跳到主要内容

章节切分大纲 — building-reliable-ai-systems-meap-v12

原书 11 章、799k 字符(本库最大的几本之一),按新词密度切成 21 章 + 总纲。 每章约 15k–22k 字符。每行一节:「进来时以为…… → 出去时知道……」。 七段结构里的固定段(顶层全景 / 作者判断与证据 / 边界与局限 / 可带走的 / 原文地图)不逐行列, 只列核心原理线。每章标出一条主走查(红线二加强)和要单开一节从现象讲起的承重词


全书一条主线(总纲第 3 节的骨架)

一条链,八步。每一步都写明「上一步的结论逼出了什么问题,这一步怎么回答」。

① 模型在考卷上已经赢了人:研究生级科学题 94 分(人类专家约 70),
真实 GitHub issue 解决 85%。可 MIT 的调查说,95% 的企业试点拿不到可测的回报。
↓ 考卷赢了、生产输了,落差到底在哪?
② 把同一批模型换到它没见过的代码库上,85% 掉到 58–65%。
落差不在能力,在「换个环境还成不成立」。这个落差有名字:可靠性落差。
↓ 那「可靠」到底要什么?
③ 可靠 = 说得准 + 做得安全 + 长期不退化。传统软件只看在不在线、报不报错;
AI 多出一维:**系统可以 99.99% 在线,同时自信地答错**。这一维叫语义正确性,
它在任何运维面板上都没有格子。
↓ 这一维最典型的失效是什么?
④ 幻觉:看起来对的错答案。它不是 bug,是机制的产物——
模型学的是「权威内容长什么样」,一次一个词地挑「像样」的下一个词,
**而在它开口之前,没有任何一步去对照真值检查**。所以调低随机度治不了它。
↓ 治不了,只能围堵。第一圈:让它说的话有据
⑤ 【第一层 可靠输出】提示词最快最便宜,但它不知道你家的退货政策
→ 检索增强(RAG):先把文档取回来再让它照着答 → 可检索自己会失败
→ 嵌入与混合检索:答案在库里却取不到,得靠关键词补语义、靠重排修顺序
→ 有些东西是「行为」不是「知识」(格式、语气、领域判断),那才轮到微调改权重。
↓ 说的话可信了,能不能让它动手?
⑥ 【第二层 可靠 agent】赌注换了量级:答错很尴尬,做错可能是灾难。
而且误差会级联——**每步 85% 可靠的流程走 10 步,端到端只剩约 20%**。
→ 于是要记忆、要工具、要「推理-行动-观察」的循环
→ 工具多了就撞上 N×M:5 个应用 × 10 个系统 = 50 套集成,于是有了 MCP 这个统一接口
→ 一个 agent 什么都干就什么都平庸,于是拆成多个并加编排。
↓ 会做事了,怎么知道它一直做得对?
⑦ 【第三层 可靠运营】第一件事是能不能量——不量就只能凭感觉改。
而一量出来,第一件被颠覆的事是钱和时间到底花在哪:**模型自己吐字这一步吃掉了
九成时间、九成七的成本**,于是省钱的动作是让它少说话,不是换更快的机器。
↓ 可这些数字不是量一次就完了
模型会被供应商悄悄换掉,用户提问的方式会漂,同一套系统的表现会自己往下走,
于是必须长期盯着——而不是上线前测一次。
↓ 而盯着盯着会撞见一类失效,任何指标都不显示
系统对不同的人不一样好:它不宕机、不报错、总体准确率也不掉。这就逼出最后一层。
↓ 而这一层不是终点,它反过来喂回第一层
⑧ 闭环:评测找出弱的提示词,监控抓到检索失败,偏见检测揭出训练数据的缺口。
全书收在六条原则上——把输出锚在已核实的信息上 / 把 agent 约束在安全动作里 /
持续监控 / 公平对待所有用户 / 保护隐私 / 从第一天就建评测。

这本书真正的落点是第 ⑧ 步的六条原则和那个闭环,不是任何一章的技术。 第 1 章立的三层框架不是事后分类,它就是这本书的目录本身——立完框架,后面十章一章一格地填。


01 可靠性落差(原书 Ch1 §1.1–1.2、1.4–1.6)01-reliability-gap.md

主走查: 原书开篇那位律师(六条判例,原书 §1.3.1 的真事,不另编数字)。 ① 他让 AI 研究助手找判例,拿回六条,案名合规、卷宗号和年份格式完美、法律推理读着也通 → ② 他写进诉状,交给联邦法院 → ③ 法官书记员打电话来:这六个案子一个都不存在 → ④ 同期的运维面板:可用率 99.99%、延迟 800 毫秒、HTTP 错误 0 (这三个数是为演示编的,不是书里的)→ ⑤ 那六条在面板上没有任何一个格子对得上 → ⑥ 三种失效各归三层的哪一层:编造引文=第一层,系统自动把文书递交出去=第二层, 三周后才被人发现=第三层 → ⑦ 起手式该从哪一级开始。 这条走查全书只讲一次,第 02 章接着同一条引文往下拆机制,不重开一个案子。 承重词(单开一节,从现象讲起):「基准」(从「怎么给一个会说话的东西打分」讲起)、 「语义正确性」(从「面板全绿,答案是错的」讲起)。

  1. 进来时以为「模型已经比专家强了,剩下的是产品问题」→ 出去时知道基准分是在一套固定考卷上量的,换到没见过的代码库同一批模型从 85% 掉到 58–65%,这段落差就是这本书要填的东西
  2. 进来时以为「可靠 = 不宕机、不报错」→ 出去时知道 AI 多出一维:系统可以 99.99% 可用同时自信地答错,以及可靠系统的八条属性彼此有真实取舍(准确 vs 延迟、安全 vs 成本)。「大部分对、少数错」这个形状用原书的编程场景来立(§1.2.3:43% 的 AI 生成代码上生产前仍需人工调试、逻辑 bug 是人写的 1.7 倍),不在律师那个案子上另编一套数字
  3. 进来时以为「AI 出事都是同一种出事」→ 出去时知道四类失效各有各的修法:编造引用(法律)、说错政策(客服)、代码有洞(编程)、动作不安全(企业 agent),以及每一类对应的工程结论
  4. 进来时以为「这些数字说明 AI 很成功」→ 出去时知道这批 2026 年的商业数字全部没有参照物、作者本人是 AI 落地服务商的 CTO,该怎么读它们
  5. 进来时以为「可靠性是上线前最后一道检查」→ 出去时知道三层框架:说得准 / 做得安全 / 长期跑得住,以及为什么必须按这个顺序——一个自信答错的模型不只是没用,是危险的
  6. 进来时以为「做 AI 系统要先选个厉害的架构」→ 出去时知道起手式是一条阶梯:先提示词,不够加检索,要领域专长才微调,要动作才小心地上 agent,而评测与监控从第一天就有

02 幻觉:看起来对的错答案(原书 Ch1 §1.3 + Ch2 §2.2.1 的温度证据)02-hallucination.md

主走查: 那六个不存在的判例里的一条。① 拿出这条引文,逐段看它为什么长得像真的 (法院名、卷宗号格式、年份都合规)→ ② 模型生成到「F.3d」这一步时,手里是一张候选词的概率表, 「后面接三位数字」是高概率(这张表是为演示编的)→ ③ 它照着挑,拼出一个格式完美的案号 → ④ 整条链上没有任何一步去查这个案号是否存在 → ⑤ 把随机度调到 0 再跑一遍:格式更整齐, 案号照样是编的 → ⑥ 这条属于「与世界知识矛盾」,而把政策文档喂给它、它仍说错,属于另一类。 承重词(单开一节,从现象讲起):「幻觉」(从「它错得和对的时候一模一样自信」讲起)、 「一次一个词地生成」(从「它写答案的时候其实在做一道填空题」讲起)。 取材路径(这一章的地基书里只有一句话,按守则顺序先标出来): 原书 §1.3.2 讲机制 只有「一次一个 token 地按概率生成,优化的是听起来合理而不是准确」这一句,没有任何展开; 「一次一个词地生成」这一节的展开取自 ② 类书架——我们自己已验收的样板书 shelf=ai-book-reference/what-is-chatgpt-doing#01-one-word-at-a-time.md; 主走查里那张候选词概率表的具体数,当场声明「为演示编的」。 同一条也适用于第 06 章「嵌入」的首现处 (shelf=ai-book-reference/what-is-chatgpt-doing#03-embeddings.md)。

  1. 进来时以为「AI 出错会像软件出错那样有征兆」→ 出去时知道传统 bug 产出的是明显错的东西(报错、崩溃、乱码),而幻觉产出的是看起来对的错答案,它不会宣告自己的存在
  2. 进来时以为「模型是查完资料再回答的」→ 出去时知道它是一次一个词地续写,每一步只在一张候选词的概率表里挑一个「像样」的,整段回答是这么拼出来的
  3. 进来时以为「幻觉是训练得不够好」→ 出去时知道四条成因各在这条链的哪一步:学的是权威内容的样子而不是事实、逐词优化「合理」而不是「准确」、训练材料本身含错、开口前没有任何内建的核对步骤
  4. 进来时以为「把随机度调到 0 就不编了」→ 出去时知道书引的实测:调到 0 不能可靠地减少幻觉,某些场景反而增加——因为随机度和「有没有核对」是两回事
  5. 进来时以为「幻觉是一种毛病」→ 出去时知道至少分两类:与你给的材料矛盾(内在)、与世界知识矛盾(外在),而它们需要完全不同的手段,后面十九章各治一段

