跳到主要内容

数据截至 (上游 commit c187ef3271d5)

不训模型,用模型 — 全书唯一破例的一章

这一章讲三件事。第一件:这本书在这里破了自己的例。 前面九章的骨架是「自己训一个」,这一章一次训练都没有 —— 书自己声明了这是例外,理由很实在:这类模型要多大的网络、要喂多少文字, 已经远远超出一个人能做的范围。所以整章讲的是怎么用别人已经练好的。

第二件,是「用」本身其实是一门手艺。 从一把钥匙加三行代码开始, 到怎么把话说清楚、怎么把几步串成一条流水线, 最后让它回一份程序能直接读进数据库的东西,而不是一段给人看的文字。

第三件,是三个最容易被拧错的旋钮。 同一句话问两遍答案不一样,不是它坏了, 是设计里故意留的随机 —— 而这三个旋钮就是管这件随机的。写代码该拧到多少、 写文案该拧到多少,书给了具体的数。

在全书链条里的位置: 这一章是链条上唯一一处断口。 三个零件(数据形状、网络里放什么层、输出层配哪把尺)在这里全部不适用 —— 因为根本没有训练循环至于这类模型内部怎么转,书号称要深潜,却停在了半路 —— 那一半由我们补,在第 11 章。

1. 顶层全景:两个词,换回一份四个字段的电影信息

这一章的主走查很小,但走完就把整章串起来了:你只给它两个词 ——「mars, botanik」 (德语,意思是「火星、植物学」)—— 让它认出这是哪部电影,并且把片名、主角、导演、 上映年份四样东西以程序能读的格式返回。

两个词:mars, botanik

├─① 一把钥匙放进单独的文件 ──→ 代码里不出现任何密码

├─② 挑一个模型、连上去 ──────→ 三行代码

├─③ 看账单怎么算 ───────────→ 按 token 计费,输入和输出分开算

├─④ 温度拧到 0.2 ───────────→ 要稳定,不要发挥

├─⑤ 定角色 + 填模板 ─────────→ 「你是电影专家」+「剧情:{两个词}」

├─⑥ 声明想要哪四个字段 ──────→ 片名 / 主角 / 导演 / 年份

├─⑦ 用竖线把三步串成一条链 ──→ 模板 → 模型 → 解析

└─⑧ 拿回结果 ──────────────→ {'title': 'The Martian', …}

图说:这一章真正的新东西是 ⑤⑥⑦。 ①②③ 是入场手续,④ 是旋钮, 而 ⑤⑥⑦ 才是「把一次随口提问,变成一道能塞进程序里的工序」。

2. 这一章为什么破例不训练

先看现象: 你翻到这一章,会以为终于要自己训一个会说话的模型了。没有。 书开门见山地说:由于训练语言模型的复杂度和技术门槛,我们从一个更高的抽象层起步 —— 用已经训好的模型,重点学怎么高效地用它们1

这里先把两个词定死,后面一直会用到。

第一个词是大语言模型 —— 指的是一类复杂的神经网络, 在大到难以想象的文本数据上训练过;正因如此,它认得出语言里复杂的规律和关联, 于是能写出前后连贯、内容也对得上的文字,能答问题、能翻译、能写创意内容2

它的英文缩写是 LLM —— 三个字母分别取自 large(大)、language(语言)、model(模型), 后面各章会和中文名混着用,说的是同一件事。

第二个词是基础模型 —— 指的是在巨量数据上训出来的、用途很广的底座, 可以被改造去干各种各样的活3。 「基础」这个词的重点在它不是为某一个任务训的,这和前面九章每一个模型都专为一件事而训,正好相反。

补充(不在书里):这类模型当初到底在学什么,全书一个字没交代。 它只说「在巨量文本上训过」,却没说训练的题目是什么。 题目其实极其朴素:遮住一段文字的下一个词,让它猜。 猜错了就照第 01 章那个循环挪一挪权重,换下一段再来。 这件事不需要任何人工标注 —— 文字本身就是答案,所以能拿整个互联网当题库4

为什么这件事个人做不了 —— 书给的理由是两条门槛叠在一起:

门槛书怎么说
网络要多复杂复杂度本身就是门槛之一1
要多少文字「大到难以想象」的规模2

所以这一章的动作全部换了:不是「怎么训」,是「怎么调用别人训好的那一个」。

3. 第一次调用:一把钥匙,加三行代码

它解决什么问题。 你想在自己的 Python 脚本里,用上一个跑在别人机器上的模型。 那种一直开着、专门等着别的程序来问话的电脑,就叫服务器。

可那台服务器凭什么认得你、凭什么知道该向谁收钱?

答案是一把钥匙。 书解释得很清楚:网页服务用账号密码登录,而程序要用一个服务, 用的是一把钥匙 —— 它相当于账号和密码合成的一样东西5这种「一个程序调用另一个程序」的入口,行话叫 API;那把钥匙就叫 API key。

拿钥匙的步骤书列成了六步5:注册账号 → 开通计费并充点钱 → 在网站的钥匙页面新建一把 → 复制 → 粘进一个文件。

第五步那个文件必须单独存在,这是这一节最重要的一条规矩。 书的说法是:把代码和凭据分开是一条通行的好做法,所以钥匙要存在一个单独的文件里, 惯例是叫 .env,放在工作目录下6

.env 文件里就一行:
OPENAI_API_KEY = sk-proj...

代码里从来不出现这串字符,只出现「去环境里取名叫 OPENAI_API_KEY 的那个值」。

图说:这样做的好处是,你可以把代码分享给任何人、传到任何地方,钥匙不会跟着跑出去。

连上去只要三件事:模型的名字、一个叫温度的参数、以及那把钥匙7

调用只有一个动作: 把你的问题传给一个叫 invoke() 的方法,它把模型跑一遍、把结果带回来8

回来的东西里最要紧的是两块:

装什么
content模型真正的回答,一段文字
response_metadata这一次用掉了多少 token —— 账单就是照这个算的

书特意点了一句:输入和输出是分开计费的8。 第 5 节讲 token 是什么,以及为什么这件事会变成成本问题。

书还提醒了一个极易搞混的点,值得原样记住: Groq 是一家做芯片的公司(专做让模型跑得快的硬件), Grok 是另一家公司的模型(马斯克那边的)。两个词只差一个字母,完全不是一回事9

4. 同一段代码,怎么换到别家、换到自己机器上

先看现象: 上一节用的是要付费的那一家。换一家要重写一遍代码吗?

不用。这一节是这一章最实用的一节 —— 一套写法,三种后端。

先把两个词分开。 一个模型如果只能通过它东家的服务去用、内部那堆数不给你, 这一类就叫闭源

反过来,把训好的那堆数公开出来、任何人都能下载去自己跑的,叫开源 —— 不过这个词有个陷阱,下一小节马上讲。

后端什么时候选它代价
付费的闭源模型要最强的效果花钱,而且数据要发到别人服务器上
免费跑开源模型的服务想先试试、不想绑银行卡仍然要发到别人服务器上10
下载到自己机器上跑数据一点都不许出网效果受限于你的硬件

代码上的差别只有一处:换一个类名、换一把钥匙。 其余包括 invoke()、 包括从 content 取结果,一模一样 —— 书自己也点了这一句: 这些接入方式全都遵循同一套写法11

4.1 开源和「开放权重」不是一回事

这个区分书讲得很准,而且外面经常被混着用,值得原样记住12:

说法公开了什么
真正的开源连模型结构和用了哪些训练数据都公开
开放权重只把训好的那一堆数公开给你随便用,训练数据和训练细节仍然保密

书举的例子是 Llama 那一族:任何人都能免费用,但训练数据的细节公司不说12书还提醒:大多数被叫作「开源」的模型,其实只到「开放权重」这一档。

4.2 跑在自己机器上:数据不出网

它解决什么问题: 有些资料根本不能发出去。 书的说法很直接 —— 有时候你想在本地跑,是因为隐私要紧、不愿意把机密信息传上互联网13

