节点 - #多轮交互#
概述
- 仅 “#单次交互#” 和 “#多轮交互#” 是 “唯二” 可以与用户进行交互的节点,在两类节点中定义的信息项才会被从用户输入中抽取信息
- 进入 “#多轮交互#” 节点后,系统就会一直停留在该节点,进行多轮交互,直到遇到后继的退出情况;当然此时也可以进行触发(触发执行完毕后又返回 “#多轮交互#” 节点),或进行具有 “主题” 信息项修饰的 “#单次交互#” 节点的主题切换;此时 AI 会根据全局的应对话术、静态和/或动态参考信息或大模型本身的知识来回复用户的疑问或要求;针对静态和/或动态参考信息,历史对话记录中的用户输入会一起作为信息检索的语义匹配目标,这样会有一种针对某一主题进行多轮知识问答的效果
- 更进一步,在该节点的每一轮交互中:
- AI会抽取 “抽取信息” 属性中定义的信息项的最新值
- 执行 “执行函数”(Python对话树) 或 “执行脚本”(Xmind对话树) 属性中定义的脚本或函数来进行相关的处理
- 使用 “{_多轮交互动态提示词_}” 系统信息项的内容作为提示词来精确动态控制该轮的对话要求
- 如果满足 “退出意图” 属性中定义的用户意图则退出该节点的交互循环,或者在 “执行函数”(Python对话树) 或 “执行脚本”(Xmind对话树) 属性中动态设置了 “{_多轮交互退出原因_}” 的值也会退出该节点的交互循环
- 对于 Xmind 对话树,节点内容的首行必须是 “#多轮交互#”,然后第二行开始的内容就是下面的各个属性(每个属性都是由 “@” 开头并用 “=” 分割开的前后两部分,前面是属性名,后面是属性内容),如:
#多轮交互#
@... = ...
@... = ...
@... =
...
...
...
@... = ...|...|... - 对于 Python 对话树,chattree.create_node() 的第一个参数必须是 “#多轮交互#”,第二个参数 dict 中就是如下的各个 key(即属性),如果没有特殊说明,其 value(即属性内容)类型均为 str,如:
multi_turn_node = chattree.create_node("#多轮交互#", {
"...": "...",
"...": ["...","..."],
"...": "...\n...\n",
"...": [{"...":"...","...":"...","...":"..."}, ...],
}) - 和 “#单次交互#” 节点不同,本节点后面不能有 “#用户意图#” 节点,且不能通过 “#动作#重新提问#” 的方式来重复执行
- “对话树例子” 中的 “医院挂号” 和 “急救知识问答” 对话树例子中有该节点
“提示未找到参考信息” 属性
(Xmind 对话树则是 “@提示未找到参考信息 = ...” 的形式)
- 当前的多轮交互中,如果用户最新的提问无法从系统预设的静态和/或动态参考信息中找到相关的内容来回答时,可以设置一个默认的、直接输出给用户的回复,比如 “抱歉,目前我的知识库里没有您的问题的答案”
- 注意这里无法使用两端是“<”、“>”的“提示词”模式(参见 “文本输出”)
- “对话树例子” 中的 “急救知识问答” 对话树例子中有该属性
“抽取信息” 属性
(Xmind 对话树则是 “@抽取信息 = ...” 的形式)
- 对于 Xmind 对话树,属性内容是若干的信息项信息,多个信息项信息则多行,每个(每行)的信息项信息分为如下三段:
- 第一段是信息项
{...},具体参见 “信息项” - 第二段是信息项约束
(...),两端用(半角)小括号括住,具体参见 “信息项”,可选 - 第三段是信息项修饰的用 “|” 分开的若干值
[...|...|...],两端用方括号括住,具体见 “节点 - #单次交互#” 中关于信息项修饰的说明(但只能是其中的“明确”、“隐含”、“复述”、“增量”、“json”) 单行如:{...}或{...}(...)或{...}(...)[...|...|...]
- 第一段是信息项
- 对于 Python 对话树,属性内容是一个 list,list 的每个元素是一个 dict,dict 中有如下 key:
- “信息项”:单个信息项名称,str 类型,具体参见 “信息项”
- “信息项约束”:即信息项的约束,具体参见 “信息项”,该 key 可选
- “信息项修饰”:参见 “节点 - #单次交互#” 中 “信息项修饰” 的说明(但只能是其中的“明确”、“隐含”、“复述”、“增量”、“json”);该 key 可选
- “信息项选项”:值是一个元素为 str 的 list,具体参见 “信息项”,该 key 可选;该 key 仅 python 对话树支持
- “信息项选项修饰”:值是一个元素为 str 的 list,具体参见 “信息项”,该 key 可选;该 key 仅 python 对话树支持
- 对于这些信息项:
- 本节点每进行完一轮交互,系统都会从当前对话记录中抽取这些信息项的最新值
- 可以在 “#多轮交互#” 之前进行初始化(通过 “#动作#执行脚本” 等节点)
- “对话树例子” 中的 “医院挂号” 对话树例子中有该属性
“执行函数”(Python对话树) 或 “执行脚本”(Xmind对话树) 属性
(Xmind 对话树则是 “@执行脚本 = ...” 的形式)
- 对于 Xmind 对话树,属性内容是多行的 Python 脚本(脚本中可基于
ctx对信息项进行访问或赋值),如:...
...ctx['{...}']...
... - 对于 Python 对话树,属性内容是一个 dict,其中 key 是 “执行函数”,value 是一个 Python 函数名或 lambda 表达式(函数定义或 lambda 都须带一个
ctx参数并可基于ctx对信息项进行访问或赋值),如:def xxxx_func(ctx):
...
...ctx['{...}']...
...
multi_turn_node = chattree.create_node("#多轮交互#", {
...
"执行函数": xxxx_func,
...
})multi_turn_node = chattree.create_node("#多轮交互#", {
...
"执行函数": lambda ctx : ...ctx["{...}"]...,
...
}) - 本节点每进行完一轮交互并抽取上述信息项后,系统都会执行上述脚本或函数
- 如果要退出本节点的交互循环,可以在脚本或函数中将退出原因赋值给系统信息项 {_多轮交互退出原因_};退出后,“#多轮交互#” 节点后继的 “#条件#脚本” 节点可以根据 {_多轮交互退出原因_} 来执行不同的分支
- 本节点的每一轮交互中,可以随时赋值系统信息项 {_多轮交互动态提示词_},直接动态控制每一轮的具体对话内容和对话要求
- 更多参见 “Python 脚本/函数”
- “对话树例子” 中的 “医院挂号” 对话树例子中有该属性
“退出意图” 属性
(Xmind 对话树则是 “@退出意图 = ...” 的形式)
- 对于 Xmind 对话树,属性内容是退出意图的描述,多个则用 “|” 分隔开,优先级高的放到前面
- 对于 Python 对话树,属性内容是一个 list,list 中的每个元素是一个 str,表示退出意图的自然语言描述,优先级高的放到前面
- 本节点每进行完一轮交互后,都会判断上述退出意图(即作为退出多轮交互的条件的用户意图,参见 “意图”),满足时,{_多轮交互退出原因_} 会被赋值相应的描述,且下一步会退出交互循环;同样,“#多轮交互#” 节点后继的 “#条件#脚本” 节点可以根据 {_多轮交互退出原因_} 来执行不同的分支