Dify 企业级应用案例
02
电商售前售后客服(查单 / 退款 / 咨询三分支)
Chatflow + 自定义工具难度 ★★★
意图分类分流 + API 工具调用,一个入口覆盖售前售后全链路:订单类请求自动查真实数据,LLM 只做提取与话术包装,不编造订单状态。
解决什么问题
客服需要同时处理三类请求:商品咨询(答知识库)、订单查询(要查业务系统)、退款申请(要调业务接口写数据)。纯 RAG 客服只能答第一类,后两类仍要人工。
方案价值
- 意图分类分流 + API 工具调用,一个入口覆盖售前售后全链路
- 订单类请求自动查真实数据,LLM 只做提取与话术包装,不编造订单状态
- 阿里云官方方案同款架构,可平移到任何有 API 的业务系统(ERP/CRM/OA)
架构与节点流程
开始→意图识别(问题分类器)├─ query_order 查订单LLM 提取订单ID→工具:查询订单→LLM 组织回答→直接回复├─ apply_refund 退款LLM 提取订单ID→工具:查询订单→LLM 分析退款原因→工具:创建退款→LLM 整理结果→直接回复└─ other 商品咨询知识检索(商品库)→LLM 回答→直接回复
依据:阿里云官方方案《搭建对话流(Chatflow)AI 电商客服助手》,节点与分支逻辑与其手动搭建路径一致。
搭建步骤
1
创建商品知识库
知识库 → 创建知识库 → 导入已有文本,上传商品介绍文档。参数:分段通用 / 索引高质量 / Embedding:text-embedding-v4 / 检索:混合检索。召回测试验证商品参数问答准确。
2
创建两个自定义工具(对接业务 API)
工具 → 自定义 → 创建自定义工具,用 OpenAPI(Swagger) Schema 定义。鉴权:请求头 / Bearer / Authorization(值 test123 为示例,生产换成动态 token 并限制来源 IP)。
自定义工具 · OpenAPI Schema(查询订单 + 创建退款)
openapi: 3.0.0
info:
title: 电商客服工具
version: 1.0.0
servers:
- url: http://<你的业务服务器IP>
paths:
/order:
get:
operationId: queryOrder
summary: 查询订单信息
parameters:
- name: orderid
in: query
required: true
schema: {type: string}
description: 12位订单号
/refund:
post:
operationId: createRefund
summary: 创建退款申请
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
orderid: {type: string, description: 12位订单号}
reason: {type: string, description: 退款原因}保存后点「测试」验证两个函数能通。这一步的本质:把任意已有 REST API 包装成 Dify 节点可调用的工具——换成你们公司的订单/工单/ERP 接口即可复用整个案例。
3
创建 Chatflow 与意图识别
新建 Chatflow,删掉默认节点,添加问题分类器:模型 qwen-max(或同级),开启记忆与记忆窗口,分类:
问题分类器 · 分类与说明
query_order 用户想查询订单状态、物流、发货进度 → 输出 query_order apply_refund 用户想申请退款、退货、售后 → 输出 apply_refund other 商品咨询、参数比较、其他问题 → 输出 other 说明:需结合历史对话上下文判断;一句话里同时有退款和查单时, 按用户最终目的分类(如"不要了,把钱退我"= apply_refund)。
4
query_order 分支:提取订单号 → 查单 → 作答
- LLM「识别订单ID」(温度 0):从
sys.query提取订单号,输出约束写在提示词里:
LLM · 识别订单ID(查单/退款分支各一个,提示词相同)
任务:从用户输入中提取订单号。
规则:
1. 订单号是正好 12 位的连续数字。
2. 只输出订单号本身,不要任何其他文字。
3. 如果用户输入中没有 12 位订单号,只输出:0
4. 如果数字超过 12 位,禁止截断,视为无订单号输出 0。
用户输入:{{#sys.query#}}- 工具节点「查询订单信息」:orderid 选择「识别订单ID → text」输出变量。
- LLM「根据订单信息回答」:上下文取工具返回 text,提示词核心:「你是电商客服,根据查询结果回答订单状态,包含订单号、状态、物流信息;如查询结果为空或无订单号,礼貌请用户提供 12 位订单号。禁止编造未出现在结果中的信息。」
- 直接回复 输出 LLM 文本。
5
apply_refund 分支:五节点串行
- LLM 识别订单ID(同上提示词)
- 工具「查询订单信息」(先查单确认存在)
- LLM「分析退款原因」:「从用户消息提取退款原因,没有则输出『无』。只输出原因短语,不超过 30 字。」
- 工具「创建退款申请」:orderid ← 识别订单ID.text;reason ← 分析退款原因.text
- LLM「整理退款结果」:把接口返回 JSON 转成友好话术(含工单号、预计时效);缺订单号或缺原因时分别提示补充。
- 直接回复
6
other 分支:RAG 商品咨询
知识检索(sys.query → 商品知识库)→ LLM(上下文 = 检索结果;提示词同案例一第 5 步的「只依据资料回答」模板,把「内部助手」换成「电商客服」)→ 直接回复。
7
调试、发布与嵌入
- 预览分别测三类话术:「我的订单 123456789012 发货了吗」/「不要了,退款」/「A67 和 A68 屏幕有什么区别」。
- 发布 → 发布更新 → 运行,拿到 Web 地址。
- 嵌入商城:复制 iframe 代码贴入站点模板;或「访问 API」创建密钥走 RESTful 集成(密钥放服务端,禁止前端明文)。
- 在监控里观察各分支 token 消耗,给工具类分支设置用量告警。
为什么「LLM 提取 → 工具执行 → LLM 包装」要拆三个节点?
让 LLM 直接决定调工具(Agent 模式)虽然省事,但订单号提取错误率与幻觉率都更高;拆开后每步输出可单测、可审计,这是生产级 Chatflow 与 demo 的分水岭。
坑
① 写操作(退款)接口务必在业务侧加幂等与二次校验,LLM 提取的 orderid 可能格式合法但不存在;② 高峰期给工具接口设限流;③ 业务 API 用内网地址 + 网关鉴权,不要暴露公网无鉴权。