跳到主要内容

特化——把提示词烙进权重

这一章讲三件事: 为什么格式类任务的可靠性问题「写更好的提示词」解决不了;LoRA/DoRA/NF4 三个零件各自省什么;以及一次完整特化的全部数字——提示词从 15 行到一个词,合规率反而上升。 前面六章都在让模型「更小更快」,本章调头:在保全结构的前提下改行为。它也是第十章的供体——特化好的专家,之后要被移植进 MoE。

1. 这一章讲什么

改造管线的最后一段:结构已剪、知识已恢复,现在把模型对准你的数据和格式。本书选的演示任务是生产里最常见的一类:从病历自由文本抽字段(年龄、用药这类条目),输出严格 schema 的 JSON。模型其实已经「知道」这些知识——它缺的是稳定照格式办事的习惯1

它在全书链条里的位置: 全参数微调在这里被否掉(太贵、易遗忘),取而代之的是 PEFT(参数高效微调)家族:冻结整个基模,只训练一小片新增参数——不到 1%,甚至不到 0.1%2

2. 顶层全景

两个障碍 三个零件 一次落地
───────── ───────── ─────────
显存:全参微调要 LoRA:把「权重变化量」 任务:病历 → 严格 JSON
权重+梯度+优化器, 拆成两个小矩阵,只训它们 结果:15 行 prompt →
约为模型大小的 DoRA:把「幅度/方向」拆开 一个词「Extract:」
4-8 倍[^3] 分开调,更贴近全参微调 合规:85% → 100%
NF4:4-bit 存基模,腾显存 能力:-3.2%(可接受)

3. 核心原理

3.1 LoRA:赌「变化量很小」

全参微调贵在哪,拿数字说话:SmolLM2-1.7B 的 q_proj(注意力的查询投影)是一个 2048×2048 的矩阵,超过 419 万参数——这还只是一层的四个注意力矩阵之一,乘以 24 个块……3。LoRA 的赌注:微调带来的权重变化量(记作 ΔW)本身很小,而且低秩(能拆成两条细长表格相乘的形式),于是不直接学 ΔW,把它拆成两个瘦矩阵的乘积 A×B(中间维叫 rank,r)。r 在乘法里抵消,乘积与原矩阵同形,推理时直接加上去4

省多少?r=8 时,原来要训的 4,194,304 个参数变成 2048×8 + 8×2048 = 32,768 个,省 99.2%5。两个实现细节:小矩阵 B 初始化为全零——训练起点 ΔW=0,模型从「原样」出发;推理时 W+ΔW 结构不变、零额外开销6。r 怎么选没有理论,4/8/16 是常见起点,r=8 是「没证据需要更大之前」的合理默认7

3.2 DoRA:把幅度和方向拆开

LoRA 有个理论瑕疵:ΔW 一步同时改动权重的幅度(信号多强)和方向(语义指哪)。全参微调不是这样——两者近乎独立变化,相关系数 −0.62;LoRA 拖着它们一起动,相关性 +0.83。DoRA 的修法:把原矩阵分解成「幅度向量 m + 方向矩阵 V」,LoRA 部分管方向,m 单独可训——相关系数降到 −0.31,贴近全参微调的行为8。代价是多训一批幅度参数、训练更慢;换来的是更小的能力损伤、更低 rank 也能撑住、小数据更有效这三项理论优势9

3.3 NF4:给冻结的基模腾地方

PEFT 解决了「梯度与优化器状态」的显存,但冻结的基模本身还是原尺寸。量化(把数值压成更短的存储)解决这部分:16-bit 存变 8-bit、4-bit。为什么不等比地全用 8-bit?因为 16→8 省一半,16→4 省到四分之一——常是「塞不塞得进这张卡」的分界线10

4-bit 只有 16 个档位,怎么摆有讲究。均匀摆法在 [-1,1] 上等距放档,但 LLM 权重是正态分布,绝大多数挤在 0 附近——0.08、0.10、0.12 全被舍进同一档。NF4(QLoRA——量化版 LoRA——论文提出的 4-bit 格式)把档位密的地方对准 0 附近:同样 4-bit,失真小得多,已成为事实标准11

