基于Dialogflow实现自定义输入决策树的功能需求及导航问题咨询
解决Dialogflow中决策树流程导航(Hops)的实现方案
Hey there, I’ve tackled similar Dialogflow workflow hurdles before, so let’s walk through exactly how to build your custom decision tree—including handling gold/silver routing, loops, multi-step flows, and that tricky "hops" navigation you’re stuck on.
1. 核心思路:用Contexts + Fulfillment实现流程跳转
Dialogflow原生的意图/上下文系统单独用可能会觉得跨流程跳转受限,但把输出上下文和** fulfillment webhook**结合起来,就是实现灵活流程导航的关键:
- 输出上下文相当于"状态标记",用来追踪用户当前处于哪个流程分支;
- Fulfillment(后端钩子)可以让你根据用户输入或当前状态,动态设置上下文、触发意图,直接实现流程间的跳转。
2. 分步实现指南
2.1 基础搭建:定义核心意图与上下文
先搭好基础模块:
- 根意图:命名为
credit_card_start,触发词可以是"我想办信用卡"这类用户启动流程的语句; - 分支意图:创建
gold_card_intent(触发词"gold")、silver_card_intent(触发词"silver"); - 上下文标记:创建
gold_flow_active、silver_flow_active、main_menu_active这几个上下文,用来标记当前的流程状态。
2.2 构建4-5步长流程(以金卡为例)
我们把金卡流程拆成5步,用上下文来控制流程推进:
- 第一步:用户输入"gold"后,设置
gold_flow_active上下文(生命周期设为5,足够覆盖整个流程),回复:"很棒的选择!你在我们这里已有账户吗?(是/否)" - 第二步:如果用户说"是",触发
gold_existing_account意图(仅当gold_flow_active上下文存在时生效),回复:"太好了!你想直接关联现有账户,还是提交新的申请?(关联/新申请)" - 第三步:用户选"关联"后,回复:"请输入你的8位账户编号:"
- 第四步:通过Fulfillment验证账户编号有效性,验证通过后回复:"账户关联成功!你想先查看申请详情还是直接提交?(查看/提交)"
- 第五步:用户选"提交"后,确认申请完成,然后重置上下文,回复:"你的金卡申请已提交!想继续了解其他卡种还是结束对话?(继续/退出)"
2.3 实现流程循环与跨流程跳转(Hops)
这部分全靠Fulfillment来实现。比如用户在金卡流程里想切换到银卡,或者回到主菜单:
- 添加导航意图:创建
navigate_back意图,触发词包括"返回"、"切换到银卡"、"主菜单"; - 在Fulfillment中处理逻辑:
- 先检查当前活跃的上下文(比如
gold_flow_active); - 如果用户说"切换到银卡",清除
gold_flow_active,设置silver_flow_active上下文,回复:"好的!我们切换到银卡流程。你在我们这里已有账户吗?(是/否)" - 如果用户说"主菜单",清除所有流程上下文,设置
main_menu_active,回复:"欢迎回来!你想了解金卡还是银卡?(gold/silver)"
- 先检查当前活跃的上下文(比如
2.4 Fulfillment代码示例(Node.js)
下面是一段处理上下文管理和导航的代码片段:
const functions = require('firebase-functions'); const {WebhookClient} = require('dialogflow-fulfillment'); exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); // 处理金卡流程启动 function handleGoldStart(agent) { agent.context.set({ name: 'gold_flow_active', lifespan: 5 }); agent.add("Great choice! Do you have an existing account with us? (yes/no)"); } // 处理从金卡切换到银卡 function handleSwitchToSilver(agent) { agent.context.delete('gold_flow_active'); agent.context.set({ name: 'silver_flow_active', lifespan: 5 }); agent.add("Got it! Let's switch to the Silver card flow. Do you have an existing account with us? (yes/no)"); } // 处理回到主菜单 function handleMainMenu(agent) { agent.context.delete('gold_flow_active'); agent.context.delete('silver_flow_active'); agent.context.set({ name: 'main_menu_active', lifespan: 1 }); agent.add("Welcome back! Would you like to explore Gold or Silver credit cards? (gold/silver)"); } // 意图与处理函数映射 const intentMap = new Map(); intentMap.set('gold_card_intent', handleGoldStart); intentMap.set('navigate_back.switch_silver', handleSwitchToSilver); intentMap.set('navigate_back.main_menu', handleMainMenu); agent.handleRequest(intentMap); });
2.5 确保流程循环
要让对话能循环进行直到用户退出:
- 完成任何一个流程(比如提交申请)后,一定要重置到主菜单上下文,并提示用户选择继续或退出;
- 添加
exit_intent意图,触发词为"退出"、"结束",回复感谢语后结束对话。
3. 避坑关键提示
- 上下文生命周期:合理设置生命周期——太短会丢失流程状态,太长会导致旧上下文意外生效;
- 意图优先级:让导航意图(比如"返回")的优先级高于流程特定意图,确保用户想跳转时能触发正确的意图;
- 状态追踪:如果需要更复杂的跳转(比如从金卡第三步跳到银卡第二步),可以在Fulfillment中记录当前流程的步骤,再根据记录调整上下文和回复。
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

