2025年5月

在 Dify 的开发过程中,动态变量条件分支 是构建复杂逻辑的核心工具。通过灵活运用这两者,开发者可以实现多轮对话、分支决策、动态参数传递等高级功能,显著提升 AI 应用的灵活性和智能化水平。本文将深入解析动态变量的高级用法,并结合实战案例展示条件分支的复杂逻辑设计。


一、动态变量的高级用法

动态变量是 Dify 中实现节点间数据传递的关键机制。除了基础的用户变量和系统变量外,开发者还可以通过 变量聚合嵌套引用动态赋值 等方式实现更复杂的逻辑。

1.1 变量聚合:整合多路分支数据

场景:在多分支流程中(如同时查询本地知识库和外部 API),需要将多个分支的输出结果合并后再传递给大模型。

操作步骤

  1. 在流程设计界面中,添加 “变量聚合” 节点。
  2. 将多个分支的输出变量(如 kb_resultapi_result)拖入聚合节点。
  3. 配置聚合规则(如合并为 JSON 数组或字符串拼接)。

代码示例

{
  "combined_data": {
    "knowledge_base": {{kb_result}},
    "external_api": {{api_result}}
  }
}

1.2 嵌套变量引用:动态拼接参数

场景:根据用户输入动态生成 API 请求路径(如 https://api.example.com/{{city}})。

操作步骤

  1. HTTP 请求节点 中,将 URL 配置为动态表达式:

    https://api.example.com/{{user_input}}
  2. 在调试面板中验证变量是否正确替换。

1.3 会话变量与记忆机制

场景:在 Chatflow 中记录用户历史对话内容,实现上下文感知的多轮对话。

操作步骤

  1. LLM 节点 中启用 “记忆” 功能(默认关闭)。
  2. 通过会话变量(如 sys.conversation_id)关联历史对话记录。

代码示例

{
  "history": {{sys.conversation_history}},
  "user_query": {{user_input}}
}

二、条件分支的高级技巧

条件分支(If-Else 节点)允许根据变量值动态执行不同逻辑路径,尤其适合多轮对话或复杂业务流程。

2.1 嵌套条件分支:多层逻辑判断

场景:用户输入的查询类型不同,需执行不同处理流程(如天气查询 vs 订单状态查询)。

操作步骤

  1. 添加第一个 If-Else 节点,判断查询类型:

    if ({{user_query}} contains "天气") {
      // 执行天气查询流程
    } else if ({{user_query}} contains "订单") {
      // 执行订单查询流程
    }
  2. 在子分支中添加嵌套条件(如进一步判断城市或订单号格式)。

2.2 结合 RAG Pipeline 的动态检索

场景:根据用户输入动态选择知识库(如英文文档 vs 中文文档)。

操作步骤

  1. RAG 检索节点 中,通过变量动态设置知识库 ID:

    knowledge_base_id = {{user_language == "en" ? "en_kb_id" : "zh_kb_id"}}
  2. 将检索结果传递给 LLM 生成最终回答。

2.3 多轮对话的分支控制

场景:在 Chatflow 中根据对话轮次(sys.dialogue_count)触发不同行为(如第 1 轮收集用户信息,第 2 轮生成报告)。

操作步骤

  1. If-Else 节点 中配置条件:

    if (sys.dialogue_count == 1) {
      // 提示用户提供信息
    } else if (sys.dialogue_count == 2) {
      // 调用 RAG 生成报告
    }
  2. 通过会话变量存储用户输入的信息供后续使用。

三、实战案例:客服系统的多轮对话设计

需求

构建一个智能客服系统,支持以下功能:

  1. 用户首次输入问题 → 分类问题类型(技术问题/订单问题)。
  2. 技术问题 → 查询知识库并生成解决方案。
  3. 订单问题 → 验证订单号格式 → 若无效则提示重输,若有效则查询物流信息。

实现步骤

  1. 流程设计

    • 开始节点:接收用户输入(user_query)。
    • If-Else 节点:判断问题类型(通过关键词匹配)。
    • RAG 检索节点:针对技术问题检索知识库。
    • HTTP 请求节点:针对订单问题调用物流 API。
    • 变量聚合节点:合并知识库结果和物流信息。
    • LLM 节点:生成最终回复。
  2. 关键代码片段

    • 问题分类逻辑

      if (user_query.includes("技术")) {
        // 触发技术问题分支
      } else if (user_query.includes("订单")) {
        // 触发订单问题分支
      }
    • 订单号验证

      if (!/^\d{6}$/.test(order_id)) {
        // 提示用户重新输入订单号
      } else {
        // 调用物流 API
      }

四、避坑指南

  1. 变量作用域问题

    • 问题:子流程中的变量无法被父流程引用。
    • 解决方案:使用全局变量或通过 变量聚合 显式传递数据。
  2. 条件分支逻辑混乱

    • 问题:嵌套过多导致难以维护。
    • 解决方案:拆分为独立模块(如“问题分类模块”和“订单处理模块”)。
  3. 性能瓶颈

    • 问题:频繁调用外部 API 或 RAG 检索导致延迟。
    • 解决方案:启用缓存策略或合并多次请求。

五、总结:动态变量与条件分支的核心价值

通过动态变量和条件分支的组合,开发者可以构建高度灵活的 AI 应用,覆盖从简单问答到复杂业务流程的多种场景。无论是多轮对话的上下文管理,还是基于用户输入的动态路由,这些高级技巧都能显著提升应用的智能化水平。


下一步建议

立即体验这些高级技巧,让 Dify 成为您构建 AI 应用的“智能引擎”!