Dialogflow代码实现:如何检索上下文?附产品搜索场景代码疑问
嘿,我来帮你理清这个Dialogflow的上下文处理和产品搜索实现的问题~
解决Dialogflow上下文检索与产品搜索场景的代码实现问题
一、如何在Dialogflow中检索上下文
Dialogflow里的上下文是追踪对话状态的核心工具,你可以通过以下方式在代码里获取和判断上下文:
- 获取当前所有活跃上下文:
agent.contexts(返回一个上下文对象数组) - 获取指定名称的上下文:
agent.getContext('你的上下文名称'),如果上下文不存在会返回undefined - 检查上下文是否存在:用
agent.getContext('your_context_name') !== undefined就能判断当前对话是否处于目标状态
在你的产品搜索场景里,当机器人问完“您想找什么产品?”后,必须设置一个专属上下文(比如awaiting_product_query),这样后续用户回复时,Dialogflow才能识别出这个回复是对应之前的产品询问,而不是其他无关意图。
二、产品搜索场景的完整代码实现
我把你给出的代码片段补全并优化,适配Dialogflow的完整对话流程:
1. 处理“发起产品搜索”意图(对应你的I want a product意图)
这个意图触发后,机器人主动询问用户需求,并设置上下文标记对话状态:
function searchProduct(agent) { // 回复用户的询问 agent.add('您想找什么产品?'); // 设置上下文,有效期设为5轮对话(足够覆盖用户回复及可能的追问) agent.setContext({ name: 'awaiting_product_query', lifespanCount: 5 }); }
2. 创建并处理“提供产品名称”意图
你需要先在Dialogflow控制台做这些配置:
- 新建意图(比如命名为
Provide Product Name) - 配置训练短语:添加“苹果”、“华为手机”、“笔记本电脑”等用户可能的回复
- 设置实体:用系统实体
@sys.product或自定义实体提取产品名称,参数名设为product_name - 配置输入上下文:指定为
awaiting_product_query,确保只有在之前触发了产品搜索意图后才会触发这个意图
对应的代码处理器如下:
async function handleProductQuery(agent) { // 1. 检索上下文,确认当前对话处于产品搜索状态(可选但能增强鲁棒性) const productContext = agent.getContext('awaiting_product_query'); if (!productContext) { agent.add('抱歉,我没太明白您的需求,您可以先告诉我您想搜索产品哦~'); return; } // 2. 获取用户提供的产品名称(优先从参数提取,比直接取原始回复更准确) const productName = agent.parameters.product_name; if (!productName) { agent.add('麻烦您告诉我具体的产品名称哦~'); return; } try { // 3. 执行数据库检索(替换成你的实际数据库查询逻辑) const matchedProducts = await queryProductsFromDatabase(productName); if (matchedProducts.length === 0) { agent.add(`抱歉,没有找到匹配“${productName}”的产品哦~`); } else { // 4. 格式化返回产品列表 const productList = matchedProducts.map(prod => `- ${prod.name}(${prod.price}元)`).join('\n'); agent.add(`以下是匹配“${productName}”的产品列表:\n${productList}`); } } catch (error) { agent.add('抱歉,查询产品时出现了问题,请稍后再试~'); console.error('产品查询错误:', error); } // 5. 清除上下文,结束当前产品搜索流程 agent.clearContext('awaiting_product_query'); } // 模拟数据库查询函数(替换为你的实际数据库连接逻辑) async function queryProductsFromDatabase(productName) { // 示例数据,实际中替换为数据库模糊查询 const mockProducts = [ { name: '苹果iPhone 15', price: 5999 }, { name: '苹果MacBook Air', price: 8999 }, { name: '华为Mate 60', price: 5499 } ]; return mockProducts.filter(prod => prod.name.includes(productName)); }
3. 关联意图与处理器函数
最后把两个意图和对应的处理器绑定:
const intentMap = new Map(); intentMap.set('I want a product', searchProduct); intentMap.set('Provide Product Name', handleProductQuery); // 导出供Dialogflow调用的Webhook服务 exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); agent.handleRequest(intentMap); });
关键要点总结
- 上下文是控制对话流程的核心,设置输入上下文能确保意图只在正确的对话阶段触发
- 优先通过Dialogflow的参数提取用户输入的关键信息,比直接处理原始回复更可靠
- 数据库查询建议用异步函数,避免阻塞对话响应
- 流程结束后记得清除上下文,防止后续对话被错误触发
内容的提问来源于stack exchange,提问作者Jean-louis Gouwy
相关产品推荐
相关产品推荐

