智能客服SFT和DPO的运用场景
两个问题都非常有价值,直接回答:
问题 1:真实电商场景,大部分问答应该走 RAG,SFT 主要做意图分类?
你的判断基本正确,但更准确的说法是两者分工不同。
真实电商客服系统的架构通常是这样的:
用户输入
↓
意图识别(分类器 or LLM)
↓
├─ 意图=查订单状态 → 调接口,走 RAG 把实时数据注入 prompt
├─ 意图=查物流 → 调接口,走 RAG
├─ 意图=退款进度 → 调接口,走 RAG
├─ 意图=投诉/情绪 → 走 LLM 生成(需要有温度的回答)
├─ 意图=政策咨询 → 走知识库 RAG(退换货政策、活动规则)
└─ 意图=闲聊/复杂 → 走 LLM 生成
SFT 在这里教的核心能力有三件事,不只是意图分类:
| SFT 教的能力 | 说明 | 这个项目里的体现 |
|---|---|---|
| 风格/人设对齐 | 学会"小智"的口吻,专业友好简洁,不说废话 | 所有回答的语气风格 |
| 槽位提取与追问 | 用户没给订单号时,知道主动要 | "请提供一下订单号" |
| RAG 结果的组织能力 | 拿到接口返回的数据后,怎么用自然语言包装成友好回复 | 订单状态/物流查询的回答模板 |
本项目的数据是简化版——直接把"查询结果"硬编码进了回答里(比如
"订单 SO202581971316 还未发货"),真实生产中这个信息来自接口调用,模型只负责把结果"说好"。SFT 教的是"如何把实时数据转化为自然语言"这个能力。
问题 2:SFT 和 DPO 的数据看起来没本质区别,到底有什么区别?
表面上看确实很像,但训练目标完全不同,这是根本区别。
看数据的角度
随机拿同一个场景对比一下:
SFT 数据(退款慢):
user: "退款10天了还没到账,什么情况?"
assistant: "理解您着急的心情!退款已提交银行...如超过7个工作日联系我..."
DPO 数据(退款慢):
prompt: "申请退款10天了还没处理"
chosen: "10天确实太久,我马上帮您升级处理,标记紧急工单..."
rejected: "退款需要时间,请耐心等待。"
SFT 数据只告诉模型"遇到这种问题,要这样回答"——一个答案,没有对比。
DPO 数据告诉模型"这两个回答,左边的比右边的好"——两个答案,有对比。
训练目标的本质区别
SFT 的目标:
最大化"正确回答"的生成概率
→ 模型学会"应该说什么"
DPO 的目标:
最大化 chosen 和 rejected 的概率差距
→ 模型学会"什么叫更好"
SFT 之后,模型可能会生成"技术上正确但态度冷漠"的回答——因为它只学了"什么是对的答案",没有学"为什么这个比那个好"。
DPO 之后,模型在相同场景下会更主动、更有温度、更愿意给方案——因为它看过大量对比,知道"退款需要时间请等等"是差回答。
什么情况下只用 SFT,什么情况下加 DPO
| 场景 | 建议 |
|---|---|
| 模型完全不懂这个领域(冷启动) | 先做 SFT,教会基本知识和格式 |
| 模型知识够了,但语气/风格不对 | SFT 微调风格即可 |
| 模型回答"正确但不好"——敷衍、冷漠、被动 | 加 DPO,教"什么叫更好" |
| 有大量真实用户反馈数据(点赞/踩) | 直接构造 DPO 偏好对,价值极高 |
| 模型有安全/价值观问题 | 必须用 DPO/RLHF,SFT 不够用 |
一句话总结:SFT 是"教技能",DPO 是"建价值观"。这个项目先用 SFT 教模型当客服,再用 DPO 教它什么叫"好客服"。两步缺一不可——没有 SFT 打底,DPO 的 chosen 里有大量模型根本不懂的领域知识,学不进去;没有 DPO,模型回答虽然正确,但用户体验会明显差一截。
总结
| 能力 | 能否用 DPO 替代 SFT | 条件 |
|---|---|---|
| 风格/人设对齐 | ✅ 能,但有条件 | 基座模型要够强(32B+),小模型不行 |
| 槽位提取与追问 | ⚠️ 很难 | DPO 不擅长教"全新行为",只擅长优化已有行为 |
| RAG 结果组织能力 | ❌ 不能 | 格式映射必须靠 SFT 示范,DPO 解决不了 |
一句话:SFT 是"从无到有",DPO 是"从有到优"。用 DPO 替代 SFT,相当于让一个没上过学的人直接参加优秀毕业生评比——连基础都没有,评比就没有意义了。

浙公网安备 33010602011771号