跳到主要内容

reading-notes — fine-tuning-with-python-train-align

原文:library/fine-tuning-with-python-train-align/text/。行号 = text 文件行号(清洗文本一行=一段)。 前言(02-fm-c15.txt)与作者简介(03-fm-c2x.txt)已读,以下笔记逐章记。

前言(02-fm-c15.txt,14K)

  • 核心主张:「用模型」和「拥有模型」之间的缝隙靠微调补(prelude 段 7「gap between using a language model and owning one」)。
  • 消费级硬件视角是全书卖点:LoRA/QLoRA 让 7B 模型在单张 24GB 消费级 GPU 上高质量微调成为可能;DPO 让偏好对齐不需要 RL 基础设施;HF PEFT/TRL 库把这一切打包成 Python API(段 13)。
  • 与 RAG 姊妹卷(RAG with Python)配套;本书第 4 章讲两者结合模式(段 67–69)。
  • 全书代码跑 Google Colab 免费 T4;QLoRA 让 7B 微调可在免费 T4 上跑(段 63)。
  • 作者 Muhammad Sohail:数据科学家/自由开发者(03-fm-c2x)。书 2026-05-21 出版(chapters.json date)。
  • 「本书与众不同」:既不是 API 文档也不是教程博文,是解释每个技术「为什么」的工程参考(段 55–59)。
  • 章节预告(段 39–51)给出各章覆盖,与 chapters.json 一致:7 章。
  • 各章主题:1 基础+全参微调+特征微调;2 PEFT/LoRA/QLoRA;3 指令微调与对齐(SFT/RLHF/DPO/ORPO/SimPO);4 领域微调(医疗法律代码金融跨语言)+RAG 结合;5 评测;6 部署;7 案例与 capstone。

Ch1(04-ch01…,794 行,51K)— Fine-Tuning Fundamentals: Full and Feature-Based

关键段:

  • :7–13 引言:「在所有东西上训练的模型,没有为任何具体的东西优化」;本章覆盖。
  • :15–25 微调 vs RAG:RAG 不改权重、查询时注入文档→解决「知识获取」;微调改权重→解决「行为」;互补不竞争。「RAG improves what a model can access. Fine-tuning improves what a model fundamentally is.」(:25)
  • :27–49 微调做什么:预训练=几十亿 token 上的统计摘要(:33);权重分布反映训练数据分布(:35);微调=在先验之上继续训练,shift 分布到目标分布,不是从头学(:39–41);权重量级变化 << 权重本身量级,「微调后的模型看起来大部分像预训练模型+定向修正」——这既是有效性来源也是灾难性遗忘的根源(:43)。分布偏移是核心机制(:45–49):shift 太快太远→丢一般能力。
  • :51–81 什么时候微调:三场景=①任务性能(一致的结构化输出,:55–61)②风格控制(:63–69)③领域适配(:71–75)。何时不微调(:77–81):prompt/RAG 能解决就不微调;<100 样本不可行;需求频繁变化时不微调(微调模型是行为快照,更新要重训)。
  • :83–97 全参微调:更新所有参数;适合大数据+大算力+深层行为改变(:87–89);小模型(125M/350M)单卡数小时可全参微调(:91)。显存账(:95):7B 16-bit 权重≈14GB + AdamW 优化器状态≈28GB,合计 40GB+,超消费级单卡——这是 LoRA/QLoRA 的动机(:97);>3B 全参微调在消费硬件要 multi-GPU/gradient checkpointing/PEFT。
  • :99–101 梯度检查点:拿 ~33% 更多计算时间换激活显存。
  • :103–123 特征微调:冻结主干,只训小任务头(:105);直觉=预训练表示已足够丰富,头只需学线性映射(:109);完全避免灾难性遗忘(:111)。适合分类;不适合生成/分布外(:113–117)。层选择微调(:119–123):冻结前 1/3(通用句法),训后 1/3(任务特定)。
  • :125–149 数据格式三型:completion(prompt→completion,简单但脆,提示词变体就退化,:129–135);instruction(语义跟随,泛化更好,:137–141);chat(system/user/assistant 角色轮替,LLaMA/Mistral/Phi 家族都用变体,格式不对会忽略 system prompt,:143–149)。多轮例子注意 turn 边界 tokenization。
  • :151–175 数据质量>数量:500 高质量 > 5000 平庸(:153)。质量四属性:准确/多样/一致/无污染(:155–163)。curation:标注指南+校准会+Cohen's kappa(:167);合成数据先抽样审查+checklist(:169);过滤规则(过短响应/重复输入/格式残留,:171)。去重:embedding 相似度阈值 ~0.95 是标准做法(:175)。
  • :177–205 超参:学习率最重要,全参微调收敛于 1e-55e-5,比预训练低 1–2 个数量级;默认 2e-5(:181–185)。头训练用 1e-41e-3(:187)。warmup:从 0 线性升到目标 lr,通常占总步数 5–10%;例:1000 样本×3 epochs÷batch 8=375 步→warmup 20–40 步(:189–193)。batch size 8–32(累计后)<4 噪声大 >128 找到 sharp minima(:195–199)。epochs 1–5,以验证损失为准(:201–205)。
  • :207–227 灾难性遗忘:机制=新任务梯度覆写旧任务权重(:211–215);加重条件:分布差异大、lr 高、epochs 多、数据少(:217)。对策:①低 lr(最有效,:221)②early stopping(:223)③数据混洗/replay:每批 10–20% 通用数据(:225)④PEFT 结构性保护(:227)。
  • :229–249 评测:两个轴=任务性能+一般能力保持(:231);capability probes(固定小探针集,微调前后跑,:243);人工评测是高风险决策的金标准(:245–249)。
  • :251–775 代码:Colab 安装(peft 0.10.0, trl 0.8.6, transformers 4.40.0, bitsandbytes 0.43.0);30 条客服查询 4 分类(billing/technical/account/feature_request);distilbert-base-uncased;全参 lr 2e-5 epochs 4 batch 8 warmup_ratio 0.1 fp16;特征微调对照:冻结除 classifier 外全部,lr 1e-3,epochs 6。
  • :777–795 章总结。

