跳到主要内容

会写那句话才算会用模型 — 五种技术的组合律

这一章讲三件事: 大语言模型(Large Language Model,下文简称 LLM——就是大家常听的那三个字母) 到底是个什么东西、你作为软件工程师的位置为什么变了; 以及全书开篇那个贯穿实验——同一个问题,五种问法,只有一种组合作对了。 读完你会拿到全书的第一条因果链:模型不归你调教,你能控制的只有喂给它的话—— 所以「怎么组合这些话」就是这门新手艺的全部起点。

1. 先看现象:同一个问题,五种问法

原书开篇没有讲理论,而是做了一个实验,这个问题贯穿了整章1:

第 30 任美国总统在他岳母去世时几岁?

用 OpenAI 的 gpt-3.5-turbo 模型,五种问法得到五种命运:

问法得到什么哪里出了问题
直接问「……他 48 岁」人认对了,年龄错
让它一步步想写出五步推演,结论 85 岁步子看着合理,里面的事实是编的
附上资料再问54 岁离真相只差 3 年——又败在减法
给它配计算器让它调用计算器它选错了工具、填错了年份
资料+分步+计算器一起上calculator,1929 - 187257 岁这次对了
同一个问题 ──┬─ 直接问 → 人对数错
├─ 加一句「逐步想」 → 过程漂亮结局崩
├─ 附参考资料 → 万事俱备只欠减法
├─ 配外部函数 → 函数选错参数瞎填
└─ 三样全给 → ✓ 57 岁

图说:这不是四条弯路衬托一条正道,
而是「每种手段都修好了前面的一种失败」。单用哪个都会翻车。

这张表是本章的主走查。下面每一节都会回到它: 先弄清它回答问题的那台机器是什么,再看五种问法各自在修什么。

2. 它是一台接话机器

LLM 接收文字,预测并生成像人写的文字,本质上是手机输入法上那个自动补全功能的极端放大版2。 拆开这个名字看:「大」指它读过的文本和可调数值的规模巨大——OpenAI 的 GPT(它的模型家族名)第三代 GPT-3,个头可见一斑。

它的个头是 1750 亿个参数(参数:控制这台机器内部行为的数值),造它时读入了 45TB 文本3; 对比一下:一部高清电影约 4GB,45TB 相当于一万多部电影那么多的纯文字。

而这台机器的本尊,是一张神经网络(neural network:把极多个简单计算件连成网拼出来的东西)——记住这个名字,后面还会见到它。

它凭什么能「接着说」?靠统计。你输入「英格兰的首都是___」,它在学习阶段读过的海量文本(书里管这堆材料叫语料(corpus))里, 「England」周围反复出现过 France、United States 这类国名,「capital」附近反复出现过 London、Paris 这类首都名,于是判断下一个词大概率是 London4

但它读的不是词

严格地说,模型每次处理的最小单位不是完整的词,而是标记(token): 可以是单个字符、一截词头、一个完整的词,取决于各家模型的切分方案5。 原书拿 GPT-3.5 的切分器(cl100k)给了个实例:good morning dearest friend 三个单词被切成 5 个标记——morning 一个就够,生僻些的 dearest 要拆成两截, 每个标记都有自己的编号(如 _morning 是 6693)5。 经验值:一个标记约合四个英文字符,或四分之三个英文单词5。 中文通常更碎,常见一字一标记,所以同样一段话,中文往往比英文占更多标记。

3. 模型的四种出厂形态

刚出厂的「裸」模型其实很难伺候。

裸模型:只会续写

基础版本叫预训练(pretrained)模型:在海量互联网与书籍文本上造出来的那一版。

造题方式是自监督(self-supervised)的——不需要人来写标准答案,题目从数据里自动产生: 盖住句子的最后一个词让模型猜,或者挖掉句子中间的一个词让它补6

它的毛病是只认续写不认提问:你问「What is the capital of England?」它未必搭理你, 但你说「The capital of England is_」它就能顺下去7。 这离产品还差得远,于是有了后两层加工。

两层加工:听得懂吩咐,聊得起天

加工的统称叫微调(fine-tuning):拿新数据在现成模型上接着训。

第一层,指令微调(instruction-tuned):用人工编写的问题-答案对来微调——这类数据要人来拼,量必然远小于预训练(pretraining)语料8

紧接着再用 RLHF——收集用户对不同回答的偏好反馈来继续校准——让模型的回答风格贴近人的喜好8。 这一步把使用者从少数研究者扩大到了所有能用自然语言提问的人8