03 旋钮与选模型(原书 Ch2 §2.1–2.5)03-sampling-knobs-and-model-choice.md

主走查: 同一句提示词「列 10 件在杂货店能做的有趣事」跑三档。① 随机度 0:十条整整齐齐、 再跑一次一字不差 → ② 0.7:条目换了、还是人话 → ③ 2.0:前三条正常,第四条开始变成 boxShadow UIApplicatiion Disable nonprofit 这样的词串(书里的真实输出)→ ④ 换成按累积概率截断的那个旋钮,把 0.9 调到 0.5,看候选池怎么收窄 → ⑤ 加上频率惩罚,看重复的产品名怎么被压下去 → ⑥ 固定随机种子再跑两次:仍有微小差异。 承重词(单开一节,从现象讲起):「温度」(从「同一句话问两遍,答案不一样」讲起)、 「推理模型」(从「有的模型根本不给你温度这个旋钮」讲起)。

  1. 进来时以为「同一个问题该有同一个答案」→ 出去时知道每一步挑词都带随机,温度调的就是这份随机度,以及事实类 0.3 / 产品问答 0.4–0.6 / 闲聊 0.7–1.0 这条经验带
  2. 进来时以为「随机度越高越有创意」→ 出去时知道调到 2.0 会直接吐出乱码词串,它不是变有创意,是候选池宽到把不该考虑的词也放进来了
  3. 进来时以为「温度是唯一的旋钮」→ 出去时知道另一路是按累积概率划线截断(top-p),以及官方为什么建议这两个只调一个
  4. 进来时以为「输出越短越不容易出错」→ 出去时知道长度上限管的是「把回答收到它答得可靠的那一块」,而不是越短越准——思维链恰恰靠更长的输出提高质量;书给的起步带是 200–500 个词元
  5. 进来时以为「收口只能靠限字数」→ 出去时知道同一件事还有两个拧法:划一条终止线(见到这个字串就收口,这个参数在每一份接口文档里都叫 stop / stop_sequences),以及给整段对话设一个最大轮数并写清什么条件下终止——因为多绕一轮就多一次它自由发挥的机会
  6. 进来时以为「同一个词反复出现只能靠提示词管」→ 出去时知道频率惩罚(按出现次数递增地压)和存在惩罚(出现过就一律压)治的是两种不同的啰嗦
  7. 进来时以为「把随机数种子固定住就能完全复现」→ 出去时知道浮点运算和服务端并行会带来微小差异,完全确定性做不到;能做的是固定种子,或者跑多次取多数
  8. 进来时以为「旋钮是先学的,模型是后选的」→ 出去时知道顺序正好反过来:模型决定了你有哪些旋钮可拧——推理模型会先花算力「想」再答,很多干脆忽略温度、改用「想多久」这个参数,而开源模型换来的是生命周期和数据都在自己手里

04 提示词技法的阶梯(原书 Ch2 §2.6–2.7)04-prompting-ladder.md

主走查: 一道题走完五级。15, 32, 5, 13, 82, 7, 1 里的奇数相加是不是偶数? (正确答案:15+5+13+7+1=41,奇数,所以 False。)① 只给指令 → 答 True,错 → ② 给两个示范 → 仍答 True,错(书里的真实结果)→ ③ 示范里把中间步骤写出来 「9+15+1=25,所以 False」→ 模型照着算出 41 → 对 → ④ 采样三次交叉比对,两次 False 一次 True, 按多数取 False → ⑤ 换成有多个合理答案的问题(电视坏了怎么办),分三支各评估再选。 承重词(单开一节,从现象讲起):「少样本(在提示词里塞例子)」(从「它没被重新训练,怎么看两个例子就学会了」讲起)、 「思维链」(从「给了例子它还是算错,可把草稿纸写出来它就对了」讲起)。

  1. 进来时以为「提示词就是把话说清楚」→ 出去时知道它有五个部件,其中最容易漏掉的是显式的质量标准(明确要求不臆测、不脱离所给材料)
  2. 进来时以为「不给例子模型也能干活」→ 出去时知道零样本能做情感分类这类任务,但它不知道你公司的退货政策,复杂任务上也不稳
  3. 进来时以为「给几个例子就稳了」→ 出去时知道在提示词里塞例子确实能教会它新词新格式(书用编造词 fribble/blicket 演示),但多步逻辑照样塌,奇数那道题就是证据
  4. 进来时以为「模型算错是因为它笨」→ 出去时知道它是「一步跨到答案」跨不过去,把中间步骤写进示范(思维链)就对了;零样本变体只要在末尾加一句「一步步想」
  5. 进来时以为「思维链能一直手写下去」→ 出去时知道手写不可规模化,于是有自动生成推理链的做法,以及作者自己给的警告:生成出来的链必须大量验证,否则它自己会引入新的幻觉
  6. 进来时以为「一次回答就是一次判断」→ 出去时知道采样多次交叉比对能筛掉幻觉(四个素食意面推荐里混进一个自称素食的鸡肉千层面),以及不止一条链的思维树把 Game of 24 从 4% 推到 74%
  7. 进来时以为「这些技法今天照样都要用」→ 出去时知道对推理模型显式的思维链指令通常没必要——它们内部已经在做,这是这本书最新的一处时代注脚

05 检索增强:把回答钉在文档上(原书 Ch3 §3.1–3.5、§3.8 + Ch4 §4.4.2 切块 + Ch2 §2.8 函数调用)05-rag-grounding.md

主走查: 「用礼品卡买的电子产品,退货政策是什么?」① 不接外部资料: 「大多数零售商允许 30 天内退货,不过礼品卡购买可能条款不同」——听着专业,是编的 → ② 把政策 PDF 载入 → ③ 切成块:整段政策连着资格条件切在一起还是切开,两种切法各会怎么错 → ④ 每块转成一串数存进索引 → ⑤ 提问时取回最像的 3 块 → ⑥ 拼进提示词 → ⑦ 回答变成「14 天内可退成店铺积分,或 30 天内换货,需原始礼品卡收据」,而且能指出这句出自哪份文件。 承重词(单开一节,从现象讲起):「检索增强(RAG)」(从「这台 55 寸电视能塞进我的普锐斯吗——它得同时知道两件它不知道的事」讲起)、 「切块」(从「资格条件被切到了另一块里,于是系统答『政策存在』却答不出『你符不符合』」讲起)、 「函数调用」(从「模型没法自己上网查天气,可它能开口说『我要调 get_weather,参数是巴黎』 ——这句话是谁执行的」讲起;走查里给出真实的 JSON 参数和返回值。 它隔九章还要被读者原样取用:第 13 章靠它区分「被动取信息」和「主动改外部状态」, 第 14 章靠它讲清和统一协议的分水岭,所以在这里就得给足力气,不能只挂一行)。

  1. 进来时以为「模型不懂的事,再训一次就懂了」→ 出去时知道把所有产品 × 所有地点 × 所有配送方式塞进参数里不只算不动,而且一出厂就过期
  2. 进来时以为「检索增强是个产品或框架」→ 出去时知道它就是两步动作:先按问题从外部来源取回相关内容,再把取回的内容当材料交给模型去写答案
  3. 进来时以为「取回来就完事了」→ 出去时知道三个部件各干什么(检索器找、生成器写、知识源是被索引过的资料本体),以及资料必须事先建好索引
  4. 进来时以为「建索引是一句命令」→ 出去时知道四步:载入 → 切分 → 转成一串数 → 存起来,四步各有各的坑
  5. 进来时以为「切多大无所谓」→ 出去时知道小块会把资格条件和政策名切散、大块会把相关度稀释,解法是按内容类型切(法律按条、叙述按段)再加约 20% 重叠当保险
  6. 进来时以为「接上文档就不会编了」→ 出去时知道它自带六条代价与失效模式:建索引要钱、每次查询多一段延迟、可能漏检也可能捞错、给对了材料它照样可能编,而且知识库又小又稳时直接写进提示词更划算
  7. 进来时以为「书里的示例代码可以照抄」→ 出去时知道这一章的项目把一个只会「从段落里划出片段」的问答模型当成生成模型用了,这是未定稿留下的技术错误,以及我们为什么要点破它
  8. 进来时以为「外部真值只能靠我们先取好塞给它」→ 出去时知道还有一种反过来的形态:模型自己开口说「我要调 get_weather,参数是 {"city":"Paris"}」,这句话由我们的代码执行、结果再塞回对话里让它接着写——这就是函数调用;它顺带把输出格式钉成了函数参数的形状,而后面第 12–15 章 agent 的一切动作都是从这一步长出来的