一个必须知道的限定:NF4 是存储格式不是计算格式——没有 GPU 能原生做 4-bit 矩阵乘,每次运算前现场反量化回 16-bit。省的是内存,不是算力12。本书实测:T4 上一整套(QLoRA 底模+适配器(外挂的一小片可调数值)+梯度+优化器)峰值 2.34 GB,8 GB 卡轻松放下13

3.4 主走查:一次特化的全部数字

走查对象:SmolLM2-1.7B-Instruct,任务=从病历抽临床信息、输出严格 JSON。

先立靶子。格式的「对」被定义成机器可查的契约:字段齐、类型对——年龄给成字符串(文字型的 "32",不是数字 32)也算失败14。数据集 400 条合成病历(360 训/40 测),故意掺了五类噪声:干净 100、带缩写 80、症状隐晦 80(「觉得房间在转」=眩晕)、带错字 70、夹带无关家常 7015

基线成绩单:15 行严格的系统提示词(开场定规矩的那段指令)下,总体合规 85%。

按类拆开看,破绽就出来了——干净、缩写、隐晦、错字类全过,唯独「夹带无关内容」的 12 条只有 58.3% 过关:文本里出现指令没预设的东西,机器就被带跑16这就是 prompt 的硬上限:提示词能定义任务,不能把行为泛化(推广到没见过的输入)上去17

再立能力基线(防止学完任务忘了世界):五个通用基准先行测好——arc_easy 0.652、winogrande 0.654、piqa 0.794 等18

训练三件套。数据格式:Instruct 模型按「角色」读对话,训练样本就用它的聊天模板拼——system 塞进一个词「Extract:」,user 放病历,assistant 放标准 JSON。要教的映射只有一条:系统说「Extract:」,答案就只能是合规 JSON19参数:r=8、缩放系数 alpha=16(惯例取两倍 rank)、随机失连(dropout:训练时随机掐断一小部分连线,防背题)设 5%,微调靶子覆盖注意力的 q/k/v/o 加 MLP 的 gate/up/down 全部七个投影——「怎么说」和「怎么想」都允许调20。可训参数 9,043,968 个,占总数 0.5257%21超参:3 遍、每批 8 条,共 135 步;学习率 2e-4(LoRA 惯例),配预温——头几步小步试探,防止新初始化的适配器被大步长打坏22

成绩:

schema 合规率(40 条测试集,提示词只剩「Extract:」)
基线 + 15 行 prompt:85%(irrelevant 类 58.3%)
QLoRA + 1 个词: 100%(irrelevant 类 100%)
QDoRA + 1 个词: 100%(irrelevant 类 100%)

图说:「原来住在提示词里的知识,现在住进了权重」[^24]。
修好的正是 prompt 唯一治不了的那一类。

代价如实报:五个通用基准加权平均降 3.2%;唯一的明显下滑是 arc_easy(-10.3%)——与医疗毫无关系的科学常识,推测是生成分布被拽向结构化医疗文本;lambada 的困惑度从 5.96 涨到 6.90(+15.8%)——不是不会了,是输出风格收窄,换提问方式时它信心不足23

QDoRA 呢? 理论优势在本任务上完全没兑现——成绩与 QLoRA 几乎可互换。作者的解释很清醒:本任务是结构适配(改「怎么说」),不是语义适配(改「说什么」);幅度-方向解耦在「常识推理/视觉理解」这类需要深层语义变化的任务上才显威力——DoRA 论文的原实验恰恰都是那类。一句话总结:论文提出,数据裁决24。选型建议因此很简单:格式类任务用 QLoRA(还更快),深度语义适配才考虑 QDoRA25

3.5 训完之后:合并还是换装

训练产物是一个独立的适配器(一小片外挂数值,存成一个小目录),两种用法:

  • 合并:merge_and_unload() 把适配器加进基模、拆掉全部 PEFT 脚手架,得到一个普通模型——单一特化、追求最快推理时选它26;
  • 换装:一个基模常驻显存,按需加载不同适配器——不同医院不同格式,就是两个适配器的事。注意切换有真实开销,别每个请求切一次;正解是按任务把请求分批排队,一批全用同一个适配器,跑完再换27

4. 作者的判断与证据

