微调数据应该怎么构造?
微调数据应该怎么构造? - 一句话定位
微调数据决定大模型微调效果的天花板。构造一份合格数据集需要走完获取 → 清洗 → 质量控制 → 格式化 → 扩增五步流程,且格式必须与目标模型的能力结构(基础指令 / Function calling / 混合推理)严格对齐。
核心概念(术语表)
- 微调(Fine-tuning):在预训练模型基础上用领域专属数据进行二次训练,让模型在保留通用能力的同时获得特定任务能力,是医疗、法律、金融等垂直领域的标配手段。
- PII(个人识别信息):姓名、身份证号、电话号码等敏感字段,是数据清洗中必须匿名化或移除的核心目标,社交平台迁移数据时尤其关键。
- Alpaca 格式:基础指令微调格式,由 instruction / input / output 三字段构成,结构简单,适合单轮指令任务。
- ShareGPT 格式:多角色多轮对话格式,包含 system / user / assistant 三种 role,支持复杂对话、角色扮演和工具调用场景。
- 特殊标记符(Special Tokens):如
、、``,用于标记消息起止和角色身份,定义存储在模型的 tokenizer_config.json 中,错一字符模型就识别不出边界。 - tool_schema:描述可用工具的 JSON Schema,定义函数名、description、参数类型与必填项,是 Function calling 微调的核心数据载体。
- reasoning_content:模型思考过程字段(如 Qwen3 混合推理),与最终回复分离,训练时通过
<think>...标签包夹呈现。 - CAMEL 数据集(camel-ai/ai_society):托管在 Hugging Face 上的大规模对话数据集,包含约 22.9 万条结构化多轮对话,是角色扮演微调的事实标准素材。
- Llama_factory:统一数据格式转换的开源工具,可将原始数据处理为多种模型特定的微调格式,省去手写转换脚本。
- Dify workflow:LLM 编排工具,可串联 Prompt 生成、数据扩增、质量过滤等节点,自动化构造数据集。
- 数据构造从「凑数量」升级到「匹配模型能力结构」。早期 Alpaca 只需 instruction / input / output 三字段;进入 2024 年后,随着 Qwen3 等模型同时具备 Function calling 与混合推理能力,数据格式必须承载 tool_schema(XML 标签 + JSON)和 reasoning_content(
<think>段),数据构造升级为多能力协同训练。 - 2024 年 12 月,AWS 中国博客发布《炼石成丹:大语言模型微调实战系列(一)数据准备篇》,系统性梳理了「获取 → 扩增 → 清洗 → 质量评估 → 标准化和格式化」全流程。
- 2025 年 7 月,知乎专栏《大模型学习路线(二十二)如何构造微调数据集》聚焦 Qwen3 等新模型,提出针对 Function calling 与混合推理场景的具体数据格式构造方案。
- CAMEL 项目由 Hugging Face 托管,提供约 22.9 万条结构化多轮对话,是角色扮演微调的事实标准数据集。
工作原理 / 核心机制
整体思路:微调数据构造的目标不是堆量,而是让「数据格式、内容分布、信号密度」三者同时匹配目标模型的能力边界和最终任务场景。
输入 / 输出:输入是原始数据(来自互联网、生产、社交平台、公开数据集等),输出是符合目标模型微调脚本格式要求的标准化训练集,通常以 JSONL 或 Parquet 存储。
核心步骤详解:
第一步:数据获取(四条主路径)
- 互联网抓取 + 人工改写:用 Python 的 requests 和 BeautifulSoup 库抓取,社交网站数据标准化、清洗简单;小说网站需做段落分割和对话提取。优点是量大,缺点是清洗繁琐。
- 生产数据 + 人工改写:线上 LLM 回答往往缺乏真实人类对话特征,需重写其中约 30% 的模型拒绝回答样本,并加入情感表达避免「官腔」。典型改写:「我无法回答这个问题,因为它涉及到个人隐私」→「我理解你的好奇心,但这个问题涉及到个人隐私。也许我们可以聊聊别的有趣话题?比如你最近看过什么好电影吗?」
- 现有社交平台数据迁移:使用 WeChatMsg 等开源工具导出聊天记录,但必须处理 PII 信息。
- 公开数据集:Kaggle 托管超 50,000 个公共数据集;亚马逊开放数据平台覆盖公共交通、航天、生态资源;UCI 包含 100+ 按机器学习问题类型分类的标准数据集;CAMEL 含约 22.9 万条结构化多轮对话。
第二步:数据清洗(六类操作)
- 移除或匿名化 PII(姓名、身份证号、电话)。
- 纠正拼写和语法错误(典型代码示例:
teh→the,dont→don't)。 - 去除 HTML 标签、特殊字符和无关内容(含 URL)。
- 过滤广告、垃圾信息等干扰内容。
- 删除无关或重复内容。
- 确保对话的连贯性和逻辑性。
第三步:数据集质量控制(四种方法 × 三个维度)
- 方法:随机抽样人工审核、统计分析(分布 / 长度 / 词频)、小规模测试微调、交叉验证。
- 维度:移除重复和近似重复内容、过滤低质量对话、确保符合法律法规和伦理要求。
- 实操工具:用 pandas 做描述统计(
df.describe()),用 matplotlib 绘制对话长度分布图(50 个 bin),用 Counter 计算词频 Top 10。
第四步:数据格式化和标准化
- 不同模型有特定微调格式,Llama_factory 等工具可统一处理。
- Alpaca 结构简单,适合基础指令微调;ShareGPT 支持更多角色种类,适合复杂对话与角色扮演。
- 标准转换示例:把
user_input/ai_response对转换为 OpenAI 格式的 messages 数组,含 system / user / assistant 三种 role。
第五步:数据扩增(五种传统方法 + 四种 LLM 方法)
- 传统方法:同义词替换、回译、文本生成、上下文扩展、句子重组。
- LLM 方法(尤其适用于角色扮演):
- 基于 Prompt 的数据生成:输入「生成一段医生和病人之间的对话,医生性格温和,病人有些焦虑」,LLM 输出符合要求的对话。
- 对话扩展:把「用户:我今天感觉不太舒服」扩展为带压力源、睡眠、症状、建议的多轮对话(5 轮以上)。
- 场景变换:将咖啡店对话改写为餐厅、书店等其他场景(示例:咖啡店 → 餐厅的「牛排真不错」对话)。
- 风格转换:将正式风格的 AI 书推荐对话改写为轻松风格(示例:Russell & Norvig 的《人工智能:一种现代方法》从「我建议您可以考虑阅读」转为「哇,说到 AI 的好书,我立马想到一本超赞的!」)。
第六步:按模型能力差异化格式
- 基础指令格式:alpaca_zh 三段式(instruction / input / output)→ 转成
user\n你好\nassisant\n你好,有什么可以帮到你?序列。 - 带系统提示:在 user 段前插入
system ...。 - 带 Function calling:在 system 段后追加
<tools>{tool_schema JSON}</tools>,assistant 回复内嵌<tool_call>{"name": ..., "arguments": ...}</tool_call>。 - 带推理过程:在 conversations 中加 reasoning_content 字段,最终格式以
<think>...包夹思考段。
关键知识点
- 微调五大场景:垂直增强、任务特化、语言本地化、语气风格、安全性增强。
- 微调数据五大流程:获取 → 清洗 → 质量控制 → 格式化 → 扩增(扩增可选)。
- 四种数据获取路径:互联网抓+人工改写、生产数据+人工改写、社交平台迁移、公开数据集。
- 生产数据中约 30% 是模型拒绝回答样本,必须人工改写才能进入训练集。
- 数据清洗六目标:PII 匿名化、拼写纠错、HTML 清洗、广告过滤、去重、连贯性。
- 质量控制四方法:随机抽样、统计分析、小规模测试、交叉验证。
- Alpaca vs ShareGPT:前者结构简单(基础指令微调),后者多角色(复杂对话)。
- 五种传统数据扩增:同义词替换、回译、文本生成、上下文扩展、句子重组。
- 四种 LLM 扩增:Prompt 生成、对话扩展、场景变换、风格转换。
- CAMEL 数据集含约 22.9 万条多轮对话,专门服务角色扮演场景。
- Kaggle 托管超 50,000 个公共数据集;UCI 含 100+ 标准数据集。
- 微调格式依赖特殊标记符
、、user、assistant,定义见 tokenizer_config.json。 - alpaca_zh 的 JSON 字段:instruction、input、output。
- Qwen3 的微调序列格式:
system ... \nuser ... \nassisant ...。 - Function calling 训练数据需嵌入 tool_schema 在
<tools>段,并在 assistant 回复中输出<tool_call>{json}</tool_call>。 - 推理数据需在 assistant 段前置
<think>...包夹 reasoning_content。
应用场景
- 情感陪伴 / 游戏 NPC:使用社交平台迁移(WeChatMsg 导出聊天记录)+ LLM 扩增(Prompt 生成 + 风格转换)构造角色对话,CAMEL 提供约 22.9 万条基础素材。
- 垂直领域问答(医疗 / 法律 / 金融):互联网抓取专业论坛 + Kaggle / UCI 公开数据集 + 人工改写,构造专业知识问答对,垂直增强通用模型。
- Function calling 智能助手:用 tool_schema 定义工具集(如 get_weather),构造天气查询、订单查询等多场景训练数据,保留 Qwen3 混合推理能力。
- 心理咨询 / 虚拟教师:基于 Prompt 的 LLM 数据生成,构造医生性格温和、病人焦虑等多角色多场景对话,任务特化场景。
- 语言本地化:将英文语料通过回译扩增为多语言版本,训练多语言模型。
- 安全性增强:通过清洗 PII、过滤有害内容,训练减少模型产生不当输出的能力。
常见误区 / 踩坑
- ❌ 数据量越大效果越好
✅ 正解:质量优先于数量。CAMEL 仅 22.9 万条却成为角色扮演标杆,而 30% 的拒绝回答样本若不改写会显著拉低效果。 - ❌ 直接用 LLM 生成的回答训练
✅ 正解:LLM 回答缺乏真实人类对话特征(「官腔」、无表情),需人工改写,加入情感表达和口语化,否则模型学到的全是机器味。 - ❌ 忽略特殊标记符差异,直接拼接 user / assistant 文本
✅ 正解:必须严格使用、等标记符,定义见模型的 tokenizer_config.json,错一字符模型就识别不出消息边界,整批数据作废。 - ❌ Function calling 数据不带 tool_schema
✅ 正解:必须在 system 段嵌入<tools>{完整 tool_schema JSON}</tools>,否则模型不知道可调用哪些工具、参数如何填写,调用准确率断崖式下跌。 - ❌ 推理数据混在 content 里
✅ 正解:思考过程必须放在 reasoning_content 字段(或最终格式中的<think>...段),与最终回复分离,否则会破坏推理能力的可观测性和训练信号。 - ❌ 数据扩增是必做步骤
✅ 正解:扩增是可选步骤。特定领域数据充足时不必扩增;扩增不当会引入噪声,反而损害模型。CAMEL 这类数据集本身就是 LLM 扩增产物,二次扩增可能适得其反。 - ❌ 清洗只去 HTML 不去 PII
✅ 正解:PII 匿名化是清洗第一步,姓名 / 身份证 / 电话必须先处理,否则微调出的模型可能在推理阶段泄露用户隐私,承担法律风险。
性能 / 复杂度
- 数据清洗时间复杂度:O(n),n 为样本数;PII 匿名化通常采用正则匹配,O(n × m),m 为匹配模式数(典型 m = 5-20 个 PII 模式)。
- 数据扩增时间复杂度:传统扩增毫秒-秒级 / 条;LLM 扩增单条约 1-5 秒,批处理 + vLLM 推理可压缩到 0.5 秒 / 条。
- 数据格式化的 token 增长:alpaca_zh 三字段约 50-100 tokens / 条;ShareGPT 多轮约 200-1000 tokens / 条;Function calling 含 tool_schema 后约 500-2000 tokens / 条(含工具描述)。
- 方案对比:
- 方案 A(传统扩增:同义词 / 回译):速度毫秒-秒级,多样性受限,O(n × k),k 为替换词数。
- 方案 B(LLM 扩增:场景 / 风格变换):速度秒-分钟级,多样性高、语义保真,O(n × t / batch_size),t 为单条生成时间。
- 临界点:单条扩增成本敏感时优先传统扩增;需要角色多样性和风格覆盖时必须 LLM 扩增 + 人工抽检。
- 数据量经验值:基础指令微调 1k-10k 条;角色扮演 5w-30w 条;Function calling 单一工具 500-2000 条,多工具组合需 1w+ 条。
与相关概念的区别
- 微调 vs 预训练:
- 数据量:预训练 TB 级(万亿 tokens),微调 KB-MB 级(万-百万条)。
- 数据来源:预训练用通用语料(网页 / 书籍),微调用任务专属数据(对话 / 问答)。
- 目标:预训练学通用知识,微调学任务模式。
- 怎么选:有明确下游任务且数据充足时选微调;否则用 Prompt Engineering 或 RAG。
- Alpaca 格式 vs ShareGPT 格式:
- 结构:Alpaca 三字段(instruction / input / output),ShareGPT 多消息数组(system / user / assistant)。
- 角色:Alpaca 单角色(默认助手),ShareGPT 多角色(可任意定义)。
- 适用:Alpaca 适合简单指令任务(翻译 / 摘要),ShareGPT 适合复杂多轮对话和角色扮演。
- 怎么选:基础问答用 Alpaca;对话 / 角色 / 工具调用必须 ShareGPT。
- 传统数据扩增 vs LLM 数据扩增:
- 速度:传统扩增毫秒-秒级,LLM 扩增秒-分钟级。
- 多样性:传统扩增限于词 / 句层面,LLM 扩增可生成全新场景和风格。
- 质量风险:传统扩增风险低但天花板低,LLM 扩增可能引入幻觉(需人工抽检)。
- 怎么选:低成本大批量用传统扩增;高质量角色扮演 / 风格覆盖必须 LLM 扩增 + 抽检。
- 微调 vs RAG:
- 知识更新:微调需重训(小时-天级),RAG 实时检索(秒级)。
- 数据要求:微调需 1k+ 条结构化样本,RAG 只需文档库。
- 成本:微调需 GPU 小时级训练,RAG 需向量库存储和检索算力。
- 怎么选:知识频繁更新选 RAG;任务模式稳定且需低延迟选微调。
- 全量微调 vs LoRA / QLoRA:
- 数据要求:全量微调对数据量更敏感(万级+),LoRA 千级即可见效。
- 工具调用准确率:全量微调对 Function calling 的工具选择准确率提升更显著(约 3-5%)。
- 显存:全量微调需 70B × 2 bytes × 优化器状态,LoRA 仅需模型 0.1-1% 参数。
- 怎么选:实验阶段或小数据用 LoRA;生产部署且数据充足用全量微调。
进阶 / 面试加分项
- 最新进展:Qwen3 等具备 Function calling + 混合推理能力的模型要求数据格式同时承载 tool_schema(XML 标签 + JSON)和 reasoning_content(
<think>段),数据构造从单一能力训练升级为多能力协同训练。同时,Llama_factory、Dify workflow 等工具大幅降低了格式转换的工程门槛。 - 业界争议:是否需要全量微调 vs LoRA / QLoRA?数据质量相当时 LoRA 即可,但全量微调对 Function calling 的工具选择准确率提升更显著(约 3-5%)。CAMEL 等大规模合成数据集的「机器味」是否会被新一代微调技术(如 DPO / RLHF)部分消除?尚无定论。
- 金句送给候选人:「数据决定上限,模型只是逼近这个上限的工具;微调数据的格式对了,模型能力才有可能被正确激发。」
面试如何回答
🟢 什么是大模型微调?常见的微调场景有哪些?
回答要点:
微调(Fine-tuning)是在预训练大模型基础上,使用特定领域的数据集进行二次训练,让模型在保留通用能力的同时获得特定任务能力的过程。常见场景分五大类:第一是垂直增强,比如把通用模型改造成医疗、法律、金融等领域的专家;第二是任务特化,如问答系统、文本分类、命名实体识别;第三是语言本地化,把以英语 / 汉语为主的模型适配到小语种;第四是语气风格调整,让输出更符合特定表达方式;第五是安全性增强,通过训练减少有害内容。典型应用包括情感陪伴、心理咨询、虚拟教师、心理占卜、游戏 NPC 等。和预训练相比,微调数据量从 TB 级降到 KB-MB 级,从通用语料转为任务专属数据。
🟢 微调数据准备的核心流程是什么?包含哪几步?
回答要点:
微调数据准备走五步流程:获取 → 清洗 → 质量控制 → 格式化 → 扩增。第一步获取有四条主路径:互联网抓+人工改写、生产数据+人工改写、社交平台迁移(如 WeChatMsg 导出)、公开数据集(Kaggle 50,000+、UCI 100+、CAMEL 22.9 万)。第二步清洗要做六件事:PII 匿名化、拼写纠错、HTML / URL 清洗、广告过滤、去重、连贯性检查。第三步质量控制用四种方法:随机抽样、统计分析(长度分布 / 词频)、小规模测试微调、交叉验证。第四步格式化和模型对齐,Alpaca 适合基础指令、ShareGPT 适合多轮对话。第五步扩增是可选步骤,必要时用同义词替换、回译或 LLM 扩增。每一步都有具体工具支持:requests/BeautifulSoup 抓取、pandas 做统计分析、Llama_factory 做格式转换、Dify workflow 做流程编排。
🟡 微调数据有哪些获取方式?各自的优缺点是什么?
回答要点:
数据获取有四条主路径。第一条互联网抓+人工改写:社交网站数据标准化、清洗简单;小说网站需段落分割和对话提取。优点是数据量大,缺点是清洗繁琐、需要处理反爬。第二条生产数据+人工改写:用线上 LLM 回答或真实业务数据构建,优点是贴近业务,缺点是约 30% 是模型拒绝回答样本必须人工改写,且 LLM 回答有「官腔」需口语化。第三条社交平台迁移:用 WeChatMsg 等工具导出聊天记录,优点是真实人类对话特征明显,缺点是必须处理 PII 隐私。第四条公开数据集:Kaggle 50,000+ 个数据集、UCI 100+ 标准数据集、CAMEL 22.9 万条角色扮演对话,优点是即拿即用,缺点是和具体业务场景匹配度有限。实践中常组合使用,比如用 CAMEL 做基础 + 业务数据做精调。
🟡 数据清洗的关键步骤和目标是什么?
回答要点:
数据清洗要解决六类问题。第一是 PII 匿名化,移除或脱敏姓名、身份证号、电话号码等敏感字段,这是合规底线。第二是拼写和语法纠错,比如「teh」改「the」、「dont」改「don't」,Python 正则代码示例:re.sub(r'\\s+', ' ', text).strip() 合并多余空白。第三是去除 HTML 标签、特殊字符、URL(re.sub(r'http\S+', '', text))。第四是过滤广告、垃圾信息等干扰内容。第五是删除无关和近似重复内容,避免模型学到噪声。第六是确保对话连贯性和逻辑性,多轮对话尤其关键。清洗后必须做质量评估:用 pandas 的 df.describe() 做描述统计,用 matplotlib 绘制消息长度分布(50 个 bin),用 Counter 统计词频 Top 10,发现异常分布及时回溯。
🟡 Alpaca 和 ShareGPT 格式有什么区别?应该怎么选?
回答要点:
Alpaca 格式是基础指令微调格式,JSON 字段三段式:{instruction, input, output},结构简单,适合单轮指令任务如翻译、摘要。ShareGPT 格式是多角色多轮对话格式,消息数组含 system / user / assistant 三种 role,支持复杂对话、角色扮演和工具调用。选择标准:基础问答、文本分类用 Alpaca 即可,开发成本低;多轮对话、角色扮演、Function calling 必须用 ShareGPT,因为它能携带 system 提示词、多轮 user-assistant 交替和 tool_call 嵌套。alpaca_zh 转 Qwen3 微调序列示例:{"instruction": "", "input": "输入:你好。", "output": "输出:你好,有什么可以帮到你?"} → user\n你好\nassisant\n你好,有什么可以帮到你?。实际工程中常用 Llama_factory 统一转换。
🟡 用 LLM 做数据扩增有哪些方法?举几个具体例子。
回答要点:
LLM 数据扩增有四种核心方法,尤其适用于角色扮演场景。第一种基于 Prompt 的数据生成:输入「生成一段医生和病人之间的对话,医生性格温和,病人有些焦虑」,LLM 直接输出符合角色设定的对话。第二种对话扩展:把单轮「用户:我今天感觉不太舒服」扩成多轮,加入压力源(工作压力大、熬夜)、具体症状(头晕、恶心)、个性化建议(作息调整、冥想),可达 5 轮以上。第三种场景变换:把咖啡店对话改写为餐厅、书店等其他场景,保留对话结构但替换实体(「这里的咖啡真不错」→「这里的牛排真不错」)。第四种风格转换:把正式风格(「我建议您可以考虑阅读 Stuart Russell 和 Peter Norvig 合著的《人工智能:一种现代方法》」)改写为轻松风格(「哇,说到 AI 的好书,我立马想到一本超赞的!」)。这四种方法可以结合 Dify workflow 串联成自动化流水线。
🔴 带 Function calling 的微调数据应该怎么构造?给一个具体格式示例。
回答要点:
带 Function calling 的微调数据必须在 system 段嵌入 tool_schema,并在 assistant 回复中输出 tool_call。tool_schema 是描述工具的 JSON Schema,例如 get_weather 函数:{name, description, parameters: {type: object, properties: {location: {type: string, description}}, required: [location]}}。构造流程分三步:第一步在 conversations 的 system 字段写「你是一名助人为乐的助手,当用户查询天气时,请调用 get_weather 函数」;第二步在 system 段后追加 # Tools you may call one or more functions... <tools>{tool_schema JSON}</tools> For each function call, return a json object...<tool_call>;第三步 assistant 回复用 <tool_call>{"name": "get_weather", "arguments": {"location": "北京"}}</tool_call> 包裹 JSON。如果还要保留 Qwen3 的混合推理能力,需要在 assistant 段前置 <think>... 包夹 reasoning_content。踩坑点:tool_schema 漏写或错一个字段,模型调用准确率断崖式下跌;token 增长约 500-2000 tokens / 条(含工具描述)。
🔴 如何设计一个完整的微调数据质量控制体系?包含哪些维度、哪些方法、哪些工具?
回答要点:
微调数据质量控制体系应分三层。第一层是清洗层,解决六类问题:PII 匿名化(正则匹配 O(n×m),m=5-20)、拼写纠错、HTML/URL 清洗、广告过滤、去重、连贯性检查,工具用 Python 正则 + pandas。第二层是评估层,三维度并行:去重维度(MinHash / SimHash 查近似重复)、质量维度(启发式规则 + LLM 评分过滤低质量对话)、合规维度(关键词黑名单 + 人工抽检)。第三层是验证层,四方法闭环:随机抽样人工审核(建议 1-5% 抽样率)、统计分析(df.describe() + 长度分布直方图 + 词频 Counter)、小规模测试微调(1000-5000 条样本先训一版看 Loss 曲线)、交叉验证(不同子集多次微调对比结果一致性,波动超过 5% 报警)。工具链:Dify workflow 串流程、Llama_factory 做格式转换、CAMEL 数据集做对照基线。数据量经验值:基础指令 1k-10k、角色扮演 5w-30w、单工具 Function calling 500-2000、多工具组合 1w+。