第二层,对话微调(dialogue-tuned):再多加多轮对话样本,并给输入输出加上一层结构—— 把文字分成带角色的段落:system(给模型的指令)、user(用户的任务)、 assistant(模型的输出)。这个格式还有一个安全副作用:把用户输入和系统指令隔开, 让人更难用一句话骗出系统提示里的机密——这种攻击书里点到名字,叫 jailbreaking9

第三层,任务微调(fine-tuned):开发者自己拿专有数据再训一轮,专攻一件事 (比如从上市公司年报抽取风险因素)。代价是通用性换专精度:它变得更擅长本职, 也更不会干别的10

往后这本书说的 LLM,一律默认指指令微调后的模型;说的 chat model, 指对话微调后的模型——这是作者自己声明的全书口径,也是你的默认选择11

4. 提示工程:软件工程师的新岗位

既然模型不归你训练(从头训练太贵,普通团队玩不起)、也不必重新训练 (现成的已经足够聪明),那工程师干什么?拿现成的模型,想办法让它为你的用例干活, 这件事叫提示工程(prompt engineering)12。作者甚至说: 广义上看,这本书就是一本「如何用 LangChain 做提示工程」的书13

五种基本技术,每一种都在修走查表里的一种失败。

技术一:直接问(zero-shot)

最朴素的开局:直接下指令。简单问题常能答对,尤其答案很可能在训练数据里见过的时候。 走查表第一行的「48 岁」就是这么来的14。它的边界:没人担保正确—— 书中特别注明,同一问题重跑可能得到不同结果,因为生成本身有随机性,而且供应商会随时更新模型15。 所以它只是起点:通常你得反复改写好几轮提示才能拿到可靠系统16

技术二:思维链(Chain-of-Thought,CoT)

只在提问前多加一句「Think step by step」,模型的输出就从一句话变成了一串步骤17。 它有效的原因,作者引用的研究说法是:把复杂问题拆成有序小步再做决定,模型的决策质量更高18

但看走查表第二行:五步推演步步合理,结论照样错——因为链条的第一环用了错的出生年份数据。 CoT 放大的不是知识,是把已有知识的组织方式摆出来;源头数据错,链条越长错得越从容。 还有一条容易被忽略的反面证据:作者援引 2024 年的论文指出, 在人类越想越错的那些任务上,强制思维链同样会让 LLM 表现变差19——它是把双刃剑。

技术三:检索增强(RAG)

RAG(Retrieval-Augmented Generation,检索增强生成)的做法: 把相关的原文段落(书里管它们叫 context)直接放进提示词(即你发给模型的那段话),让模型照着材料作答20。 走查表第三行附上了Coolidge 及其岳母的四段生平资料,模型把年龄算到了差 3 年—— 检索解决了「材料哪来」,没解决「算术别错」。这句「off by 3」是作者的原话21

技术四:工具调用(tool calling)

在提示词前列出可用的外部函数清单(叫什么、擅长什么), 并规定模型的输出格式:想说要用某个函数时,按固定格式报出来,由你的代码接住后真正执行22。 走查表第四行里模型确实服从了格式,却提出了荒唐的参数——calculator,2023-1892: 拿今年减一个瞎猜的年份,而不是用材料里的 1929 和 1872。

这暴露了一个格式解决不了的问题:它的规划能力才是短板,格式合规只是及格线。

把三种捆在一起

于是作者的结论水到渠成,值得抄下来:每一种提示技术,都是在与其他技术(部分)组合时才最有用23。 资料(context)把数字来源给对,思维链约束它先理清关系,计算器接管算术:

[四段生平资料]
Tools:
- calculator: 接受数学表达式,返回结果
如果要用工具作答,以 CSV 格式输出表头为 tool,input 的清单
Think step by step.
第30任美国总统在他岳母去世时几岁?

模型输出 calculator,1929 - 1872,代码读出这条指令交给计算器执行,57 岁,正确24

技术五:举例教学(few-shot)

第五种不必写进走查表,因为它修的是另一件事:新任务的「规则」难以言传时, 直接给几个例题。few-shot prompting 就是把若干个「问题→标准答案」的对子放进提示词, 让模型临场模仿,不需要任何再训练25。它比微调灵活(查询时随手改), 威力不如微调,所以作者的建议顺序是:先用 few-shot,不够再考虑微调25。 进阶玩法是动态版:攒一个大例子库,每来一个问题挑最相关的几条塞进去26

