跳到主要内容

节点 - #单次交互#

仅 “#单次交互#” 和 “#多轮交互#” 是 “唯二” 可以与用户进行交互的节点,在两类节点中定义的信息项才会被从用户输入中抽取信息

Xmind 对话树

对于 Xmind 对话树,节点内容的首行必须是 “#单次交互#”,然后就仅有第二行:

  • 第二行内容是用 “=” 分割开的前后两部分
  • “=” 前的部分是信息项相关内容:
    • 第一段是信息项 “{...}”,两边用大括号括起来,具体参见 “信息项”
    • 第二段是信息项约束 “(...)”,两边用(半角)小括号括起来,具体参见 “信息项”,可选
    • 第三段是信息项修饰或问题修饰的用 “|” 分开的若干值 “[...|...|...]”,两边用方括号括起来,具体说明见下面 Python 对话树中的相应部分(出现就表示“是”,未出现就表示“否”),可选
  • “=” 后的部分是系统问题,具体参见 “文本输出”
  • 如:
    #单次交互#
    {来电者目前所在的具体地点}(需要详细地址,包括小区、楼号、门牌号等)[明确|复述|必需] = 请问您现在具体在哪里?请提供详细地址,包括小区、楼号、门牌号等

Python 对话树

对于 Python 对话树,chattree.create_node() 的第一个参数必须是 “#单次交互#”,第二个参数 dict 中若干个 key:

  • “信息项”:值是单个信息项名称,str 类型,具体参见 “信息项”
  • “信息项同义词”:值是一个 list,包含若干个信息项同义词(str 类型),这些同义词的格式要求同“信息项”;同义词主要是为了增加某些极端情况下(绝大部分情况下是不需要定义同义词的)的信息抽取成功率,比如对于信息项 {航班降落城市},如果用户输入是 “订张机票,后天飞北京”,此时增加一个同义词 {飞到哪个城市},会大大提升信息抽取成功率;仅 Python 对话树支持同义词;该 key 可选;“对话树例子” 中的 “商旅平台_预订机票” 对话树例子中有该属性
  • “信息项约束”:值是信息项的约束,str 类型,具体参见 “信息项”,该 key 可选;“对话树例子” 中的 “商旅平台_预订机票” 和 “医院挂号” 对话树例子中有该属性
  • “信息项修饰”:值是一个 list,包含若干个信息项修饰值(str 类型),这些值的具体说明见下面(出现就表示“是”,未出现就表示“否”);该 key 可选
    • “隐含”:表示用户提供该信息项的答案时,可以是间接隐含的表达方式;“对话树例子” 中的 “商旅平台_预订机票” 和 “120” 对话树例子中有该信息项修饰值
    • “明确”:表示用户提供该信息项的答案时,必须是直接明确的表达方式;对于某些容易引起 LLM 幻觉的信息项也可以用这个属性来应对;“对话树例子” 中的 “商旅平台_预订机票” 和 “120” 对话树例子中有该信息项修饰值
    • “原文”:有些概念即使用 “明确” 修饰值也还是会出错,就用该属性,即要求用户的答复中完全包含该节点后面某个 “#用户意图#” 子节点的字面内容(即有该信息项修饰值的 “#单次交互#” 节点后面一定要有 “#用户意图#” 子节点)
    • “复述”:指系统回复时会先自动复述该信息项内容(即用户回答的内容),以便用户确认;“对话树例子” 中的 “商旅平台_预订机票” 和 “120” 对话树例子中有该信息项修饰值
    • “固定”:表示该信息项仅在该 “#单次交互#” 节点的交互中可被赋值(即不会对该信息项进行全局信息抽取,这样就不能超前回答也不能后继修改);某些情况下,后面有 “#用户意图#” 子节点且子节点后面还有子节点的 “#单次交互#” 节点的信息项,如果信息项名称中含有 “是否”,可能需要设置该修饰值;“对话树例子” 中的 “商旅平台_预订机票” 和 “120” 对话树例子中有该信息项修饰值
    • “必需”:用户不能拒绝回答该信息项的问题,如果用户不回答或拒绝回答则会重复提问;没有该修饰时,如果用户拒绝回答问题,则信息项会被赋值 None(注:仅 “#单次交互#” 中定义的信息项可以被系统识别为拒绝回答);“对话树例子” 中的 “商旅平台_预订机票” 和 “120” 对话树例子中有该信息项修饰值
    • “增量”:表示用户提供的信息项的内容是不断递增的,系统会自动将用户多次回答的内容累加到一起,比如 {地址} 信息项,先是 “小区名”,然后是 “小区名+楼号”,最后是 “小区名+楼号+门牌号”;另外 {...案情}{...理由}{...结果} 等描述性的信息项可能也是增量的;“对话树例子” 中的 “120” 对话树例子中有该信息项修饰值
    • “主题”:表示该信息项所在节点是一个主题节点,该节点后继必须有若干 “#用户意图#” 节点且每个 “#用户意图#” 节点的 “意图” 属性都是一个主题(话题),所谓话题管理,就是指在这些主题之间进行对话内容的切换
      • 在对话过程中可以随时进入/切换/重入/退出某个主题,类似地则只能进入和退出某个触发(指 “#触发#” 节点后的 “#用户意图#” 节点的 “意图” 属性,参见 “节点 - #触发#”
      • 每次进入/切换/重入某个主题时,其后继的所有 “#单次交互#” 节点的信息项都会被清空(除了用户当前刚刚又输入了的信息项)
      • 一个对话树只能有一个主题节点,但作为子树被调用时会被忽略,即仅在第一个父对话树中的主题节点才有效(但这种情况可以用来更加精准地约束 “#单次交互#” 节点的信息项名称的语义)
      • “对话树例子” 中的 “商旅平台” 对话树例子中有该信息项修饰值
    • “json”:表示信息项存储的是 JSON 格式信息,一般用来保存多行表格信息,如 “{乘机人信息}”,同时需要信息项约束来说明具体格式要求,如 “包括‘姓名’、‘证件类型’和‘证件号码’”,然后所存储的信息项的值就可能是 [{"姓名":"张三","证件类型":"身份证","证件号码":"123456789012345678"},[{"姓名":"张三","证件类型":"护照","证件号码":"CD123456"}],具体如何使用 json 值参见 “Python 脚本/函数”“对话树例子” 中的 “商旅平台_预订机票” 对话树例子中有该信息项修饰值
    • 最佳实践:
      • 做是否判断的信息项可能需要 “必需” 和 “固定”
      • 做最后信息确认的信息项多半需要 “明确”
  • “信息项选项”:值是一个元素为 str 的 list,具体参见 “信息项”,该 key 可选;该 key 仅 python 对话树支持;“对话树例子” 中的 “商旅平台_预订机票” 和 “医院挂号” 对话树例子中有该属性
  • “信息项选项修饰”:值是一个元素为 str 的 list,具体参见 “信息项”,该 key 可选;该 key 仅 python 对话树支持;“对话树例子” 中的 “商旅平台_预订机票” 和 “医院挂号” 对话树例子中有该属性
  • “系统问题”:值是系统问题文本,str 或 list[str] 类型,具体参见 “文本输出”“对话树例子” 中的 “商旅平台_预订机票” 和 “120” 对话树例子中有该属性
  • “问题修饰”:值是一个 list,包含若干个问题修饰值(str 类型),这些值的具体说明见下面(出现就表示“是”,未出现就表示“否”);该 key 可选
    • “改写”:系统问题会被重新组织语言后再输出(意思不会改变)
    • “总是反复提问”:在本节点时,如果用户没有回答该节点的问题,则 AI 一定会再次提问
    • “绝不反复提问”:在本节点时,如果用户没有回答该节点的问题,则 AI 绝不会再次提问,即使用户一直不回答问题(此时对话状态会一直停留在该节点);该属性和“总是反复提问”不能同时出现,如果这两个属性都不出现则缺省情况是:当用户没有回答该节点的问题时,如用户的回答触发了(动态/静态)参考信息或触发了应对话术则不再次提问、如都没触发则再次提问;“对话树例子” 中的 “商旅平台” 对话树例子中有该问题修饰值
  • “提问前执行脚本”:值是一个函数,具体参见 “Python 脚本/函数”;该 key 可选,且 xmind 对话树不支持;“对话树例子” 中的 “商旅平台_预订机票” 对话树例子中有该属性
  • “提问前提示用户”:值是 str 或 list[str] 类型,具体参见 “文本输出”;该动作会在执行 “提问前执行脚本” 后再执行;该 key 可选,且 xmind 对话树不支持;“对话树例子” 中的 “商旅平台_预订机票” 对话树例子中有该属性
  • “提问前结构化输出”:值是 str 类型,作用等效于 “节点 - #结构化输出#”;该动作会在执行 “提问前执行脚本” 后再执行;该 key 可选,且 xmind 对话树不支持;“对话树例子” 中的 “商旅平台_预订机票” 对话树例子中有该属性

其它

  • 系统问题文本前面不用加入各种语气词,如 “好的” “那么” 等
  • 信息项名称要和“系统问题”的文本要匹配,比如问题是 “双方达成初步共识了吗?” 时,对应的信息项名称应该是 {双方是否有初步共识},而不能是 {双方达成的共识};如果信息项必须是 {双方达成的共识},则问题就应该是 “双方达成了什么共识?”
  • “对话树例子” 中的 “商旅平台”、“商旅平台_预订机票”、“120” 对话树例子中有该节点