做法:装一个本地的模型运行平台(书用的那个叫 Ollama),然后一条命令把模型拉下来14

这里有一张很有用的档位表 —— 它头一次让「模型有多大」这件事变得具体15:

档位有多少个可调的数说明
最小2.7 亿能在普通笔记本上跑
最大270 亿是最小那档的 100 倍
能看图的门槛40 亿起低于这一档只能读文字

书选的是 40 亿那一档,下载下来 3.3 GB14 —— 大约是一部高清电影的体量, 而它已经能同时读文字和图。

4.3 从「发一段字」到「发一张图」:只多一步

能同时吃文字、图片、声音、视频的模型,书管它叫多模态模型16

代码上的差别只有一步:图片不能直接当路径发过去,得先编成一长串字符。 这种「把二进制数据转成一串可打印字符」的编码方式叫 base6417

走一遍(书拿一张流程图去问它)18:

一张 PNG 流程图
→ 读成二进制 → base64 编成一长串字符
→ 塞进消息里(和那句问题并排放)
→ 发给模型
→ 它答:「这张图展示的是一个开发人工智能模型的流程,
从数据收集开始,经过预训练模型、指令模型、安全模型,最后到评估。」

图说:除了「编码」这一步,其余和发一段纯文字完全一样。 注意它答对了 —— 图里那五个方框的名字,它一个不落地读出来了。

5. token 与上下文窗口:为什么长对话又贵又慢

先看现象: 上一节那次调用的账单是按 input_tokens: 13output_tokens: 290 算的813 和 290 是什么单位?

它不是「词」。 书说得很清楚:模型会把输入的文字拆成更小的单位,叫 token; 一个 token 可能是一个词、一个词的一部分,甚至只是一个标点19

书给的实例最能说明问题:「PyTorch」这一个词,被切成了「Py」和「Torch」两块20为什么要切得这么碎? 因为这样一来,再生僻的词也能用已有的碎块拼出来 —— 这种切法叫子词切分,是今天语言模型通用的做法21

每一块都会被换成一个编号。 那次示例里,「Py」是 37863、「Torch」是 16270920编号来自一本词典,而这本词典必须和模型配套 —— 书特意提醒: 换错了词典就全乱套22

换算成词大概是多少,书给了两条经验规律23:

语言规律换句话说
英语1 个 token ≈ 3/4 个词100 个 token 大约能写 75 个词
德语1 个词 ≈ 2.1 个 token同一段话,德语要花掉英语近三倍的 token

德语为什么更亏,书给了理由:德语复合词多,而且大多数模型的词典是照英语建的, 所以常见英文词往往整词就是一个 token,德语词却要被拆碎23

接着是这一节真正的落点:一次最多能塞进去多少 token,是有硬上限的。 这个上限叫上下文窗口24

它同时决定三件事24:

  1. 能记住多长的对话 —— 窗口越大,越能「记得」前面说过什么;
  2. 要花多少算力 —— 窗口越大,处理同一段文字要的资源越多;
  3. 等多久才有回音 —— 窗口越大,延迟(从发问到出结果的等待时间)越长。

差别有多大?书给了两个真实的数25:

模型上下文窗口
一个小模型4096 个 token
另一个大窗口模型250000 个 token

后者是前者的 61 倍。 换成刚才那条英语规律,4096 个 token 大约是三千个词 —— 一篇长文章就装满了;25 万个 token 则是一本中等厚度的书。

6. 三个旋钮:同一句话问两遍,为什么答案不一样

先看现象。 你把同一个问题问两遍,它答得不一样。这不是故障,是设计。

每次要吐下一个 token 时,模型手上其实是一整排候选,每个候选带一个可能性26接下来挑哪一个 —— 这三个旋钮管的就是这件事。

6.1 第一个旋钮:温度,管的是「差距被放大还是抹平」

书的定义:温度用来控制结果的随机性,典型取值从 0 到 1,有时更高26

拧到低拧到高
模型很聚焦,结果很确定 —— 同一个问题反复问,答案基本一样挑选范围变宽,更容易冒出有创意或者意料之外的东西

书给了一个很好的比方:一家冰淇淋店。 气温低的时候客人少, 只上最受欢迎的那几个口味是明智的;气温一高、客人一多,就该把冷门口味也摆出来27

但这只是比方。真正在发生的事是这样的 —— 书拿一个填空题走了一遍。

题目是「Bert 喜欢 ____」,候选只留三个:读书、跑步、写程序。 模型手上本来就有这三个词各自的可能性,而温度决定这三个数之间的差距被怎么处理28:

温度 0.1(低) 温度 0.5(中) 温度 20(极高)
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 写程序 ▉▉▉▉ │ │ 写程序 ▉▉▉ │ │ 写程序 ▉▉ │
│ 读书 ▉ │ │ 读书 ▉▉ │ │ 读书 ▉▉ │
│ 跑步 ▏ │ │ 跑步 ▉ │ │ 跑步 ▉▉ │
└──────────┘ └──────────┘ └──────────┘
差距被拉大 原本的差距 差距被抹平,
几乎只会挑第一个 三个几乎一样可能

图说:这三张分布图直接照搬书里那张图的形状。 温度低时模型把差距放大,温度高时差距消失、所有词变得一样可能28书还提醒:温度一般不该超过 1,再高就会输出混乱、前后不连贯的东西26

6.2 第二个旋钮:划一条累计线

它解决什么问题: 温度只改差距,候选还是全部都在。 有些概率低到荒唐的词,仍然有机会被抽中。

做法:把候选按可能性从高到低排队,从头往下累加,凑够一个比例就不再往下看29

书给的例子可以逐格核对。 题目是「晚上我想去看一场 ____」:

候选可能性累计
电影0.50.5
游戏0.30.8 ← 停在这里
餐厅0.110.91 ← 超过 0.9 了,不要
医生0.01

这条线定在 0.9,所以只有「电影」和「游戏」进入候选; 再加上「餐厅」累计就是 0.91,越线了30这个旋钮的名字叫 top-p。

两个端点值得记住29:拧到 1 等于不过滤,全部候选都算; 拧到 0.5 以下,输出会变得非常聚焦、非常可预测。

6.3 第三个旋钮:固定只看前几名(top-k)

最简单的一个:不管累计到多少,就固定取可能性最高的前 k 个,再从里面随机挑31

上面那个例子里 k 设成 3,进入候选的就是电影、游戏、餐厅30k = 1 就是完全确定的 —— 永远挑第一名31

和 top-p 的差别一句话:top-p 的候选数量是浮动的(可能性集中时只剩两三个, 分散时可能有几十个),top-k 的数量写死31

6.4 该拧到多少:书给了具体的数

这张表是这一节最实用的东西,直接抄走32:

干什么温度top-ptop-k
写创意文字0.8–1.00.9–1.050–100
写代码0.1–0.30.7–0.910–20
客服问答0.2–0.40.7–0.920–50

读一下这张表的逻辑: 写代码要的是能跑,一个字母错了就废,所以三个旋钮全部拧紧; 写创意文字要的是别老是同一套,所以三个都放开;客服在两者之间 —— 书的理由是要可靠、但也得留一点灵活性,否则回话像机器人32

7. 怎么挑一个模型:七条筛子

先看现象: 上一节那张图里摆了十几个模型名字。凭什么选?

书列了七条,而且明确区分了硬指标和软指标33。下面按「什么时候它是决定性的」排:

筛子什么时候它说了算
能力排名一般情况下的第一参考 —— 但见下面那条重要提醒
知识截止到哪天你要问的事发生在最近 —— 训练数据定稿之后的事它不可能知道34
数据能不能出网处理机密信息时,这一条压过其他所有35
开源还是开放权重你要复现、要审计训练数据时(见第 4.1 节)12
价钱量大时 —— 按 token 计费,输入通常比输出便宜36
上下文窗口要处理很长的文档时(见第 5 节)37
延迟要做实时语音这类场景时 —— 等太久就没有「自然对话」可言38

