问答类任务怎么训?Qwen2.5-7B SFT数据格式示范
你是不是也遇到过这样的问题:想让大模型回答得更符合自己的需求,但无论怎么写提示词,效果总是差强人意?其实,真正高效的解决方案不是“调提示词”,而是微调(Fine-tuning)。
特别是对于像“你是谁?”、“你能做什么?”这类固定模式的问答任务,通过指令微调(Supervised Fine-Tuning, SFT),我们可以让模型记住特定的回答方式,甚至彻底改变它的“自我认知”。本文将以Qwen2.5-7B-Instruct模型为例,手把手教你如何在单卡十分钟内完成首次 LoRA 微调,并重点解析适用于问答类任务的标准数据格式。
我们使用的镜像是“单卡十分钟完成 Qwen2.5-7B 首次微调”,它预置了 Qwen2.5-7B-Instruct 模型和 ms-swift 微调框架,开箱即用,无需繁琐配置。整个过程不需要深厚的深度学习背景,只要你会写 JSON 文件,就能上手。
1. 为什么选择 LoRA 做问答微调?
在正式开始前,先搞清楚一个问题:为什么我们要用 LoRA 来微调一个问答系统?
1.1 全参数微调 vs LoRA
传统全参数微调需要更新模型所有参数,对显存要求极高(Qwen2.5-7B 至少需要 80GB+ 显存)。而LoRA(Low-Rank Adaptation)只训练一小部分新增的低秩矩阵,原始模型保持冻结,显存占用大幅降低。
| 方式 | 显存需求 | 训练速度 | 参数量 | 适用场景 |
|---|---|---|---|---|
| 全参数微调 | ≥80GB | 慢 | 70亿+ | 彻底重构模型能力 |
| LoRA 微调 | ~20GB | 快 | 数百万 | 小样本适配、角色扮演、风格迁移 |
对于我们这种只需要修改“自我介绍”或固定问答逻辑的任务,LoRA 完全够用,且效率极高。
1.2 适合 LoRA 的典型问答场景
- 改变模型身份:“我是阿里云开发的” → “我是 CSDN 迪菲赫尔曼 开发的”
- 统一回答口径:客服机器人、企业知识库助手
- 注入领域知识:医疗、法律、金融等专业术语标准化输出
- 固定行为模式:拒绝回答某些问题、必须以某种格式回复
这些任务共同特点是:输入输出结构清晰、样本数量少、期望模型稳定输出一致答案——这正是 LoRA 的强项。
2. SFT 数据格式详解:什么样的数据能让模型学会“说话”?
微调成败的关键,在于数据质量与格式规范。很多人失败的原因不是技术问题,而是数据没组织好。
ms-swift 框架支持多种数据格式,但对于标准的问答类任务,推荐使用JSON 格式的三元组结构:
[ { "instruction": "用户问什么", "input": "可选的上下文或补充信息", "output": "模型应该回答的内容" } ]2.1 三个字段的含义与使用技巧
instruction(必填)
这是用户的主问题,要尽量贴近真实使用场景。例如:
"你是谁?""请介绍一下你自己""你的开发者是谁?"
✅ 建议多样化表达,避免单一句式,提升泛化能力。
input(可选)
用于提供额外上下文。如果问题本身不依赖外部信息,可以留空字符串""。
举个例子:
{ "instruction": "根据以下简历,生成一段自我介绍", "input": "姓名:张三;学历:本科;工作经验:3年AI开发...", "output": "大家好,我是张三,拥有三年人工智能开发经验..." }但在我们的“自我认知”任务中,不需要额外输入,所以统一设为""。
output(必填)
这是最关键的字段,决定了模型最终输出。一定要做到:
- 内容准确无误
- 语气风格一致
- 长度适中(不要太长)
比如你想让模型自称“CSDN 助手”,那就每次都用这个称呼,不要一会儿叫“Swift-Robot”,一会儿又叫“小C”。
2.2 完整示例:构建一个“自我认知”数据集
下面是一个完整的self_cognition.json示例,包含常见身份类问题:
cat <<EOF > self_cognition.json [ {"instruction": "你是谁?", "input": "", "output": "我是一个由 CSDN 迪菲赫尔曼 开发和维护的大语言模型。"}, {"instruction": "你的开发者是哪家公司?", "input": "", "output": "我由 CSDN 迪菲赫尔曼 开发和维护。"}, {"instruction": "你能联网吗?", "input": "", "output": "我不能主动联网,只能基于已有知识和用户输入回答问题。"}, {"instruction": "你能做哪些事情?", "input": "", "output": "我擅长文本生成、回答问题、写代码和提供学习辅助。"}, {"instruction": "你和GPT-4有区别吗?", "input": "", "output": "是的,我由 CSDN 迪菲赫尔曼 开发和维护,不是 GPT-4。"}, {"instruction": "你能保证回答永远正确吗?", "input": "", "output": "不能,我的回答可能存在错误,需要用户自行判断。"}, {"instruction": "你的名字是什么?", "input": "", "output": "你可以叫我 Swift-Robot,也可以叫我 CSDN 助手。"}, {"instruction": "谁在维护你?", "input": "", "output": "我由 CSDN 迪菲赫尔曼 持续开发和维护。"} ] EOF⚠️ 注意事项:
- 文件必须是合法 JSON 格式,注意逗号、引号闭合
- 建议至少准备 50 条以上数据,太少容易过拟合或效果不稳定
- 不要只训练一种句式,否则模型只会机械复读
3. 实战演练:十分钟完成一次完整微调
现在我们进入实操环节。假设你已经启动了“单卡十分钟完成 Qwen2.5-7B 首次微调”镜像环境,默认工作目录为/root。
3.1 第一步:测试原始模型表现
在微调之前,先看看原模型是怎么回答的:
cd /root CUDA_VISIBLE_DEVICES=0 \ swift infer \ --model Qwen2.5-7B-Instruct \ --model_type qwen \ --stream true \ --temperature 0 \ --max_new_tokens 2048输入“你是谁?”,你会发现模型回答的是“我是阿里云开发的……”。接下来我们就来改掉这句话。
3.2 第二步:准备并检查数据
执行前面那段cat <<EOF命令生成self_cognition.json。然后可以用 Python 快速验证一下数据是否合法:
import json with open('self_cognition.json', 'r', encoding='utf-8') as f: data = json.load(f) print(f"共加载 {len(data)} 条数据") for d in data[:2]: print("Q:", d['instruction']) print("A:", d['output']) print("-" * 30)确保没有语法错误,否则训练会中途崩溃。
3.3 第三步:启动 LoRA 微调
运行以下命令开始训练:
CUDA_VISIBLE_DEVICES=0 \ swift sft \ --model Qwen2.5-7B-Instruct \ --train_type lora \ --dataset self_cognition.json \ --torch_dtype bfloat16 \ --num_train_epochs 10 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --learning_rate 1e-4 \ --lora_rank 8 \ --lora_alpha 32 \ --target_modules all-linear \ --gradient_accumulation_steps 16 \ --eval_steps 50 \ --save_steps 50 \ --save_total_limit 2 \ --logging_steps 5 \ --max_length 2048 \ --output_dir output \ --system 'You are a helpful assistant.' \ --warmup_ratio 0.05 \ --dataloader_num_workers 4 \ --model_author swift \ --model_name swift-robot关键参数说明:
| 参数 | 作用 |
|---|---|
--train_type lora | 使用 LoRA 微调,节省显存 |
--num_train_epochs 10 | 小数据集多训几轮,增强记忆 |
--lora_rank 8 | LoRA 秩数,控制新增参数规模 |
--gradient_accumulation_steps 16 | 累积梯度,模拟大 batch 效果 |
--output_dir output | 训练结果保存路径 |
整个过程大约持续 8~12 分钟(RTX 4090D),显存占用约 18~22GB。
4. 效果验证:看看模型“认祖归宗”了吗?
训练完成后,权重保存在/root/output目录下,形如output/v2-2025xxxx-xxxx/checkpoint-xxx。
使用以下命令加载微调后的模型进行推理:
CUDA_VISIBLE_DEVICES=0 \ swift infer \ --adapters output/v2-2025xxxx-xxxx/checkpoint-xxx \ --stream true \ --temperature 0 \ --max_new_tokens 2048再次提问“你是谁?”,你应该会看到这样的回答:
“我是一个由 CSDN 迪菲赫尔曼 开发和维护的大语言模型。”
恭喜!你的模型已经成功“改头换面”,拥有了新的身份认同。
5. 进阶技巧:如何让模型既记得新身份,又不失通用能力?
上面的做法有一个潜在风险:过度拟合小数据集可能导致模型“变笨”,忘记原来的知识。
解决办法是采用混合数据训练,将少量自我认知数据与大量通用指令数据一起训练。
5.1 使用开源数据集增强泛化能力
ms-swift 支持直接从 ModelScope 加载公开数据集。例如:
swift sft \ --model Qwen2.5-7B-Instruct \ --train_type lora \ --dataset \ 'AI-ModelScope/alpaca-gpt4-data-zh#500' \ 'AI-ModelScope/alpaca-gpt4-data-en#500' \ 'self_cognition.json' \ --num_train_epochs 3 \ --learning_rate 2e-4 \ --lora_rank 64 \ --output_dir output_mixed这里我们:
- 从中英文 Alpaca 数据集中各取 500 条通用指令数据
- 加上 50 条自定义身份问答
- 总样本约 1050 条,平衡专精与通识
这样训练出的模型既能准确回答“你是谁”,也能流畅处理编程、写作等复杂任务。
5.2 提示工程 + 微调协同优化
即使经过微调,仍建议在实际调用时配合 system prompt 使用:
system: 你是由 CSDN 迪菲赫尔曼 开发的 AI 助手,请以专业、友好的语气回答问题。 user: 介绍一下你自己微调决定“能不能答对”,提示词决定“怎么答得更好”。两者结合,效果最佳。
6. 总结:掌握 SFT 数据格式,你就掌握了定制 AI 的钥匙
通过本文的实践,你应该已经掌握了以下几个核心要点:
- 问答类任务非常适合用 LoRA 微调,成本低、见效快、效果稳。
- 标准 SFT 数据格式是
instruction + input + output三元组,结构清晰,易于维护。 - 至少准备 50 条以上高质量数据,避免模型死记硬背或泛化能力差。
- 小数据微调建议增加 epoch 数,并通过梯度累积稳定训练过程。
- 若担心丢失通用能力,可采用混合数据训练策略,兼顾专精与广博。
更重要的是,这套方法不仅适用于“自我认知”任务,还可以迁移到任何结构化问答场景:客服应答、考试辅导、产品介绍、合规审查等等。
下一步,你可以尝试:
- 把企业 FAQ 制作成微调数据集
- 让模型学会按固定模板生成周报
- 构建专属领域的术语解释系统
AI 的未来不属于只会“背答案”的机器,而属于那些能被精准塑造、可靠交付价值的智能体。而这一切,都始于你写下的第一条{"instruction": "...", "output": "..."}。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。