手搓企业智能客服问答智能体-基于Dify的工作流实战

24 阅读11分钟

手搓一个企业智能客服问答智能体:基于 Dify 的工作流实战

用一套「意图分流 + 多知识库检索 + 大模型生成」的工作流,把散落在几十份产品文档里的客服知识,变成 7×24 小时在线的智能客服。

引言:客服的痛点,不只是"人多"

做过企业客服的都清楚,最难的不是"回答问题",而是这三件事:

  1. 知识散:产品手册、售后话术、常见故障文档、各产品线资料,散落在不同人手里、不同文件夹里
  2. 新人慢:一个客服要熟记几百条问答,培训周期长,离职率高
  3. 在线时间有限:客户不分工作日与节假日地提问,客服却要上下班

传统做法是"整理一份 FAQ 文档 → 客服照着答",本质还是人肉检索。而用 Dify 搭一个智能客服智能体,核心就是把"检索 + 组织答案"这两步交给大模型完成,客服只需要处理那些真正需要人判断的事。

这篇文章完整记录我"手搓"这个映美云打印平台智能客服工作流的过程——从整体架构到每个节点的设计取舍,以及踩过的坑。


一、整体架构:五个节点,两条分支

这个智能客服工作流不长,但结构非常清晰。整体链路如下:

                         ┌──────────────────┐
用户提问 ──▶ ┌────────┐  │  直接回复(人工)   │
             │ 开始   │─▶│  客服热线话术     │
             └───┬────┘  └──────────────────┘
                 │              ▲
                 ▼              │ IF: query 含"转人工"/"人工"
           ┌──────────┐         │
           │ 条件判断  │─────────┤
           └────┬─────┘         │
                │               │
                │ ELSE          │
                ▼               │
           ┌──────────┐         │
           │ 知识检索  │         │
           │ (6个知识库)│         │
           └────┬─────┘         │
                ▼               │
           ┌──────────┐         │
           │   LLM    │         │
           │ DeepSeek │         │
           └────┬─────┘         │
                ▼               │
           ┌──────────┐         │
           │ 直接回复 2│◀────────┘
           │ (生成答案)│
           └──────────┘

核心思路只有一句话:先用一组确定性的关键词规则把"要转人工"的请求挑出来,剩下的全部走"知识库检索 + 大模型生成"。

这样做的好处是——把"最贵的"和"最便宜的"分开处理:

分支触发条件处理方式成本
人工分支用户明确要"转人工"直接回复固定话术几乎为零(不调模型、不检索)
问答分支其余所有问题检索知识库 → LLM 生成一次检索 + 一次 LLM 调用

二、逐节点拆解

2.1 开始节点:接住用户的原始问题

工作流的入口,只接收一个变量就够了:

  • sys.query(String)——用户的原始提问

不额外设计复杂变量,原因是这是个纯问答型客服,输入信息已经足够。保持入口简洁,后面所有节点都基于 sys.query 做文章。

2.2 条件判断:一句话决定"转人工"还是"问知识库"

这是整个工作流最前面、也是最关键的"分流阀"。

条件设置(IF / ELSE 结构):

IF   query 包含 "转人工"  → 走人工分支
IF   query 包含 "人工"    → 走人工分支
ELSE                      → 走知识检索分支

为什么用关键词匹配,而不是让大模型去分类?

这是我在设计时反复权衡后定下的方案,理由有三个:

  1. 快:条件判断是毫秒级的,而一次 LLM 意图分类要几百毫秒到几秒
  2. 省:转人工这部分请求根本不消耗 token
  3. 准:像"转人工""人工客服"这种诉求,表达高度固定,关键词匹配的准确率不比大模型差

踩过的坑:关键词一定要列全。

一开始我只写了"转人工",结果用户输入"我要找人工""人工客服在吗""转接人工"就全部漏判、被丢进知识库去检索,答非所问。后来把关键词补成"人工"这种更宽泛的词,覆盖度立刻上来了。