走查素材:30 条数据→distilbert 分类,「My payment failed and I was charged twice」→billing 可当主走查;显存账(14+28=40GB)是硬数字。

Ch2(05-ch02…,522 行,35K)— PEFT: LoRA and QLoRA

关键段:

  • :7–11 引子:7B 全参微调 >40GB(A100 80GB 勉强,24GB 消费卡不行);PEFT 核心洞察=微调的权重变化不是均匀分布的,大部分有用适配可以装进少量精心挑选的变化里。
  • :13–29 显存算术(本章主走查素材):四组件=权重+梯度+优化器状态+激活(:19);7B 16-bit:权重 14GB+梯度 14GB+AdamW 28GB=56GB(未计激活)(:21)。LoRA r16 在 7B 上加 ~20–40M 可训参数(0.3–0.5%)(:23);QLoRA 底座 14GB→~4GB,总训练显存 ~8–12GB——56GB→8–12GB,从多卡集群降到单张消费卡(:23,:25)。质量:多数任务 LoRA≈全参;差距出现在需要深分布偏移的任务(:29)。
  • :31–63 LoRA(Hu et al. 2021,:33):低秩假设——全参微调的 ΔW 内在秩很低(:37);ΔW≈A(d×r)·B(r×k),前向=W+AB,只训 A/B,r 常取 4/8/16/32(:39–41)。α 缩放:更新=(α/r)·AB,惯例 α=2r——改 r 不自动改更新量级(:45)。初始化:A 高斯随机、B 全零→训练起点恰好等于预训练行为,稳定性关键(:47)。目标矩阵:原论文只打 Wq+Wv;现在默认打注意力全部线性层,深域适配加 FFN up/down(:53–55)。秩选择:4–64;r4–8 风格微调、r16 万金油默认、r32–64 大行为偏移;实操=从 16 起步,不够加到 32/64,够了试 8(:61–63)。
  • :65–85 QLoRA(Dettmers et al. 2023,:67):4-bit=每权重 16 个可能值(:71);7B 权重 14GB→3.5GB,56GB→<12GB(:73)。NF4(NormalFloat4):量化级按正态分布间距排,不是等距——同样 4 bit 误差更小(:77)。底座 4-bit 冻结,A/B 保持 16-bit;前向时反量化→算→再量化,由 bitsandbytes 自动做(:79)。双重量化:量化常数本身也量化,0.5→0.127 bit/参数(:83)。分页优化器:CUDA unified memory,显存尖峰时优化器状态暂移 CPU RAM;paged_adamw_32bit(:85)。
  • :87–101 超参:秩随数据量走——几百条样本训不动高秩(过拟合风险)(:91);α=2r 最稳,α 过高不稳(:93)。目标模块:q/k/v/o_proj 强默认;LLaMA 系加 gate/up/down_proj;算力紧就 q+v(:97)。dropout 0.05–0.1 小数据,大数据可 0(:101)。
  • :103–125 其他 PEFT:瓶颈适配器——层内插 down→非线性→up 小模块+残差;可组合(AdapterFusion),已被 LoRA 取代(:105–109)。prefix tuning——每个注意力层的 K/V 前面拼可学前缀向量;完全不动权重,换任务=换前缀(:113–115)。prompt tuning——只在输入嵌入层拼,参数=前缀长×嵌入维;效果随模型规模涨,10B+ 上接近全参(:117)。IA3——学逐元素缩放向量(K/V/FFN 三组),hidden 4096×32 层才 ~1–2M 参数,比 LoRA 尊 1–2 个数量级;适合小数据/低延迟,大偏移吃力(:121–125)。
  • :127–131 方法对比(7B):LoRA r16≈全参显存的 25–35%;QLoRA 10–15%;IA3 优化器状态最小。质量:LoRA r16–64 打全部注意力≈全参差几个百分点;QLoRA≈LoRA 同秩。
  • :133–149 HF PEFT 库:PeftConfig 家族→get_peft_model→print_trainable_parameters(建完先跑这个核参数量)(:135–137);save_pretrained 只存适配器(几 MB);merge_and_unload 把 W+AB 烘回底座,推理不再依赖 PEFT 库(:141–147);适配器堆叠(:149)。
  • :151–473 实操(QLoRA on phi-2):BitsAndBytesConfig(load_in_4bit, nf4, bfloat16, double_quant);prepare_model_for_kbit_training;LoraConfig(r=16, alpha=32, target=[q_proj,k_proj,v_proj,dense], dropout=0.05);SFTTrainer + formatting_prompts_func 手拼 <|system|>/<|user|>/<|assistant|> 模板;lr 2e-4(LoRA 的 lr 比全参 2e-5 高一个数量级!);batch 2×grad_accum 4=有效 8;cosine;max_grad_norm 0.3;paged_adamw_32bit;merge_and_unload 收尾。
  • :475–505 对比表:全参 100%/>56GB/基线;LoRA r16 ~0.3%/~28GB/95–99%;QLoRA ~0.3%/8–12GB/93–98%;瓶颈 ~0.3%/90–97%;prefix ~0.07%/85–95%;prompt ~0.006%/80–95%(10B+ 有竞争力);IA3 ~0.014%/85–95%。
  • :507–523 总结;引向 Ch3。