5. 作者亮出的底牌

除了逐个演示五种技术,作者还交代了三件容易被当成废话、其实是立场的事。

其一,LangChain 诞生的理由就是本章的实验。 2022 年 10 月 22 日 Harrison Chase 提交了 LangChain 的第一个 GitHub commit, 出发点是一个朴素的观察:最有意思的 LLM 应用都需要把 LLM 与「其他计算源或知识源」组合—— 书上举的正是在提示里让它把球题改写成计算器输入的例子27。 作者的定位很直白:LangChain 是最早(写作当时也是最大)提供这类积木的组合工具库28, 彼时月下载 2800 万次、GitHub 星标 9.9 万、社区逾 7.2 万人——按作者自己的口径,这是生成式(即拿训练材料生成新内容)AI 领域最大的开发者社区,这三个数就是「最大」的注脚29利益相关提醒:Nuno Campos 是 LangChain 公司的创始工程师之一,这本书由官方出品, 读的时候记得把「事实陈述」和「自家产品宣传」分开掂量(本库关于作者页,text/16-fm-about-the-authors.txt:5,搜「early pioneer」)。

其二,随机性写在基因里。 作者选择OpenAI Playground 第一课就把 temperature 拧到 0 并告诉读者:温度(控制输出随机程度的那个旋钮)越低输出越确定30。这句话反着读更重要——即使温度为 0 也别指望绝对稳定, 供应商还在不断更新模型15

其三,反复声明的「这行 没有 定论」。 CoT 有论文证明它会帮倒忙19、 jailbreaking 防不胜防只能缓解9、价格两年间显著下降但没有底部预言31—— 凡是作者不确定的地方都直说,这本书的好习惯之一是把「不知道」留在纸面上。

6. 边界与局限

  • 技术时效。全书示例锚定 gpt-3.5-turbo 时代(2025 年初出版)。书里自己说较新的模型已经为 思维链和工具调用做过专项微调、不再需要那些手工指令32;今天更进一步—— 补充(不在书里,依据我们的 frontier 书架):LangChain 当前大版本中 agent 已经被封装成一键构建物, 连循环骨架都不必手写。依据: shelf=ai-frontier-reference/langchain@src:libs/langchain_v1/langchain/agents/factory.py:971 事实=新版 create_agent 的文档说明明写「process repeats until no more tool_calls are present」,循环已是框架内置。
  • 「4 字符 ≈ 1 标记」是英文口径。中文用户不能直接套用这个换算做成本估算5
  • 本章的 RAG 只是「贴一段 context 进提示词」的最简形态。真正的检索系统(存数串的库、切块策略、 远近打分法)要到第 03 章才展开;在这里它的全部实现就是把维基百科的段落复制粘贴进对话框20
  • RLHF 只有一句话。它作为四个字的名词出场,背后的人机协作机制一本书都没展开; 想真懂要去别的书架找(补充(不在书里,来自通用知识):RLHF 全称 Reinforcement Learning from Human Feedback——人给回答打分、机器照着分数继续调自己的那套做法;流程两步:先训一个 奖励模型(reward model,即专管打分的助手),再拿它当尺子去调模型)。

7. 可带走的

  1. 你的岗位变了:不用训练模型,专门负责「怎么让它干活」,这门手艺叫提示工程;
  2. 裸模型只续写;指令微调让它听懂命令,对话微调让它聊得起来(system/user/assistant 三角色);
  3. 最小单位是标记(token):约四个英文字符一个,常见词一块、生僻词多块,中文更要按字算钱;
  4. 单用任何一种提示技术都会翻车——组合(资料+分步+工具)才是可靠形态,这是 LangChain 存在的理由;
  5. CoT 放大组织能力而非知识,垃圾进、漂亮垃圾出;而且对人有害的任务上它照样帮倒忙;
  6. RAG 先把材料递到手边,但算术之类的硬操作要外包给工具;
  7. few-shot 是新任务的速效药:先试例子,不行再谈微调;
  8. 生成本质带随机,同题不同答是设计不是故障,调试时要多跑几次再看结论。

8. 原文地图