一句话经验:关键词覆盖宁可宽一点,因为"误转人工"的代价只是给个电话,而"漏转人工"的代价是客户被机器反复答非所问。

如果以后关键词越来越多、规则越来越绕,可以在这个节点后面再加一个 LLM 意图分类节点做兜底——但一开始真没必要,别过度设计。

2.3 直接回复(人工分支):一个干净利落的兜底

人工分支不玩花的,直接给出客服热线:

请问您是希望联系人工客服吗?
请拨打映美客服热线联系我们:
📞 400-930-8899 或 0750-6391888

感谢您的耐心等待,祝您使用愉快!

这个节点看似简单,但它是整个客服体系的"安全阀"。

一个智能客服无论做得多好,都一定会遇到答不上来、或者客户就是想要人的情况。预留一个"随时可转人工"的出口,比把知识库做得更全更重要——它决定了客户在最坏情况下的体验下限。

2.4 知识检索:一个节点挂六个知识库

进入问答分支后,第一个节点就是知识检索(Knowledge Retrieval)。

查询变量:sys.query,直接拿用户的原始提问去检索。

知识库配置——这里是这个工作流的核心资产。我没有把公司所有文档塞进一个大库,而是按产品线 / 用途拆成了多个知识库,一次检索时联合挂载:

知识库内容
彩色标签打印机问题与解答文档主打产品线的 FAQ
云打印开放平台开放平台对接文档
映美售后质保常用语售后话术标准化
数码产品知识库数码产品资料
拉式仓库知识库仓储/物流相关知识
映美美的产品合作/关联产品资料

为什么要拆成多个库,而不是合成一个?

这是我在实践中总结的经验:

  • 维护隔离:某个产品线文档更新,只动它自己的库,不影响其他库
  • 检索精度:分库后可以针对不同库设置不同的检索参数和切片策略
  • 权限清晰:不同部门管理各自的库,职责明确
  • 可扩展:新上一个产品线,加一个库就行,不用重构整个库

检索参数建议:

  • TopK:先设 3~5,观察召回情况再调。设太大容易把无关内容带进上下文,反而干扰大模型
  • Score 阈值:建议开启,过滤掉相关度过低的片段。宁可不答,也别拿低质内容硬答
  • Rerank:如果知识库多了、召回噪音大,加一个重排序模型能明显提升命中率

2.5 LLM 节点:让模型"看着资料回答"

检索到的知识片段,连同用户问题一起,喂给大模型生成答案。

模型选择:DeepSeek-R1-Distill-Qwen

这里我选的是 DeepSeek 的蒸馏版本,而不是满血版大模型,理由是:

  • 客服问答是有资料可依的任务,不需要模型有超强推理能力,够用即可
  • 蒸馏模型延迟更低、成本更低,客服场景对响应速度敏感
  • 免费/低价额度充足,适合高频调用

提示词(Prompt)设计要点:

你是映美公司的专业智能客服,负责解答用户关于产品、售后、技术对接的问题。

请遵循以下规则:
1. 优先基于「知识库上下文」回答,不要凭空编造
2. 如果知识库上下文里找不到答案,不要硬答,请引导用户转人工客服
3. 回答要专业、简洁、有条理,涉及步骤时分点说明
4. 涉及价格、承诺类问题,请谨慎,引导联系人工确认
5. 语气礼貌,符合企业客服形象

【知识库上下文】
{{context}}

【用户问题】
{{sys.query}}

这段 Prompt 里最关键的一条是第 2 条:明确告诉模型"找不到就说不知道,引导转人工"。这是防止大模型幻觉的第一道防线——比起让它自信地胡编一个答案,宁可让它坦率地说"这个我帮您转人工"。

2.6 直接回复 2:把答案还给用户

最后一个节点,输出 LLM 节点的返回文本 {x: text}。

到这里,一条完整的客服问答链路就跑通了。


三、知识库这口"井",要提前挖好

智能客服的效果,70% 取决于知识库的质量,模型和编排只占 30%。这部分虽不在工作流画布上,但必须单独讲。