注意:Ch1 :95 的快速账(14+28>40GB)漏了梯度项,Ch2 :21 的完整账是 56GB——两处数字不一致,拆解里用 56GB 完整版并如实点破。

Ch3(06-ch03…,898 行,50K)— Instruction Tuning and Alignment

关键段:

  • :7–31 指令跟随缺口:预训练模型是文本补全器——问它问题,它可能接着写更多问题,因为「问题后跟问题」在语料里是完全合法的续写模式(:7);预训练没教「意图对齐」,语料里有益有害混着,模型没有「要回答」的训练倾向(:21);表现:让它写排序函数可能写出一篇讲排序算法的文章;长度约束被无视(:27);对有害内容没有回避倾向(:29)。
  • :33–49 SFT:数据集三性=多样性/单例质量/覆盖度(:37–43);规模-质量权衡:FLAN 多任务有效但任务多样性>样本量;Alpaca/Orca 少量高质量≥大量平庸;Phi 用「教科书质量」合成数据(:47);1000 条优秀 > 100,000 条平庸(:49)。
  • :51–73 三种格式:Alpaca(instruction/input/output,单轮,Stanford 2023)(:55–59);ShareGPT(轮次列表,源自人机对话收集,多轮自然)(:61–65);OpenAI chat(system/user/assistant,事实标准;system 消息让部署时改行为不用重训)(:67–71);推理时模板用错=最常见的意外行为来源(:73)。
  • :75–91 合成数据:Self-Instruct(Wang et al.):种子集→生成指令→过滤→生成响应;Alpaca 用 175 个人写种子经 GPT-3.5 扩到 52,000 对(:81);Orca:蒸馏 GPT-4 的逐步推理轨迹而非只蒸答案——「蒸过程比蒸结论有效得多」(:85);质检:过滤过短/事实不一致/不跟指令,去重关键(模型反复提示会生成重复输出),再人工抽查(:89–91)。
  • :93–123 RLHF:SFT 分不出「两个看起来都对、实际一个好得多」的响应(:95);RLHF 训比较而非标签(:97);三阶段(InstructGPT):SFT→奖励模型→策略优化(:101)。偏好数据=三元组(instruction/chosen/rejected);用比较不用打分,因为人更擅长相对判断(:111);标注者间一致性是关键指标(:113)。奖励模型:同底座初始化+线性头出标量;Bradley-Terry 成对损失(:117–119)。奖励黑客/古德哈特定律:优化代理指标太久→找到高分但人觉得怪/啰嗦/谄媚的输出;这就是 KL 惩罚存在的原因(:123)。
  • :125–143 PPO:策略=语言模型,动作=下一个 token,状态=上下文+已生成,奖励=完整响应末尾的标量(:131);proximal=每次更新用 KL 约束贴着旧策略,防策略坍塌(:133);目标=期望奖励−系数×KL(当前‖SFT);系数太小→奖励黑客,太大→学不动(:137–139);同时驻留显存四模型:策略+SFT 参考 +奖励+价值→这是 DPO 的动机(:143)。
  • :145–165 DPO(Rafailov et al. 2023):闭式解——RLHF 目标的最优策略可用「策略对 chosen/rejected 的生成概率」直接表达,不用显式算奖励、不用 RL(:151);损失=两个对数概率比(相对参考模型)之差的负 log-sigmoid(:153);只要两个模型(策略+冻结 SFT 参考),普通监督学习基建(:157);局限:离线固定数据集;iterative DPO 缓解(:159);beta=KL 约束强度,0.1–0.5,0.1 常用默认(:165)。
  • :167–183 ORPO(Hong et al. 2024):SFT+偏好优化单阶段,odds ratio 惩罚直接加进 SFT 交叉熵;chosen 同时当 SFT 目标(:173–175)。SimPO(Meng et al. 2024):去掉参考模型,用按长度归一的 average log prob 顶替参考模型的归一化作用;加目标奖励 margin;显存只要一个模型(:181–183)。
  • :185–199 安全微调:Constitutional AI(Anthropic):按一组原则让模型自我批评+自我修订,减少标注员接触有害内容;两阶段(自我批评修订→AI 反馈造偏好对)(:191–193);拒绝训练的校准难题:过多→误伤良性请求,过少→越狱(:197–199)。
  • :201–879 实操:phi-2;SFT 6 条→DPO 5 对;DPO lr 5e-5(vs SFT 2e-4),beta=0.1;偏好对样例:chosen 具体/结构化/可执行,rejected 含糊/打太极(:503–555);偏好数据质量分析(词数比、含代码)(:719–777);ORPO 模式:lr 8e-6,lambda_=0.1,单阶段(:779–877)。
  • :881–897 总结。