06 嵌入:把意思变成坐标(原书 Ch4 §4.1–4.2)06-embeddings.md

主走查: 一家医疗公司的保险问答机器人。① 用户问「手术后的物理治疗报销吗?」, 文档里明明写着答案,它却说不知道 → ② 把这句话和文档里那句「术后康复治疗的理赔流程」 各转成一串数 → ③ 两串数的夹角算出一个分:0.62(这个数是为演示编的)→ ④ 换成医疗领域训过的模型再算:0.88 → ⑤ 于是这条终于能被取到 → ⑥ 再看 Airbnb 怎么用同一招:百万条房源预先算好向量,搜索时只算查询那一个。 承重词(单开一节,从现象讲起):「嵌入」(从「两句话一个共同的词都没有,意思却完全一样」讲起)、 「余弦相似度」(从「怎么用一个数说清两句话有多近」讲起)。

  1. 进来时以为「检索失败是模型不够聪明」→ 出去时知道模型好、文档全,失败仍可能全在取这一步,而取这一步的根子在把文字变成数的那个模型
  2. 进来时以为「把文字变成数字」是个玄乎的说法 → 出去时知道它就是给每段文字算出一串数(常见 384 或 768 个),关键不在于「是一串数」,而在于意思相近的文字落得彼此更近
  3. 进来时以为「近不近只能靠感觉」→ 出去时知道量法有两种:算夹角(与长度无关)和算点积(把长度也算进去),多数系统用前者,因为它只看语义方向
  4. 进来时以为「随便挑个现成模型就行」→ 出去时知道三类各有取舍:商业接口开箱好用但不知道拿什么训的、换供应商要把整个语料重嵌一遍;开源可微调可本地跑但要自己养机器;领域专用在本行准得多、出了本行就差——「termination」在合同里和在医疗报告里根本是两回事
  5. 进来时以为「选模型看榜单就够」→ 出去时知道还有四个轴:维度(降到四分之一在百万级文档上就是可观的省钱,而且有一种训练法让你部署时才决定砍到多少维)、能吃多长的文档、多语言、以及跑得动什么硬件
  6. 进来时以为「训练这种模型要大量人工标注」→ 出去时知道 Airbnb 用的是用户点击这个免费信号,以及它自带的偏差(排在前面的天然更容易被点)和三个生产难题(新房源冷启动、算力预算、质量会随时间退化)

07 检索为什么还会失败(原书 Ch4 §4.3、§4.4.1 + Ch3 §3.6.5 整节)07-retrieval-failures-and-reranking.md

主走查: 五条员工政策文档,问「加州辞职要提前多久?」(书里跑得出真实分数)。 ① 纯向量检索取最近的 5 条,答案「加州员工须提前 30 天」一条都没取到 → ② 三条原因各占什么 → ③ 加上关键词检索,它直接抓「California」「notice」原词 → ④ 两路合并,再让一个把问题和文档拼在一起读的模型重排 → ⑤ 命中那条得 0.987,第二名 0.223(注意它把问题里的 quitting 连到了文档里的 resignation)→ ⑥ 换一题:「残障员工的远程办公政策」——东西取到了,可它排第 3,上面压着假期政策和福利登记 → ⑦ 重排把它提到第 1 → ⑧ 最后把 20 篇文档一股脑拼进上下文,把正确那条放正中间,看它怎么被忽略。 承重词(单开一节,从现象讲起):「稀疏检索 / BM25」(从「它连 California 这个词都没匹配上」讲起)、 「交叉编码器」(从「文档取对了,可顺序不对」讲起)。

  1. 进来时以为「向量检索取不到就是库里没有」→ 出去时知道答案就在库里、却排在截断线外一点,三条原因分别是语义漂移、召回不足、领域鸿沟
  2. 进来时以为「取不到大不了让模型自己答」→ 出去时知道这时它只剩两个坏选项:编一个,或者认输说不知道——检索失败是怎么变成幻觉的
  3. 进来时以为「语义检索比关键词高级,应该取代它」→ 出去时知道两者互补:一路懂「辞职」和「通知期」的概念联系,一路死死抓住原词,合起来叫混合检索,而关键词那一路的老将 BM25 确定、快、可复现
  4. 进来时以为「召回够了就算取对了」→ 出去时知道召回和精度是两件事:东西在但排第 3 就是精度问题,得靠分阶段——先广撒网冲召回,再逐级过滤,最后精排
  5. 进来时以为「重排就是再算一次相似度」→ 出去时知道两种编码方式的根本差别:一种把问题和文档各自编成向量再比(快、可预先算好,但两者从不直接相互作用),另一种把问题和文档拼成一对一起读(能看出「work accommodation」和「ADA」高度相关,但慢到只能用在少量候选上)
  6. 进来时以为「上下文窗口大了就多塞点进去」→ 出去时知道模型对开头和结尾用得最好、放在长上下文正中间的信息最不可靠,所以「多检索一点」反而会降低表现
  7. 进来时以为「取回来的都得给模型」→ 出去时知道那之后还要再筛一道:按语义相似度划一条线,把「沾边但不是答案」的段落剔掉(书里的例子:问国际漫游怎么开通,取回 FAQ、资费表、博客、条款四份,只有 FAQ 里有分步操作,其余按阈值剔除),长文档还要先压成要点再塞——因为塞进去的每一段都在稀释真正有用的那一段
  8. 进来时以为「相关就够了」→ 出去时知道纯语义只有一个维度,它看不见时效、权威性、受众、地域、部门——问「加州的陪产假政策」,排第 1 的是 2019 年已归档的全球政策,加上地域和状态过滤后正确答案才升到第 1;而且不是所有属性都该硬过滤,归档文档乘 0.5 软降权,旧但高度相关的仍有机会浮上来

08 规模化与漂移(原书 Ch4 §4.5–4.6)08-vector-scale-and-drift.md

主走查: 把 07 那套政策库放大到 200 万块。① 朴素检索每查一次要比 200 万次,慢到不可用 → ② 换成分层图:从顶层稀疏的一层出发,朝查询方向走,走不动就下沉一层,几跳到位 (推荐的两个参数:每个节点最多 16 条连接、建索引彻底程度 100)→ ③ 768 维 × 200 万 × 每个数 4 字节 ≈ 6 GB 内存(这笔换算是我们算的,不在书里)→ ④ 每个数压成 1 字节 → 约 1.5 GB;压成 1 比特 → 约 0.19 GB → ⑤ 拿压过的粗筛,候选再交给 07 那个精排模型 → ⑥ 三个月后同一条查询开始取不到东西——两种漂移各是怎么发生的。 承重词(单开一节,从现象讲起):「近似最近邻 / 分层小世界图(HNSW)」(从「十万篇就慢到难受,几百万篇完全不可用」讲起)、 「量化」(从「内存装不下,能不能少存几位」讲起——这个词在第 11 章讲微调时会再用一次,同一个定义,只是作用对象从向量换成权重)。

  1. 进来时以为「检索慢是机器不够快」→ 出去时知道它是数量级问题:朴素做法要和每一条比一遍,十万篇就难受、几百万篇不可用
  2. 进来时以为「加速要靠更好的硬件」→ 出去时知道靠的是换一种找法:把向量组织成层数递增的图,顶层稀疏、底层全量,逐级下沉——复杂度从「和每条比」变成「比的次数随规模只慢慢地长」,在大集合上就是毫秒和数秒的差别
  3. 进来时以为「有了这个算法就有了向量数据库」→ 出去时知道最常用的那个库是内存里的相似度搜索工具,进程一退索引就没了:持久化、增量更新、水平扩展、副本、可观测这五件事得由数据库补,而七个候选各自的取舍是什么
  4. 进来时以为「向量存进去就不用管了」→ 出去时知道三种压法(按码本近似、每个数降精度、每维塌成一比特)各省多少、损多少,以及这三个词就是你在向量库配置界面上会看到的原词
  5. 进来时以为「原文一起塞进向量库省事」→ 出去时知道百万级切块时它会让索引内存暴涨,企业常见做法是库里只放向量和块 ID、原文放在便宜的文档库里按 ID 取
  6. 进来时以为「文档没改,检索就不会退化」→ 出去时知道两种漂移:人问问题的方式会变(用户和索引慢慢分开),以及换了嵌入模型却没重嵌文档(不是语义上分开,是数值上分开),处置的关键不是周期而是一致

09 检索取对了吗:评它、改它、连起来(原书 Ch3 §3.6–3.7)09-rag-evaluation-and-upgrades.md

