如何为Botframework用户个性化配置LUIS短语列表以对接Cortana?
解决LUIS识别用户自定义房间/设备的问题
针对你遇到的每个用户有自定义房间、设备名称,LUIS无法提前预知的情况,我给你几个实用的解决方案,帮你避免识别错误:
1. 用LUIS动态列表实体(最推荐)
LUIS其实支持在每次请求时动态传入实体列表,刚好能解决按用户维度定制识别范围的问题,而且不需要修改原模型或重新发布:
- 首先在你的LUIS模型里先定义好对应的实体类型(比如
Room、Device); - 当Bot收到用户请求时,先调用你的后端获取该用户的所有设备/房间列表;
- 调用LUIS预测API时,在请求体里加入
dynamicLists参数,把用户的设备/房间名称作为该实体的动态候选列表传进去(示例代码如下)。
这样LUIS在识别时,只会从你传入的这个用户专属列表里匹配实体,完全不会识别用户没有的“客厅”这类名称。
{ "query": "打开浴室的灯", "dynamicLists": [ { "listEntityName": "Room", "requestLists": [ { "name": "用户房间列表", "canonicalForm": "浴室", "synonyms": ["洗澡间"] }, { "name": "用户房间列表", "canonicalForm": "餐厅", "synonyms": ["饭厅"] } ] }, { "listEntityName": "Device", "requestLists": [ { "name": "用户设备列表", "canonicalForm": "灯", "synonyms": ["电灯"] } ] } ] }
2. 在Bot层做二次验证与模糊匹配
如果暂时没法用动态列表实体,也可以在Bot拿到LUIS的识别结果后,自己做一层过滤:
- 当LUIS识别出实体(比如“客厅”),Bot立刻去查当前用户的设备/房间列表;
- 用精确匹配或模糊匹配算法(比如Levenshtein字符串相似度、拼音匹配)找最接近的候选;
- 如果找到匹配项,就询问用户确认(比如“你是想打开餐厅的灯吗?”);如果完全没匹配到,直接提示用户“我没找到你说的设备,请确认名称是否正确”。
这个方案不需要修改LUIS模型,完全在Bot端实现,灵活度很高,适合各种场景。
3. 模仿Connected Home的设备发现逻辑
Connected Home的核心逻辑其实就是先获取用户的设备列表,再用这个列表约束识别范围,你可以自己实现这个流程:
- 用户完成OAuth授权后,Bot主动调用你的后端接口,获取该用户的所有设备/房间信息,存入用户的会话上下文或持久化存储;
- 之后每次用户发起请求,都从存储中取出这些信息,要么传给LUIS做动态列表,要么在Bot端做二次验证。
这个逻辑和前两个方案是相通的,本质都是把用户的专属设备列表作为识别的“白名单”。
内容的提问来源于stack exchange,提问作者Lukas Volf
相关产品推荐
相关产品推荐

