← 返回文章列表

Dify 中级实验(02):问题分类器——智能路由引擎如何四路分发?

1. 业务场景

先讲一个我们实际遇到的场景。

一家做企业 SaaS 的公司,客服团队每天要处理几百条用户消息:有人问「API 返回 500 错误怎么办」——这是技术问题;有人问「你们报价多少」——这是商务问题;有人喊「我要退货」——这是售后问题。所有消息涌进同一个入口,客服要先读懂、再判断、再手动转给对应团队,高峰期消息排队,用户越等越急。

我们第一次接这类需求时,第一反应也是「写一组关键字规则,命中哪个算哪类」。真正动手才发现——用户的话千奇百怪,「我要退货!」和「东西坏了想退掉」没有一个字是一样的,规则永远追着新说法跑。后来翻 Dify 的节点列表才发现:平台原生的 Question Classifier(问题分类器) 就是干这个的——LLM 理解语义,按预设类别做多路路由,直接决定后续走哪个分支。

这不是个例。任何「用户问题需要先分类、再走不同流程」的业务场景都是这个模式:工单系统里故障报修要先分给对应运维组,FAQ 导航里用户要先选问题大类,邮件中心里咨询、投诉、合作邮件要先分流给不同部门处理。

2. 场景痛点

这个流程的痛点,在客服团队身上体现得最直接:

本质上,分类这件事没有技术含量,却决定后面所有流程走哪条路——分错一次,整条处理链都跟着错。分类的确定性不该靠每个客服的个人手感,该靠一份可复用的规则。

3. 方案:为什么是问题分类器

选问题分类器的理由,我们实际对比过:

这篇文章我们就用它搭一个「企业智能助手」,四类问题(技术/商务/售后/其他)四路分发,每类走各自的处理流程。

4. 整体架构

graph TD start["开始:user_query"] classifier["问题分类:Question Classifier、4 类"] kb["技术知识库检索"] tech_qa["技术问答"] end_tech["结束"] price["模拟价格查询"] biz["商务接待"] end_biz["结束"] ticket["生成工单号"] aftersale["售后处理"] end_as["结束"] qa["通用问答"] end_other["结束"] start --> classifier classifier -- "tech" --> kb --> tech_qa --> end_tech classifier -- "business" --> price --> biz --> end_biz classifier -- "after_sale" --> ticket --> aftersale --> end_as classifier -- "other" --> qa --> end_other

链路很清晰:入口收问题 → 分类路由 → 四路独立处理。关键点:分类器的边直接用类别 ID 作为 sourceHandle——tech/business/after_sale/other 四条边从分类节点分出去,不需要中间再挂 IF-ELSE。

5. 模块设计

5.1 分类类别配置

classes:

  - id: tech

    name: 技术问题

  - id: business

    name: 商务问题

  - id: after_sale

    name: 售后问题

  - id: other

    name: 其他

5.2 分类指令(instruction)——决定分类质量的灵魂

分类器靠 LLM 理解,指令写得好不好直接决定分类准确率

instruction: |

  对用户的问题进行分类,只能归为以下四类之一:

  - 技术问题(tech):产品技术咨询、代码问题、系统 BUG、API 文档、错误信息

  - 商务问题(business):报价、合同、合作、采购、价格

  - 售后问题(after_sale):退换货、投诉、保修、维修、退款

  - 其他(other):不属于以上三类的任何问题

  只输出类别 ID,不要输出其他内容。

要点:

5.3 分支处理

每个分支独立成链。技术分支(知识库检索)注意:知识库结果传给代码节点参数类型用 list,提取用 item.get("content", "")

def main(results: list) -> dict:

    docs = [r.get("content", "") for r in results if isinstance(r, dict)]

    return {"docs_text": "\n\n".join(f"[{i+1}] {d}" for i, d in enumerate(docs))}

6. 运行验证

四类典型输入实测:

输入 预期分类 结果
「API 返回 500 错误怎么办?」 tech ✅ 走知识库检索 + 技术问答
「你们报价多少?」 business ✅ 走价格查询 + 商务接待
「我要退货!」 after_sale ✅ 生成工单 + 售后处理
「今天天气怎么样?」 other ✅ 通用问答

混合问题(如「API 报错还扣了钱,怎么退」)——分类器会按置信度归入最匹配类别。

7. 实战坑

现象 修复
类别没有示例词表 分类准确率低(「报价」被分到售后) instruction 里每类给 5-8 个示例词
没有 other 兜底类别 无关问题被硬塞进业务类别 加 other 类 + 「不属于以上三类」
分类后接 IF-ELSE 再判断 多一层无谓判断(分类器已给结果) 直接用类别 ID 做出边(sourceHandle)
知识库结果直接给 LLM object 不可见 / 引用格式乱 先代码节点转 docs_text 编号文本

8. 实验文档及源码获取

文章聚焦核心配置与采坑点;实验的完整分步操作(节点搭建/参数表/调试指引)见实验文档原文。

本系列 · Dify 实验 · 中级
  1. Dify 中级实验(01):参数提取器实战——如何从自然语言中提取结构化数据?
  2. Dify 中级实验(02):问题分类器——智能路由引擎如何四路分发?
  3. Dify 中级实验(03):模板转换实战——如何用零 Token 完成文本加工?
  4. Dify 中级实验(04):迭代进阶——如何批量处理数据并守住性能边界?
  5. Dify 中级实验(05):并行执行——如何让多路任务同时跑?
  6. Dify 中级实验(06):变量聚合——如何确定性合并多路分支结果?
  7. Dify 中级实验(07):子工作流——如何把公共逻辑做成可复用积木?
  8. Dify 中级实验(08):代码节点进阶——如何用标准库处理文件与数据?
  9. Dify 中级实验(09):HTTP 节点进阶——如何搞定认证、分页与错误重试?
  10. Dify 中级实验(10):知识库深度调优——如何科学评估检索质量?
  11. Dify 中级实验(11):高级 RAG 流水线——如何搭建多路检索与精排?
  12. Dify 中级实验(12):Agent 深度配置——如何让智能体自主调用工具?
  13. Dify 中级实验(13):多 Agent 协作——如何编排多个智能体分工干活?
  14. Dify 中级实验(14):对话变量与状态管理——如何让工作流记住多轮对话的状态?
  15. Dify 中级实验(15):条件分支高阶策略——多条件路由如何避免分支爆炸?
  16. Dify 中级实验(16):错误处理与降级——工作流如何有尊严地失败?
  17. Dify 中级实验(17):调试监控与性能优化——响应慢和 Token 超支如何定位?
  18. Dify 中级实验(18):插件开发入门——如何把工作流变成 Agent 可调用的工具?
  19. Dify 中级实验(19):综合实战——如何把 19 个实验串成一条生产级流水线?
  20. Dify 中级实验(20):综合实战——自动化报告生成流水线如何从数据到周报一步到位?

联系我

15088711270

手机端点击号码可直接拨打 · 桌面端可复制

微信二维码

扫码加微信 · 备注「门户」更快通过