主走查: 接着 05 那套退货问答,拿 100 道题跑一遍。① 取回 10 块里 7 块相关 → 检索精度 0.7 → ② 问题与答案的向量夹角 → 答案相关度 0.85 → ③ 100 题答对 85 → 事实准确率 0.85 → ④ 人评三条 (4+5+4)/3 = 4.33 → ⑤ 往测试集里塞一条专门的幻觉样例: 问「Unlimited Elite 套餐含 5G 吗」,回答「含,部分地区速度高达 10 Gbps,还免费送热点」 ——前半句真、后面的数字和赠品是文档里没有的 → ⑥ 用最朴素的检测法(回答里有多少词没在原文出现)去判它,看它为什么既冤枉同义改写、又放过照抄词拼出来的假话 → ⑦ 换成评审模型,按事实正确性 / 上下文贴切度 / 幻觉迹象三项打 1–5 分。 承重词(单开一节,从现象讲起):「评审模型」(从「500 条回答,人一条条审审不过来」讲起)、 「知识图谱与 GraphRAG」(从「『各地区政策有什么不同』这个问题,任何单独一份文档里都没有答案」讲起)。

  1. 进来时以为「答得对不对一眼能看出来」→ 出去时知道要规模化地审只能让另一个模型当评审:把用户问题、取回的文档、生成的回答一起给它,按三项打分,低分的挑出来人工复核
  2. 进来时以为「评测集就是攒一堆常见问题」→ 出去时知道要五类问法齐全(事实 / 比较 / 排障 / 账单 / 假设),权威文档当标准答案,而且必须专门放进容易触发幻觉的样例
  3. 进来时以为「评测要专门的工具」→ 出去时知道四个指标手算就能出:检索精度、答案相关度、事实准确率、人评分,各自量的是链条上的哪一环
  4. 进来时以为「现成的评测套件说的都对」→ 出去时知道那八个指标各量什么、彼此怎么分工,以及书里有两个的定义写重了——未定稿的痕迹,我们照实点出并去源码里核实真定义
  5. 进来时以为「检测幻觉就是看回答里有没有原文没有的词」→ 出去时知道这个朴素做法有两个盲区:同义改写会被冤枉成幻觉,照抄原文的词拼出来的假话会被判成没幻觉
  6. 进来时以为「检索不到就是库里没有」→ 出去时知道可以从查询这一侧动手:改写和扩写问题、先让模型凭空写一篇「假想的答案文档」再拿它去检索(HyDE)、按问题类型路由到不同的索引和大小模型
  7. 进来时以为「取回更多文档就能答更难的问题」→ 出去时知道跨文档归纳类的问题(各地区差异、Q1 的风险和 Q3 的措施什么关系)靠取块答不了,得先把文档里的实体和关系抽成一张图再按社区做分层摘要,代价是建索引开销显著变大

10 什么时候该微调(原书 Ch5 §5.1–5.2、§5.3.1–5.3.2)10-when-to-finetune.md

主走查: 一个客服机器人「答得对但太像机器人」,三问走一遍。 ① 换个提示词试试:系统提示加一句「永远专业而温暖,像在帮一位重要的朋友」, 拿 10 个真实例子跑,8 个过线 → 到此为止,五分钟解决,不花钱 → ② 换个需求:「你们还有多少件蓝衬衫?」——今天 50 件,明天卖光。微调出来的模型会永远自信地说 50 件, 这题必须走检索 → ③ 再换:「必须按 Bluebook 格式引注,50 轮对话不走样」——提示词写到第五版仍会忘, 拿 500 个正确引注的例子微调之后不走样了 → ④ 但它答不出「这条依据哪份文件」, 因为知识被烧进权重、不带来源 → ⑤ 所以生产里两条一起用。 承重词(单开一节,从现象讲起):「微调」(从「提示词写到第五版还是不对,还能怎么办」讲起)、 「过拟合与验证损失」(从「训练分一路在降,可它在没见过的题上更差了」讲起)。

  1. 进来时以为「效果不好就该微调」→ 出去时知道三问先过一遍:更好的提示词能不能过线、事实会不会经常变、需不需要稳定地守住某种格式或领域判断
  2. 进来时以为「微调就是再喂一批资料」→ 出去时知道它是真的去改模型的权重,和提示词、检索的分工在哪(改不改权重、知识从哪来、成本、能不能控语气、新鲜度)
  3. 进来时以为「微调之后就不需要检索了」→ 出去时知道微调过的模型没法在回答里引用具体文档——知识烧进权重不带来源标注,要可核实的回答就必须两条一起用
  4. 进来时以为「微调过的专用模型一定更靠谱」→ 出去时知道三个案例各自的警告:医学考试 91 分不保证碰到考卷外的新病例还稳、金融术语训多了会盖掉通用能力(灾难性遗忘)、代码模型擅长样板但复杂逻辑仍要人审
  5. 进来时以为「数据越多越好」→ 出去时知道宁可少而精:几百个例子就能显著超过零样本,而格式不一致(有的写 Q: 有的写 User:)会让模型糊涂,该出多种格式的任务每种都得给够例子
  6. 进来时以为「训练完看训练分就知道好不好」→ 出去时知道要留 10–20% 做验证集、分布要一致、验证集的例子绝不能同时在训练集里,而验证损失开始回升就是该停的信号

11 微调怎么做:LoRA、QLoRA 与蒸馏(原书 Ch5 §5.3.3–5.4)11-lora-qlora-distillation.md

主走查: 用一块 24 GB 的消费级显卡微调 70 亿参数的开源模型。 ① 全量微调:全精度下至少 28 GB 显存,装不下 → ② 冻住原模型,只在注意力的两个部位各挂两个小矩阵, 只训这些:70 亿里的三四百万个,大约两千分之一 → ③ 再把权重压成 4 位存(光这一项省约 75% 内存), 计算时仍在高精度下做 → ④ 参数怎么填:秩 8、缩放 16(实际缩放 = 16 ÷ 8 = 2)、 只挂 query 和 value 两个投影、随机关掉 10% 连接防过拟合 → ⑤ 1000 个例子、等效批大小 4、学习率 2e-4,跑 15–30 分钟(全量微调要数小时到数天)→ ⑥ 训完的模型仍太大太贵,拿它当老师给一批领域问题生成回答,再用这些问答对训一个小 5–20 倍的学生。 承重词(单开一节,从现象讲起):「训练的一步到底在做什么」(从「说是在学习,到底谁在改什么」讲起: 前向 → 看错多远 → 反推每个数的责任 → 挪一丁点)、 「低秩适配(LoRA)」(从「改一个模型,非得动它全部 70 亿个数吗」讲起,并补上书没讲的那一层: 权重的改动量可以拆成两个瘦矩阵相乘)。

  1. 进来时以为「训练」是个笼统的词 → 出去时知道一步就是四个动作,拿一道具体的分类题走一遍带上数:数据流过去出预测(它答 0.3)→ 比对正确答案(1)算出「错得多离谱」这一个数(0.7)→ 反推每个参数对这 0.7 各担了多少责 → 每个数朝「错少一点」的方向挪一丁点
  2. 进来时以为「那几个训练参数是另一堆新概念」→ 出去时知道它们各拧在上一节那四个动作里的某一步上:批大小拧「一次拿几道题走完这四步再更新」、学习率拧最后那一步「挪多大」、轮数拧「整套题重做几遍」、梯度累积拧「攒几个小批的责任账再一起更新」——四个已知动作的参数,不是四个新概念
  3. 进来时以为「微调就是把整个模型再训一遍」→ 出去时知道全量微调的账:70 亿参数全精度至少 28 GB 显存,而且有把通用能力盖掉的风险
  4. 进来时以为「只训 1% 的参数肯定差很多」→ 出去时知道冻住原模型、只挂两个小矩阵去训,能拿到全量微调 95% 以上的效果,内存省到十分之一;这一类方法通常训的量级是全部参数的 0.1%–1%,而本章那个具体配置落在两千分之一——「低秩」低在哪里,书没讲,我们从原论文补
  5. 进来时以为「压缩权重必然掉精度」→ 出去时知道 4 位存 + 高精度算这个组合怎么成立,按正态分布分配区间的格式为什么对神经网络特别合适,以及给量化配置本身再压一遍是什么意思
  6. 进来时以为「省内存的做法风险更小」→ 出去时知道书特意点出的反直觉:只更新一小撮参数,如果那撮恰好承载着通用能力,遗忘风险可能比全量微调更高,缓解是在训练数据里掺进原领域的提醒样例
  7. 进来时以为「拿量化好的模型微调更省事」→ 出去时知道这是一条硬禁令:压缩会在权重里留下小的舍入误差,你在这些已经偏了的值上继续训,每一步都在累积不准而不是纠正它;而 4 位那套是加载时才压,原始权重没被改过——这是两件事
  8. 进来时以为「学生模型要学老师的内部概率」→ 出去时知道对闭源大模型你根本拿不到内部概率,好在也不需要:学生只学着复现老师的最终输出就够(序列级蒸馏),换来小 5–20 倍、更快、能跑在老师跑不了的硬件上

12 从「会说」到「会做」:agent 与记忆(原书 Ch6 §6.1–6.2.2)12-agents-and-memory.md

