引言
你搭好了客服机器人,接了GPT-4或者DeepSeek的API,Prompt调了好几版,RAG也接上了。试了试,用户问"订单怎么还没到",它能回答出来。用户问"产品怎么用",它也能答个七七八八。
能用,但有几个绕不过去的问题。
第一是数据合规。企业客户的数据不能出内网,不能交给第三方API。尤其金融、医疗、政务这些行业,监管明确要求数据不出域。API这条路,合规上就走不通。
第二是成本控制。API调用是按token收费的,每天几千次对话,账单跑起来很快。日活上去之后,这个成本会越来越高。
所以不是API模型不够强,Prompt和RAG也确实能解决大部分问题。但合规和成本这两个硬约束,把很多企业推向了微调这条路。自己微调一个7B的模型部署在内网,数据不出域,合规过关。前期有训练成本,但跑起来之后,边际成本远低于按量计费的API。用量越大,省得越多。
解决了"为什么微调"之后,下一个问题是:数据从哪来?
微调的效果,70%取决于数据质量。模型权重是公开的,算法是现成的,算力租得到。唯独数据,得自己搞定。
下面讲三种获取数据的方式。
场景设定
假设你在一家电商平台做AI客服。用户问题五花八门,有查订单的、问产品的、投诉售后的、报技术故障的。对话有长有短,用户可能一句话说清楚,也可能绕了半天才说到正题。
你需要一份覆盖这些场景的数据集去微调模型。
历史客服对话记录
如果你所在的公司已经跑了一段时间的客服业务,聊天记录、工单、邮件里躺着大量真实对话。这些是最值钱的东西。
真实用户怎么问、真实客服怎么答、对话怎么推进、有哪些坑------合成数据永远给不了你这些。
拿到数据之后,要做几件事。
脱敏。把姓名、手机号、订单号、身份证号全部替换掉,不然合规这关就过不去。
切分。一个会话可能聊了十几轮,中间用户可能换话题。你要把完整的对话轮次切出来,保持上下文连贯。
去重和过滤。纯表情、乱码、单方面辱骂、客服只会说"稍等"------这些没用,筛掉。
聚一下类。用户问"东西在哪"、"快递怎么还没到"、"什么时候送来",其实是同一个意思。把这类意图归拢,能让数据覆盖更均衡。
这条路适合手里已经有数据的人。成本最低,因为数据是现成的,只需要投入清洗的人力。长期运营中,这是最稳定可靠的数据来源。
Dify RAG 系统临时采集
如果你没有历史数据,但有文档------产品手册、FAQ、技术说明------那可以走这条路。
思路很简单:先用最好的模型搭一个RAG系统,放出去跑一段时间,收集用户的问题和这个高级模型给出的答案。
Dify是个现成的工具,模型管理、知识库、RAG流水线都给你配好了,你只需要把文档导进去,接上GPT-4或者DeepSeek-V3的API,上线跑一两周。
跑完之后你会得到一批东西:真实用户问的问题(这个你自己造不出来),以及当前最好的模型给出来的高质量回答(这个普通模型也写不出来)。
然后把这些数据格式化成微调需要的格式,拿去训练你自己的小模型。
这条路的核心成本是API调用费。你相当于花钱买了一批高质量的训练数据,同时验证了业务流程的可行性。适合预算允许、需要快速拿到高质量数据的团队。
Easy Dataset 文档生成
前两种都走不通的话,还有一种兜底方案:完全靠合成。
Easy Dataset 是一个图形化的数据生成工具。你把产品文档、技术手册、FAQ之类的文件丢进去,它会自动分段,调用大模型从每个段落里抽问题、抽答案,最后给你导出一份完整的微调数据集。
整个过程点鼠标就能完成,不需要写代码。
安装完之后创建一个项目,配置一下模型API,上传文档,点击自动提取问题,再点击自动生成数据集,最后导出JSON文件。没了。
这条路成本最低,只需要付一点API调用费就能跑出大批量数据。最快几小时就能从零拿到一批可用数据。缺点是合成数据终究不如真实对话来得自然,有些边缘情况可能覆盖不到。但作为冷启动阶段的方案,够用了。
Alpaca 与 ShareGPT 数据格式
无论数据从哪来,最后都得喂给训练框架。LLaMA Factory是目前最主流的微调框架之一,它支持两种数据格式:Alpaca和ShareGPT。
Alpaca 格式
Alpaca格式结构简单,适合单轮问答场景。
json
[
{
"instruction": "用户说:我的订单怎么还没到?请以客服身份回应。",
"input": "订单号:ORD20240815001",
"output": "您好,非常抱歉给您带来不便。正在为您查询......您的订单已于今日上午10:30由快递员派送,预计今天内送达。",
"system": "你是一个专业、礼貌的电商平台AI客服助手。"
}
]
字段就四个:instruction是指令,input是额外信息,output是预期回答,system是系统提示词。
如果你的数据都是单轮问答,用这个格式就够。
ShareGPT 格式
ShareGPT格式支持多轮对话,靠conversations列表来记录完整的对话轮次。
json
[
{
"conversations": [
{"from": "human", "value": "我的订单怎么还没到?"},
{"from": "gpt", "value": "请问您的订单号是多少?"},
{"from": "human", "value": "ORD20240815001"},
{"from": "gpt", "value": "您的订单已于今日上午派送,预计今天内送达。"}
],
"system": "你是一个专业、礼貌的电商平台AI客服助手。"
}
]
human是用户,gpt是助手,按顺序排下去就行。
如果你的场景大量涉及多轮沟通,用ShareGPT更合适。单轮为主的话,Alpaca就够。
LLaMA Factory 配置
数据准备好之后,在data/dataset_info.json里加一条配置。
Alpaca格式这样配:
json
{
"web_customer_alpaca": {
"file_name": "web_customer_alpaca.json",
"formatting": "alpaca"
}
}
ShareGPT格式这样配:
json
{
"web_customer_sharegpt": {
"file_name": "web_customer_sharegpt.json",
"formatting": "sharegpt",
"tags": {
"role_tag": "from",
"content_tag": "value",
"user_tag": "human",
"assistant_tag": "gpt"
}
}
}
然后启动训练时加上--dataset web_customer_alpaca就行了。
怎么选
| 维度 | 历史对话 | Dify RAG采集 | Easy Dataset |
|---|---|---|---|
| 数据真实性 | 最高 | 问题真实,答案合成 | 完全合成 |
| 数据质量 | 依赖清洗 | 最高 | 取决于文档质量 |
| 金钱成本 | 低 | 高 | 低 |
| 人力成本 | 高 | 中 | 低 |
| 时间效率 | 慢 | 中 | 快 |
| 隐私风险 | 高 | 低 | 无 |
起步阶段先用Easy Dataset跑一批基础数据出来,让模型快速具备领域常识。然后搭Dify跑一两周,用高质量问题答案补充数据集。长期的话,持续积累真实客服对话,那才是最好的数据来源。
总结
微调这件事,算法和算力都不是瓶颈,数据才是。
三种数据来源,各有用处。有历史对话就用历史对话,有文档就上Dify采集,什么都没有就靠Easy Dataset合成。格式方面,单轮用Alpaca,多轮用ShareGPT。
最终目标是一样的:在满足数据合规要求的前提下,用可控的成本,让模型从"通用工具"变成"你的人"。