给了证据的: 85%→100% 的合规率、0.5257% 的可训参数比、2.34 GB 显存峰值,全部来自可复现的 notebook(含 T4 精简版);「300 例让 LLaMA3-8B 零样本(不给例子直接考)就追平 LLaMA3-70B、格式错误 17→1」是外部独立佐证(Losch 等,2025,同样做临床结构化抽取)——「prompt 的知识搬进权重换来结构可靠性」不是本书孤证,是文献里有记录的模式28

作者的方法论表态: 顶会论文给你 DoRA 这样的精致工具,但要不要这点复杂度,由你的问题约束和数据说了算——预算有限、理解到位、测量严格,现有硬件就够造出生产级特化模型29

5. 边界与局限

  • 特化不免费。 平均 -3.2%、单项 -10.3% 是本任务的实测;任务越窄,这代价越值得,反之要慎重。
  • DoRA 判决只对「结构适配」类任务成立,换语义类任务结论未测——作者把「找一个 DoRA 能赢的任务」留成了练习30
  • 合成数据集只有 400 条,且 schema 刻意简单;书里明说这是演示口径,真实项目的数据构建是独立工程(仓库附了生成 notebook)。
  • 量化不是默认项:显存塞得下就别量化,训练更快——NF4 是内存瓶颈的解法,不是美德31
  • 实验只到 1.7B;更大模型的适配器占比、可训靶子选择是否同结论,书里没测。

6. 可带走的

  1. prompt 的可靠性上限在「没预设的输入」上:格式契约写进权重,才治得了这一类;
  2. LoRA 的账:4,194,304 → 32,768(r=8);B 初始化为零,从原样出发;
  3. 可训靶子默认七个投影(注意力四个+MLP 三个),「怎么说」和「怎么想」都放开;
  4. NF4 省内存不省算力:档位贴着正态分布摆;显存够就别量化;
  5. alpha=2×rank、lr=2e-4、warmup 几步:LoRA 微调的常见起点;
  6. 验收三件套:目标任务的机器可查指标 + 通用基准基线 + 按类拆解的失败分析;
  7. QDoRA 不是升级包:结构适配用 QLoRA,语义适配再考虑 DoRA;
  8. 适配器整批换装:切换有开销,调度加队列,别请求级切换;
  9. 「论文提出,数据裁决」:本实验室彩蛋里 r=1、只练一遍也能 100% 合规——别迷信大配置32

7. 原文地图