主走查: 「帮我找下周二从纽约到旧金山的早班机,再订个 SFO 附近的酒店。」 ① 纯模型的三次失败:「你可以试试达美或捷蓝」/「建议你给团队发封邮件说明会议细节」/ 「我没法访问实时订票系统」→ ② 补上三样东西之后它才能真的办 → ③ 但这条流程拆下来有 10 步,每步 85% 可靠 → 0.85 的 10 次方 ≈ 0.197,端到端只剩约 20% → ④ 用户第二轮说「哦,要靠窗的」——没记忆就是「抱歉,我不知道你指的是什么」→ ⑤ 用一个消息列表原样存下 8 轮 → ⑥ 对话到第 40 轮撑爆上下文 → 压成一段滚动摘要, 每压一次多一次模型调用。 承重词(单开一节,从现象讲起):「agent」(从「一个同事能给你讲清怎么订机票,另一个同事能真的替你订了」讲起)、 「误差级联」(从「每一步都考 85 分,为什么整条流程只剩 20 分」讲起)。

  1. 进来时以为「模型答不好是知道得不够」→ 出去时知道三个限制是分开的:知识冻在某一时刻的快照上、隔着一堵玻璃墙够不着任何系统、拆不出也管不了多步流程
  2. 进来时以为「agent 是一种更聪明的模型」→ 出去时知道它是在模型之上加的三样东西:接外部工具、执行动作、编排流程,模型本身没变
  3. 进来时以为「每步都挺准,整条流程应该也不错」→ 出去时知道乘法的残酷:85% 的十次方约等于 20%,这个数解释了后面九章为什么要花这么大力气
  4. 进来时以为「模型当然记得我们刚说过什么」→ 出去时知道每一轮都是重新开始,记忆是我们外挂的:会话内的短期记忆和跨会话的持久记忆,后者要数据库、要结构化,还要面对「用户有权决定记住什么」
  5. 进来时以为「记忆越全越好」→ 出去时知道原样存下每一轮最简单也最便宜,但内存随对话线性增长;压成摘要能撑住长对话,代价是每次压缩都是一次模型调用;生产上通常先用前者,撞到上限再加后者
  6. 进来时以为「什么该长期记住是模型自己判断的」→ 出去时知道要显式设三个触发条件(用户明说要记 / 跨会话被反复引用 / 能改善未来交互),并且中间通常有一个把对话抽成结构化事实的步骤

13 工具、决策与护栏(原书 Ch6 §6.2.3–6.4)13-tools-react-and-guardrails.md

主走查: 接着同一条订票请求走完一圈。① 推理:「用户要机票和酒店,先办机票」→ ② 行动:调订票接口 → ③ 观察:拿到 3 个航班 → ④ 推理:「到了要住 Union Square 附近」→ ⑤ 行动:调酒店接口 → ⑥ 观察:拿到 5 家 → ⑦ 推理:「整理给用户」→ 最终答案。 然后拆三次:把工具拔掉,问巴黎天气,它答「晴,25°C」——它其实不知道; 让接口超时,看兜底怎么让它优雅地失败而不是编;让接口返回 −273°C,看输出校验 (书给的合法范围是 −90 到 60)怎么把它丢掉。 承重词(单开一节,从现象讲起):「推理-行动-观察循环(ReAct)」(从「它怎么知道该先做哪件事、做完又怎么接下一步」讲起)、 「护栏」(从「拦住『怎么造炸弹』很容易,拦住换个说法的同一个问题就不容易」讲起)。

  1. 进来时以为「接上检索和接上工具是一回事」→ 出去时知道分水岭在这:检索是被动地取信息,工具能主动执行会改变外部系统状态的动作——真的下单、真的发确认信、真的改日历,这一步才把检索系统变成 agent
  2. 进来时以为「接上工具就不编了」→ 出去时知道工具确实是最有效的防幻觉手段之一(书引的研究:装了自评机制的模型对 77.2% 的「它不知道的问题」正确地选择了去查),但工具会超时、会限流、会返回垃圾
  3. 进来时以为「工具返回什么就用什么」→ 出去时知道三条策略缺一不可:把回答锚在工具结果上、失败时兜底(优雅地失败而不是编一个)、校验工具输出(温度不在 −90 到 60 之间就当无效数据丢掉)
  4. 进来时以为「该调哪个工具靠写规则」→ 出去时知道规则式简单透明但僵硬——「Union Square 附近能带宠物的酒店」里的「能带宠物」没显式编程就处理不了;让模型自己推理该走哪几步更灵活,代价是要更强的模型和更仔细的评测
  5. 进来时以为「模型是一次想清楚再动手」→ 出去时知道它是推理一步、行动一步、看结果再推理下一步的循环,这个循环就是后面所有 agent 系统的骨架
  6. 进来时以为「护栏就是一张违禁词表」→ 出去时知道关键词匹配在生产里很脆——换个同义词就绕过去了,生产系统用按语义判断的护栏;交叉核对(两个独立来源都说 800 才算已核实)和把中间推理步骤显示给用户,是另外两道
  7. 进来时以为「这些还停留在演示阶段」→ 出去时知道 2026 年的四个生产案例各自做成了什么(医生病历自动生成让倦怠率降 21%、单月处理 5 万份文档、贷款文档自动化率超 90%),以及行业整体到了什么位置

14 N×M 与 MCP:工具怎么被发现(原书 Ch7 §7.1–7.6 + 我们协议书架的规范补充)14-mcp-and-tool-discovery.md

主走查: 「我要一件 100 美元以下的轻便马甲。」① 先算账:5 个 AI 应用 × 10 个外部系统 = 50 套自定义集成,改一处到处重构 → ② 换成统一接口:每个系统一个服务端、每个应用一个客户端, 50 变 15 → ③ 我们用七行商品 CSV 建出第一个工具 search_products(query, max_price, limit) → ④ 运行时去问服务端「你有哪些工具」,拿回参数清单和类型 → ⑤ 模型构造 {"query":"lightweight vest","max_price":100} → ⑥ 调用被路由到我们的服务端 → ⑦ 返回 JSON → ⑧ 模型答「女士便携马甲,79.99 美元,现货」→ ⑨ 再挂第二个工具 check_inventory,看它自己决定先搜后查。 承重词(单开一节,从现象讲起):「模型上下文协议(MCP)」(从「每接一个新系统就要重写一遍」讲起)、 「工具清单与工具描述」(从「模型凭什么知道有哪些工具、什么时候该用哪个」讲起)。

  1. 进来时以为「接几个 API 是小事」→ 出去时知道它是乘法:应用数 × 系统数,而且每套都各崩各的
  2. 进来时以为「上了这个协议,模型就能自己接系统了」→ 出去时知道它只统一了一层——AI 和工具之间怎么对话;工具背后的执行逻辑是你写的,认证、授权、端点安全也是你的,协议管的只有格式校验和错误格式
  3. 进来时以为「服务端代码写完就算通了」→ 出去时知道中间还有一步「怎么确认它真的通了」:把服务端跑起来,用官方检查器连上去,看它列不列得出你的工具、调得动调不动(原书 §7.4)
  4. 进来时以为「工具是我们每次请求里告诉模型的」→ 出去时知道这正是和函数调用的分水岭:那边是你在每次请求里内联地把函数描述带上,这边是服务端自己提供一份可读的工具清单,模型去问
  5. 进来时以为「模型调工具要我们写编排代码」→ 出去时知道链式调用是自动发生的:它按问题和工具描述自己决定调哪些、按什么顺序;而两个工具都起个含糊的名字,它就会选错——工具描述其实是写给模型看的路由指令
  6. 进来时以为「书讲完了这个协议的全部」→ 出去时知道书只讲了工具这一半,规范里还有资源、提示词模板、能力协商和三种传输方式——这一节由我们的协议书架补上(书里给的那个仓库地址还是错的,我们实测后改正)

15 优雅地失败,与「载具」(原书 Ch7 §7.7–7.8)15-failing-gracefully-and-harness.md

