对话管理器模式
接入方式
对话管理器模式,需要在对话管理器页面中开发F节点功能。
登陆OB对话平台:https://console.orionbase.cn/login
进入“NLP配置——场景对话——对话流管理“。
对话流基本构成
- 1个开始单元
- N个触发、功能、回复单元
- 各单元间的连线
F节点开发,即对应对话流中的“功能单元“。
1. 开始单元
- 开始单元是每个对话流都有且只有一个的,标志着对话流的开始。
- 开始单元支持配置对话超时时间,指在等待用户语音指令时的最长时长,超过这个时长后,系统认为用户已经无需进行对话,对话流的状态会直接结束。
- 超时时长默认15秒,可以根据需要自行调整。
- 超时时长设置为0时,即表示无超时时长,会一直等待用户输入。
- 开始单元中的超时时间不会影响对话流中的意图的填槽过程。
2. 触发单元
- 触发单元用于接收用户的语音/文字,并对用户输入的信息进行一些条件判断,来决定后续如何回应用户
- 触发单元的触发条件判断包括intent、slot、query和other四种:
- intent:意图,用于判断用户的语音/文字指令是否能命中已配置的意图
- intent条件中可选择的意图,是当前账号所属组织下的打开状态下的全部意图,均需要在文法预先配置
- 已经配置到对话流中的意图,如果在文法配置模块被关闭,会导致对话流在进行到该意图时舞蹈响应
- slot:槽位,用于判断用户指令中是否包含指定的槽位值
- 需要先在当前触发单元配置了intent条件,才可以选择slot条件进行配置;
- slot条件配置时,需要先选择是哪一个意图下,选择范围是当前触发单元配置的全部意图;选择完意图后,可以指定槽位和预期的槽位值。
- query:即用户指令的原文,可以配置query完全等于某段文本,或query包含某些特定的关键词
- 配置query = ‘xxxx’时,表示用户输入要和预置的条件完全一致才可以触发;
- 配置query 包含 ‘xxx,yyy,zzz’时,表示用户输入包含xxx、yyy、zzz三个关键词才可以触发,多个关键词之间用英文逗号隔开。
- 配置query 不包含 ‘xxx,yyy,zzz’时,表示用户输入不包含xxx、yyy、zzz三个关键词才可以触发,多个关键词之间用英文逗号隔开。
- other:其他,主要用于存在对话分支的部分,当用户的输入无法命中其他的预设条件时,就会命中other条
- other条件一定是单独存在的,配置了other条件的触发单元无法添加其他条件,已存在其他条件的触发单元也不能添加other条件。
- intent:意图,用于判断用户的语音/文字指令是否能命中已配置的意图
- 多条件触发时:可以通过点击“且”、“或”的按钮来添加多个条件逻辑判断用于多条件触发
- 计算逻辑:先计算或再计算且,PS:(条件1 或 条件2)且(条件3 或 条件4)
- 存在一些异常的情况,在配置过程中应当尽量避免:
- 在触发单元中,应当避免配置类似‘intent = aaa’ 且 ‘intent = bbb’的条件;
- 开始单元后连接的那一层触发单元,应当避免配置‘other’条件,否则可能会导致用户的语音输入全部进入了‘other’的对话流。
3. 功能单元
- 当部分复杂的功能无法通过配置满足时,可通过功能节点编写代码完成,在代码中可以调用第三方API完成特殊的技能
- 能实现的功能举例:
- 功能节点可以根据NLP给出的解析结果
- 直接代码内部配置不同的answer
- 调用第三方API获得结果并返回
- 拼接某些URL的scheme,支持吊起某些OPK/APK的特殊页面
- 实现意图缺省的多轮
- 功能节点可以根据NLP给出的解析结果
详细对话流配置流程,参见“对话流管理“。
配置平台快速测试
登陆对话平台,在快速测试中,即可实际测试多轮效果。
F节点开发文档
对话管理器工作原理概述
用户输入的Query首先被NLU引擎解析为实体词和意图,意图本身又可能包含抽取出的槽位。通常意图识别结果中的槽位值是来自于某一个解析出的实体词。即可以认为实体词是用来填槽的素材,文法规则是填槽的模板。
用户可以定义多个对话流程图,每个对话流程图里有若干个节点。对话流程图可以认为是一种规则,或者说是一种程序,对话管理器的核心工作,就是按照对话流程图所指定的规则和程序完成对话。而对话的核心是槽位的填充,即通过一系列的话术规则、反问,引导用户表达自己的诉求,将用户的诉求转换为意图和槽位。
如上图所示,用户定义的对话流程图是模板,对话管理器会在内存中维护一组与对话模板一一对应的对话状态,我们称之为对话状态帧(Frame)。通常一个用户可能会关联多个对话流程图,因此也就会有多个Frame与之对应。Frame是有顺序的,排在最前面的Frame称为当前活跃Frame,活跃Frame对应的对话流程图模板也就是当前活跃的对话流程图模板。
如何控制对话流程?
对话模板中的每一个节点都可以返回几种不同的指令,用于控制对话引擎如何继续执行对话流程图。这些指令包括:
- 返回用户,携带TTS信息和其他资源返回用户
- 当某个节点认为需要向用户返回结果时,可以告诉对话管理引擎不要继续执行对话图中的其他节点了。返回用户又可以细分为两种返回:
- 1、本次返回给用户结果后,还期待处理用户输入的下一个Query。这将导致对话管理器在遇到下一个Query时优先将Query重新发送到本次离开的对话节点。为了实现这一目的,当前对话流对应的Frame会被移动到Frame列表的最前面,使之成为当前激活对话。
- 例如,当执行到C节点时,可以告诉对话引擎,现在返回给用户一个响应,并且下一轮对话继续承接用户的输入。这样,当下一轮对话来临时,对话引擎会首先再次执行C节点。
- 2、本次返回用户后,终止对话。这将导致对话管理器清除当前对话流程图对应的Frame中的所有信息。
- 1、本次返回给用户结果后,还期待处理用户输入的下一个Query。这将导致对话管理器在遇到下一个Query时优先将Query重新发送到本次离开的对话节点。为了实现这一目的,当前对话流对应的Frame会被移动到Frame列表的最前面,使之成为当前激活对话。
- 当某个节点认为需要向用户返回结果时,可以告诉对话管理引擎不要继续执行对话图中的其他节点了。返回用户又可以细分为两种返回:
- 尝试其他兄弟节点
- 例如在上述示例中,对话引擎执行到B节点,B节点认为自己无法处理当前请求,但认为其他节点有可能可以处理该请求。当对话管理引擎收到这个指示时,其将继续访问C节点,看C节点是否可以响应。若C节点也不能响应,则认为当前绘画流程图不能处理本次Query,对话引擎会尝试其他对话流程图是否可以响应该请求
- 尝试其他对话图
- 例如在上述示例中,对话引擎执行到B节点,B节点认为自己无法处理当前请求,且当前对话流中的其他节点也不能、或者不应该处理当前请求,则B节点可以指示对话引擎放弃尝试C节点,直接去尝试其他的对话流程图是否可以响应。
- 继续执行子节点
- 例如在上述示例中,对话引擎执行到C节点,C节点认为对话可以继续,故其可以指示对话管理引擎继续访问D节点
如何产生用户响应?
NLU解析结果可能包含对一个用户输入Query的多种理解方式,故一个Query对应的NLU解析结果是一个列表,里面可能包含多个意图。其中,排在列表第一位的,是NLU引擎经过排序算法认为最优的结果。但这个最优的结果,不一定是用户想要的结果。另外,用户单次Query所提供的槽位信息可能会有缺失,需要通过多轮对话反问才能获取用户想要的全部信息。因此:
- 对话管理器返回的意图、槽位等信息,并不是NLU解析的原始结果,而是存放在Frame中,经过对话管理器加工的结果。
- 编写F节点LUA脚本的终极目的,就是按照用户的业务需求,在Frame中拼装领域、意图、槽位、第三方资源等信息。
基本对象类型
NLU解析结果(NluParsedResult)
成员 | 类型 | 说明 | 备注 |
---|---|---|---|
query | string | 用户输入的文本 | |
entities | []NluParsedEntity | 从query中解析出的实体词列表 | |
intents | []NluParsedIntent | 从query中解析出的意图列表 |
实体词解析结果(NluParsedEntity)
成员 | 类型 | 说明 | 备注 |
---|---|---|---|
text | string | 实体词的原始值,与用户输入保持一致 | |
value | String或LuaTable | 归一化后的实体词,可以是文本,也可以是一个结构体。具体类型可以由type字段决定。当type=Normal时,该字段为字符串,其内容为text归一化后的同义词,无同义词时text与value相同。当type= | TODO |
dict_name | String | 该实体词所属的词典名称 | |
type | String | 实体词类型,目前可能取值为:Normal | |
ex | LuaTable | 一个str到str类型的map,用于存储和实体词关联的其他信息 | 暂未启用 |
意图解析结果(NluParsedIntent)
成员 | 类型 | 说明 | 备注 |
---|---|---|---|
domain_name | string | ||
intent_id | number | 意图ID | 意图判断应尽量以意图名称为准。不要使用意图ID,它是对话系统内部的信息,并且有可能会在未来移除对Lua引擎的暴露,除非你是系统开发者,清楚地知道自己在做什么,否则不要使用。 |
intent_name | string | 意图名称 | |
slots | []NluParsedSlot | 意图抽取出的槽位列表 | |
source_name | string | 产生该意图的模块名称 |
槽位解析结果(NluParsedSlot)
成员 | 类型 | 说明 | 备注 |
---|---|---|---|
slot_name | string | 槽位名称 | |
slot_type | string | 槽位包含实体词类型,参考实体词解析结果(NluParsedEntity)类型说明 | |
text | string | 参考实体词解析结果(NluParsedEntity)类型说明意图名称 | |
dict_name | string | 参考实体词解析结果(NluParsedEntity)类型说明 | |
value | String或LuaTable | 参考实体词解析结果(NluParsedEntity)类型说明 | |
ex | LuaTable | 参考实体词解析结果(NluParsedEntity)类型说明 |
对话管理器返回条目(DMResponseItem)
成员 | 类型 | 说明 | 备注 |
---|---|---|---|
应避免直接操作该对象的内部字段。请通过系统提供的API来操作该对象 |
系统环境全局常量
DM_API_VERSION
字符串,获取当前LUA脚本执行环境API接口的版本号,目前为1.0.0
您可以在代码中根据此值来写出兼容不同运行环境的代码