主题原书章原文位置
工程师岗位的转移Prefacetext/03-fm-preface.txt:25(搜「increasing amounts of time」)
LangChain 起点、calculator 动机案例Prefacetext/03-fm-preface.txt:29(搜「first commit on GitHub」) · text/03-fm-preface.txt:33(搜「reword the question」)
LLM 定义与规模、接话本质Prefacetext/03-fm-preface.txt:41(搜「extreme」) · text/03-fm-preface.txt:45(搜「45 terabytes」)
统计式预测(England/London)Prefacetext/03-fm-preface.txt:87(搜「similar places」)
token 与 cl100k 实例Prefacetext/03-fm-preface.txt:61(搜「atomic unit」) · text/03-fm-preface.txt:83(搜「four characters」)
预训练与自监督造题Prefacetext/03-fm-preface.txt:91(搜「self-supervised fashion」) · text/03-fm-preface.txt:95(搜「Remove the last word」)
裸模型只认续写Prefacetext/03-fm-preface.txt:101(搜「prime the response」)
指令微调与 RLHFPrefacetext/03-fm-preface.txt:109(搜「by necessity much smaller」) · text/03-fm-preface.txt:113(搜「user feedback received」)
对话微调、三角色、jailbreakingPrefacetext/03-fm-preface.txt:123(搜「multiturn dialogue」) · text/03-fm-preface.txt:127(搜「jailbreaking」)
任务微调与口径声明Prefacetext/03-fm-preface.txt:131(搜「loss of generality」) · text/03-fm-preface.txt:133(搜「workhorses」)
提示工程定义Prefacetext/03-fm-preface.txt:139(搜「prompt engineering」)
温度归零、随机性与迭代Prefacetext/03-fm-preface.txt:151(搜「more deterministic」) · text/03-fm-preface.txt:168(搜「element of randomness」) · text/03-fm-preface.txt:170(搜「iterate on prompts」)
zero-shot 与 48 岁错误答案Prefacetext/03-fm-preface.txt:159(搜「30th president」) · text/03-fm-preface.txt:163(搜「48 years old」)
CoT 用法与其反面证据Prefacetext/03-fm-preface.txt:176(搜「Think step by step」) · text/03-fm-preface.txt:174(搜「reduce LLM performance」) · text/03-fm-preface.txt:202(搜「very reasonable」)
RAG 定义与差 3 岁Prefacetext/03-fm-preface.txt:206(搜「known as context」) · text/03-fm-preface.txt:230(搜「off by 3」)
工具调用定义与错误示范Prefacetext/03-fm-preface.txt:234(搜「external functions」) · text/03-fm-preface.txt:252(搜「2023-1892」)
组合律与最终正确Prefacetext/03-fm-preface.txt:256(搜「most useful when used in combination」) · text/03-fm-preface.txt:290(搜「57 years」)
few-shot 两种形态Prefacetext/03-fm-preface.txt:296(搜「before fine-tuning」) · text/03-fm-preface.txt:300(搜「predetermined list」)
社区规模与技术承诺Prefacetext/03-fm-preface.txt:310(搜「monthly downloads」) · text/03-fm-preface.txt:312(搜「abstractions」)