Ch4(07-ch04…,140 行,20K)— Fine-Tuning for Specific Domains

关键段:

  • :7–13 引子:领域微调不是换题材,数据获取/质量标准/合规/评测/部署架构都要重来。
  • :15–37 战略选择:继续预训练 vs 指令微调:继续预训练(领域自适应预训练)=拿大量原始领域文本继续训下一个 token,在语言表示层加深,不给任务示范(:21–23);需要数亿到数十亿 token(:25);大尺度灾难性遗忘:惯例混 10–30% 通用文本(:27)。指令微调=底座领域知识够、只缺任务用法时用(:31–33)。两段式(先继续预训练后指令微调)效果最好,但多数团队从指令微调起步(:37,:135)。
  • :39–59 法律:文档长(合同几十页,保单/并购协议几百页)→语义分块必须保住完整条款边界,切断句子会改法律含义;层级结构(先懂全篇再析章节)(:43–47)。术语精确:shall/will/may/must 法律含义不同;indemnification/hold harmless/defend 义务不同;material adverse effect 是判例堆出来的术语——训练数据必须显式一致地展示这些区分,含糊样本训出含糊模型(:51);需要合格法律专业人员核注(:53)。辖区差异:一个州可执行的条款另一个州未必;按辖区+业务领域切窄,不做大杂烩(:57–59)。
  • :61–79 代码:独有优势=输出可机械验证(过测试就是过)(:63);私有框架挑战:内部认证库/错误处理模式/微服务参数格式,任何公开模型都没见过——「你的内部代码库按定义不在任何公开训练语料里」,这是最清晰最站得住的微调用例(:67–69)。三类数据:docstring↔实现、测试↔通过测试的实现、重构前后(:73);用执行自动过滤训练数据(解析不过的删、过不了基本测试的删)(:75);评测:Pass@k(k 个生成里至少一个全过测试的概率),HumanEval 164 题,领域内要用自己的内部 API 契约+测试集自建(:79)。
  • :81–95 低资源语言:low-resource ≠ 说话人少——数亿使用者的语言也可能数字化文本占比小(:87);跨语言迁移:mBERT/XLM-R/mT5 在 100+ 语言上同训,表示空间迁移性好(:91);数据增强:回译(backtranslation)、跨语言增强、多语言混合训练(:95)。
  • :97–113 领域评测基准:MMLU/HellaSwag/HumanEval 测的是通用能力,测不到领域应用在乎的(:99);好基准三件套=真实分布输入(含该说「不确定」的边界例)+参考输出/判据+领域指标(:103);输入尽量从真实使用收(:105);先用人工评验证自动指标相关性再放大;医疗法律部署决策必须领域专家人工评(:109–113)。
  • :115–129 微调+RAG:互补:微调是训练时知识快照,跟不上金融行情/法规/医学进展;RAG 提供可更新的当前知识,但通用模型读不懂检索到的领域材料——微调过的模型综合检索结果更准(:121–123)。整合模式:检索用嵌入模型也做领域微调(医疗=医学文献嵌入+临床问答生成模型+当前指南库;法律=法律文档嵌入+合同分析生成模型+本辖区法条判例库;金融=分析生成模型+查询时行情数据)(:127–129)。
  • :131–141 总结。
  • ⚠ 缺口(如实记录):前言(:45)与本章引子(:9)、章总结(:137)都预告/复述了**医疗(HIPAA、PHI、MIMIC、去标识化、clinician annotation)与金融(数值锚定、时效敏感)**两节的正文,但转码文本里这两节正文不存在(grep 全库只有引子/前言/总结里的提及);前言还许诺本章结尾有 hands-on 项目,文本里也没有代码。拆解按「文本里实际有的」写,缺口如实写进 notCovered/边界。