「能力排名」那一条要讲清楚它是怎么来的,否则读者会误以为是某种考试分数。

书用的那个排行榜 —— 把一堆模型按强弱排成一列的那种榜 —— 是靠人投票投出来的。 用户输入一个问题, 同时拿到两个模型的回答,但不知道哪个是哪个,由他判断谁答得更好 —— 这叫双盲测试,是评估领域的黄金标准39

书还点了一个细节:榜上好几个模型并列同一个名次。 原因是排名带了 95% 的置信区间 —— 落在同一个区间里的模型,统计上分不出高下, 所以并列39

判断(我们的,不是书里的):这一节里所有的型号名和排名,都必须当成一张有日期的快照读, 不能当成现状。 书自己在那张排行榜截图上标了日期:2025 年 11 月 9 日,并且说 名次经常变、你看到的排名很可能已经不一样了39我们的处理是:全章不写「目前最强的是 X」,只写「书写作的那个时点排在前面的是 X」。 如果错,会错在: 如果某个模型的领先地位真的长期稳定,那么这条谨慎就是多余的; 但判据在书自己那句话上 —— 它自己就说了排名经常变。

判断(我们的,不是书里的):同一页上出现了两套对不上的型号名。 正文写的是某一家的 Sonnet 4.5,而紧挨着的那张图里写的是同一家的 Opus 4.1 和 Sonnet 4.040两处至少有一处过时,而书没有说明拍摄时间不同。 如果错,会错在: 如果图是更早截的、正文是后来更新的,那么这只是编辑没同步,不是事实错; 但读者对着看会以为是两件不同的事。

8. 让它按角色说话:三种消息、一张模板、一条链

先看现象: 前面每次调用,我们都只是甩过去一句话。 可真实的对话里,「谁在说」是有区别的。

8.1 三种消息角色

书列了三种,而且分工很清楚41:

角色谁在说装什么
user(用户)这一次要它干的活 —— 一个词到一整篇文档都行
system(系统)你,在对话开始之前它该扮演什么角色、用什么语气、目标是什么
assistant(助手)模型它的回答,外加这次用了多少 token

system 那一条值得展开,因为它是「让它按你要的方式说话」的主要手段。 书举的例子是:「你是一个专攻软件问题排查与讲解的技术支持助手。 回答要清晰、分步骤,尽量避免行话。42

它的边界书也照实写了,而且这一段很诚实43:

  1. 它只能塑造初始行为,没法在整段对话里强制执行 —— 遇到意料之外的输入,模型的语气和行为会漂;
  2. 它管不住内容准确性和伦理问题 —— 那要靠另外的防护手段。

这里把那个天天听见的词定死:你发给模型的那段话,就叫提示词。专门研究「怎么把提示词写好」的那一整片领域,叫提示工程41

8.2 模板:把变的部分挖成空

它解决什么问题: 上面那套话,你不会每次都重打一遍。 变的只有其中一两个词,固定的部分应该只写一次。

做法:写一份带占位符的模板,用的时候把值填进去44:

模板(只写一次):
system: 「你是一个把英语翻译成别的语言的助手。」
user: 「把这句话:'{input}' 翻译成 {target_language}」

填值(每次都变):
{input: "I love programming.", target_language: "German"}

填完得到:
system: 「你是一个把英语翻译成别的语言的助手。」
user: 「把这句话:'I love programming.' 翻译成 German」

图说:这种「固定部分只写一次、变的部分挖成空、用的时候再填」的东西,就叫提示词模板。 书特意提醒它和 Python 的 f-string 长得像但不是一回事 —— f-string 要求变量事先存在,而这里的 {input}{target_language} 事先根本没定义过44

8.3 链:用一个竖线把几步串起来

它解决什么问题: 到目前为止,「填模板 → 调模型 → 从结果里把文字取出来」是三段代码。 这三段每次都一样,应该能一次写完。

做法就是一个竖线45:

链 = 模板 | 模型 | 取文字

用的时候只调一次:
链.invoke({input: "I love programming.", target_language: "German"})
→ "Ich liebe Programmieren."

图说:竖线左边那一步的输出,就是右边那一步的输入。 一条链就是一串首尾相接的工序46

顺带把最后一步那个动作的名字定下来: 模型吐回来的是一整团东西, 要从里面把真正的文字取出来 —— 这种「把一团数据拆开、按需要的形状装好」的动作,就叫解析; 干这件事的零件叫解析器45

书还提了两种更复杂的接法(只给了图,没给代码): 并行链(同一个输入同时走两条不同的链)和带路由的链 (先有一步判断该走哪一条,再分流过去)47

9. 结构化输出:让它回一份程序能读的东西

先看现象: 模型的强项是写自由文字 —— 讲故事、写邮件、生成代码都行。 可如果这段输出不是给人看的,而是要存进数据库、要喂给下一道工序呢?

一段散文没法直接入库。 书把这个场景说得很准: 当语言模型不在流程的末端、它的输出要被别的系统拿去用时,就需要结构化输出48

什么是结构化输出: 不是自由文字,而是机器可读的固定格式;最常见的是 JSON 和 XML49。 (JSON 在第 05 章出现过 —— 就是那种用花括号和「名字:值」写成的数据格式。)

它买来三样东西49:

  1. 语言模型和别的软件之间能直接对接;
  2. 能把流程自动化 —— 书举的例子:让模型从一段自由文字里抽出商品信息, 直接送进电商系统;
  3. 消掉歧义 —— 模型被逼着照一个说死的格式回话,结果一致得多

怎么做,三步50:

① 声明你想要哪几个字段、每个字段是什么类型
(片名:字符串、主角:字符串、导演:字符串、上映年份:字符串)

② 把这份声明交给上一节那种解析器 ——
它能照着这份声明,自动生成一段给模型看的格式说明

③ 把那段格式说明塞进 system 消息里 —— 不用自己写

图说:第 ③ 步是这一节最省事的地方。 格式说明不是人手写的, 是从第 ① 步那份声明自动生成出来的 —— 声明改了,说明跟着改50

这里有一条配套规矩:做结构化输出时,温度要拧低(0 到 0.3 之间)。 书给的理由很直接:这时候不该让模型发挥创意,要它确定51。 回头看第 6.4 节那张表 —— 这和「写代码」那一行是同一个道理。

10. 主走查:两个德语词,换回一份四个字段的电影信息

下面每个数和每个字串都来自书。

第 ① 步,钥匙进 .env 一行,代码里不出现6

第 ② 步,挑模型。 这一次用的是那家免费服务上的一个开放权重模型52

第 ③ 步,温度拧到 0.2。 落在书自己给的 0 到 0.3 那个区间里5152

第 ④ 步,声明想要什么。 四个字段,每个的类型都写成字符串 —— 字符串 —— 计算机里对「一段文字」的叫法,和数字相对53:

title 片名
main_character 主角
director 导演
release_year 上映年份

第 ⑤ 步,写两条消息54:

system: 「你是电影专家。{格式说明}」 ← 花括号那一格由第 ④ 步自动填
user: 「剧情:{plot}」 ← 花括号那一格由用户填

第 ⑥ 步,把三步用竖线串起来55:

链 = 模板 | 模型 | 解析器

第 ⑦ 步,把两个词塞进去。 输入是 {"plot": "mars, botanik"} —— 注意这两个词是德语,而且没有任何一个字提到电影名56

第 ⑧ 步,拿回结果57:

{'title': 'The Martian',
'main_character': 'Mark Watney',
'director': 'Ridley Scott',
'release_year': '2015'}

读一下这个结果 —— 它同时说明了三件事:

  1. 模型认出了这部电影:两个德语词「火星、植物学」,足够定位到《火星救援》;
  2. 回来的不是一段话,是四个字段 —— 这份东西可以直接存进数据库,不用再解析;
  3. 每个字段的类型都对:年份也是字符串,因为第 ④ 步是这么声明的53

