如何在Dialogflow中限定范围?多门店场景下的门店识别方案
嘿,这个场景我刚好帮客户落地过,给你拆解两个核心需求的具体实现思路:
一、让机器人识别用户咨询的门店并返回对应信息
这里分两种主流方案,你可以根据官网的集成情况选择:
1. 预传递门店参数(推荐,无需用户额外操作)
因为每个门店的官网是独立部署的,你可以在网页端调用Dialogflow的代码里,直接把当前门店的标识(比如门店ID、名称)作为**自定义载荷(Payload)**传给Dialogflow。
举个网页端的代码示例:
// 网页端向Dialogflow发送请求的核心代码片段 async function sendMessageToBot(userInput) { const sessionId = generateUniqueSessionId(); // 生成用户会话ID const sessionPath = dialogflowClient.projectAgentSessionPath(projectId, sessionId); const request = { session: sessionPath, queryInput: { text: { text: userInput, languageCode: 'zh-CN', }, }, // 关键:传递当前门店的信息 queryParams: { payload: { data: { storeId: 'hangzhou_xihu_001', storeName: '杭州西湖门店' } } } }; const responses = await dialogflowClient.detectIntent(request); // 处理机器人返回的结果... }
接下来在Dialogflow后台:
- 创建一个名为
current_store的上下文(Context),把传入的storeId和storeName作为上下文参数存储下来; - 在“询问营业时间”这类意图里,直接引用上下文参数生成动态回复,比如设置响应文本为:
{{current_store.storeName}}的营业时间是周一至周日9:00-22:00哦~; - 其他需要门店信息的意图(比如地址、联系方式)都可以用同样的方式调用参数。
2. 引导用户主动选择门店(适配无预传参数的场景)
如果有些用户是通过非官网渠道(比如通用入口)进来的,或者官网暂时没法传递参数,可以设置一个兜底逻辑:
- 创建一个
store类型的实体(Entity),录入所有门店的名称、简称、地址关键词作为实体值和同义词(比如“西湖店”对应“杭州西湖门店”); - 在“询问营业时间”意图里添加触发条件:如果
current_store上下文不存在,就触发一个“询问门店”的子意图,回复类似:“请问你咨询的是哪家门店呢?我们有杭州西湖店、上海陆家嘴店等门店哦~”; - 当用户说出门店名称后,Dialogflow会识别
store实体,把对应的门店信息存入current_store上下文,再自动触发营业时间的回复。
二、在Dialogflow中限定对话范围
要让机器人只聚焦门店相关业务,主要靠以下几个配置:
1. 配置默认回退意图
Dialogflow自带的Default Fallback Intent是处理所有未匹配意图的兜底,你可以修改它的回复内容,比如:抱歉,我暂时只能解答关于门店营业时间、地址、在售产品的问题哦,有其他需求可以联系门店客服~
另外,你还可以给这个回退意图添加上下文条件:比如当current_store上下文存在时,回复更贴合门店的内容;如果没有上下文,就回复通用的兜底内容。
2. 用上下文控制意图触发范围
给所有门店相关的意图(比如营业时间、地址咨询)设置触发上下文为current_store,这样只有当机器人已经知道用户对应的门店时,这些意图才会被触发;如果用户聊无关话题(比如“今天天气怎么样”),会直接触发回退意图。
同时,你可以设置上下文的生命周期(Lifespan),比如设为5轮对话,当用户连续5轮聊无关内容,上下文自动失效,机器人可以回复:“请问你还有关于门店的问题吗?”引导回到业务范围。
3. 精准设置意图触发短语
给每个门店相关的意图添加精准的触发短语,避免无关问题误触发。比如“询问营业时间”的触发短语可以设为:
- 你们营业时间是什么?
- 几点开门?
- 几点关门?
- XX店几点营业?
尽量不要设置太宽泛的短语,比如“告诉我点信息”,这样容易误触发。
这样配置下来,既能精准匹配用户所在的门店,又能把对话牢牢控制在业务范围内,你可以根据自己的门店数量和业务复杂度调整细节~
内容的提问来源于stack exchange,提问作者Ron Smalls