Ch5(08-ch05…,790 行,35K)— Evaluating Fine-Tuned Models

关键段:

  • :7–13 开场故事:训练损失健康、几个测试 prompt 看着不错→宣布成功→三周后用户报告没测过的输入类行为怪异/业务方对比发现改进不显著/模型丢了用户一直依赖(从没提过)的能力。病根=评测,不是工程。「训练损失与真实质量相关但不相同,差距正是生产事故住的地方」(:11)。
  • :15–25 两轴评测:①目标任务变好了吗 ②用户依赖的能力没退化吗——两轴同等重要,多数框架只测第一轴(:21);退化即 Ch1 灾难性遗忘(法律微调后算术变差、客服微调后写码变差)(:23);永远对照底座评,不做绝对评:0.78 单独看没有信息量,0.78 vs 底座 0.61 才有意义(:25)。
  • :27–53 任务指标:分类——accuracy 在类不平衡时骗人(90% 单类→全猜该类=90%)(:33);F1=precision/recall 的调和平均;macro(类等权)/weighted(按类频)(:35);混淆矩阵最有诊断力——billing 与 account 系统性混淆,聚合指标看不见(:37)。生成——ROUGE:n-gram 重叠(ROUGE-1/2/L=一元/二元/最长公共子序列),为摘要而生,开放式生成上误导(:43);BERTScore:用预训练 BERT 算语义相似度,同义不同词得分高(:45);诚实口径:它们是代理不是度量,先对人工判断样本验证再信(:47)。结构化输出——格式有效性(JSON 解析得动/SQL 执行得动)比相似度可靠;执行式评测是结构化任务金标准(:51–53)。
  • :55–71 能力探针:微调之前设计(事后设计有确认偏误)(:61);三性=多样/代表真实查询/稳定(温度设 0)(:63);最常受伤的能力:指令跟随、事实回忆、算术推理、表达不确定(:65);基准回归测试:全量基准太贵,每类抽 10–20 条分层样本(:69);EleutherAI lm-evaluation-harness 是标准工具(:71)。
  • :73–95 LLM-as-judge:条件=评的标准能用自然语言说清+评委比被评者强(GPT-4 评小模型)(:79);擅长风格/语气/帮助性/完整性/分析质量;不可靠于事实准确性(评委可能与被评者共享同一误解)与专业领域(:81);评测 prompt 四件套=任务描述+显式评分细则(具体可观察行为,非抽象形容词)+先说理由后给分+可解析输出格式(:87);位置偏差:两响应比较时评委偏爱排前面的——成对比较正反各跑一次取平均,单响应打分则随机化顺序(:89);验证评委:与人工判断的相关性 Spearman rho>0.7 才可用;没验证的评委制造虚假信心,比没有评测更糟(:93–95)。
  • :97–113 人工评测:不可替代的两个场景=需要专家知识的领域质量+错了代价高的部署决策(:99);结构化:拆维度独立评(事实准确/语气/行动清晰/长度),别让评「总体质量」(:103–105);一致性 Cohen's kappa(分类)/Pearson(连续)(:107);样本量:5 分制上预期差 ≥0.5 → 50–100 条够;更小效应要更多(:111);预算紧→优先评自动指标分歧最大和模型最没把握的样本(:113)。
  • :115–773 实操管线(标注了哪些是模拟预测):分类对照(底座 0.60 vs 微调 1.0 的模拟数,:167 写明 simulated);生成质量 ROUGE/BERTScore(3 条客服例);5 条能力探针(回归判定:delta < −0.1 → REGRESSION)(:447);LLM 评审模板(4 维 1–5 分,JSON 输出,demo 结果,生产用 OpenAI temperature 0)(:473–643);部署闸门:任务改进(f1_weighted > 底座+0.02 或 bertscore > 底座+0.01)∧ 无能力回归 ∧ 评审总分 ≥3.5 → DEPLOY(:725–755)。
  • :775–791 总结。

