:条件分支高阶策略——多条件路由如何避免分支爆炸?)
Dify 中级实验15条件分支高阶策略——多条件路由如何避免分支爆炸Dify 实验系列 · 中级 15/20 | 实验编号DIFY-102-16基于 Dify 1.16.1 实测2026-081. 业务场景先讲一个我们实际遇到的场景。一家电商平台的客服系统每天收到几千条用户问题需要自动分流VIP 客户的紧急售后要立刻转人工普通用户的技术咨询走自助服务新用户的简单问题走标准流程。分流依据不是单一条件——客户等级、问题紧急度、问题类型、历史交互次数四个维度叠加判断。他们一开始用「if-else 二选一」的思路搭一个分支判断是不是 VIP另一个分支判断是不是紧急……结果分支越叠越多画布上一团乱麻改一个规则要顺着十几条线找半天还老是漏掉某些输入组合——那些用户请求没有匹配到任何分支直接卡死在流程里。我们第一次接这类需求时第一反应也是「多画几个 if-else 分支不就行了」。真正画到第三个维度才发现——分支会爆炸组合数量是各维度取值的乘积画布根本放不下改一个规则要顺着十几条线找半天。这不是个例。任何「多个维度叠加、需要按综合情况路由」的场景都是这个模式售后工单按紧急度客户价值分流、营销活动按用户画像行为分流、审批流按金额角色分流——「二选一」的条件分支根本写不下多维判断分支会爆炸。2. 场景痛点这个流程的痛点在客服分流系统的迭代过程中体现得最直接if-else 写不下多维判断4 个维度、每个维度 3-4 个取值组合起来几十种情况全用条件分支表达画布根本放不下配置工作量失控。分支爆炸、改不动规则散落在几十条分支里改一个判定标准要动十几处牵一发动全身业务方提需求没人敢接。漏掉组合就死路总有一些输入组合没被任何分支覆盖请求静默卡死——用户发完问题毫无响应客诉直接升级。决策逻辑和路由逻辑混在一起算分、比较、兜底全埋在分支条件里可读性差出问题不知道从哪查起。本质上问题不在「要不要分支」而在「决策和路由该不该混在一起」——复杂决策应该收敛到代码里分支节点只做纯粹的路由分发。3. 方案为什么是评分制路由 条件分支Dify 工作流里解决多维路由的标准姿势是「代码节点做决策算分条件分支只做路由按分数分发」——本实验用「评分 条件分支」的组合搭一个智能客户分流系统。选它的理由决策逻辑收敛四个维度按权重打分全部写在一个代码节点里改规则只改一处分支保持纯粹分支数量可控分数算出来只有 4 个档位转人工/优先队列/自助服务/标准流程分支从「几十条组合」降为「4 个 case」默认回退兜底评分代码里留 else 分支任何输入组合都有去处杜绝「请求卡死无输出」。这篇文章我们就用它搭一个「智能客户分流系统」每个客户请求按客户等级、问题紧急度、问题类型、历史交互次数四个维度打分路由到转人工/优先队列/自助服务/标准流程四个分支之一。4. 整体架构case_human转人工case_priority优先队列case_self自助服务case_normal标准流程开始4 个维度变量优先级评分路由Code加权评分 → route/reason/priority_score路由分流IF-ELSE4 个 case通知客服并记录工单Code生成安抚回复LLM结束VIP专属回复LLM排队信息计算Code结束FAQ自助检索知识库自助回答LLM结束标准回复LLM结束链路很清晰入口收 4 个维度变量 → 代码节点加权算分 → IF-ELSE 按分数四路分发 → 各分支独立处理收尾。整条链路 14 个节点、13 条边四个分支互不干扰、各自独立收尾——关键设计就是「分数收敛、路由纯粹」。5. 模块设计5.1 开始节点interaction_count必须用number类型——如果图省事用 text-input传进来是字符串评分代码里12 10直接抛TypeError-label:客户等级options:[vip,normal,new]required:truetype:selectvariable:customer_level-label:历史交互次数required:truetype:numbervariable:interaction_count5.2 评分路由节点Code核心四个维度按权重打分等级最高 30、紧急度最高 40、类型 10-20、历史交互加减分决策逻辑全部收敛在这个节点下游分支只认route字符串defmain(customer_level:str,urgency:str,issue_type:str,interaction_count:int)-dict:importjsontry:countint(interaction_countor0)exceptException:count0score0level_scores{vip:30,normal:15,new:10}scorelevel_scores.get(customer_level,0)urgency_scores{emergency:40,general:20,inquiry:5}scoreurgency_scores.get(urgency,0)type_scores{tech:10,after_sale:20,business:15}scoretype_scores.get(issue_type,0)ifcount10:score10elifcount0:score-5elifcount3andissue_typeafter_sale:score15ifscore60:route,reasonhuman_agent,高优先级总分超过阈值elifscore40orcustomer_levelvip:route,reasonpriority_queue,中等优先级或 VIP 客户elifurgencyinquiry:route,reasonself_service,简单咨询自助服务else:route,reasonnormal_queue,标准流程处理# 兜底任何组合都有去处breakdown{level_score:level_scores.get(customer_level,0),urgency_score:urgency_scores.get(urgency,0),type_score:type_scores.get(issue_type,0),history_bonus:score-level_scores.get(customer_level,0)-urgency_scores.get(urgency,0)-type_scores.get(issue_type,0)}return{priority_score:score,route:route,reason:reason,max_score:100,breakdown_json:json.dumps(breakdown,ensure_asciiFalse)}注意最后一行评分明细用breakdown_jsonstring输出而不是 object——Dify 的 object 类型在节点间不可见要留给后续节点查看就必须展平成 JSON 字符串。5.3 路由分流节点IF-ELSE四个 case 全部显式声明每个 case 一条条件字符串比较用iscases:-case_id:case_humanconditions:-comparison_operator:is# ⚠️ 字符串比较必须用 is不是 value:human_agentvariable_selector:[cd_route,route]logical_operator:and-case_id:case_priorityconditions:-comparison_operator:isvalue:priority_queuevariable_selector:[cd_route,route]logical_operator:and# Dify 中级实验15条件分支高阶策略——多条件路由如何避免分支爆炸6. 运行验证用实验文档的 5 组用例实测点击「运行」填 4 个维度变量输入组合期望路由实测结果VIP 紧急 售后human_agent评分 30402015105转人工 ✓normal 一般 技术normal_queue评分 15201045 60 且非 VIP标准流程 ✓normal 一般 咨询self_service评分 40非 VIP 且是咨询自助服务 ✓new 紧急 售后priority_queue评分 104020-565超过 60 转人工看具体分数VIP 咨询 首次priority_queue评分 30510-540VIP 直接进优先队列 ✓日志里核对每个场景的priority_score、route、reason确认决策链路符合预期。7. 实战坑坑现象修复多分支各自接 End 节点时 variable 重名四个 End 输出都叫reply校验报变量重复每个分支 End 的 variable 加后缀reply_ha/reply_pq/reply_ss/reply_nq跨节点唯一字符串条件用比较Pydantic 校验报错「Input should be ‘contains’…」字符串用is数字比较才用且≥/≤必须用 Unicode 符号会报错交互次数变量用 text-input代码里12 10报TypeError: not supportedstart 变量用 number 代码内int()防御转换双保险分支条件漏了兜底 case部分输入组合走到死路无输出四路 case 全量声明最后一个 case 永远留给默认路径评分制里就是 else 分支评分明细用 object 输出下游节点引用breakdown.level_score取不到值object 展平为breakdown_json字符串需要时 json.loads采坑点均来自本实验 DSL 生成与运行验证的真实记录多 End 变量重复、Unicode 运算符、number 类型、object 展平。8. 实验文档及源码获取实验文档完整操作步骤DIFY-16条件分支高阶策略.md源码可直接导入dify102_16_智能客户分流系统.ymlDSL 目录dify-102/dsl/文章聚焦核心配置与采坑点实验文档还包含多级嵌套分支、动态条件路由规则表下放、A/B 测试分流三个进阶实验的完整分步操作。下一篇Dify 中级实验16错误处理与降级——工作流如何有尊严地失败 你在这个实验的场景里踩过什么坑欢迎评论区分享你的实战经验。