高质量微调数据编制方法
第一部分:高质量通用微调数据编制心法
核心目标:制作能让模型从“知道”变为“会做”的教科书级范例。
四项黄金原则:
- 质量压倒数量:1000条精雕细琢的数据,远胜10万条粗糙数据。
- 场景驱动,而非API驱动:数据应围绕“解决问题”展开,而非“展示函数”。
- 指令需“过度具体”:假设模型毫无背景,提供全部约束(技术栈、版本、格式、边界条件)。
- 输出需“生产就绪”:代码应包含错误处理、日志、注释,可直接集成到项目。
标准编制流程:
- 定义目标:明确模型需掌握的单一、具体技能(如“用Pandas进行数据清洗”)。
- 设计指令:
- 提供角色与上下文(“你是一个数据分析师,正在处理销售数据…”)。
- 明确列出要求(使用数字编号,如1. 处理空值;2. 格式化日期;3. 输出CSV)。
- 给出输入输出范例。
- 编写输出:
- 完整且可运行。
- 符合项目规范(命名、格式、错误处理)。
- 附带简要解释(关键行注释)。
- 迭代与审查:
- 人工抽样检查:随机审查至少100条,确保指令与输出精准匹配。
- 多样性检查:覆盖正面、反面、边界情况。
第二部分:面向AI Agent的微调数据特殊设计
核心升级:Agent数据不仅是“问答对”,更是模拟其“思考-行动-观察”内部决策过程的沙盘演练。
五大关键设计要素:
- 工具定义集成:每条数据应隐含或明确关联工具清单,说明名称、功能、参数。
- 思维链外化:在
output中,必须拆解推理步骤。这是Agent学会自主规划的关键。 - 结构化动作输出:将“调用工具”设计为一种标准化的输出格式。
- 多轮交互模拟:构建完整对话轮次,包含用户输入、Agent思考、工具调用、工具返回、Agent回应。
- 结果处理示范:展示如何解析、判断并利用工具返回的结果生成最终答复。
一个Agent数据的核心结构示例:
{
“conversation”: [
{“role”: “user”, “content”: “北京天气怎样?要带伞吗?”},
{“role”: “assistant”, “content”: {“thought”: “需先查天气,再根据降水建议。调用天气工具。”, “action”: {“tool_name”: “get_weather”, “parameters”: {“location”: “北京”}}}},
{“role”: “tool”, “content”: {“result”: {“condition”: “多云”, “precipitation”: 70}}},
{“role”: “assistant”, “content”: {“thought”: “降水概率70%,建议带伞。”, “final_answer”: “北京多云,降水概率高,建议带伞。”}}
]
}
通用数据 vs. Agent专用数据对比
| 维度 | 通用微调数据 | AI Agent专用数据 |
|---|---|---|
| 核心目标 | 完成单次、静态的问答或代码生成。 | 完成动态、多步骤的任务,涉及环境交互。 |
| 输出重点 | 最终答案的正确性与完整性。 | 决策过程的合理性与行动序列的准确性。 |
| 数据结构 | 简单的 {“instruction”: “”, “output”: “”}。 | 复杂的多轮对话,包含 thought, action, tool_response。 |
| 评估标准 | 输出是否符合指令要求。 | 推理是否合理,工具使用是否正确,能否根据反馈调整。 |
实践路线图
- 启动:从你的项目中,选取10个最具代表性的任务,手动编制10条符合上述标准的“完美数据”,建立质量标准。
- 批量生产:根据这10条范例,编写脚本从项目历史(代码、提交信息、工单)中半自动化提取和构建更多数据。
- 格式转换:使用 LLaMA Factory 等框架,将你的
JSON数据自动转换为目标基座模型(如Qwen、Llama)所需的对话格式(如ChatML)。你不必手动处理格式。 - 持续迭代:用初步模型处理新任务,收集其失败案例,将这些案例作为反面教材或新的训练数据加入下一轮训练。
最重要的一步:立即动手,从你最熟悉的领域开始创建第一批高质量数据。这是构建实用AI Agent过程中不可替代、价值最高的工作。如果需要针对特定场景(如数据库操作、API集成)的设计范例,可随时提出。
高质量微调数据的使用
这是一个非常关键的操作问题。两种数据的使用路径和最终目标有显著区别,下图清晰展示了从数据到应用的全流程对比:
路径一:通用指令数据的使用(得到一个“专家模型”)
使用目标:让模型成为一个在特定领域(如编写Java工具类)知识渊博、回答准确的专家。
使用步骤:
- 数据准备:你已拥有格式良好的
{instruction, output}对。 - 格式转换:使用训练框架(如LLaMA-Factory),选择一个对话模板(如ChatML),将你的数据自动转换为模型训练所需的文本序列。你无需手动拼接。
- 执行微调:使用QLoRA等参数高效方法,在基座模型(如CodeLlama)上运行微调。产出是一组新的模型权重文件(如
adapter_model.safetensors)。 - 部署使用:
- 直接对话:将微调后的模型加载到任何支持该模型的聊天界面或API中(如Ollama、Text Generation WebUI)。你可以直接问:“如何用Commons Lang3安全拼接字符串?” 它会根据所学给出精准答案。
- 集成到应用:将模型作为代码生成、文档撰写等任务的引擎嵌入你的工作流。
核心:你得到的是一个升级版的ChatGPT,它在你定制的领域内更专业。
路径二:AI Agent专用数据的使用(得到一个“智能体大脑”)
使用目标:让模型成为一个能自主规划、决定调用工具、处理结果的智能体决策核心。
使用步骤:
第1-3步与通用数据相同:准备Agent格式数据 -> 格式转换 -> 微调训练。这一步产出的同样是一个“大脑”,但这个大脑被训练为输出结构化动作。
最关键的第4步:与Agent框架集成。这个大脑不能单独工作,它必须接入一个执行层。
- 选择框架:选用LangChain、LlamaIndex等框架,它能定义工具、解析模型输出、调用工具、管理状态。
- 关键配置:确保框架中工具的定义(名称、参数)与微调数据中的完全一致。这是成败的关键。
- 组装运行:
# 伪代码示意:以LangChain为例 from langchain.agents import initialize_agent, Tool from your_model_loader import load_fine_tuned_model # 加载你微调好的模型 # 1. 加载微调后的模型 llm = load_fine_tuned_model() # 2. 定义与训练数据匹配的真实工具 tools = [ Tool(name="get_current_weather", func=real_weather_api, description="..."), Tool(name="search_database", func=real_db_query, description="...") ] # 3. 创建智能体,并指定其遵循与训练数据一致的格式(如ReAct) agent = initialize_agent(tools, llm, agent="react-chat") # 4. 运行!模型会输出“思考”和“行动”,框架会截取“行动”部分去调用真实工具 agent.run(“查询北京天气,并总结是否需要带伞。”)
核心:你得到的是一个具备决策能力的“大脑”,必须与充当“四肢”的Agent框架结合,才能成为一个能行动的完整智能体。
对比与选择建议
| 特性 | 通用指令微调 | AI Agent专用微调 |
|---|---|---|
| 产出物 | 一个领域专家模型 | 一个智能体决策引擎 |
| 使用方式 | 可直接对话或调用 | 必须与Agent框架结合使用 |
| 核心能力 | 知识问答、内容生成 | 任务规划、工具调用、多步推理 |
| 复杂度 | 相对较低,易部署 | 较高,需维护工具与框架 |
| 适合场景 | 编写代码、解答疑问、创作文本 | 自动化工作流、复杂任务处理、环境交互 |
给你的直接建议:
- 如果你的目标是让模型更好地回答你领域内的问题或生成特定代码,请使用通用指令数据进行微调。
- 如果你的目标是构建一个能自动操作软件、处理工单、分析数据并生成报告的自动化流程,请使用AI Agent专用数据进行微调,并准备好与框架集成。