主走查: 还是那个商品搜索工具,把价格上限传成 0。① 不做处理:工具抛出 TypeError: 'NoneType' object is not iterable → 模型对用户说「我在搜索时遇到了一个错误」——没用 → ② 换成统一结构:{"success": false, "error": "invalid_price", "message": "Price must be greater than zero."} → 模型说「我没法搜索 0 美元以下的产品,你是不是想设一个别的价格上限?」——有用 → ③ 再换一种:价格合法但没有匹配结果,返回 success: true + 空列表 + 一条建议 → 模型说「50 美元以下没找到夹克,不过这里有几件价位高一点的」并再发一次调用 → ④ 加 5 秒超时和 1、2、4 秒退避的三次重试 → ⑤ 最后把这个工具放进载具里跑: 凭据和审批留在控制面,模型生成的代码在沙箱里跑,沙箱崩了从上一个检查点恢复。 承重词(单开一节,从现象讲起):「结构化错误响应」(从「模型看到一段 Python 堆栈,只会说『出错了』」讲起)、 「载具(harness)与沙箱」(从「同一个模型,装进不同的外壳,能力差出一大截」讲起)。

  1. 进来时以为「工具出错就是抛异常」→ 出去时知道模型需要的是关于「哪里错了」的结构化信息,不是一段堆栈——四个字段(成没成、错误码、给人看的话、结果)分别被模型用来干什么
  2. 进来时以为「没有结果也是一种失败」→ 出去时知道它们是两回事:出岔子是 success: false,搜索正常完成但没匹配是 success: true 加一条建议,而模型看到这两种会做出完全不同的下一步
  3. 进来时以为「超时重试是运维的事」→ 出去时知道它得写进工具本身:一次瞬时网络错误不该让整个请求失败,常见做法是最多三次、间隔 1/2/4 秒,然后才把超时告诉模型
  4. 进来时以为「agent 的能力来自模型」→ 出去时知道 2026 年业界收敛出来的说法是「模型提供推理,载具提供能力」:会话与状态、记忆、工具系统、输出通道,这一圈外壳才是产品
  5. 进来时以为「沙箱只是为了跑代码方便」→ 出去时知道它的要害是分面:控制面管 agent 循环、工具路由、审批、追踪,凭据和敏感数据留在这一侧,绝不进入模型生成的代码运行的那一侧
  6. 进来时以为「让 agent 干活就是给它写详细文档」→ 出去时知道四条实践反过来:给它一张约一百行的地图而不是一本百科(单体说明文件必然烂掉)、让仓库成为唯一事实来源(它在上下文里拿不到的东西,对它就等于不存在)、不变量靠机器强制且报错信息里直接写补救指令、偏好无聊可组合的技术
  7. 进来时以为「工具是能力」→ 出去时知道每一个能读文件、查库、调外部接口的工具同时也是攻击面:79% 的组织已经在用 agent,只有 14.4% 的部署拿到了完整安全批准

16 多 agent 与编排(原书 Ch8 + Ch6 §6.4.5 的框架格局)16-multi-agent-orchestration.md

主走查: 一张徒步靴照片 + 「你们有类似但防水的吗?」+ 「要是不合脚,退货政策是什么?」 ① 图片先过一个图像描述模型,得到字符串 trail hiking boots → ② 和文字拼成 trail hiking boots waterproof → ③ 意图分析用小模型返回 {search_needed: true, qa_needed: true} → ④ 条件边走「两个都要」这一支 → ⑤ 搜索 agent 取到 3 件 → ⑥ 启发式回补:结果文本里出现 return / warranty,把「要问答」强制置真 → ⑦ 政策 agent 取到退货条款 → ⑧ 综合节点换用完整模型,把两份结果写成一条回答 → ⑨ 最后把搜索 agent 换成一个直接抛异常的假函数:断言回答里有「抱歉」但不许出现 "error" 这个词承重词(单开一节,从现象讲起):「单体 agent 问题」(从「一个 agent 什么都干,结果什么都平庸」讲起)、 「状态与条件边」(从「两个 agent 之间到底靠什么传话、谁决定下一步走哪」讲起)。

  1. 进来时以为「工具够多,一个 agent 就够了」→ 出去时知道一个模型扛所有责任的三个症状:上下文被无关信息填满、回复前后不一致、加新能力得重写整个系统
  2. 进来时以为「拆成多个 agent 是为了好看」→ 出去时知道一句「200 美元以下的冬季保暖夹克,顺便说说保修条款」实际需要三种不同的智能:找货、懂规则、把两份答案合成一条连贯的话
  3. 进来时以为「agent 之间靠函数调用串起来」→ 出去时知道编排要五个概念:共享状态、节点、边、按状态动态选路的条件边、以及把它们装起来的图,它们分别解决什么
  4. 进来时以为「判断用户要什么就是看关键词」→ 出去时知道要用模型的函数调用来解析意图并强制它必须调用,同时留一条兜底默认路径——理由就写在书的代码注释里
  5. 进来时以为「多 agent 就是多花几倍的钱」→ 出去时知道它反而是省钱的地方:意图分类和参数抽取用小模型,综合回答和解释保修例外用完整模型,每个 agent 用最配它那项任务的模型
  6. 进来时以为「测试就是测每个 agent 对不对」→ 出去时知道 bug 长在接缝上,五类测试各盯一处:混合查询的路由、意图含糊时的判断、单个 agent 挂掉时的优雅降级(而且不许把技术细节暴露给用户)、关键需求穿过整条流水线的保留率、以及不许状态污染
  7. 进来时以为「选框架是最重要的决定」→ 出去时知道两种框架其实是两种心智模型——一种要你像工程师那样画流程图,一种要你像管理者那样写岗位说明书,各自适合什么;而书自己的结论是重要的不是框架,是那五个模式

17 怎么知道它是对的(原书 Ch9 §9.1、§9.3)17-evaluating-hallucination-and-agents.md

主走查: 闪购那天积下来的 500 条真实问答。① 先定基准数据:某个产品是 30 天退货, 这个事实必须明确写在基准里,不能靠从别的政策推 → ② 造两套测试集:通用集分布要和生产一致 (生产里 40% 问库存,测试集就 40%),对抗集专挑刁钻 → ③ 抽出每条可核实的论断逐条核 → ④ 无据的比例:通用 8%、对抗 25% → ⑤ 再按话题拆:产品信息 3%、配送政策 15%,先改哪里一目了然 → ⑥ 把「续航 6 小时、保修一年、特价 79.99」这一条回答拆成三个原子事实,错 1 条,得分 0.67 → ⑦ 换成词重叠指标,看它为什么既冤枉换了说法的正确回答、又放过用对了词的错回答 → ⑧ 换成模型评审,而评审自己也会幻觉 → ⑨ 最后测 agent:退款流程期望走 ["intent_classifier","refund_agent","gather_info","compile_followup"],实际在第 2 步就跑偏了。 承重词(单开一节,从现象讲起):「有据 / 基准缺陷率」(从「回答听着没毛病,怎么判它到底有没有依据」讲起)、 「执行轨迹」(从「答案是对的,可它是蒙对的」讲起)。

  1. 进来时以为「测一测就知道好不好」→ 出去时知道四步缺一不可:先把基准数据钉死、再造通用集和对抗集两套、再逐条抽论断去核、最后才是报数
  2. 进来时以为「准确率一个数就够」→ 出去时知道要看无据回答的比例,而且必须通用集和对抗集分开报、按话题拆开报——差距本身才是决定先改哪里的信息
  3. 进来时以为「一条回答要么对要么错」→ 出去时知道它常常是三条主张里错一条,拆成原子事实逐条判,得到的信息比整条打个「幻觉」标签多得多,代价是每条都要调模型
  4. 进来时以为「和标准答案比一比就行」→ 出去时知道最常被搬来当幻觉检测用的那把尺子(ROUGE)本来是给机器翻译和摘要评分的:一元变体看单词重叠、二元看相邻词对、L 看最长公共子序列,量的都是「抄没抄到参考答案的用词」;至于它为什么不能当幻觉检测用,盲区和第 09 章那个朴素做法是同一对,不再重讲
  5. 进来时以为「让模型当评审就解决了」→ 出去时知道评审自己也会幻觉,而且有系统性偏好(偏爱更长的、偏爱和自己风格像的、察觉不到细微的事实错误),三条缓解分别针对哪一种;而要能统计,评审的判决必须被约束成一组固定标签(「有幻觉 / 无幻觉」)而不是自由文本,否则你连「这周比上周高了多少」都算不出来——生产上就是靠这一条把评审挂成定期抽样、超阈值告警的一根管子,第 19 章那套监控在生产里就是这么跑的
  6. 进来时以为「测试集跑绿了就安全」→ 出去时知道还要有一支专门想让系统失败的队伍:指标抓的是系统性问题,红队挖的是只有有创造力、有动机的人才找得到的失效
  7. 进来时以为「agent 的评测就是看最后答得对不对」→ 出去时知道要三层:任务成没成、工具调对没有、以及它走过的步骤序列对不对——正确的答案可能掩盖有缺陷的中间推理,正确的推理也可能被一次工具失败毁掉

18 让它跑得起:四个性能模式(原书 Ch9 §9.2)18-performance-patterns.md

