Dify 动态变量与条件分支的高级用法
在 Dify 的开发过程中,动态变量 和 条件分支 是构建复杂逻辑的核心工具。通过灵活运用这两者,开发者可以实现多轮对话、分支决策、动态参数传递等高级功能,显著提升 AI 应用的灵活性和智能化水平。本文将深入解析动态变量的高级用法,并结合实战案例展示条件分支的复杂逻辑设计。
一、动态变量的高级用法
动态变量是 Dify 中实现节点间数据传递的关键机制。除了基础的用户变量和系统变量外,开发者还可以通过 变量聚合、嵌套引用 和 动态赋值 等方式实现更复杂的逻辑。
1.1 变量聚合:整合多路分支数据
场景:在多分支流程中(如同时查询本地知识库和外部 API),需要将多个分支的输出结果合并后再传递给大模型。
操作步骤:
- 在流程设计界面中,添加 “变量聚合” 节点。
- 将多个分支的输出变量(如
kb_result
和api_result
)拖入聚合节点。 - 配置聚合规则(如合并为 JSON 数组或字符串拼接)。
代码示例:
{
"combined_data": {
"knowledge_base": {{kb_result}},
"external_api": {{api_result}}
}
}
1.2 嵌套变量引用:动态拼接参数
场景:根据用户输入动态生成 API 请求路径(如 https://api.example.com/{{city}}
)。
操作步骤:
在 HTTP 请求节点 中,将 URL 配置为动态表达式:
https://api.example.com/{{user_input}}
- 在调试面板中验证变量是否正确替换。
1.3 会话变量与记忆机制
场景:在 Chatflow 中记录用户历史对话内容,实现上下文感知的多轮对话。
操作步骤:
- 在 LLM 节点 中启用 “记忆” 功能(默认关闭)。
- 通过会话变量(如
sys.conversation_id
)关联历史对话记录。
代码示例:
{
"history": {{sys.conversation_history}},
"user_query": {{user_input}}
}
二、条件分支的高级技巧
条件分支(If-Else 节点)允许根据变量值动态执行不同逻辑路径,尤其适合多轮对话或复杂业务流程。
2.1 嵌套条件分支:多层逻辑判断
场景:用户输入的查询类型不同,需执行不同处理流程(如天气查询 vs 订单状态查询)。
操作步骤:
添加第一个 If-Else 节点,判断查询类型:
if ({{user_query}} contains "天气") { // 执行天气查询流程 } else if ({{user_query}} contains "订单") { // 执行订单查询流程 }
- 在子分支中添加嵌套条件(如进一步判断城市或订单号格式)。
2.2 结合 RAG Pipeline 的动态检索
场景:根据用户输入动态选择知识库(如英文文档 vs 中文文档)。
操作步骤:
在 RAG 检索节点 中,通过变量动态设置知识库 ID:
knowledge_base_id = {{user_language == "en" ? "en_kb_id" : "zh_kb_id"}}
- 将检索结果传递给 LLM 生成最终回答。
2.3 多轮对话的分支控制
场景:在 Chatflow 中根据对话轮次(sys.dialogue_count
)触发不同行为(如第 1 轮收集用户信息,第 2 轮生成报告)。
操作步骤:
在 If-Else 节点 中配置条件:
if (sys.dialogue_count == 1) { // 提示用户提供信息 } else if (sys.dialogue_count == 2) { // 调用 RAG 生成报告 }
- 通过会话变量存储用户输入的信息供后续使用。
三、实战案例:客服系统的多轮对话设计
需求
构建一个智能客服系统,支持以下功能:
- 用户首次输入问题 → 分类问题类型(技术问题/订单问题)。
- 技术问题 → 查询知识库并生成解决方案。
- 订单问题 → 验证订单号格式 → 若无效则提示重输,若有效则查询物流信息。
实现步骤
流程设计:
- 开始节点:接收用户输入(
user_query
)。 - If-Else 节点:判断问题类型(通过关键词匹配)。
- RAG 检索节点:针对技术问题检索知识库。
- HTTP 请求节点:针对订单问题调用物流 API。
- 变量聚合节点:合并知识库结果和物流信息。
- LLM 节点:生成最终回复。
- 开始节点:接收用户输入(
关键代码片段:
问题分类逻辑:
if (user_query.includes("技术")) { // 触发技术问题分支 } else if (user_query.includes("订单")) { // 触发订单问题分支 }
订单号验证:
if (!/^\d{6}$/.test(order_id)) { // 提示用户重新输入订单号 } else { // 调用物流 API }
四、避坑指南
变量作用域问题:
- 问题:子流程中的变量无法被父流程引用。
- 解决方案:使用全局变量或通过 变量聚合 显式传递数据。
条件分支逻辑混乱:
- 问题:嵌套过多导致难以维护。
- 解决方案:拆分为独立模块(如“问题分类模块”和“订单处理模块”)。
性能瓶颈:
- 问题:频繁调用外部 API 或 RAG 检索导致延迟。
- 解决方案:启用缓存策略或合并多次请求。
五、总结:动态变量与条件分支的核心价值
通过动态变量和条件分支的组合,开发者可以构建高度灵活的 AI 应用,覆盖从简单问答到复杂业务流程的多种场景。无论是多轮对话的上下文管理,还是基于用户输入的动态路由,这些高级技巧都能显著提升应用的智能化水平。
下一步建议
- 实践建议:尝试在实际项目中结合 变量聚合 和 嵌套条件分支 实现复杂逻辑。
资源推荐:
立即体验这些高级技巧,让 Dify 成为您构建 AI 应用的“智能引擎”!