跳到主要内容

节点 - #多轮交互#

概述

  • 仅 “#单次交互#” 和 “#多轮交互#” 是 “唯二” 可以与用户进行交互的节点,在两类节点中定义的信息项才会被从用户输入中抽取信息
  • 进入 “#多轮交互#” 节点后,系统就会一直停留在该节点,进行多轮交互,直到遇到后继的退出情况;当然此时也可以进行触发(触发执行完毕后又返回 “#多轮交互#” 节点),或进行具有 “主题” 信息项修饰的 “#单次交互#” 节点的主题切换;此时 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,表示退出意图的自然语言描述,优先级高的放到前面
  • 本节点每进行完一轮交互后,都会判断上述退出意图(即作为退出多轮交互的条件的用户意图,参见 “意图”),满足时,{_多轮交互退出原因_} 会被赋值相应的描述,且下一步会退出交互循环;同样,“#多轮交互#” 节点后继的 “#条件#脚本” 节点可以根据 {_多轮交互退出原因_} 来执行不同的分支