You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:29:17