[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"learning-part-15-finetuning":3,"learning-all":13},{"id":4,"slug":5,"title":6,"description":7,"level":8,"topic":9,"url":10,"content":11,"sortOrder":12},13,"part-15-finetuning","Part 15 · 模型微调 Fine-Tuning","目标：理解\"什么时候必须微调、怎么选基座、怎么备数据\"，并完整跑通一次业务微调。","ADVANCED","微调",null,"# Part 13 · 模型微调 Fine-Tuning\n\n\n---\n\n## Section 1 · 微调 vs RAG vs Prompt（边界再理清）\n\n**Subsection 1 · 记判断表**\n```\n需求类型                   用啥\n临时改风格\u002F格式              Prompt\n要答私有知识\u002F新资料           RAG\n要固定输出格式\u002F领域术语       微调\n要模型学会新能力\u002F新知识       微调\n要低成本快速验证             先 Prompt → 不够再 RAG → 再微调\n```\n- 💡 顺序永远是：**先用最轻的，不够再上重的**。\n\n**Subsection 2 · 过关自测**\n判断 4 个场景该用啥（答案：1 客服固定话术→微调 2 公司制度问答→RAG 3 翻译→Prompt 4 让模型识别专业医学术语→微调）。\n\n**过关**：能对号入座 = Section 1 完成。\n\n---\n\n## Section 2 · 选基座模型\n\n**Subsection 1 · 记选型**\n```\n中文通用\u002F业务   Qwen2.5 系列（首选）\n中文对话        ChatGLM 系列\n英文通用        Llama3 系列\n推理强          DeepSeek 系列（较大，需好显卡）\n小体量快速试     Qwen2.5-0.5B \u002F 1.5B\n```\n- 💡 结论：**没特殊理由就选 Qwen**——教程多、社区大、中文好。\n\n**Subsection 2 · 定你的实验模型**\n写笔记：`我接下来微调实验用 Qwen2.5-1.5B-Instruct（显存要求低，适合学习）`。\n\n**过关**：能说出选型理由 = Section 2 完成。\n\n---\n\n## Section 3 · 微调数据格式（JSONL）\n\n**Subsection 1 · 记格式**\n微调数据通常是 JSONL（每行一个 JSON），对话格式叫 ChatML：\n```\n{\"messages\": [{\"role\": \"user\", \"content\": \"问题\"}, {\"role\": \"assistant\", \"content\": \"答案\"}]}\n{\"messages\": [{\"role\": \"user\", \"content\": \"另一个问题\"}, {\"role\": \"assistant\", \"content\": \"另一个答案\"}]}\n```\n\n**Subsection 2 · 造 10 条示例数据**\n新建 `train_data.jsonl`，内容：\n```\n{\"messages\": [{\"role\": \"user\", \"content\": \"你好\"}, {\"role\": \"assistant\", \"content\": \"您好，请问有什么可以帮您？\"}]}\n{\"messages\": [{\"role\": \"user\", \"content\": \"怎么退款\"}, {\"role\": \"assistant\", \"content\": \"亲，请在订单页点击申请退款，1-3个工作日到账。\"}]}\n```\n（再补 8 条类似客服对话）\n\n**过关**：能写出标准 JSONL = Section 3 完成。\n\n---\n\n## Section 4 · 准备你自己的数据集\n\n**Subsection 1 · 写脚本生成**\n新建 `make_data.py`：把你的\"客服问答\"整理成 JSONL：\n```python\nimport json\n\npairs = [\n    (\"你们几点发货\", \"我们工作日下午4点前下单当天发货。\"),\n    (\"能开发票吗\", \"可以，下单时填写抬头，随货寄出。\"),\n    (\"支持七天无理由吗\", \"支持，未拆封7天内可申请。\"),\n    # ... 再加 10~20 条\n]\n\nwith open(\"train_data.jsonl\", \"w\", encoding=\"utf-8\") as f:\n    for q, a in pairs:\n        f.write(json.dumps({\"messages\": [\n            {\"role\": \"user\", \"content\": q},\n            {\"role\": \"assistant\", \"content\": a},\n        ]}, ensure_ascii=False) + \"\\n\")\n\nprint(\"生成完成，共\", len(pairs), \"条\")\n```\n\n**Subsection 2 · 数据量建议**\n```\n少样本风格微调：100~500 条高质量即可\n领域能力提升：1000~10000 条\n原则：宁可少而精，不要多而脏\n```\n\n**过关**：数据集生成 + 了解数据量 = Section 4 完成。\n\n---\n\n## Section 5 · 数据清洗与去重（代码）\n\n**Subsection 1 · 写清洗脚本**\n新建 `clean_data.py`：\n```python\nimport json\n\n# 读入\nrows = []\nwith open(\"train_data.jsonl\", encoding=\"utf-8\") as f:\n    rows = [json.loads(line) for line in f]\n\n# 1. 去重（按 user 问题去重）\nseen, cleaned = set(), []\nfor r in rows:\n    q = r[\"messages\"][0][\"content\"]\n    if q in seen:\n        continue\n    seen.add(q)\n    cleaned.append(r)\n\n# 2. 过滤：答案太短的扔掉（\u003C5字说明质量差）\ncleaned = [r for r in cleaned if len(r[\"messages\"][1][\"content\"]) >= 5]\n\n# 3. 写回\nwith open(\"train_data_clean.jsonl\", \"w\", encoding=\"utf-8\") as f:\n    for r in cleaned:\n        f.write(json.dumps(r, ensure_ascii=False) + \"\\n\")\n\nprint(f\"原 {len(rows)} 条 → 清洗后 {len(cleaned)} 条\")\n```\n- ✅ 预期看到：条数减少（去重\u002F过滤生效）。\n- 💡 脏数据会带偏模型，**清洗比数量更重要**。\n\n**过关**：清洗脚本跑通 = Section 5 完成。\n\n---\n\n## Section 6 · HF Transformers 训练入门\n\n**Subsection 1 · 装库**\ncmd：`pip install transformers datasets accelerate`\n\n**Subsection 2 · 跑最简训练**\n新建 `hf_train.py`：\n```python\nfrom transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer\nfrom datasets import Dataset\nimport json\n\n# 读数据\nrows = [json.loads(l) for l in open(\"train_data_clean.jsonl\", encoding=\"utf-8\")]\ndataset = Dataset.from_list(rows)\n\n# 加载小模型（CPU 也能跑 0.5B）\nmodel_name = \"Qwen\u002FQwen2.5-0.5B-Instruct\"\ntokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)\nmodel = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True)\n\ndef fmt(ex):\n    text = tokenizer.apply_chat_template(ex[\"messages\"], tokenize=False)\n    return tokenizer(text, truncation=True, max_length=256, padding=\"max_length\")\n\ndataset = dataset.map(fmt)\n\nargs = TrainingArguments(\n    output_dir=\"hf_out\",\n    num_train_epochs=3,\n    per_device_train_batch_size=1,\n    logging_steps=1,\n    save_strategy=\"no\",\n    report_to=[],\n)\n\ntrainer = Trainer(model=model, args=args, train_dataset=dataset)\ntrainer.train()\nprint(\"训练完成\")\n```\n- 运行（第一次下载模型，可能 10 分钟；CPU 慢是正常的）\n- ✅ 预期看到：loss 逐渐下降，最后\"训练完成\"。\n\n**过关**：最简 SFT 训练跑通 = Section 6 完成。\n\n---\n\n## Section 7 · 认识 LLaMA-Factory（微调神器）\n\n**Subsection 1 · 概念**\n```\nLLaMA-Factory = 一行命令\u002F一个网页 完成 LoRA 全参微调\n支持：SFT \u002F LoRA \u002F QLoRA \u002F DPO，支持 Qwen 等全系模型\n```\n\n**Subsection 2 · 装**\n- 打开 https:\u002F\u002Fgithub.com\u002Fhiyouga\u002FLLaMA-Factory 按 README 安装：\n```\ngit clone https:\u002F\u002Fgithub.com\u002Fhiyouga\u002FLLaMA-Factory.git\ncd LLaMA-Factory\npip install -e .\n```\n- ✅ 预期看到：安装成功。\n\n**过关**：LLaMA-Factory 装好 = Section 7 完成。\n\n---\n\n## Section 8 · 用 LLaMA-Factory 跑 SFT（命令版）\n\n**Subsection 1 · 跑训练**\n在 LLaMA-Factory 目录运行：\n```\npython src\u002Ftrain_bash.py \\\n  --model_name_or_path Qwen\u002FQwen2.5-1.5B-Instruct \\\n  --dataset train_data_clean.jsonl \\\n  --template qwen \\\n  --output_dir .\u002Foutput_sft \\\n  --num_train_epochs 3 \\\n  --per_device_train_batch_size 1 \\\n  --learning_rate 5e-5 \\\n  --save_strategy no\n```\n- ⚠️ 首次会下载模型，需要网络；GPU 没有就用 0.5B 版本（CPU 也能，慢）。\n- ✅ 预期看到：loss 下降，训练完成，输出目录里有模型。\n\n**过关**：LLaMA-Factory 训练跑通 = Section 8 完成。\n\n---\n\n## Section 9 · 推理：加载微调后的模型\n\n**Subsection 1 · 用微调模型回答**\n新建 `infer_sft.py`：\n```python\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\n\n# 加载你微调后的模型\nmodel = AutoModelForCausalLM.from_pretrained(\".\u002Foutput_sft\", trust_remote_code=True)\ntokenizer = AutoTokenizer.from_pretrained(\"Qwen\u002FQwen2.5-1.5B-Instruct\", trust_remote_code=True)\n\ntext = tokenizer.apply_chat_template(\n    [{\"role\": \"user\", \"content\": \"能开发票吗\"}], tokenize=False, add_generation_prompt=True\n)\ninputs = tokenizer(text, return_tensors=\"pt\")\nout = model.generate(**inputs, max_new_tokens=50)\nprint(tokenizer.decode(out[0][len(inputs[\"input_ids\"][0]):], skip_special_tokens=True))\n```\n- ✅ 预期看到：模型用你数据里的语气回答（比较像你造的那几条客服话术）。\n\n**过关**：微调模型能推理 = Section 9 完成。\n\n---\n\n## Section 10 · 对比：微调前 vs 微调后\n\n**Subsection 1 · 对照测试**\n- 用原始模型（不加载 output_sft）问同样问题，记录回答。\n- 用微调后模型问同样问题，记录回答。\n- ✅ 预期看到：微调后更贴合你的客服语气\u002F话术。\n- 写对比笔记：哪些问题改进明显，哪些没变。\n\n**过关**：能说清微调到底改进了什么 = Section 10 完成。\n\n---\n\n## Section 11 · 评估微调效果（量化）\n\n**Subsection 1 · 写评估**\n- 准备 10 条\"测试问题\"（训练集里没出现过的）。\n- 分别用两个模型回答，人工打分（0~5）：回答是否贴切\u002F语气是否对。\n- 算平均分对比。\n- ✅ 预期看到：微调后平均分更高。\n- 💡 这就是\"评估集 + 打分\"的最简评估，后面Part 16 会系统化。\n\n**过关**：有量化的前后对比 = Section 11 完成。\n\n---\n\n## Section 12 · DeepSpeed 认识（分布式微调）\n\n**Subsection 1 · 概念**\n```\nDeepSpeed = 微软的分布式训练框架，让大模型在有限显存上训练\n  ZeRO 1\u002F2\u002F3：把优化器状态\u002F梯度\u002F参数分片到多卡\n作用：你本地单卡跑不动的模型，用 DeepSpeed + 多卡能跑\n```\n- 💡 学习阶段知道\"它解决显存不够\"即可，LLaMA-Factory 里可加 `--deepspeed config.json` 启用。\n\n**过关**：能说 DeepSpeed 解决什么 = Section 12 完成。\n\n---\n\n## Section 13 · 常见坑\n\n**Subsection 1 · 记坑**\n```\n坑1  显存 OOM → 换更小模型 \u002F batch_size=1 \u002F 加 gradient_accumulation\n坑2  中文乱码\u002F重复 → max_length 太短或数据太脏，清洗+加长\n坑3  训练 loss 不降 → 学习率太大\u002F数据太少，调小 lr 或加数据\n坑4  模型\"忘了\"原来能力（灾难性遗忘）→ 混入一些通用数据\n坑5  模板不匹配 → 用对 LLaMA-Factory 的 template（qwen\u002Fchatglm 等）\n```\n\n**过关**：坑笔记写完 = Section 13 完成。\n\n---\n\n## Section 14 · 综合：微调一个\"固定风格助手\"\n\n**Subsection 1 · 完整项目**\n做一个项目 `finetune_demo`：\n1. 造 100 条\"可爱语气客服\"数据（风格统一）\n2. 清洗 + 去重\n3. LLaMA-Factory 微调\n4. 微调前后对比 + 评估分数\n5. README 写流程\n- ✅ 预期看到：一个完整、可复现的微调项目。\n\n**过关**：完整项目跑通 = Section 14 完成。\n\n---\n\n## Section 15 · 站 13 验收\n\n**勾选**\n- [ ] 能判断\"微调\u002FRAG\u002FPrompt\"场景\n- [ ] 能选基座并说明理由\n- [ ] 会写 JSONL 数据 + 清洗去重\n- [ ] HF 最简训练跑通（Section 6）\n- [ ] LLaMA-Factory SFT 跑通（Section 8）\n- [ ] 微调后模型能推理（Section 9）\n- [ ] 有量化前后对比（Section 11）\n- [ ] 了解 DeepSpeed 解决什么\n- [ ] 常见坑笔记写完\n\n**写 400 字Part 13 总结**：微调全流程 + 你的数据\u002F模型\u002F效果数字。\n\n**全勾选 = Part 15 通过** → 进入下一站 Part 16 · PEFT 参数高效微调，20 天，重点 LoRA）。\n\n\n\n",15,[14,21,27,33,40,46,52,58,63,69,75,81,87,92,98,99,105,111,117,123,129],{"id":15,"slug":16,"title":17,"description":18,"level":19,"topic":20,"url":10,"content":10,"sortOrder":15},1,"part-1-llm-basics","Part 1 · 大模型基础认知","小白零基础友好。这一站不写代码，只建立\"大模型到底是什么\"的骨架。","BEGINNER","大模型认知",{"id":22,"slug":23,"title":24,"description":25,"level":19,"topic":26,"url":10,"content":10,"sortOrder":22},2,"part-2-llm-principles","Part 2 · 大模型原理 · 入门实操","这一站不卷数学，只把\"理解模型所需的知识\"讲透。；站 2A 解决\"理解模型\"，站 2B 解决\"面试能答\"。；这一层是\"有余力再做\"，不做也不影响你进入站 3。","大模型原理",{"id":28,"slug":29,"title":30,"description":31,"level":19,"topic":26,"url":10,"content":10,"sortOrder":32},100,"part-3-llm-principles-deep","Part 3 · 大模型原理 · 面试深入","数学基础、机器学习、神经网络、词向量、思维链等面试必考原理",3,{"id":34,"slug":35,"title":36,"description":37,"level":38,"topic":26,"url":10,"content":10,"sortOrder":39},101,"part-4-llm-principles-advanced","Part 4 · 大模型原理 · 进阶可选","从零写迷你模型、RLHF、PPO、分布式训练实操等进阶内容","INTERMEDIATE",4,{"id":32,"slug":41,"title":42,"description":43,"level":19,"topic":44,"url":10,"content":10,"sortOrder":45},"part-5-prompt-engineering","Part 5 · Prompt 提示词工程","从这里开始，你每天都要真的调大模型 API。","提示工程",5,{"id":39,"slug":47,"title":48,"description":49,"level":19,"topic":50,"url":10,"content":10,"sortOrder":51},"part-6-llm-api","Part 6 · 大模型 API 调用","站 3 你已经调通了 API。这一站把\"调用\"做成专业水准：","API 工程",6,{"id":45,"slug":53,"title":54,"description":55,"level":38,"topic":56,"url":10,"content":10,"sortOrder":57},"part-7-rag","Part 7 · RAG 检索增强生成","这一站是\"能落地\"的关键：让模型回答**你的私有知识**。","RAG",7,{"id":51,"slug":59,"title":60,"description":61,"level":38,"topic":56,"url":10,"content":10,"sortOrder":62},"part-8-rag-optimization","Part 8 · RAG 优化与评估","站 5 你做出了\"能跑\"的 RAG。这一站把它做到\"能打\"：",8,{"id":57,"slug":64,"title":65,"description":66,"level":38,"topic":67,"url":10,"content":10,"sortOrder":68},"part-9-langchain","Part 9 · LangChain 框架","目标：用 LangChain 把\"模型、提示词、检索、记忆、工具\"串成可复用的链和 Agent。","LangChain",9,{"id":62,"slug":70,"title":71,"description":72,"level":38,"topic":73,"url":10,"content":10,"sortOrder":74},"part-10-agent","Part 10 · Agent 基础","让模型从\"会聊天\"变成\"能干活\"：自己拆任务、调工具、看结果、再行动。","Agent",10,{"id":68,"slug":76,"title":77,"description":78,"level":8,"topic":79,"url":10,"content":10,"sortOrder":80},"part-11-multi-agent","Part 11 · 多 Agent 与 Agent IDE","从\"单个 Agent\"升级到\"多 Agent 协作\"，并掌握 AutoGen \u002F LangGraph \u002F GPTs \u002F Coze \u002F Dify 五个工具。","多 Agent",11,{"id":74,"slug":82,"title":83,"description":84,"level":8,"topic":85,"url":10,"content":10,"sortOrder":86},"part-12-llamaindex","Part 12 · LlamaIndex","站 5~7 你用了 LangChain 做 RAG。LlamaIndex 是另一条专攻\"数据 + LLM\"的路线。","LlamaIndex",12,{"id":80,"slug":88,"title":89,"description":90,"level":8,"topic":91,"url":10,"content":10,"sortOrder":4},"part-13-transformer","Part 13 · Transformer 深入","站 2A 建立了直觉，这一站把手写代码跑通——从\"懂概念\"到\"写得出\"。","Transformer",{"id":86,"slug":93,"title":94,"description":95,"level":8,"topic":96,"url":10,"content":10,"sortOrder":97},"part-14-open-models","Part 14 · 开源模型与私有化部署","目标：把主流开源模型在本地\u002F服务器跑通，理解服务化工程（显存、量化、并发）。","模型部署",14,{"id":4,"slug":5,"title":6,"description":7,"level":8,"topic":9,"url":10,"content":10,"sortOrder":12},{"id":97,"slug":100,"title":101,"description":102,"level":8,"topic":103,"url":10,"content":10,"sortOrder":104},"part-16-peft-lora","Part 16 · PEFT 参数高效微调","重点吃透 **LoRA**：用极少量可训练参数微调大模型（消费级显卡就能跑）。","PEFT\u002FLoRA",16,{"id":12,"slug":106,"title":107,"description":108,"level":8,"topic":109,"url":10,"content":10,"sortOrder":110},"part-17-quantization","Part 17 · 模型量化","目标：理解\"为什么量化、主流算法各自思路\"，能动手量化并评估效果。","量化",17,{"id":104,"slug":112,"title":113,"description":114,"level":8,"topic":115,"url":10,"content":10,"sortOrder":116},"part-18-data-evaluation","Part 18 · 训练数据与模型评估","数据决定模型上限，评估决定你\"能不能交付\"。","数据与评估",18,{"id":110,"slug":118,"title":119,"description":120,"level":8,"topic":121,"url":10,"content":10,"sortOrder":122},"part-19-multimodal","Part 19 · 多模态应用","让 AI 同时\"看得懂图、听得了音、说得出话\"。","多模态",19,{"id":116,"slug":124,"title":125,"description":126,"level":8,"topic":127,"url":10,"content":10,"sortOrder":128},"part-20-projects-career","Part 20 · 项目实战 + 求职备战","把 0→1 到 1→100 学到的全部收敛成**能展示、能讲、能面试**的项目。","项目与求职",20,{"id":130,"slug":131,"title":132,"description":133,"level":8,"topic":134,"url":10,"content":10,"sortOrder":135},102,"extra-2026-ai-tech","额外篇 · 2026 年 AI 应用开发必学的 5 项成熟技术","从近半年爆发的技术里，挑出已经过了尝鲜期、能真正用在项目里的 5 项：推理模型、MCP、多模态、GraphRAG、AI 编程工具链，每项都给到能跑通的代码。","AI 工程实践",21]