Ch6(09-ch06…,1140 行,52K)— Deploying Fine-Tuned Models in Production

关键段:

  • :7–13 引子:notebook 里跑通是工程,可靠服务真实用户是生产工程;AI 特有问题=提示注入/PII 泄漏/查询分布漂移/生产数据-重训反馈回路/GPU 推理成本动力学。
  • :15–39 三层架构:API 网关(认证/限流/路由)+推理层+数据层(会话/缓存/日志)(:21);各层独立扩缩(:23);流式响应几乎总是更好,一开始就规划 SSE/WebSocket(:27);分层超时(短输出短超时)(:29);幂等键防重试重复计算(:31);API 从第一天就带版本号,同时维护两个版本(:33);微服务拆分(预处理/生成/后处理+网关),早期单服务就够(:37–39)。
  • :41–69 三个推理服务:vLLM(UC Berkeley;PagedAttention=用操作系统虚拟内存式的分页方案管 KV 缓存,消碎片→更大 batch;OpenAI 兼容 API;continuous batching=新请求动态插进进行中的批次;代价=启动时预分配大块 KV 显存,配错会 OOM)(:47–53);TGI(HF 出品,Hub 加载微调模型/LoRA 适配器方便,量化支持好,语法约束的结构化输出)(:57–59);Ollama(自托管最简,CLI+本地 REST+量化模型库,OpenAI 兼容客户端)(:63–65)。选型:开发/低流量→Ollama;中流量→TGI;高流量→vLLM;没 GPU→商用 API(:69)。
  • :71–87 LoRA 适配器多路复用:12 个微调变体≠12 份完整模型;适配器每个几百 MB,可与冻结底座共存显存;vLLM lora_request 参数按请求选适配器,切换开销微秒级;80GB 单卡上 7B 底座+10–20 个小适配器(:81);适配器当版本化工件管理(model registry:MLflow/W&B)(:85–87)。
  • :89–103 限流:两级(每用户+全局);按 token 而非请求数限流——2000 token 响应的成本≈100 token 的 20 倍(:95);缓存:精确匹配+嵌入相似度近重复(要管 TTL 防陈旧)(:99);故障转移:交互式应用响亮地失败几乎总是好过不加说明地返回陈旧答案(:103)。
  • :105–123 可观测:LangSmith(LangChain 全链路追踪+成本估算+人工评审界面→生产失败变成评测样本)(:111–113);Arize Phoenix(开源、不绑 LangChain、嵌入漂移检测=性能退化的早期警报、可本地部署保敏感数据)(:117–119);指标:延迟按组件拆、质量按流量抽样、硬错误(超时/异常)与软错误(拒答/格式坏)分开、成本按请求(:123)。
  • :125–143 成本:商用 API 输出 token 价是输入的 2–4 倍→微调出的简洁输出是可测的成本优势(:131);自托管成本=GPU 时,吞吐是关键,vLLM 的 continuous batching+PagedAttention 直接降每 token 成本(:133);路由层:按查询复杂度分流(简单→小模型),混合难度应用平均成本降 40–60%;路由分类器本身要轻(微调 BERT/DistilBERT)(:137–139);推理量化:4-bit 7B≈4GB vs 16-bit 14GB→同卡放 3 份=吞吐 3 倍,质量代价通常 1–3%(注意:这是推理量化,与训练量化不同)(:143)。
  • :145–163 持续改进闭环:显式反馈(点赞/举报)+隐式反馈(点来源/复制/追问/完成任务)(:151–153);闭环:流量→响应→质量信号→评测集→最弱处→重训→上线→循环;建了闭环的团队持续变好,把每次上线当一锤子买卖的停滞(:159);数据飞轮:更多用户→更多反馈→更好微调→更好质量→更多用户——所以尽早带着不完美上线几乎总是好过等完美(:163)。
  • :165–187 安全:提示注入=检索文档/用户输入里的恶意文本让模型无视指令(「ignore all previous instructions…」);RAG 攻击面大(:171–173);完全防住注入目前做不到——按「注入有时会成功」设计:限制模型能执行的动作、重大动作要人工确认(:175);PII 两条泄漏路径(知识库含 PII→检索→复述;模型从训练数据记住的 PII)→摄入和输出两端都要过滤(:179–181);多租户:每层校验租户身份+审计日志,fail closed(校验逻辑出错时返回 403 而不是放行)(:185–187)。
  • :189–209 扩缩:无状态服务;多轮对话历史放 Redis(按 session ID),任何实例都能接(:195–197);最少在途请求(LOR)负载均衡优于轮询——LLM 请求处理时长高度可变,轮询会让长请求后面排队(:201–203);自动扩缩看队列深度不看 CPU(GPU 才是瓶颈资源)(:207–209)。
  • :211–1113 实操:FastAPI 服务:SemanticCache(阈值 0.92,TTL 3600s)、PIIFilter(正则:email/phone/ssn/credit_card/ip)、PromptInjectionDetector(7 条正则,风险分=min(1, 命中数×0.4))、租户过滤检索(qdrant filter)、七段请求流水线(注入检查→输入 PII→语义缓存→租户检索→生成 stub→输出 PII→写缓存)(:693–801);健康监控(错误率 <5% → healthy)(:901);FastAPI 骨架(Bearer API key,60/min 限流)(:969–1089)。
  • :1115–1141 总结+全书结语。
  • ⚠ 原文自身瑕疵(如实记录):①:17 说「比我们在第 5 章搭的简单 retrieve-and-generate 循环复杂得多」——本书第 5 章是评测章,没搭过 RAG 循环(应为姊妹书的章);②:213 说部署「第 4 章的金融文档分析模型」——我们的文本里第 4 章没有 hands-on 金融模型;③:1117 称「本章是最后一章」而全书还有第 7 章;④:1117/:1125 总结里讲「RAG 基础设施节」——正文对应节里混有 RAG 话题。→ 本书部分章节有从姊妹书 RAG with Python 改编的痕迹,拆解里照实点破。