1. 文档清洗

原始文档里往往有页眉页脚、目录、水印、无关的修订记录。这些噪音进到切片里,会污染检索结果。先把"给人看的文档"处理成"给机器看的文档",再上传。

2. 切片策略

不是所有文档都适合一个切片大小:

  • FAQ / 问答类:按"一问一答"切,一个切片就是一条完整问答
  • 操作手册类:按"步骤/小节"切,保证一个切片内的逻辑自洽
  • 长文档:适当重叠切片(overlap),避免答案正好被切断

3. 命名与元数据

知识库名称要能自解释(比如"映美售后质保常用语"就比"常用语2"好得多)。有条件的话,给文档打上产品线、版本等元数据标签,后续可以做更精细的检索路由。

4. 持续更新

客服知识是活的。建议建立一个固定节奏:每月复盘一次"大模型答不上来的问题",把新问题补充进知识库。这个闭环,才是智能客服越来越聪明的真正原因。


四、几个关键设计决策复盘

① 分流放在最前面,而不是让模型判断一切

很多人的第一反应是"让大模型判断用户要不要转人工"。我把它放到了工作流最前端,用确定性的条件判断先做粗筛——能用规则解决的,就别交给模型。省时、省钱、还更稳。

② 兜底比完备更重要

不管是"转人工"的分流,还是 Prompt 里"找不到就引导人工"的约束,本质都是在设计失败路径。一个没有兜底的智能客服,遇到知识盲区就会胡说八道;而一个兜底做好的智能客服,最差也只是"礼貌地让你打电话",体验下限是有保障的。

③ 拆库,别贪大

知识库不是越大越好。精准、干净、分区明确的小库,效果远好于一个什么都往里塞的大库。


五、踩过的坑

坑现象解决
关键词漏判"找人工""转接人工"没被识别,被丢去检索放宽关键词,覆盖所有"人工"相关表达
检索到无关内容大模型拿着不相关的片段硬答开启 Score 阈值,调小 TopK,必要时加 Rerank
幻觉知识库没有的问题,模型自己编答案Prompt 里强约束"找不到就转人工"
文档噪音页眉页脚进了切片,稀释了有效信息上传前清洗文档
知识库过时答的是旧产品的旧参数建立月度知识库更新机制

六、下一步可以怎么扩展

这套工作流跑通后,扩展空间很大:

  1. 转人工接工单:人工分支不只是给电话,还可以自动创建工单/发飞书通知,把"转人工"变成"留痕的任务"
  2. 多轮澄清:用户问题太模糊(如"打不出来")时,先反问"请问是哪款机型?",再检索
  3. 工具调用(Agent 化):接入订单查询、物流查询等 API,让客服能查实时数据,而不只是答文档
  4. 数据回流:把用户问题和命中情况记录下来,形成"高频未解决问题"看板,反哺知识库建设
  5. 图文并茂:产品类问题常常"一张图胜千言",可以让模型在回答里带示意图、截图(这也是我这个客服版本正在做的方向)

七、总结

回头看,这个企业智能客服工作流的精髓,其实就三句话:

  1. 规则归规则,模型归模型——确定性的事用条件判断解决,开放性的答案用大模型生成
  2. 知识库是根,工作流是干——把知识库这口井挖好,整棵树才长得好
  3. 永远留一条转人工的路——兜底做扎实,体验才有下限

整个工作流只有五个节点,一天之内就能搭出第一版。真正的功夫,不在画布上的连线,而在画布外的那些产品文档里。

先用最少的节点跑通闭环,再一点点把它养聪明——这就是"手搓"一个企业智能客服的全部方法论。


本文工作流基于 Dify Chatflow 搭建,模型使用 DeepSeek-R1-Distill-Qwen,知识检索挂载多个产品线知识库。


下期预告

下期我将介绍如何多轮澄清客户问题,引导客户正确描述问题,以及 Dify 知识库的详细建立过程。