主题原书章原文位置
RAG vs 微调、prompt 的病7 Model specializationtext/29-ch07-7-model-specialization.txt:38(搜「consult a knowledge base」) · text/29-ch07-7-model-specialization.txt:44(搜「break production pipelines」)
两大障碍与 PEFT7 Model specializationtext/29-ch07-7-model-specialization.txt:68(搜「4x to 8x」) · text/29-ch07-7-model-specialization.txt:71(搜「catastrophic forgetting」) · text/29-ch07-7-model-specialization.txt:76(搜「learn the delta」)
LoRA 原理与省 99.2%7 Model specializationtext/29-ch07-7-model-specialization.txt:94(搜「more than 4 million parameters」) · text/29-ch07-7-model-specialization.txt:142(搜「99.2%」) · text/29-ch07-7-model-specialization.txt:148(搜「4, 8, and 16」)
零初始化与推理合并7 Model specializationtext/29-ch07-7-model-specialization.txt:221(搜「original LoRA paper」) · text/29-ch07-7-model-specialization.txt:233(搜「intact model structure」)
DoRA 相关性与优势7 Model specializationtext/29-ch07-7-model-specialization.txt:257(搜「-0.62」) · text/29-ch07-7-model-specialization.txt:282(搜「Less capabilities degradation」) · text/29-ch07-7-model-specialization.txt:364(搜「four sequential steps」)
NF4 与量化取舍7 Model specializationtext/29-ch07-7-model-specialization.txt:415(搜「memory is the real bottleneck」) · text/29-ch07-7-model-specialization.txt:436(搜「cuts the model size in half」) · text/29-ch07-7-model-specialization.txt:442(搜「NormalFloat 4-bit」) · text/29-ch07-7-model-specialization.txt:448(搜「de facto standard」) · text/29-ch07-7-model-specialization.txt:461(搜「dequantized on the fly」) · text/29-ch07-7-model-specialization.txt:469(搜「2.34 GB」)
任务与数据集7 Model specializationtext/29-ch07-7-model-specialization.txt:511(搜「structured clinical information」) · text/29-ch07-7-model-specialization.txt:557(搜「validation failure」) · text/29-ch07-7-model-specialization.txt:569(搜「intentionally injects noise」)
基线与 prompt 上限7 Model specializationtext/29-ch07-7-model-specialization.txt:796(搜「85% schema compliance」) · text/29-ch07-7-model-specialization.txt:815(搜「gets lost」) · text/29-ch07-7-model-specialization.txt:834(搜「prompt-only systems」) · text/29-ch07-7-model-specialization.txt:881(搜「0.6520」)
数据格式与可训参数7 Model specializationtext/29-ch07-7-model-specialization.txt:940(搜「MINIMAL_PROMPT」) · text/29-ch07-7-model-specialization.txt:1052(搜「9,043,968」) · text/29-ch07-7-model-specialization.txt:1064(搜「double the rank」)
训练配置7 Model specializationtext/29-ch07-7-model-specialization.txt:1087(搜「2e-4」) · text/29-ch07-7-model-specialization.txt:1117(搜「135 steps」)
成绩与代价7 Model specializationtext/29-ch07-7-model-specialization.txt:1153(搜「QLoRA minimal prompt」) · text/29-ch07-7-model-specialization.txt:1178(搜「3.2%」) · text/29-ch07-7-model-specialization.txt:1184(搜「structured medical language」) · text/29-ch07-7-model-specialization.txt:1190(搜「narrowing of output style」)
QDoRA 判决7 Model specializationtext/29-ch07-7-model-specialization.txt:1279(搜「9,682,944」) · text/29-ch07-7-model-specialization.txt:1335(搜「practically interchangeable」) · text/29-ch07-7-model-specialization.txt:1341(搜「data disposes」) · text/29-ch07-7-model-specialization.txt:1377(搜「pragmatic choice」)
合并与换装7 Model specializationtext/29-ch07-7-model-specialization.txt:1420(搜「maximum inference speed」) · text/29-ch07-7-model-specialization.txt:1445(搜「different clinics or hospitals」) · text/29-ch07-7-model-specialization.txt:1493(搜「negate the performance benefit」)
论文对照7 Model specializationtext/29-ch07-7-model-specialization.txt:1524(搜「2106.09685」) · text/29-ch07-7-model-specialization.txt:1530(搜「48GB」) · text/29-ch07-7-model-specialization.txt:1536(搜「-0.31」) · text/29-ch07-7-model-specialization.txt:1548(搜「change what something means」) · text/29-ch07-7-model-specialization.txt:1554(搜「300 examples」)
实验室彩蛋7 Model specializationtext/29-ch07-7-model-specialization.txt:1578(搜「r of 1」)

