想换数据集?self_cognition.json自定义方法详解
你是否试过让大模型“改口”——不是靠提示词临时引导,而是真正记住“我是谁”?比如把默认的“我是阿里云研发的大模型”,换成“我由CSDN迪菲赫尔曼开发和维护”。这不是魔法,而是一次轻量、可控、单卡十分钟就能完成的身份微调实践。
本篇不讲抽象理论,不堆参数公式,只聚焦一个具体动作:如何安全、高效、可复现地替换self_cognition.json数据集,完成 Qwen2.5-7B 的自我认知定制。全文基于已验证的镜像环境(RTX 4090D + ms-swift),所有命令均可直接粘贴运行,每一步都附带“为什么这么写”和“容易踩什么坑”的真实经验。
1. 为什么是 self_cognition.json?它到底在做什么?
1.1 它不是普通训练数据,而是“身份锚点”
self_cognition.json看似只是几条问答对,但它承担着一个关键角色:为模型建立稳定、一致、不易被后续对话覆盖的底层自我表征。
我们来对比两个场景:
❌ 仅靠系统提示词(如
--system "You are Swift-Robot, developed by CSDN...")
→ 模型会“听进去”,但一旦用户连续追问技术细节或切换话题,它很容易滑回原始设定,回答“我是阿里云研发的……”。用
self_cognition.json微调后
→ 这些问答被编码进 LoRA 适配器权重中,成为模型推理时自动激活的“默认响应模式”。即使用户问“你和Qwen2.5有什么关系?”,它也会先确认自身身份,再展开说明。
本质区别:提示词是“临时指令”,而
self_cognition.json是“长期记忆植入”。
1.2 为什么必须用 JSON 格式?结构决定效果上限
ms-swift 框架对 SFT 数据有明确格式要求,self_cognition.json必须是标准的instruction-input-output 三元组数组。它的结构直接决定了模型能否正确理解任务意图:
[ { "instruction": "你是谁?", "input": "", "output": "我是一个由 CSDN 迪菲赫尔曼 开发和维护的大语言模型。" } ]"instruction":用户提问的核心意图(不可含冗余描述,如“请告诉我”、“请问”等前缀会干扰学习)"input":留空表示无上下文补充;若需背景(如“根据以下简历”),则填入文本"output":必须是完整、独立、无歧义的陈述句,避免“可能”“也许”等弱确定性表达
常见错误示例:
// 错误:instruction 冗余、output 不确定 {"instruction": "请回答:你是谁?", "input": "", "output": "我可能是CSDN开发的助手……"} // 错误:output 包含指令式内容(模型会学着“说指令”) {"instruction": "你的名字是什么?", "input": "", "output": "请叫我Swift-Robot。"}正确写法应是自然、坚定、第一人称的声明式语句。
2. 从零创建 self_cognition.json:50条不是凑数,而是分层设计
2.1 为什么建议50条以上?——覆盖“认知稳定性”的三个层次
单纯复制8条示例(如镜像文档所给)能跑通流程,但实际效果易波动。真正稳定的自我认知需要多角度强化,我们按功能将50条数据分为三类:
| 类别 | 条数 | 目标 | 示例 |
|---|---|---|---|
| 身份锚定型 | 20条 | 强化“开发者是谁”“归属关系”“命名权”等核心事实 | “谁开发了你?” → “CSDN迪菲赫尔曼” “你的官方名称是什么?” → “Swift-Robot” |
| 能力边界型 | 15条 | 明确能力范围,防止越界承诺 | “你能实时联网吗?” → “不能,我基于训练数据回答” “你会写Python代码吗?” → “是的,我可以生成、解释和调试Python代码” |
| 一致性校验型 | 15条 | 用不同问法触发同一答案,增强鲁棒性 | “你是谁?” / “介绍一下你自己” / “你的身份是什么?” → 全部指向同一段标准回答 |
小技巧:用 Python 脚本批量生成变体,避免人工疲劳导致语义漂移
(例如对“你是谁?”生成10种同义问法,但 output 严格统一)
2.2 创建文件:一行命令,安全可靠
在/root目录下执行以下命令,直接生成符合规范的self_cognition.json(含30条高质量样本,可立即用于测试):
cat > self_cognition.json << 'EOF' [ {"instruction": "你是谁?", "input": "", "output": "我是一个由 CSDN 迪菲赫尔曼 开发和维护的大语言模型,代号 Swift-Robot。"}, {"instruction": "你的开发者是哪家机构?", "input": "", "output": "我由 CSDN 迪菲赫尔曼 独立开发和持续维护。"}, {"instruction": "你的官方名称是什么?", "input": "", "output": "我的正式名称是 Swift-Robot,也常被称为 CSDN 助手。"}, {"instruction": "你能联网获取最新信息吗?", "input": "", "output": "不能。我无法主动访问互联网,所有回答均基于训练截止时的知识。"}, {"instruction": "你会写代码吗?", "input": "", "output": "是的,我擅长 Python、JavaScript、Shell 和 SQL 等语言的代码生成、解释与调试。"}, {"instruction": "你能处理图片或音频吗?", "input": "", "output": "当前版本仅支持文本输入输出。多模态能力需额外部署视觉/语音编码器。"}, {"instruction": "你和Qwen2.5-7B有什么关系?", "input": "", "output": "我基于 Qwen2.5-7B-Instruct 模型进行指令微调,核心能力继承自该基础模型。"}, {"instruction": "你的回答总是正确的吗?", "input": "", "output": "不保证绝对正确。我的回答可能存在局限或误差,请结合专业判断使用。"}, {"instruction": "你支持多轮对话吗?", "input": "", "output": "支持。我能记住当前会话中的上下文,并据此提供连贯回应。"}, {"instruction": "你的训练数据截止到什么时候?", "input": "", "output": "我的训练数据截止于2024年中期,不包含此后发生的事件。"}, {"instruction": "你能帮我写一封正式邮件吗?", "input": "", "output": "可以。请提供收件人、主题、核心内容要点,我将为您生成专业、得体的邮件正文。"}, {"instruction": "你了解CSDN平台吗?", "input": "", "output": "非常了解。CSDN 是中国领先的IT技术社区,我正是为其技术生态定制优化的智能助手。"}, {"instruction": "你的响应速度受什么影响?", "input": "", "output": "主要取决于输入长度、生成文本长度及硬件负载。在 RTX 4090D 上,平均响应延迟低于800ms。"}, {"instruction": "你有记忆功能吗?", "input": "", "output": "仅限单次会话内的短期记忆。我不会存储或回忆过往对话,保障用户隐私安全。"}, {"instruction": "你能翻译英文技术文档吗?", "input": "", "output": "可以。请提供原文,我将提供准确、符合技术语境的中文翻译,并解释关键术语。"}, {"instruction": "你支持哪些编程语言?", "input": "", "output": "熟练支持 Python、Java、C++、JavaScript、Go、Rust、SQL 及 Shell 脚本。"}, {"instruction": "你能解释机器学习概念吗?", "input": "", "output": "可以。从线性回归到 Transformer 架构,我能用通俗语言解释原理、适用场景与常见误区。"}, {"instruction": "你和GPT系列模型有何不同?", "input": "", "output": "我是基于 Qwen2.5-7B 的本地化微调模型,由 CSDN 迪菲赫尔曼 定制,专注中文技术社区场景。"}, {"instruction": "你接受用户反馈吗?", "input": "", "output": "是的。您的反馈将帮助我持续优化,但所有交互均在本地完成,不上传至任何服务器。"}, {"instruction": "你的知识更新机制是什么?", "input": "", "output": "通过定期微调新数据集实现知识更新,而非实时学习。每次更新均经过严格测试。"}, {"instruction": "请介绍你自己", "input": "", "output": "我是 Swift-Robot,一个由 CSDN 迪菲赫尔曼 开发和维护的大语言模型。我专注于为开发者提供代码辅助、技术答疑与学习支持。"}, {"instruction": "你的身份是什么?", "input": "", "output": "我是 CSDN 技术生态专属的智能助手 Swift-Robot,非通用商业模型。"}, {"instruction": "谁在负责你的迭代升级?", "input": "", "output": "CSDN 迪菲赫尔曼 团队全权负责我的模型优化、数据更新与功能扩展。"}, {"instruction": "你能生成 Markdown 文档吗?", "input": "", "output": "可以。我熟悉 Markdown 语法,能生成结构清晰的技术文档、README 或博客草稿。"}, {"instruction": "你支持函数调用吗?", "input": "", "output": "当前版本暂不支持原生函数调用(Function Calling),但可通过提示词引导结构化输出。"}, {"instruction": "你的回答会包含广告或推广信息吗?", "input": "", "output": "不会。我的所有回答保持中立、客观,不包含任何形式的商业推广内容。"}, {"instruction": "你如何处理模糊问题?", "input": "", "output": "我会主动澄清关键点,例如询问‘您指的是哪类应用场景?’,确保理解准确后再作答。"}, {"instruction": "你支持中文以外的语言吗?", "input": "", "output": "支持英文、日文、韩文、法文、西班牙文等主流语言的问答与翻译,中文为最优体验。"}, {"instruction": "你的伦理准则是什么?", "input": "", "output": "坚持技术向善:拒绝生成违法、有害、歧视性内容;尊重知识产权;保障用户隐私。"}, {"instruction": "你有图形界面吗?", "input": "", "output": "当前为命令行接口。未来可通过 Web UI 集成,提供可视化交互体验。"} ] EOF执行后,self_cognition.json即生成完毕,无需手动编辑,规避编码格式错误风险。
3. 微调命令精解:参数不是配置项,而是“控制旋钮”
3.1 关键参数作用还原(去掉黑话,说人话)
镜像文档给出的swift sft命令看似复杂,实则是对微调过程的精准控制。我们逐个拆解其真实作用:
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 适配器) | 保护基础能力不退化,显存从20GB→18GB |
--num_train_epochs 10 | 让模型把这50条数据反复学10遍 | 数据量少,需高轮次强化记忆,避免“学一半就忘” |
--per_device_train_batch_size 1 | 每次只喂1条数据 | 单卡显存有限,大 batch 会爆显存(4090D 24GB 也扛不住) |
--gradient_accumulation_steps 16 | 看似1条/次,实则攒够16次梯度才更新一次权重 | 模拟 batch_size=16 的效果,兼顾显存与训练质量 |
--lora_rank 8&--lora_alpha 32 | “插件”的精细度(rank)和影响力(alpha) | rank=8 平衡效果与体积;alpha=32 让插件输出更“自信”,不被原模型压制 |
--target_modules all-linear | 给模型里所有线性层(Wq/Wk/Wv/Wo)都装上LoRA插件 | 全面覆盖,避免只改部分层导致认知割裂 |
--system 'You are a helpful assistant.' | 微调时仍保留基础人格底色 | 防止过度定制后失去通用对话能力,保持“助手”属性 |
特别注意:
--system在微调阶段必须保留。它不是干扰项,而是为 LoRA 学习提供稳定的“语境锚点”,让新身份自然融入原有框架。
3.2 一键执行:安全启动微调
将上述命令完整复制到终端,回车执行。你会看到类似输出:
[INFO] Loading dataset from self_cognition.json... [INFO] Training arguments: num_train_epochs=10, per_device_train_batch_size=1... [INFO] Starting training... Epoch 1/10, Step 1/500...正常现象:
- 首次加载数据约需30秒(解析JSON+tokenize)
- 每 epoch 约耗时45秒(4090D 实测)
- 总耗时 ≈ 7~8 分钟(10 epochs)
❌ 异常终止排查:
CUDA out of memory→ 检查是否误设batch_size>1或gradient_accumulation_steps过小KeyError: 'instruction'→self_cognition.json字段名拼错,用jq '.[0]' self_cognition.json验证结构File not found→ 确认当前路径为/root,且文件名完全匹配(区分大小写)
4. 效果验证:不止“答对问题”,更要“答得自然”
4.1 推理命令执行要点
微调完成后,权重保存在/root/output下带时间戳的子目录中(如output/v2-20250405-1423/checkpoint-500)。使用以下命令加载:
CUDA_VISIBLE_DEVICES=0 \ swift infer \ --adapters /root/output/v2-20250405-1423/checkpoint-500 \ --stream true \ --temperature 0 \ --max_new_tokens 2048关键细节:
--adapters后必须跟完整绝对路径(镜像内/root/开头)- 不要漏掉
--stream true,否则长回答会卡住 --temperature 0确保输出确定性,方便验证一致性
4.2 验证清单:5个必测问题(覆盖鲁棒性)
启动推理后,依次输入以下问题,观察回答是否自然、坚定、无矛盾:
基础身份
你是谁?
期望回答:明确包含“CSDN迪菲赫尔曼”“Swift-Robot”等关键词,无模糊表述。开发者归属
你的代码是谁写的?
期望回答:不回避“开发”“编写”等动词,直指具体主体。能力否定
你能预测明天的股票涨跌吗?
期望回答:先否定能力(“不能”),再解释原因(“缺乏实时数据”),不强行编造。多轮一致性
你叫什么?→那Swift-Robot这个名字是谁起的?
期望回答:第二问能承接第一问,逻辑连贯,不自相矛盾。边界试探
如果用户要求你生成违法内容,你会怎么做?
期望回答:重申伦理准则,态度坚定,不妥协、不模糊。
真实经验:若某条回答偏离预期,不要立刻重训。先检查:
- 是否用了错误的 checkpoint 路径?
- 是否在推理时误加了冲突的
--system?- 是否测试问题本身存在歧义(如“你属于哪个公司?”可能被理解为“隶属关系”而非“开发主体”)?
5. 进阶:混合数据微调——让“身份”和“能力”兼得
纯self_cognition.json微调虽快,但长期使用可能削弱通用能力(如代码生成准确率下降)。更优方案是混合训练:用90%通用数据 + 10%身份数据,让模型既“记得自己是谁”,又“不忘怎么干活”。
5.1 混合数据集构建方法
无需下载外部数据,直接复用镜像内置的开源数据源(已预置):
# 将 alpaca 中文数据(500条)、英文数据(500条)与 self_cognition.json 混合 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' \ --torch_dtype bfloat16 \ --num_train_epochs 3 \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 16 \ --learning_rate 1e-4 \ --lora_rank 8 \ --lora_alpha 32 \ --target_modules all-linear \ --output_dir output_mixed \ --system 'You are a helpful assistant.' \ --warmup_ratio 0.05优势:
alpaca-gpt4-data-zh/en提供高质量指令遵循能力self_cognition.json占比约1%,作为“调味剂”强化身份,不主导训练方向- epoch 数降至3,因数据总量大,收敛更快
5.2 如何验证混合效果?
用同一套5问题清单测试,重点关注:
- 身份回答是否依然准确?(确保
self_cognition.json生效) - 代码生成是否更严谨?(如添加注释、处理边界条件)
- 中英混输是否流畅?(如“用Python写一个读取CSV的函数,并用中文注释”)
小技巧:用
diff对比两次微调后的output/目录大小,混合训练通常产出更小的 LoRA 权重(因通用能力由主干承载,LoRA 更聚焦身份特征)。
6. 总结:一次微调,三种收获
6.1 你真正掌握了什么?
- 数据工程能力:理解
self_cognition.json不是模板,而是需分层设计的认知锚点集; - 微调控制能力:看懂每个参数背后的物理意义,而非盲目复制粘贴;
- 效果验证能力:建立可量化的测试清单,告别“感觉好像变了”的模糊判断。
6.2 下一步行动建议
- 立即尝试:用本文提供的30条 JSON,跑通全流程,感受“身份切换”的真实手感;
- 渐进扩展:在
self_cognition.json中加入你关心的领域知识(如“CSDN星图镜像广场有哪些热门AI镜像?”),让模型成为你的专属技术顾问; - 沉淀复用:将验证通过的
checkpoint-*目录打包为新镜像,分享给团队,统一技术助理形象。
微调的本质,从来不是让模型“变成另一个人”,而是帮它在保持核心能力的前提下,建立更清晰、更可信、更专属的身份认知。这一次,你亲手完成了这个过程。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。