如何检测Watson Assistant的slot filling及上下文状态
Watson Assistant slot filling 状态检测方案
问题现象
开发对接Watson Assistant时,无法直接从默认返回的响应报文判断会话是否处于slot filling流程中:
- 当会话配置了输出上下文时,响应会返回完整的
context字段,示例响应如下:
{ "output": { "generic": [ { "response_type": "text", "text": "Hello! What can I do for you?" } ], "intents": [ { "intent": "hello", "confidence": 0.9281370162963867 } ], "entities": [] }, "context": { "global": { "system": { "turn_count": 1, "user_id": "55cd47b1-3847-430b-ba28-1739e0654576" }, "session_id": "55cd47b1-3847-430b-ba28-1739e0654576" }, "skills": { "main skill": { "system": { "state": "eyJzZXNzaW9uX2lkIjoiNTVjZDQ3YjEtMzg0Ny00MzBiLWJhMjgtMTczOWUwNjU0NTc2Iiwic2tpbGxfcmVmZXJlbmNlIjoibWFpbiBza2lsbCIsImFzc2lzdGFudF9pZCI6ImViM2RmZGRlLTJkNDUtNDBmYS05NDZlLTk2ODVmNTU2NzhhOSIsImluaXRpYWxpemVkIjp0cnVlLCJkaWFsb2dfc3RhY2siOlt7ImRpYWxvZ19ub2RlIjoicm9vdCJ9XSwibGFzdF9icmFuY2hfbm9kZSI6ImdyZWV0aW5nX29wdGlvbl8zIn0=" } } } }, "user_id": "55cd47b1-3847-430b-ba28-1739e0654576" }
- 处于slot filling流程中的默认响应没有返回类似开放上下文的可识别标识,无法直接判断会话状态,示例响应如下:
{ "output": { "intents": [ { "intent": "action_36417_intent_42985", "confidence": 1 } ], "entities": [], "generic": [ { "response_type": "text", "text": "Lite Plan: $10/month and Premium with Tech Support: $99/month." } ] }, "user_id": "64e28440-84e2-4246-bfad-34daab1b92e5" }
核心疑问:是否只能通过要求对话设计者为所有流程配置output context的方式实现状态检测?业务诉求为识别当前会话是否存在未完成的slot filling流程或未结束的开放上下文,以此判断下一条用户消息是否需要路由至同一个对话机器人处理。
解决方案
不需要强制要求对话设计者全量配置output context,有两种低侵入的可靠实现方式:
- 方案一:API层面开启全局上下文返回
调用Watson Assistant消息接口时,固定在请求参数中携带return_context=true。这个参数是API原生提供的全局开关,和对话节点是否配置自定义输出上下文无关:只要当前会话处于存续状态,包括正在执行slot filling、存在未过期的上下文,响应都会返回完整的context结构。
只需要判断响应中是否存在有效context.skills下对应技能的系统状态字段,即可确认当前是否有未完成的对话流程,直接路由到同一个机器人处理即可。之前观察到的slot filling响应不带context,本质是默认请求没有开启这个参数,不是slot filling状态下没有上下文数据。 - 方案二:对话侧做最小侵入的状态标记
如果受限于当前使用的API版本,无法使用return_context参数,不需要给所有对话节点配置输出上下文,只需要统一做两处配置:- 所有带slot filling的流程、会产生持续上下文的节点入口处,统一设置固定标识的上下文变量,比如
context.conv_status = "in_progress" - 所有流程的结束出口处,统一将该变量置为
context.conv_status = "idle"
后续只需要判断响应中返回的该变量值,即可确认会话状态,整体配置工作量远小于全量配置输出上下文。
- 所有带slot filling的流程、会产生持续上下文的节点入口处,统一设置固定标识的上下文变量,比如
注意:不要通过响应中的意图置信度判断是否处于slot filling流程,slot filling执行过程中也可能识别到其他高置信度的外部意图,用这个逻辑判断会出现路由错误。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