Footnotes

  1. 出处:「7 Model specialization」第 517 段(text/29-ch07-7-model-specialization.txt:517,搜「necessary knowledge」)。

  2. 出处:「7 Model specialization」第 76 段(text/29-ch07-7-model-specialization.txt:76,搜「learn the delta」)。

  3. 出处:「7 Model specialization」第 94 段(text/29-ch07-7-model-specialization.txt:94,搜「more than 4 million parameters」)。

  4. 出处:「7 Model specialization」第 130-136 段(text/29-ch07-7-model-specialization.txt:130,搜「hyperparameter」;text/29-ch07-7-model-specialization.txt:136,搜「cancels out」)。

  5. 出处:「7 Model specialization」第 142 段(text/29-ch07-7-model-specialization.txt:142,搜「99.2%」)与图 7.1 说明(text/29-ch07-7-model-specialization.txt:124,搜「32,768」)。

  6. 出处:「7 Model specialization」第 221 段(text/29-ch07-7-model-specialization.txt:221,搜「original LoRA paper」)与第 233 段(text/29-ch07-7-model-specialization.txt:233,搜「intact model structure」)。

  7. 出处:「7 Model specialization」第 148 段(text/29-ch07-7-model-specialization.txt:148,搜「4, 8, and 16」)。

  8. 出处:「7 Model specialization」第 257 段(text/29-ch07-7-model-specialization.txt:257,搜「-0.62」)与第 1536 段(text/29-ch07-7-model-specialization.txt:1536,搜「-0.31」)。

  9. 出处:「7 Model specialization」第 282-288 段(text/29-ch07-7-model-specialization.txt:282,搜「Less capabilities degradation」)。

  10. 出处:「7 Model specialization」第 436 段(text/29-ch07-7-model-specialization.txt:436,搜「cuts the model size in half」)。

  11. 出处:「7 Model specialization」第 442-448 段(text/29-ch07-7-model-specialization.txt:442,搜「NormalFloat 4-bit」;text/29-ch07-7-model-specialization.txt:448,搜「de facto standard」)。

  12. 出处:「7 Model specialization」第 461 段(text/29-ch07-7-model-specialization.txt:461,搜「dequantized on the fly」)。

  13. 出处:「7 Model specialization」第 469 段(text/29-ch07-7-model-specialization.txt:469,搜「2.34 GB」)。

  14. 出处:「7 Model specialization」第 557 段(text/29-ch07-7-model-specialization.txt:557,搜「validation failure」)。

  15. 出处:「7 Model specialization」第 569-587 段(text/29-ch07-7-model-specialization.txt:569,搜「intentionally injects noise」;text/29-ch07-7-model-specialization.txt:581,搜「spinning」)。

  16. 出处:「7 Model specialization」第 796 段(text/29-ch07-7-model-specialization.txt:796,搜「85% schema compliance」)与第 815 段(text/29-ch07-7-model-specialization.txt:815,搜「gets lost」)。

  17. 出处:「7 Model specialization」第 834 段(text/29-ch07-7-model-specialization.txt:834,搜「prompt-only systems」)。

  18. 出处:「7 Model specialization」第 880-885 行(text/29-ch07-7-model-specialization.txt:881,搜「0.6520」)。

  19. 出处:「7 Model specialization」第 934-951 段(text/29-ch07-7-model-specialization.txt:940,搜「MINIMAL_PROMPT」;text/29-ch07-7-model-specialization.txt:951,搜「strict JSON schema」)。

  20. 出处:「7 Model specialization」第 1064 段(text/29-ch07-7-model-specialization.txt:1064,搜「double the rank」)。

  21. 出处:「7 Model specialization」第 1052 段(text/29-ch07-7-model-specialization.txt:1052,搜「9,043,968」)。

  22. 出处:「7 Model specialization」第 1117 段(text/29-ch07-7-model-specialization.txt:1117,搜「135 steps」)。

  23. 出处:「7 Model specialization」第 1178 段(text/29-ch07-7-model-specialization.txt:1178,搜「3.2%」)、第 1184 段(text/29-ch07-7-model-specialization.txt:1184,搜「structured medical language」)与第 1190 段(text/29-ch07-7-model-specialization.txt:1190,搜「narrowing of output style」)。

  24. 出处:「7 Model specialization」第 1341 段(text/29-ch07-7-model-specialization.txt:1341,搜「data disposes」)与第 1548 段(text/29-ch07-7-model-specialization.txt:1548,搜「change what something means」)。

  25. 出处:「7 Model specialization」第 1377 段(text/29-ch07-7-model-specialization.txt:1377,搜「pragmatic choice」)。

  26. 出处:「7 Model specialization」第 1420 段(text/29-ch07-7-model-specialization.txt:1420,搜「maximum inference speed」)。

  27. 出处:「7 Model specialization」第 1445 段(text/29-ch07-7-model-specialization.txt:1445,搜「different clinics or hospitals」)与第 1493 段(text/29-ch07-7-model-specialization.txt:1493,搜「negate the performance benefit」)。

  28. 出处:「7 Model specialization」第 1554 段(text/29-ch07-7-model-specialization.txt:1554,搜「300 examples」)与第 1560 段(text/29-ch07-7-model-specialization.txt:1560,搜「documented pattern」)。

  29. 出处:「7 Model specialization」第 1566 段(text/29-ch07-7-model-specialization.txt:1566,搜「problem constraints」)。

  30. 出处:「7 Model specialization」第 1606 段(text/29-ch07-7-model-specialization.txt:1606,搜「databricks-dolly-15k」)。

  31. 出处:「7 Model specialization」第 415 段(text/29-ch07-7-model-specialization.txt:415,搜「memory is the real bottleneck」)。

  32. 出处:「7 Model specialization」第 1578 段(text/29-ch07-7-model-specialization.txt:1578,搜「r of 1」)。