Footnotes

  1. 出处:「Preface」第 159 段(text/03-fm-preface.txt:159,搜「wife's mother died」)。本章走查表的五轮问答文本全部出自该章第 161–292 段。

  2. 出处:「Preface」第 41 段(text/03-fm-preface.txt:41,搜「autocomplete feature」)。原文把它比作「taken to an extreme(放大到极致)的手机自动补全」。

  3. 出处:「Preface」第 45 段(text/03-fm-preface.txt:45,搜「45 terabytes」)。参数被定义为「控制每个神经元输出及其与相邻神经元连接权重的数值」。

  4. 出处:「Preface」第 87 段(text/03-fm-preface.txt:87,搜「similar places」)。原文细述 England/France/capital/London 各自在训练语料中的共现关系。

  5. 出处:「Preface」第 61 段(text/03-fm-preface.txt:61,搜「atomic unit」)与第 83 段(text/03-fm-preface.txt:83,搜「four characters」)。good morning dearest friend 切成 5 个标记的完整编号清单在第 63–83 段。 2 3 4

  6. 出处:「Preface」第 91 段(text/03-fm-preface.txt:91,搜「self-supervised」)。「人工拼标注集不可行,唯一可行办法是从训练数据自动造出输入-期望输出对」即出自此段。

  7. 出处:「Preface」第 101 段(text/03-fm-preface.txt:101,搜「prime the response」)。

  8. 出处:「Preface」第 109 段(text/03-fm-preface.txt:109,搜「by necessity much smaller」)、第 113 段(text/03-fm-preface.txt:113,搜「user feedback received」)、第 115 段(text/03-fm-preface.txt:115,搜「broadening the number of people」)。 2 3

  9. 出处:「Preface」第 127 段(text/03-fm-preface.txt:127,搜「jailbreaking」)。原文同时点出后果:精心构造的系统提示(可能含商业机密)会被套话泄露给终端用户。 2

  10. 出处:「Preface」第 131 段(text/03-fm-preface.txt:131,搜「loss of generality」)。

  11. 出处:「Preface」第 133 段(text/03-fm-preface.txt:133,搜「workhorses」)。「These should be your workhorses」——干活主力。

  12. 出处:「Preface」第 139 段(text/03-fm-preface.txt:139,搜「Adapting an existing LLM」)。

  13. 出处:「Preface」第 141 段(text/03-fm-preface.txt:141,搜「in a broad sense」)。

  14. 出处:「Preface」第 161–163 段(text/03-fm-preface.txt:163,搜「48 years old」)。错误答案全文:「The 30th president of the United States, Calvin Coolidge, was 48 years old when his wife's mother passed away in 1926.」

  15. 出处:「Preface」第 168 段(text/03-fm-preface.txt:168,搜「element of randomness」)。 2

  16. 出处:「Preface」第 170 段(text/03-fm-preface.txt:170,搜「iterate on prompts」)。

  17. 出处:「Preface」第 176 段(text/03-fm-preface.txt:176,搜「Think step by step」);「唯一的改动就是加了这一句」的自我对照在第 202 段(text/03-fm-preface.txt:202,搜「only change in the prompt」)。

  18. 出处:「Chapter 6. Agent Architecture」第 23 段(text/09-ch06-chapter-6-agent-architecture.txt:23,搜「granular steps」)。原文:「LLMs "make better decisions" when given instructions to reason about complex problems by breaking them down into granular steps to be taken in sequence」。

  19. 出处:「Preface」第 174 段(text/03-fm-preface.txt:174,搜「reduce LLM performance」)。所引论文为本页脚注 4:Ryan Liu 等《Mind Your Step (by Step)》,arXiv 2024-11-08(「Preface」text/03-fm-preface.txt:442,搜「Mind Your Step」)。 2

  20. 出处:「Preface」第 204–206 段(text/03-fm-preface.txt:206,搜「known as context」)。 2

  21. 出处:「Preface」第 230 段(text/03-fm-preface.txt:230,搜「off by 3」)。

  22. 出处:「Preface」第 234 段(text/03-fm-preface.txt:234,搜「prepending the prompt with a list of external functions」)。

  23. 出处:「Preface」第 256 段(text/03-fm-preface.txt:256,搜「most useful when used in combination」)。原句强调「one of the most important things to keep in mind when prompting LLMs」。

  24. 出处:「Preface」第 280–292 段(text/03-fm-preface.txt:288,搜「1929 - 1872」)与第 290 段(text/03-fm-preface.txt:290,搜「57 years」)。注:该段印刷有一处笔误,正文把执行的算式写成 1827,应以输出行 1929 - 1872 为准。

  25. 出处:「Preface」第 296 段(text/03-fm-preface.txt:296,搜「before fine-tuning」)。 2

  26. 出处:「Preface」第 298–304 段(text/03-fm-preface.txt:304,搜「pick the most relevant examples」)。

  27. 出处:「Preface」第 29 段(text/03-fm-preface.txt:29,搜「first commit on GitHub」)、第 33 段(text/03-fm-preface.txt:33,搜「reword the question」)、第 29 段(text/03-fm-preface.txt:29,搜「other sources of computation or knowledge」)。

  28. 出处:「Preface」第 37 段(text/03-fm-preface.txt:37,搜「time of writing, the largest」)。

  29. 出处:「Preface」第 310 段(text/03-fm-preface.txt:310,搜「28 million monthly downloads」)。

  30. 出处:「Preface」第 151 段(text/03-fm-preface.txt:151,搜「more deterministic」)。

  31. 出处:「Preface」第 147 段(text/03-fm-preface.txt:147,搜「come down significantly」)。

  32. 出处:「Chapter 6. Agent Architecture」第 45 段(text/09-ch06-chapter-6-agent-architecture.txt:45,搜「fine-tuned to improve their performance」)。原文指出较新的模型已为工具调用与思维链做过微调,「removing the need for adding specific instructions to the prompt」。