Ch7(10-ch07…,948 行,52K)— Case Studies and Capstone Projects

四个案例(全是「架构讨论」式,数字是书给的案例数字,不是可复现实验):

  • 案例 1 客服机器人(:13–45):12 万历史工单→4 条过滤(CSAT 4–5/单轮解决/类目在范围内/50–200 词)→18,400 条;抽 500 人工复查仍发现 ~8% 有问题(:25)。QLoRA 7B;5,000/10,000/18,400 三档对比:5K→10K 显著提升,10K→18.4K 平台期(:31)。SFT 后 DPO:800 偏好对(微调模型 vs 底座+system prompt,客服团队评)(:33)。评测三件套:自动风格指标(长度/阅读等级/行动动词频)+3 名主管月评 100 条+重开率当业务代理(:37);重开率 23%→14%,CSAT 持平,同团队容量 +400%(:39)。教训:质量过滤>数据量;风格与内容分开——风格进权重,政策内容走应用层,政策改动不用重训(:43–45)。
  • 案例 2 医疗问答(:47–79):患者教育助手;两约束=只用去标识公开数据+上线前持照医师评审(:53)。数据:MedlinePlus+MedQA 子集+GPT-4 合成(临床指南摘要切块)(:57);过滤掉数值 specific(剂量范围/诊断阈值/时间线)且必须含「咨询医生」(:59);4,200 SFT(:61)。两阶段:SFT+600 对安全 DPO(chosen=表达不确定+转诊,rejected=假自信的临床指导)(:65–67)。医师评审:首轮 200 条 11 处事实错误(集中在训练稀疏的少见病)→补数据定向重训→二轮 200 条 3 处轻微→带免责声明+季度评审上线(:71–73)。教训:SFT 教「说什么」,DPO 教「怎么说才安全」,混在一个阶段=有时准确但安全不稳定(:77);稀疏覆盖是医疗微调的头号风险(:79)。
  • 案例 3 私有框架代码生成(:81–115):230 万行 Python/850 模块,通用模型「语法对、语义错」(:85–87)。三类数据:AST 抽 docstring↔实现 ~12,000 对(滤 <5 行/>200 行)(:93);测试↔实现(:95);GPT-4 给 ~35% 无 docstring 函数自动生成,半权重+打标(:97)。CodeLlama-7B-Instruct,QLoRA r=32(不是 16)——内部词汇多样性高(几百个内部模块名/函数前缀/错误码)需要更有表现力的适配器,打全部注意力+FFN(:101)。评测:150 个内部任务 Pass@1:底座 23% → 微调 61% → 加测试对后 74%;HumanEval 与底座差 3 个百分点内=通用能力没伤(:107–109)。教训:测试对是最有效的单一增量(模型学到的是行为契约不是表面签名)(:113);持续摄取——一次性索引两个月后质量退化,改月度增量重训(:115)。
  • 案例 4 多语言意图分类(:117–149):23 国 12 意图;原方案 23 个模型=23 套维护(:121)。选 XLM-RoBERTa-large(100 语言掩码预训练,共享表示空间)(:127);标注预算:全量均匀要 276,000 条,跨语言迁移策略砍到 92,000(高资源语言足额,低资源每类 200 条靠迁移)(:129)。回译 ×3–5(:135);批内混 60% 高资源+40% 低资源(过采样)(:137)。结果:17 个高资源语言 macro F1 >0.90;6 个低资源 0.81–0.87,胜过原单语言模型的 0.76–0.83;语言混淆可忽略(:141–143)。教训:先上多语言底座;过采样纪律——不过采样时低资源语言的梯度更新太少,推不动权重(:147–149)。
  • Capstone(:151–861):内部 API 文档助手,三阶段管线:SFT(phi-2 QLoRA r16,lr 1e-4,4 epochs)+DPO(beta 0.1,lr 5e-5)+DistilBERT 复杂度路由(置信 >0.75 转人工);复用 Ch5 评测管线(含能力探针)+Ch6 部署模式。
  • 五条通则(:863–891):①质量过滤>数据量 ②风格与内容分开(微调教怎么说,应用层教说什么)③安全行为要独立的训练阶段 ④代码评测金标准=执行 ⑤跨语言迁移大幅省标注。
  • 未来方向(:893–909):合成数据成本持续降(Phi 系列);在线/持续微调(online DPO、continual LoRA);「7B 专用微调在同任务上稳定胜过 70B 通用模型,服务成本低 10 倍」→ 组织从大通用模型转向小专用模型组合(:905);对齐方法向最简单者收敛(DPO 已在开源界取代 PPO-RLHF)(:909)。
  • 资源(:911–927):关键论文(LoRA Hu 2021/QLoRA Dettmers 2023/DPO Rafailov 2023/ORPO Hong 2024/Phi-1·2);工具(transformers/PEFT/TRL/datasets/evaluate/lm-eval-harness/W&B/MLflow);社区(HF Discord、r/LocalLLaMA、Papers With Code)。