把整章串一遍就是: 一把钥匙(第 3 节)→ 挑一个模型(第 7 节)→ 按 token 计费(第 5 节)→ 温度拧低(第 6 节)→ 定角色和模板(第 8 节)→ 声明字段(第 9 节)→ 串成链(第 8.3 节)→ 拿到一份程序能读的东西。

10.1 另起一处:书还留了一个「让模型帮你写提示词」的例子

这一处和主走查不是同一条链,但它很值得记 —— 因为它把「提示词」本身变成了可优化的东西。

有一个公开的提示词共享库,里面能拉到别人写好的提示词。 书拉的那一份专门用来把一句潦草的要求扩写成一份详细的要求58

走一遍59:

输入两样东西:
潦草的要求: 「summer, vacation, beach」(夏天、假期、沙滩)
任务: 「Shakespeare poem」(莎士比亚风格的诗)
↓ 送进那份提示词 + 模型
输出一份详细的要求(节选大意):
「以莎翁风格写一首十四行诗,14 行,抑扬格五音步,
押 ABABCDCDEFEFGG 韵;要写出夏日出游的美与欢愉;
加入自然、闲适、时光易逝的主题,用比喻加深情感。」
↓ 把这份详细要求再送给模型
它写出了一首完整的十四行诗。

图说:这一步的价值在于对照。 同样两个输入,直接问和扩写之后再问,结果差得很远 —— 书把这个对照留给读者自己跑60

11. 书里的立场与证据

书里给了证据的:

  • 每一次调用的真实返回 —— 包括 token 计数、模型名、结束原因,都原样印了出来;
  • 「mars, botanik」那份 JSON —— 四个字段全对,是真跑出来的;
  • 看图那次的回答 —— 图里五个方框的名字它一个不落地读了出来;
  • 本地模型下载的真实体积和耗时输出 —— 3.3 GB,连校验步骤都印了。

作者的经验判断(书里没给证据):

  • 第 6.4 节那张「该拧到多少」的表 —— 三行数字全部没有出处,也没有实验; 这是这一章最实用、同时也最没有证据的一块。
  • 「温度不该超过 1」 —— 定性说法,没有对照;
  • 「德语 1 个词约 2.1 个 token」 —— 书自己说这是经验规律,不是精确科学23

书里没交代来历的: 那三个旋钮各自出自哪里、 尤其 top-p 这套做法(书顺带提了它的另一个名字叫核采样29) 出自哪一篇,全书一字未提。

书里对不上的: 型号名前后两套(见第 7 节末的判断块); 另有一处交叉引用把章号写错了 —— 原文说「我们扩展第 1.6 节的提示词模板」, 它想指的其实是原书自己的 §9.5(提示词模板那一节),却把章号写成了 1; 而原书 §1.6 讲的是网络结构与层,和提示词模板毫无关系61

12. 边界与局限

这本书对的地方先说清: 这一章的实用性是全书最高的之一 —— 它把「代码和凭据分开」这条工程纪律放在第一个例子里就讲了, 而且三种后端(付费、免费、本地)一次讲全,还把选择依据(隐私、成本)一并给了。 「开源 vs 开放权重」那个区分也讲得比多数材料准。

但有三处要当心:

  1. 排行榜和型号名是一张有日期的快照 —— 见第 7 节末的判断块;
  2. 同一页两套型号名 —— 同上;
  3. 一处交叉引用的节号写错 —— 见第 11 节末。

这一章没覆盖的:

  • 这类模型当初怎么训出来的,一个字没有。 书只说「在巨量文本上训过」—— 训练的题目是什么、分几个阶段,全书零命中,第 2 节那个补充块是我们补的;
  • 注意力的分数怎么算,仍然没有。 这一章的末尾号称「深潜」, 可它停在了「它算出 it 指的是 pizza」这一步 —— 第 11 章补;
  • 一次任务里让模型自己反复调用工具、自己决定下一步做什么,全书零命中。 今天最常见的那些用法(让它先去查资料再答、让它自己调用外部程序),这本书完全没讲;
  • 怎么判断它是不是在瞎编,没有。 模型会一本正经地说错话这件事,书没有提;
  • 怎么给模型的输出打分、怎么做评测,只提了那个投票排行榜,没有别的方法;
  • 提示词注入这类安全问题,零命中。

13. 可带走的

主走查一行写完: 两个德语词「mars, botanik」→ 钥匙进 .env → 挑一个开放权重模型、温度 0.2 → 声明四个字段 → system 消息里塞进自动生成的格式说明 → 模板 | 模型 | 解析器 串成一条链 → 拿回 {'title': 'The Martian', 'main_character': 'Mark Watney', 'director': 'Ridley Scott', 'release_year': '2015'}

  1. 这一章是全书唯一不训练的一章,书自己声明了这是例外,理由是复杂度和数据量;
  2. API key 是程序用的「账号密码合体」,必须存在单独的文件里,代码里永远不出现;
  3. 换一家服务商只换类名和钥匙,invoke() 和取 content 完全一样;
  4. 开源 ≠ 开放权重:前者连训练数据都公开,后者只给你训好的那堆数;
  5. 模型读的不是词,是 token —— 「PyTorch」被切成「Py」和「Torch」;
  6. 切词的那本词典必须和模型配套,换错了全乱;
  7. 英语 1 个 token ≈ 3/4 个词;德语 1 个词 ≈ 2.1 个 token —— 同一段话,德语贵近三倍;
  8. 上下文窗口是一次最多塞多少 token 的硬上限,它同时决定贵、慢、和「记得多久」;
  9. 温度不改候选,改的是候选之间差距的大小 —— 低了放大差距,高了抹平差距;
  10. top-p 是一条累计线(凑够九成就不再往下看),top-k 是固定取前几名;
  11. 写代码把三个旋钮全拧紧(温度 0.1–0.3),写创意文字全放开(0.8–1.0);
  12. system 消息定角色,但它管不住整段对话 —— 模型的语气会漂,这是书自己说的;
  13. 模板把变的部分挖成空,一份模板反复填;
  14. 竖线把「填模板 → 调模型 → 取结果」串成一条链,调一次就够;
  15. 结构化输出的关键不是「让它输出 JSON」,是先声明字段、再让格式说明自动生成;
  16. 做结构化输出时温度必须拧低 —— 这时候要的是确定,不是创意;
  17. 排行榜是双盲投票排出来的,并列名次是因为落在同一个置信区间里;
  18. 排行榜和型号名永远是一张有日期的快照 —— 书自己就说了名次经常变。

14. 原文地图