主走查: 闪购当天,「你们今天几点关门?」被问了 300 次。① 每一次都发给最贵的模型, 答案还一模一样 → ② 加精确字符串缓存:「What time do you close?」和「When are you open?」 各存一条,复用率极低 → ③ 换成按意思找:把新问题转成向量,找到相似度 0.82 的已存条目, 过了 0.7 这条线就直接返回 → ④ 但库里只有一条时它会把毫不相干的也返回——相似度比的是相对不是绝对 → ⑤ 于是阈值兜底:够不着就回落到模型 → ⑥ 再看路由:80–90% 的问题走小模型; 反例是「请用 100 字以内详述新的税收法规变化」,很短但很复杂,靠长度和关键词一定会路由错 → ⑦ 于是用小模型加函数调用来做路由决策,每次决策都带理由。 承重词(单开一节,从现象讲起):「语义缓存与相似度阈值」(从「同一个问题换个说法,缓存就等于没做」讲起)、 「模型路由」(从「『你们几点关门』和一道税法题,凭什么用同一个模型答」讲起)。

  1. 进来时以为「回答生成完再给用户是理所当然的」→ 出去时知道边生成边吐字让用户觉得它在听在答,但它也会提前泄露还没定稿的错误信息,以及哪些场景反而该等定稿(法律简报、长研究综述)
  2. 进来时以为「批处理是一个词」→ 出去时知道它是两件完全不同的事:自己在应用里攒批(摊薄开销、给限流一个缓冲,代价是亚秒级延迟),和官方的离线批量作业(成本减半,代价是最长等 24 小时、全有或全无)
  3. 进来时以为「缓存就是把问过的存起来」→ 出去时知道字面匹配抓不住同义问法,得按意思找;而按意思找自带一个陷阱:它永远会返回「最接近的那个」,哪怕根本不相关
  4. 进来时以为「缓存存进去就一直有效」→ 出去时知道三条新鲜度规矩:改了知识库或系统提示词就递增版本号、给条目挂上政策日期、只缓存稳定话题(「这件还有货吗」永远实时答)
  5. 进来时以为「用最强的模型最保险」→ 出去时知道八九成的流量根本用不上它,三种路由做法(关键词启发式 / 训一个小分类器 / 先便宜后升级的两趟法)各自的代价,以及最大的风险是把复杂问题误判成简单
  6. 进来时以为「这四个模式选一个用」→ 出去时知道它们叠着用:路由 + 语义缓存 + 攒批,再加一句最省的——如果问题只是简单的事实检索,可能根本不需要模型

19 上线之后:LLMOps 与监控(原书 Ch10)19-llmops-and-monitoring.md

主走查: 凌晨三点四分的告警:「本月账单 47000 美元。」① 打开面板:99.9% 可用、 平均 200 毫秒、HTTP 错误 0——全绿 → ② 而机器人已经连着几周在告诉顾客六个月前的订单可以全额退款 (政策是 30 天)→ ③ 翻日志:一次真实交互 356 个输入词元 + 891 个输出词元 = 1247 个,0.32 美元 → ④ 分段计时:嵌入 + 向量搜索 + 后处理加起来不到 500 毫秒,模型推理 1.65 秒,占 89.3% → ⑤ 成本更极端:推理 0.004193 美元,其余全部加起来 0.00001 美元,推理占 97% → ⑥ 所以要降 30% 成本,动的是提示词让回答变短,不是换基础设施 → ⑦ 把告警改写成「每秒词元数低于 20」「错误按用户类型聚集」「每词元成本比基线涨 50%」 → ⑧ 成本异常检测:当前小时超过上周同一小时的 2 倍就报高危。 承重词(单开一节,从现象讲起):「LLMOps」(从「面板全绿,顾客却在流失」讲起)、 「黄金数据集」(从「传统测试期望输出一模一样,而这里两次回答本来就不一样,那还怎么测」讲起)。

  1. 进来时以为「上线后按老一套监控就行」→ 出去时知道非确定性把老一套废了:同一个输入可能成功 99 次、第 100 次失败,而系统可以一边跑得很顺一边给出微妙错误的答案
  2. 进来时以为「直接用大厂接口最省事」→ 出去时知道三个代价:测试时假设 30 个词元的问题、真实用户写 350 个词的长篇,成本会爆;数据流经外部服务器的合规问题(以及一个平衡的反驳:自己跑等于把合规负担全接过来);供应商会悄悄更新模型
  3. 进来时以为「自己部署更可控」→ 出去时知道那张基础设施清单有多长(每实例每月三千到八千美元的显卡、服务栈、负载均衡、几十 GB 权重的版本管理、扩缩容与冷启动),以及混合方案的三条路由规则
  4. 进来时以为「日志记下请求和响应就够」→ 出去时知道六组字段各自回答一个问题,其中最容易漏的是每秒词元数、提示词版本号和分段计时——分段计时一拉出来就看见推理吃掉了 89% 的时间和 97% 的成本,优化的优先级当场颠倒
  5. 进来时以为「告警照传统那三条设」→ 出去时知道每条都要改写:延迟改成每秒词元数、错误率改成错误是否聚集、CPU 改成每词元成本涨了多少,以及为什么成本异常要和上周同一小时比
  6. 进来时以为「面板是给工程师看的」→ 出去时知道要连到业务结果:展示「每个满意顾客的成本」而不只是总成本,跟踪「无需升级就解决的问题数」而不只是响应时间;以及用户反馈里显式的和隐式的信号各说明什么
  7. 进来时以为「日志和面板自己搭就行」→ 出去时知道追一次交互要把检索、生成、后处理三段的词元数与耗时串成一条线,还要挂上「这次用的是哪个提示词版本」和一个质量分;这件事有现成平台(Langfuse),一家求职平台靠它盯住每月几万份简历生成,把「盲发提示词」变成「先看下游影响再发」——这也正是下一条那个影子测试跑在哪里
  8. 进来时以为「提示词是一句话,改就改了」→ 出去时知道它是生产质量合约:含糊的提示词会让同一个问题给不同用户矛盾的建议,所以要打版本号、要有一组附带「期望出现的要素」而不是标准答案的题、新版本上线前先并行跑影子测试(代价是评估期成本翻倍),以及四个该考虑换模型的信号

20 偏见:它按设计在工作(原书 Ch11 §11.1–11.3)20-bias.md

主走查: 一份写着「women's chess club captain」的简历。① 亚马逊那个开发了四年的招聘系统 给它扣分 → ② 问题不是代码里有 bug,是它完全按设计在工作:训练数据是公司十年的招聘记录, 而那些记录以男性为主 → ③ 于是它学到「男性候选人更可取」,并把这条编码进打分 → ④ 换成 2024 年那个更大的实验:三个前沿模型、550 多份真实简历、九个职业、超过三百万次比对—— 白人相关名字被青睐 85% 的次数、黑人相关 9%;男性 52%、女性 11%; 黑人男性相关名字在任何一次比对中都没有被优先于白人男性 → ⑤ 三条缓解各改动这条链的哪一环 → ⑥ 最后把公平写进训练本身:总损失 = 原来的损失 + 权重 × 两组之间的差距。 承重词(单开一节,从现象讲起):「算法偏见」(从「没有一行代码写着歧视女性,可它就是在歧视女性」讲起)、 「代理指标」(从「用『花了多少医疗费』代替『有多需要治疗』,结果是什么」讲起)。

  1. 进来时以为「偏见是个道德话题,做不做看良心」→ 出去时知道它已经是法律义务:欧盟的 AI 法案把 AI 系统按风险分成四档(不可接受 / 高风险 / 有限风险 / 最小风险),你做的客服机器人落在「有限风险」那一档、必须告知用户正在和 AI 说话,这是确定的;美国科罗拉多州的 SB 24-205 专打算法歧视;而且承保开始把 AI 事故排除在标准保单之外。原书 §1.6 的那句「监管管的是系统不是模型」也归到这里
  2. 进来时以为「AI 歧视是有人写错了代码」→ 出去时知道系统完全按设计工作,问题在于它不只是从数据里学习,还以前所未有的规模放大数据里的模式
  3. 进来时以为「这是个别公司的个别事故」→ 出去时知道三个有文献的案例各暴露一条不同的因果链:刑事风险评估把黑人被告误标为高风险的概率是相似白人的两倍、图像识别把黑人照片标成动物、以及那个最清楚的——医疗算法拿「医疗支出」当「健康需求」的代理,而黑人患者历来因系统性障碍就医更少
  4. 进来时以为「负责任 AI 就是别做坏事」→ 出去时知道四种失效模式分别是不公平对待、有害内容、隐私侵犯、以及最难缠的那种——以运营者看不见的方式失败,前面那些案例数月甚至数年没被发现,正是因为标准性能指标不看群体差别
  5. 进来时以为「一道防线做好就行」→ 出去时知道要四层叠着来(数据、模型、安全、隐私),因为每一层都在补别的层的短板,像机场安检那样没有单独一道是万无一失的
  6. 进来时以为「拿自己公司的客服日志微调最安全」→ 出去时知道那是在训练一个复刻现实不平等的模型:一家金融公司微调出来的机器人对名字通常与少数族裔相关的顾客明显更不友好,因为人类客服曾无意识地给这些顾客更短的回答;而输出又变成下一轮的训练数据,每一轮更糟
  7. 进来时以为「按名字推断族裔来做审计挺方便」→ 出去时知道书自己给这段代码打了补丁:小的名字列表会误判很多用户,既不可靠也有法律风险,生产上要用自愿自报或基于人口普查的概率工具,而且审计要经法务审阅
  8. 进来时以为「公平是基座模型自带的」→ 出去时知道得在训练时主动强制:在微调的损失里加一项群体间差距,权重越大约束越严、总体准确率可能略降;而把这套「一个模型按一份规则评判另一个模型」的做法从事后评估搬进训练循环,就是 Constitutional AI——同一个模式,只是部署在训练时而不是评估时