通读总结(写大纲用)

全书一条线:「用模型」到「拥有模型」的完整工程路径——①微调改什么(权重=统计摘要,微调=分布偏移,不是重学;何时不该微调)②怎么在消费级硬件上改得动(显存算术 56GB→8–12GB,LoRA 低秩假设,QLoRA 4-bit NF4)③从补全器到助手(SFT 三格式、合成数据、RLHF 三阶段→DPO 闭式解→ORPO/SimPO 再简化)④往哪改(领域:继续预训练 vs 指令微调、法律/代码/低资源)⑤改得对不对(两轴评测:任务+能力保持;探针/LLM 评审/人工)⑥改完怎么养(部署:三层架构、适配器复用、token 限流、成本路由、安全、反馈飞轮)⑦放一起看(四案例+capstone+五通则)。

本书独有价值(区别于 post-training 拆解):消费级硬件视角贯穿全书——每个阶段都给出「这在一台 24GB 卡上怎么落地」的数字(显存账、LoRA 超参、DPO 两模型 vs PPO 四模型、4-bit 推理三倍吞吐、Colab T4 全程可跑)。这是 ② 类出处(TRL/PEFT 源码)之外它的增量。

原文瑕疵(拆解要如实点破):Ch4 医疗/金融小节正文缺失(只有引子/总结提及);Ch6 多处把本书说成 RAG 书(「第 5 章搭的 RAG 循环」「部署第 4 章的金融模型」「本章是最后一章」);Ch1 与 Ch2 的 7B 显存数字不一致(40+GB vs 56GB)。