主题原书章原文位置
为什么从更高的抽象层起步Chapter 9text/11-ch09-chapter-9.txt:38(搜「complexity and technical requirements」)
LLM 是什么、基础模型Chapter 9text/11-ch09-chapter-9.txt:16(搜「unimaginably large amounts」) · text/11-ch09-chapter-9.txt:9(搜「foundation」)
API key 与六步申请Chapter 9text/11-ch09-chapter-9.txt:82(搜「you need an API key」) · text/11-ch09-chapter-9.txt:93(搜「separate code from credentials」)
模型实例与 invokeChapter 9text/11-ch09-chapter-9.txt:128(搜「gpt-4o-mini」) · text/11-ch09-chapter-9.txt:133(搜「invoke()」) · text/11-ch09-chapter-9.txt:173(搜「response_metadata」)
Groq 不是 GrokChapter 9text/11-ch09-chapter-9.txt:107(搜「confuse Groq with Grok」)
换到另一家、写法一致Chapter 9text/11-ch09-chapter-9.txt:199(搜「develops AI hardware」) · text/11-ch09-chapter-9.txt:532(搜「same scheme」)
开源 vs 开放权重Chapter 9text/11-ch09-chapter-9.txt:738(搜「distinguish between open-source」)
本地跑与档位表Chapter 9text/11-ch09-chapter-9.txt:419(搜「privacy is important」) · text/11-ch09-chapter-9.txt:440(搜「270 million」) · text/11-ch09-chapter-9.txt:452(搜「3.3 GB」)
多模态与 base64Chapter 9text/11-ch09-chapter-9.txt:313(搜「large multimodal models」) · text/11-ch09-chapter-9.txt:363(搜「binary-to-text coding」) · text/11-ch09-chapter-9.txt:409(搜「three USB sticks」)
token 与上下文窗口Chapter 9text/11-ch09-chapter-9.txt:302(搜「smaller units called」) · text/11-ch09-chapter-9.txt:297(搜「maximum number of input tokens」) · text/11-ch09-chapter-9.txt:758(搜「250,000 tokens」)
子词切分与 token IDChapter 9text/11-ch09-chapter-9.txt:1244(搜「split into the two tokens」) · text/11-ch09-chapter-9.txt:1231(搜「37863」) · text/11-ch09-chapter-9.txt:1263(搜「tokenizer that matches the model」)
token 与词的换算Chapter 9text/11-ch09-chapter-9.txt:1254(搜「3/4 of a word」)
温度Chapter 9text/11-ch09-chapter-9.txt:554(搜「control the randomness」) · text/11-ch09-chapter-9.txt:582(搜「ice cream parlor」) · text/11-ch09-chapter-9.txt:586(搜「Bert likes」)
top-p 与 top-kChapter 9text/11-ch09-chapter-9.txt:621(搜「nucleus sampling」) · text/11-ch09-chapter-9.txt:627(搜「Top-k sampling」) · text/11-ch09-chapter-9.txt:653(搜「movie and game have a probability of 80%」)
三个旋钮的推荐值Chapter 9text/11-ch09-chapter-9.txt:663(搜「For creative writing」)
七条选型筛子Chapter 9text/11-ch09-chapter-9.txt:682(搜「hard and soft criteria」) · text/11-ch09-chapter-9.txt:713(搜「knowledge cutoff date」) · text/11-ch09-chapter-9.txt:746(搜「billed on a token basis」) · text/11-ch09-chapter-9.txt:761(搜「time to first」)
排行榜与双盲Chapter 9text/11-ch09-chapter-9.txt:704(搜「doubleblind test setting」) · text/11-ch09-chapter-9.txt:697(搜「Snapshot of 2025-11-09」)
三种消息角色Chapter 9text/11-ch09-chapter-9.txt:777(搜「prompt engineering」) · text/11-ch09-chapter-9.txt:790(搜「technical support AI」) · text/11-ch09-chapter-9.txt:797(搜「system messages have their limitations」)
提示词模板Chapter 9text/11-ch09-chapter-9.txt:823(搜「placeholders and filled later」) · text/11-ch09-chapter-9.txt:838(搜「ChatPromptTemplate.from_messages」)
链与竖线Chapter 9text/11-ch09-chapter-9.txt:960(搜「sequence of process steps」) · text/11-ch09-chapter-9.txt:1030(搜「pipe operator」) · text/11-ch09-chapter-9.txt:978(搜「parallel chains」)
提示词共享库那次扩写Chapter 9text/11-ch09-chapter-9.txt:865(搜「prompt maker」) · text/11-ch09-chapter-9.txt:907(搜「summer, vacation, beach」) · text/11-ch09-chapter-9.txt:912(搜「skilled poet in the style」)
结构化输出Chapter 9text/11-ch09-chapter-9.txt:1063(搜「machine-readable format」) · text/11-ch09-chapter-9.txt:1118(搜「class MyMovieOutput」) · text/11-ch09-chapter-9.txt:1140(搜「partial() method」) · text/11-ch09-chapter-9.txt:1153(搜「should be less」)
主走查的输入与结果Chapter 9text/11-ch09-chapter-9.txt:1165(搜「mars, botanik」) · text/11-ch09-chapter-9.txt:1172(搜「The Martian」)
勘误 两套型号名Chapter 9text/11-ch09-chapter-9.txt:42(搜「Claude Sonnet 4.5」) · text/11-ch09-chapter-9.txt:47(搜「Claude Opus 4.1」)
勘误 交叉引用把章号写错Chapter 9 · Chapter 1text/11-ch09-chapter-9.txt:1010(搜「Chapter 1.6」) · text/11-ch09-chapter-9.txt:811(搜「9.5 Prompt Templates」) · text/03-ch01-chapter-1.txt:299(搜「1.6 Network Structure and Layers」)