21 安全、隐私与六条原则(原书 Ch11 §11.4–11.6)21-privacy-safety-and-six-principles.md

主走查: 一位患者问「我叫 David,我胸痛,该怎么办?」① 紧急词检测判为最高危, 直接走紧急路径,不再往下 → ② 换成非紧急的问题:敏感信息识别抓出姓名、电话、病历号, 按风险等级处置(最高危直接拒绝请求,高危脱敏后放行)→ ③ 生成回答 → ④ 安全检查拿三条模式过一遍:「你肯定得了……」「停掉你的药」「你不需要去看医生」,命中就加免责声明 → ⑤ 偏见监控记下这次交互,每 50 次算一遍各人群的平均质量分,任意两组差超过 0.2 就告警 → ⑥ 审计日志落盘 → ⑦ 最后把同一句话里的名字换成不同族裔跑一遍测试套件, 期望是「同等对待」、性别偏见通过率不低于 0.80。 承重词(单开一节,从现象讲起):「敏感数据 / PII」(从「用户把身份证号打进对话框之后,它去了哪里」讲起)、 「被遗忘权与权重里的记忆」(从「删掉一条数据,为什么模型里删不掉」讲起)。

  1. 进来时以为「安全就是加一层过滤」→ 出去时知道三层按「快 → 准」排:模式匹配拦明显的、专门的分类模型看语境、内容分析最全但最慢,而且它们的结论要统一成一个结构(安不安全、风险等级、解释、建议动作)——和第 15 章工具的结构化错误是同一个思路
  2. 进来时以为「AI 的隐私问题和数据库泄露差不多」→ 出去时知道它根本不同:传统软件处理完就不留,而模型在学习中会对具体样例产生逐字记忆,代码补全工具因此建议出过训练语料里真实的密钥和邮箱
  3. 进来时以为「不把数据存下来就没事」→ 出去时知道三个攻击向量各走一条不同的路:从训练数据里抽(有研究只花 200 美元的调用就提取出一万多条被记住的样例)、用户输入经由会话或日志泄漏、以及在对话里套出早前的信息和系统提示词
  4. 进来时以为「泄露一条就是泄露一条」→ 出去时知道放大效应:传统数据库被攻破,攻击者拿到的是一组有限的记录;而模型可以把同一份数据分发到与无数用户的数百万次交互里——单点暴露变成一台广播机
  5. 进来时以为「敏感数据就是身份证和手机号」→ 出去时知道要抓五类,其中最容易漏的是技术密钥和机密业务信息;而正则法的四个不足(要考虑语境、要管误报、要和法规集成)决定了生产上该上专门的工具
  6. 进来时以为「合规是法务的事」→ 出去时知道两部法规的差别会直接改变你的架构:管的范围、去标识化怎么算、泄露要多久上报(60 天 vs 72 小时)、罚到什么程度;而「被遗忘权」撞上了一堵技术墙——数据一旦进了权重,不重训整个模型就拿不出来,于是很多组织的现实结论是干脆把系统设计成根本不处理个人数据
  7. 进来时以为「这些防线是各自独立的模块」→ 出去时知道它们在一条流水线上有固定的先后:紧急检测 → 脱敏 → 生成 → 安全检查 → 偏见记录 → 审计,顺序错了就有防线形同虚设
  8. 进来时以为「全书讲完了一堆技术」→ 出去时知道它收在六条原则上(锚在已核实的信息上 / 约束 agent 的动作 / 持续监控 / 公平对待 / 保护隐私 / 从第一天就评测),以及它们的应用顺序和那个闭环:三层不只是往上叠,运营还会反过来喂回输出——评测找出弱提示词、监控抓到检索失败、偏见检测揭出训练数据的缺口

偏离原书章序的地方(交稿时要在总纲里说明)

#怎么挪的为什么
1幻觉从原书第 1 章拆出来,单独成第 02 章它是全书的敌人,后面十九章都在治它;塞在第 1 章末尾会被当成一个小节略过
2原书第 2 章的函数调用项目挪到第 05 章章尾它和检索增强是同一件事的两种形态(都是把回答锚到外部真值上),放一起省一次铺垫,并且天然接住第 12–15 章的工具线
3原书第 3 章 §3.6.5 整节(不只是 Lost in the Middle 那篇论文,还包括「取回来之后按相似度阈值再筛一道」和「长文档先压成要点」)挪到第 07 章它整节回答的都是「取回来之后还要做什么」,和精度问题是同一件事;留在第 3 章会和评测挤在一处
4原书第 4 章的切块策略挪到第 05 章切块本来就是索引四步里的「切分」那一步,书把它拖到两章之后才讲
5原书第 3 章 §3.6–3.7(检索评测与进阶手法)整块后移到第 09 章,让第 06 章的嵌入先讲这一块全程在用嵌入和余弦相似度:「答案相关度」就是拿嵌入算夹角,HyDE 之所以管用是因为「文档和文档的向量比问题和文档更近」。排在嵌入之前,读者只能把这些当口诀背
6原书第 9 章拆成第 17(评测)和第 18(性能)两章评测和性能是两件事,挤一章新词密度爆表
7原书第 6 章末尾的 agent 框架格局挪到第 16 章那里正在讲两种框架的心智模型,格局表放在同一处才有对照
8原书第 3 章的 Agentic RAG 预告并入第 13 章书自己说了「到第 6、8 章才建完整系统」,我们直接在那里讲完
9原书 §1.6 的监管紧迫性(欧盟 AI 法案 + 美国立法「管的是系统不是模型」)挪到第 20 章它回答的是「为什么现在非做不可」,和第 20 章开头的合规义务是同一件事;留在第 01 章只会变成一句没有下文的背景

另有一件事全书通用:原书是未定稿,交叉引用没校对过(至少三处章号引错)。 凡是要转述「第 N 章讲」的地方,一律按我们自己的章号重写,不许照抄。

自查:两头是不是同一件事

  • 02「温度调到 0 也不管用」 vs 03「温度到底在调什么」 —— 一度疑似重复。已分开: 02 是拿这条实测当证据说明幻觉不是随机性造成的,不讲温度机制;03 才从「同一句话问两遍答案不一样」 讲机制和实用值。保留两处。
  • 09「评审模型」 vs 17「模型当评审自己也会幻觉」 —— 这是书自己的伏笔结构(前面给方法、八章之后给局限)。 09 的出去时知道是「怎么规模化地审」,17 的是「审的人自己也不可信、三条缓解,以及判决必须落成固定标签」。不重复,保留。
  • 09「朴素幻觉检测的两个盲区」 vs 17「词重叠指标」 —— 一度是同一句,已合并。 盲区只讲一次,留在 09(它是 05 那段项目代码的直接后果,现象离读者最近); 17 只讲 ROUGE 自己的东西(它本来是给什么打分的、三个变体各量什么),盲区处一句话回指 09。
  • 13「护栏」 vs 21「安全三层」 —— 13 讲的是 agent 层面「关键词表为什么拦不住」这个失效现象, 21 讲的是系统层面三层怎么分工。原书在这里许诺错了章号(说第 10 章,实际第 11 章),我们按自己的章号写。
  • 08「量化」 vs 11「量化」 —— 同一个动作,作用对象不同(压向量 / 压权重)。 08 首现处给定义,11 直接复用,全书一词一义,不许在 11 再定义一遍。
  • 05「切块」 vs 07「切得对不对」 —— 05 讲怎么切,07 完全不碰切块,只讲取、筛和排。不重复。
  • 05「函数调用」 vs 14「工具清单」 —— 05 讲的是「模型开口说要调什么、我们执行」这个动作本身; 14 讲的是「工具是每次请求内联带上的,还是服务端自己提供一份清单让模型去问」这条分水岭。 分水岭这句话只在 14 出现,05 不预支。
  • 12「记忆」 vs 19「日志」 —— 一个是给模型看的上下文,一个是给我们看的运行记录,两回事。
  • 其余各章各节的「出去时知道」两两比对过,没有同句。

篇幅与密度自查

  • 21 章 × 约 15k–22k 字符 ≈ 35 万字符,原书 799k 字符(英文)。原书是本库最大的几本之一, 章数踩在「通常 8–20 章」的上沿再多一章,理由是新词密度: 原书第 2、3、4、5、6、7、9、11 章各含 15–25 张生面孔,一章塞不下。
  • 最密的三处已经拆开:第 4 章 → 06/07/08,第 5 章 → 10/11,第 9 章 → 17/18。
  • 原书第 3 章拆成 05(把回答钉在文档上)和 09(评它、改它、连起来),中间隔着 06/07/08 三章讲嵌入与检索 —— 因为 09 全程要用 06 才讲的嵌入。
  • 每章的承重词控制在一到两个单开一节,其余就地一段话或一句话带过——不许把力气撒平。