Footnotes

  1. 出处:「Chapter 9」第 37-40 段(text/11-ch09-chapter-9.txt:38,搜「complexity and technical requirements」)。原文:由于训练语言模型的复杂度和技术要求,我们从一个更高的抽象层次开始 —— 我们会使用已经训练好的语言模型,而首要的是学会高效地使用它们。这是全书唯一一次明说某一章不做训练。 2

  2. 出处:「Chapter 9」第 15-20 段(text/11-ch09-chapter-9.txt:16,搜「unimaginably large amounts」)。原文:大语言模型的核心是复杂的神经网络,它们在大到难以想象的文本数据上训练过;这使模型能够识别复杂的语言规律与关联,进而具备创作内容恰当且连贯的文本、回答问题、进行翻译、产出创意内容的能力;这些能力建立在模型架构的进展上,尤其是 transformer 架构。 2

  3. 出处:「Chapter 9」第 9-11 段(text/11-ch09-chapter-9.txt:9,搜「foundation」)。原文:它们被归类为基础模型 —— 一类在巨量数据集上训练出来的、用途广泛的基本模型,可以作为底座被适配到各式各样的任务上。

  4. 补充(不在书里,依据我们的 ai-book-reference 书架):这类模型训练时的题目是什么,原书从头到尾没有交代。依据: book=what-is-chatgpt-doing §01-one-word-at-a-time 事实=该章把生成拆成一个反复执行的动作 —— 为下一个词列一张可能性清单、带一点随机地挑一个接上去;而模型正是靠「遮住下一个词让它猜」这种不需要人工标注的题目训出来的。原书对此只在第 1 章有一句 self-supervised 带过(text/03-ch01-chapter-1.txt:135,搜「self-supervised learning」)。

  5. 出处:「Chapter 9」第 78-91 段(text/11-ch09-chapter-9.txt:82,搜「you need an API key」)。原文:如果你要用一个网页服务,通常需要用户名和密码;而如果你要用程序去调用一个服务,需要的是一把 API key —— 所以 API key 相当于用户名和密码的组合。原文的六步:打开平台页面、注册账号、开通计费并充值、到 API keys 区域新建一把、复制、粘贴到一个叫 .env 的文件里。 2

  6. 出处:「Chapter 9」第 93-105 段(text/11-ch09-chapter-9.txt:93,搜「separate code from credentials」)。原文:把代码和凭据分开通常是好做法,所以 API key 应当存在一个单独的文件里;常见做法是存进工作目录下一个叫 .env 的文件;这些 key 被当作环境变量对待,也就是操作系统会用到的那类变量,而代码脚本里必须用同一个变量名。 2

  7. 出处:「Chapter 9」第 124-131 段(text/11-ch09-chapter-9.txt:128,搜「gpt-4o-mini」)。原文:创建模型实例需要一个模型名(这里选的是 gpt-4o-mini);另一个重要参数是温度,它控制模型的创造性;还需要把 API key 传进去以完成身份验证,并让服务方按用量计费。

  8. 出处:「Chapter 9」第 133-175 段(text/11-ch09-chapter-9.txt:133,搜「invoke()」与 text/11-ch09-chapter-9.txt:173,搜「response_metadata」)。原文:模型对象有一个非常重要的方法 invoke(),它按给定参数执行模型;返回的信息很多,最重要的是 content,它装着模型真正的输出;另外只想提一下 response_metadata,它装着 token 用量信息 —— 你要为输入 token 和输出 token 分别付费,在这里能看到这次请求各用了多少。示例那次的数是输入 13、输出 290、合计 303。 2 3

  9. 出处:「Chapter 9」第 106-107 段(text/11-ch09-chapter-9.txt:107,搜「confuse Groq with Grok」)。原文:不要把 Groq 和 Grok 搞混 —— Groq 是一家专注于开发让语言模型快速推理的芯片的 AI 创业公司,而 Grok 是马斯克发起的一个语言模型。

  10. 出处:「Chapter 9」第 198-202 段(text/11-ch09-chapter-9.txt:199,搜「develops AI hardware」)。原文:Groq 是一家开发 AI 硬件、让推理跑得快的公司;对开发者,它提供访问语言模型(尤其是开源语言模型)的入口;这个服务可以免费使用,但仍然需要用一把 API key 来验证身份。

  11. 出处:「Chapter 9」第 531-535 段(text/11-ch09-chapter-9.txt:532,搜「same scheme」)。原文:通过 LangChain 做的这些模型接入有一个好处 —— 它们全都遵循同一套写法,所以我们仍然像前面几节那样通过 content 属性取模型的回答。

  12. 出处:「Chapter 9」第 731-742 段(text/11-ch09-chapter-9.txt:738,搜「distinguish between open-source」)。原文:严格来说应当区分开源与开放权重 —— 真正的开源模型会包含模型架构和所用训练数据在内的全部细节,但大多数「开源」模型并不包含这些;提供方公开了训练好的模型及其权重,而底层数据与训练细节仍然保密。原文举的例子是 Meta 的 Llama 系列:公众可以免费使用,但公司对训练数据细节保密。 2 3

  13. 出处:「Chapter 9」第 418-425 段(text/11-ch09-chapter-9.txt:419,搜「privacy is important」)。原文:到目前为止我们都是通过 API 调用软件即服务提供商的模型;有时候你会想在本地跑一个模型,因为隐私很重要、你不愿意把机密信息通过互联网传出去;这种情况下可以在本地计算机上跑,理想情况是有一块能跑得动像样大小模型的强力 GPU(GPU 是一种本来给游戏画面用、后来发现特别适合做深度学习那种大批量数值计算的处理器,这句括号是我们补的),但小模型在 CPU 上也能跑。

  14. 出处:「Chapter 9」第 446-459 段(text/11-ch09-chapter-9.txt:452,搜「3.3 GB」)。原文:我们用名为 gemma3:4b 的那一档,用一条 ollama pull 命令把它拉下来;打印结果显示主体文件 3.3 GB。 2

  15. 出处:「Chapter 9」第 439-446 段(text/11-ch09-chapter-9.txt:440,搜「270 million」)。原文:这是一个参数量相对较少的模型,由 Google 提供但依然很强;它有好几个不同的变体,从只有 2.7 亿参数的极小档到 270 亿参数的大档;这一类的一个特色是它也可以是多模态的 —— 看最后一列会发现 40 亿参数那一档起,模型就能同时处理文字和图像。

  16. 出处:「Chapter 9」第 311-324 段(text/11-ch09-chapter-9.txt:313,搜「large multimodal models」)。原文:对能理解并与更复杂多样的信息形式打交道的模型的需求在上升,于是有了大型多模态模型;这类模型被训练成能理解和生成多种类型(模态)的输入输出格式,模态通常包括文本、图像、音频和视频;它们能用文字分析和描述图像、按文字描述生成图像、转写音频、以及基于音频作答。

  17. 出处:「Chapter 9」第 360-364 段(text/11-ch09-chapter-9.txt:363,搜「binary-to-text coding」)。原文:由于我们处理的是本地图片而需要把它发到 API,必须先加载图片并转成一种可以当作文本字符串发送的格式;为此定义了一个函数把图片直接转成 base64 格式 —— base64 是一种「二进制转文本」的编码方法,把二进制数据转成 ASCII 字符串格式。

  18. 出处:「Chapter 9」第 402-413 段(text/11-ch09-chapter-9.txt:409,搜「three USB sticks」)。原文的模型回答(经翻译):这张图展示的是一个开发基于人工智能的模型的流程,从数据采集开始(图上画成三个 U 盘的形状),经过预训练模型、指令模型、安全模型,最后到评估;每一步都用一个齿轮图形来象征模型的处理与打磨。

  19. 出处:「Chapter 9」第 302-308 段(text/11-ch09-chapter-9.txt:302,搜「smaller units called」)。原文:很重要的一点是,语言模型会把输入文本拆成更小的单位,称为 token;一个 token 可以是一个词、一个词的一部分,甚至是一个标点符号。

  20. 出处:「Chapter 9」第 1231-1245 段(text/11-ch09-chapter-9.txt:1231,搜「37863」与 text/11-ch09-chapter-9.txt:1244,搜「split into the two tokens」)。原文那张图里,「PyTorch is a lot of fun」被切成 Py / Torch / is / a / lot / of / fun,对应的编号是 37863、162709、382、261、3261、328、2827;正文说这个切词器基于子词切分,能从「PyTorch 被切成 Py 和 Torch 两个 token」这一点看出来,而且特殊字符会被切成单独的 token。 2

  21. 出处:「Chapter 9」第 1219-1226 段(text/11-ch09-chapter-9.txt:1220,搜「breaking down of text into smaller units」)。原文:切词就是把文本拆成更小的单位;这些 token 可以是单个词、句子的一部分,甚至单个字符,取决于所用的切词方法;今天常见的语言模型用的是子词切分。每个 token 会被赋予一个唯一的数值编号,这个编号相当于一本词典里的一条,而这本词典建立起人类词汇与数值之间的对应。

  22. 出处:「Chapter 9」第 1262-1267 段(text/11-ch09-chapter-9.txt:1263,搜「tokenizer that matches the model」)。原文:切词用的「词典」不止一本;作为开发者,你必须确保用的是与模型配套的那个切词器;这一步经常被封装起来,用户不必操心,但并非总是如此。

  23. 出处:「Chapter 9」第 1249-1259 段(text/11-ch09-chapter-9.txt:1254,搜「3/4 of a word」)。原文:把 token 换算成词不是一门精确的科学,取决于好几个因素,但有一些好用的经验规律,而且因语言而异 —— 英语的通行经验是 1 个 token 大约相当于 3/4 个词,粗略说 100 个 token 能描述 75 个词;德语的比例没那么划算,经验规律是 1 个词平均相当于 2.1 个 token,这既因为德语复合词多,也因为大多数语言模型是基于英语词汇建的,很多常见英文词被当成单个 token 处理。 2 3

  24. 出处:「Chapter 9」第 296-308 段(text/11-ch09-chapter-9.txt:297,搜「maximum number of input tokens」)。原文:上下文窗口指的是一个模型一次能处理的最大输入 token 数;这一点很重要,因为模型产出相关输出的能力,取决于它在一次提示里能保留和使用多少信息;每个语言模型对同时能处理多少 token 都有一个固定上限。更大的上下文窗口让模型能处理更多信息,从而更能理解长文本或者「记住」长对话;另一方面,窗口越大,处理文本所需的计算资源也越多,而且模型的延迟会上升 —— 交付一个回答要花更长时间。 2

  25. 出处:「Chapter 9」第 754-758 段(text/11-ch09-chapter-9.txt:758,搜「250,000 tokens」)。原文举例:有些模型的上下文窗口相当小,比如 LlaVa 1.5 7B 只有 4096 个 token;而 Kimi K2 0905 有极大的 25 万 token 窗口。「61 倍」这个换算是我们算的:250000 ÷ 4096 ≈ 61。

  26. 出处:「Chapter 9」第 553-560 段(text/11-ch09-chapter-9.txt:554,搜「control the randomness」)。原文:可以用模型温度来控制结果的随机性,典型取值是 0(低温)和 1 或更高(高温);低温让模型非常聚焦、给出更确定的结果,意味着你会反复得到同一个答案 —— 模型偏好概率极高的 token;而高温会提高 token 选择的随机性,让模型从更宽的分布里选 token,从而产生更有创意或出人意料的输出;温度通常不该超过 1,因为那会导致混乱且不连贯的输出。 2 3

  27. 出处:「Chapter 9」第 580-584 段(text/11-ch09-chapter-9.txt:582,搜「ice cream parlor」)。原文的比方:设想你开一家冰淇淋店 —— 气温低的时候来店的客人少,只提供最受欢迎的几种口味可能是个好的商业决定;而气温上升、需求增加时,提供更多冷门口味就成了好决定。

  28. 出处:「Chapter 9」第 585-616 段(text/11-ch09-chapter-9.txt:586,搜「Bert likes」)。原文:温度直接关联到 token 的概率分布 —— 拿「Bert likes ____」这个提示举例,模型要填上缺失的词;可能的词非常多,为简化只展示三个:read、run、program;模型基于训练数据对这些词有一个底层概率;在非常低的温度下,模型放大这些概率之间的差异,而在非常高的温度下,这些差异消失、所有词概率相同。原文那三张图的温度分别是 0.1、0.5、20。 2

  29. 出处:「Chapter 9」第 620-626 段(text/11-ch09-chapter-9.txt:621,搜「nucleus sampling」)。原文:top-p 采样(也叫核采样)通过动态调整可选 token 的数量来控制下一个 token 的取值范围;以 top-p = 0.9 为例,模型考虑累计概率加起来到 90% 的那一组 token,并在这个范围内取最小的那个集合;这种做法在确定性和创造性之间取得平衡;如果设成 1 就没有过滤、模型考虑全部 token;如果设成小于 0.5 的小值,输出会更聚焦、更可预测。 2 3

  30. 出处:「Chapter 9」第 636-657 段(text/11-ch09-chapter-9.txt:653,搜「movie and game have a probability of 80%」)。原文那个例子:提示是「In the evening, I want to see a ____」,候选 token 及概率为 movie 0.5、game 0.3、restaurant 0.11、doctor 0.01;token 按降序排列,模型考虑累加起来小于 top-p 的那些 —— 这里 movie 和 game 合计 80%,如果再加上 restaurant,累计就是 91%,超过了 top-p;top-k 设为 3,模型取最可能的三个 token 再从中随机选。 2

  31. 出处:「Chapter 9」第 627-633 段(text/11-ch09-chapter-9.txt:627,搜「Top-k sampling」)。原文:top-k 采样控制模型在生成下一个词时考虑多少个最可能的 token;设成 1 时模型只选概率最高的那一个,结果完全确定;设成 50 时,模型每一步从最可能的 50 个 token 里采样,这提高了多样性、允许更有创意和更多变的输出;top-k 指定的是一个固定数量,与这些 token 累计代表多少概率无关。 2 3

  32. 出处:「Chapter 9」第 660-674 段(text/11-ch09-chapter-9.txt:663,搜「For creative writing」)。原文三条:创意写作用较高温度(0.8–1.0)配中等的 top-p(0.9–1.0)和 top-k(50–100);生成代码时要更可靠的片段,所以用低温度(0.1–0.3)配小的 top-k(10–20)和 top-p(0.7–0.9),以保证语法正确;客服或聊天机器人场景要求可靠、聚焦、一致,所以温度取 0.2–0.4,top-p 取 0.7–0.9 —— 既让模型选高概率 token、又保留一点灵活性使交互自然、避免机器人式的回答,top-k 取 20–50 以保持聚焦。 2

  33. 出处:「Chapter 9」第 679-692 段(text/11-ch09-chapter-9.txt:682,搜「hard and soft criteria」)。原文:根据你的项目,有一些必须考虑的硬性和软性标准 —— 要处理很长的输入提示时,上下文窗口是关键因素;要让模型考虑最新进展和趋势时,模型的知识截止日期可能极其重要;另外几个重要参数是成本、延迟和性能。接下来几节还会讨论本地部署与云托管、以及开源、开放权重与闭源模型。

  34. 出处:「Chapter 9」第 712-721 段(text/11-ch09-chapter-9.txt:713,搜「knowledge cutoff date」)。原文:每个模型都有一个知识截止日期,意思是训练数据在某个特定日期定稿、模型在这份数据上训练,更新的数据不可能体现在模型权重里;所以知道截止日期很重要 —— 如果你问模型某个事件或事实,而它发生在截止日期之后,模型不可能知道。原文补充:对聊天机器人来说这个参数正变得不那么重要,因为这类模型越来越能联网搜索最新信息。

  35. 出处:「Chapter 9」第 723-729 段(text/11-ch09-chapter-9.txt:724,搜「data protection」)。原文:选模型时另一个重要方面是数据保护 —— 如果你处理机密信息,你或你的客户可能不希望数据离开公司网络;同样重要的是知道模型是在什么数据上训练的、是否符合《通用数据保护条例》。

  36. 出处:「Chapter 9」第 744-752 段(text/11-ch09-chapter-9.txt:746,搜「billed on a token basis」)。原文:闭源模型通常按 token 计费;确切说,输入 token 和输出 token 是分开的,而输入 token 通常比输出 token 便宜;你应当估算会发出多少次请求、处理多少 token,据此估出总成本。

  37. 出处:「Chapter 9」第 754-756 段(text/11-ch09-chapter-9.txt:755,搜「very long documents」)。原文:你的项目可能涉及处理很长的文档、需要尽可能多地把信息传给模型,因此上下文窗口是选模型时的决定性因素。

  38. 出处:「Chapter 9」第 760-766 段(text/11-ch09-chapter-9.txt:761,搜「time to first」)。原文:有些用例要求模型响应非常快,这取决于模型的提供方式以及回答需要多长时间才能给出(也就是「首个 token 的时间」);如果延迟不是问题,你甚至可以在 CPU 上跑一个开源模型;但在另一些情况下,延迟可能是最重要的因素 —— 比如把语言模型和语音生成配起来做实时聊天时,语言模型很容易成为瓶颈,因为对方响应时间一长就没有「自然的」对话可言。

  39. 出处:「Chapter 9」第 694-709 段(text/11-ch09-chapter-9.txt:704,搜「doubleblind test setting」与 text/11-ch09-chapter-9.txt:697,搜「Snapshot of 2025-11-09」)。原文:可以在 LMArena 排行榜上查看不同模型的表现;模型按竞技场分数排序 —— 在竞技场里,用户同时与模型 A 和模型 B 交互,用户给出一个提示、拿到两个回答,然后判断哪个更好,因此这是一个双盲测试设置,而双盲被认为是评估测试结果的黄金标准;截图里好几个模型并列同一名次,那是因为它考虑了 95% 的置信区间;名次经常变,你看到的排名很可能会随时间越来越不一样。 那张截图标注的日期是 2025-11-09。 2 3

  40. 出处:「Chapter 9」第 41-48 段(text/11-ch09-chapter-9.txt:42,搜「Claude Sonnet 4.5」与 text/11-ch09-chapter-9.txt:47,搜「Claude Opus 4.1」)。正文列举最强的几个模型时写的是 Anthropic 的 Claude Sonnet 4.5,而紧接着那张图里写的是 Claude Opus 4.1 与 Claude Sonnet 4.0。

  41. 出处:「Chapter 9」第 768-780 段(text/11-ch09-chapter-9.txt:777,搜「prompt engineering」)与第 802-806 段(text/11-ch09-chapter-9.txt:803,搜「corresponds to the model's response」)。原文:更真实的对话里有不同类型的消息,每条消息有特定的角色和内容,最常见的三类是用户消息、系统消息和助手消息;用户消息代表人的输入,而有一整个叫提示工程的领域基本上就是在优化这条消息;助手消息对应模型的回答,主要属性是装着模型输出的 content,另外还有一个 response_metadata,里面通常是 token 用量和这次查询的耗时。 2

  42. 出处:「Chapter 9」第 783-796 段(text/11-ch09-chapter-9.txt:790,搜「technical support AI」)。原文举的系统消息例子:「你是一个专门做故障排查和讲解软件相关问题的技术支持 AI 助手。回答要清晰、分步骤,尽量避免技术行话。」原文还说:系统消息定义模型的初始指令 —— 在与用户交互开始之前,先定下它的角色、语气和具体目标。

  43. 出处:「Chapter 9」第 797-800 段(text/11-ch09-chapter-9.txt:797,搜「system messages have their limitations」)。原文:然而系统消息有其局限 —— 它们能塑造初始的模型行为,却无法在整段对话中强制严格遵守;这意味着当模型遇到用户意料之外的输入时,语气或行为会「漂移」;而且单靠系统消息,在没有配套护栏或审核机制的情况下,也无法对内容准确性或伦理问题施加细粒度的控制。

  44. 出处:「Chapter 9」第 814-852 段(text/11-ch09-chapter-9.txt:823,搜「placeholders and filled later」与 text/11-ch09-chapter-9.txt:838,搜「ChatPromptTemplate.from_messages」)。原文:最灵活的模板做法是传入一个消息列表,每条是「消息类型 + 内容」的二元组;这里定义了一条告诉模型如何表现的系统消息,和一条装着真实用户请求的人类消息;要紧的是那些被设成占位符、之后再填的变量,它们用花括号括起来 —— 例子里是 inputtarget_language;虽然这看起来有点像 Python 的 f-string,但并不一样:f-string 里变量必须事先定义,而这里我们事先没有定义过 inputtarget_language 2

  45. 出处:「Chapter 9」第 1030-1046 段(text/11-ch09-chapter-9.txt:1030,搜「pipe operator」)。原文:把链的各个元素连起来再简单不过 —— 只需要用一个竖线操作符把各部分隔开;例子里提示是链的第一个部分,接着是模型,模型的输出再交给一个解析器,把模型输出解析成最可能的字符串。示例调用的输入是「I love programming.」与目标语言德语,返回的是德语译文。 2

  46. 出处:「Chapter 9」第 958-967 段(text/11-ch09-chapter-9.txt:960,搜「sequence of process steps」)。原文:链是一串被连起来以完成某项任务的处理步骤,通常由若干组件组成;最简单的链可以是「提示到语言模型」这一种 —— 用户输入交给提示模板,模板把它的输出交给语言模型这一步,语言模型这一步生成模型输出。

  47. 出处:「Chapter 9」第 977-992 段(text/11-ch09-chapter-9.txt:978,搜「parallel chains」)。原文:你不限于只用顺序链,还可以用更复杂的结构,比如并行链(图左)和带路由的链(图右)。书只给了图,没有给这两种的代码。

  48. 出处:「Chapter 9」第 1056-1061 段(text/11-ch09-chapter-9.txt:1057,搜「great for creating stories」)。原文:语言模型很擅长生成自由文本,这对写故事、发邮件甚至生成代码都很好;但有时需要一个特定的格式 —— 比如做数据采集、流程自动化、或与其他系统集成时,也就是语言模型不在流程末端、而它的输出要被别的工具或系统使用的时候,这正是结构化输出登场的地方。

  49. 出处:「Chapter 9」第 1062-1072 段(text/11-ch09-chapter-9.txt:1063,搜「machine-readable format」)。原文:结构化输出是一种不以自由文本、而以特定的机器可读格式给出的模型回答,最常见的格式是 JSON 和 XML,另外还有 CSV 和简单列表。三条好处:语言模型与其他软件系统之间可以无缝通信;可以用来自动化工作流(例如让模型从自由文本里抽取商品细节再送进电商系统);避免自由文本可能带来的歧义 —— 因为模型被迫遵守一个明确定义的模式,结果会更一致。 2

  50. 出处:「Chapter 9」第 1113-1145 段(text/11-ch09-chapter-9.txt:1113,搜「MyMovieOutput」与 text/11-ch09-chapter-9.txt:1140,搜「partial() method」)。原文:我们用自己的输出类定义期望的格式,在类里定义要返回的 JSON 对象的键以及值的数据类型 —— 比如可以规定 title 期望是一个字符串;然后把这个输出格式交给解析器,从而能给模型明确的输出指示;创建提示模板时的新东西是 partial() 方法,它的作用是把格式说明传给提示模板 —— 我们不必自己写这段格式说明,可以直接取用解析器给出的那一份。 2

  51. 出处:「Chapter 9」第 1152-1155 段(text/11-ch09-chapter-9.txt:1153,搜「should be less」)。原文的信息框:对结构化输出而言,模型应当不那么有创造性、以更确定的方式工作,因此温度要设低(例如 0 到 0.3 之间)。 2

  52. 出处:「Chapter 9」第 1147-1151 段(text/11-ch09-chapter-9.txt:1150,搜「llama-4-scout」)。原文:用经典方式创建模型实例,并且给模型一个较低的温度 —— 代码里模型名是 meta-llama/llama-4-scout-17b-16e-instruct、温度 0.2。 2

  53. 出处:「Chapter 9」第 1113-1122 段(text/11-ch09-chapter-9.txt:1118,搜「class MyMovieOutput」)。原文那个类定义了四个字段,类型都写成字符串:titlemain_characterdirectorrelease_year 2

  54. 出处:「Chapter 9」第 1130-1137 段(text/11-ch09-chapter-9.txt:1135,搜「Filmexperte」)。原文的两条消息是德语写的:系统消息是「你是电影专家。{format_instructions}」,用户消息是「剧情:{plot}」。

  55. 出处:「Chapter 9」第 1157-1160 段(text/11-ch09-chapter-9.txt:1160,搜「prompt_template | model | parser」)。原文:现在可以创建这条链,它由提示模板、模型和解析器依次组成。

  56. 出处:「Chapter 9」第 1162-1166 段(text/11-ch09-chapter-9.txt:1165,搜「mars, botanik」)。原文把输入定义成一个字典 {"plot": "mars, botanik"} 再交给链。「botanik」是德语的「植物学」。

  57. 出处:「Chapter 9」第 1168-1179 段(text/11-ch09-chapter-9.txt:1172,搜「The Martian」)。原文的返回结果:{'title': 'The Martian', 'main_character': 'Mark Watney', 'director': 'Ridley Scott', 'release_year': '2015'},并说如预期那样,结果是一个带指定键与正确值的 JSON 对象。

  58. 出处:「Chapter 9」第 862-890 段(text/11-ch09-chapter-9.txt:865,搜「prompt maker」)。原文:LangChain Hub 上可以查看别人为各种目的写好的提示;搜索「prompt maker」能找到 hardkothari/prompt-maker,它的用途是生成一份更详细的提示。它有两个输入变量:lazy_prompttask

  59. 出处:「Chapter 9」第 903-926 段(text/11-ch09-chapter-9.txt:907,搜「summer, vacation, beach」与 text/11-ch09-chapter-9.txt:912,搜「skilled poet in the style」)。原文的输入是潦草提示「summer, vacation, beach」加任务「Shakespeare poem」;扩写出来的提示要求写一首莎翁风格的十四行诗、14 行、抑扬格五音步、ABABCDCDEFEFGG 韵脚,并要求融入自然、闲适与时光易逝的主题、用比喻加深情感。

  60. 出处:「Chapter 9」第 954 段(text/11-ch09-chapter-9.txt:954,搜「leave it to you to run the model」)。原文:作者把「只用潦草提示和任务去跑一遍、再和扩写后的结果对比」这件事留给读者,并说示例解法在脚本里。

  61. 出处:「Chapter 9」第 1010 段(text/11-ch09-chapter-9.txt:1010,搜「Chapter 1.6」)。原文写的是「我们扩展第 1.6 节的提示模板」。它想指的是原书自己的 §9.5「Prompt Templates」(text/11-ch09-chapter-9.txt:811,搜「9.5 Prompt Templates」),章号被写成了 1。 与「Chapter 1」第 299 段(text/03-ch01-chapter-1.txt:299,搜「1.6 Network Structure and Layers」):原书 §1.6 是存在的,讲的是网络结构与层类型,和提示模板无关。