跳到主要内容

让它跑得起 — 四个性能模式,以及按意思找缓存自带的那个陷阱

这一章讲三件事: 同一个问题被问三百次,怎么不用花三百次的钱; 「按意思找缓存」听着很美,但它自带一个陷阱——它永远会返回最接近的那一条, 哪怕那一条根本不相干;以及大模型小模型怎么分工,而分工最大的风险在哪。

它在全书链条里的位置: 第 17 章和这一章是原书同一章的两半。 第 17 章管「答得对不对」,这一章管「跑得快不快、贵不贵」。 第 19 章接着讲上线之后怎么长期盯着。

1. 顶层全景:「你们今天几点关门?」被问了三百次

这一章的主走查是第 17 章开头那个闪购场景的另一半:

闪购当天,「你们今天几点关门?」这个问题被问了 300 次

① 现状:每一次都发给最贵的模型,**而三百个答案一模一样**

② 加一层「一模一样的问题就直接返回上次的答案」:
「What time do you close?」和「When are you open?」**各存了一条**
→ **复用率极低**——它们答案相同,却被当成两个不同的问题

③ 换成按意思找:把新问题转成一串数,去找已存的最像的那条
→ 找到一条相似度 **0.82** 的,**过了 0.7 这条线,直接返回**

④ 但陷阱来了:**库里只有一条时,它会把那一条返回给你——哪怕毫不相干**
→ 因为相似度比的是**相对**,不是绝对

⑤ 于是必须设阈值兜底:够不着 0.7 就回落到模型,老老实实生成一遍

⑥ 再看分工:**80% 到 90% 的问题走小模型**
→ 反例:「请用 100 字以内详述新的税收法规变化」——**很短,但很复杂**
→ 靠长度和关键词一定会路由错

⑦ 于是路由决策本身也交给一个小模型来做,**而且每次决策都要带出理由**

图说:②→⑤ 是缓存这条线,⑥⑦ 是模型分工这条线。
**0.7 / 0.82 里,0.7 是书给的阈值,0.82 是我们为演示编的;
80–90%、那句税法题、以及「各存一条」的对比都是书里的原样。**

2. 边生成边吐字:它换来什么,又漏掉什么

这一节讲第一个模式,而它的取舍比它的做法有意思。

做法

模型是一个词元一个词元往外写的(第 02 章)。 所以你有两种选择:等它整段写完再给用户看,或者写一个吐一个。 后者就是流式输出。

两边各自的账

边生成边吐字等定稿再给
用户感受像打字机,用户觉得它在听、在答空白等待一段时间,然后一次性出现
适合聊天机器人、实时助手、搜索结果、快速推荐报告与摘要、要求前后逻辑连贯的任务、法律简报、长研究综述
风险模型中途改主意、半截句子让用户困惑,而且局部的错误信息会提前泄露出去感觉不那么互动

最后那一行的风险最值得记: 流式输出把「还没定稿的内容」提前给了用户看。 它写到一半可能自己纠正,可用户已经把前半句读进去了—— 在法律、医疗这类场景里,这一条足以否掉流式。

3. 「批处理」这个词有两个意思,别混

这一节讲第二个模式,而书特意停下来澄清了一个词。

书的原话:在使用这类接口时,「批处理」可以指两件完全不同的事。1

你自己在应用里攒批官方的离线批量作业
是什么你的代码把进来的请求排队,攒一小会儿或者攒够几条再一起发出去把一大堆请求打包成一个文件交上去,过一阵回来取结果
收益摊薄开销,而且给限流留出缓冲——把流量尖峰抹平成本减半,而且吞吐上限高得多(吞吐指单位时间内它准你送进去多少活)
代价用户可能感到亚秒级的延迟最长要等 24 小时;而且是全有或全无,没有增量结果
适合聊天机器人、用户正在等着的同步流程夜间分析、预先算好答案或者一串数、给整个文档库建索引、给海量数据打分

关键在「代价」那一行的量级差:一边是亚秒,一边是最长 24 小时。 这两个数就是彼此的参照物,也是选哪一种的唯一判据:用户在不在等。

书还说了它们可以共存: 一个聊天系统可以一边用「自己攒批」服务实时提问, 一边把「给新上架的产品描述全部建一遍索引」这类后台大活丢给离线批量作业。

4. 按意思找缓存:这一章讲得最透的一节

这一节是这一章的第一个承重机制,而它有一个必须知道的陷阱。

先看现象:同一个问题换个说法,缓存就等于没做

主走查第 ② 步。 最朴素的缓存是这样的:把用户问的那句话原样当钥匙,存下答案; 下次来一模一样的一句话,直接返回。

存下来的:
"What are your store hours?" → 「我们今天 9:00–21:00 营业。」

然后来了这些问法:
"What time do you close?" → **对不上,重新调模型**
"When are you open?" → **对不上,重新调模型**
"What time do you open?" → **对不上,又存成第三条**

图说:**这三句和第一句要的是同一个答案。**
可对精确匹配来说,它们是四个毫不相干的字符串。
**结果是缓存里条目一堆,复用率极低。**
(这几个问法是书里的原样。)

做法:不比字面,比意思

这一步用的正是第 06 章那套东西:把一段文字转成一串数, 意思相近的文字,那串数落得彼此更近。

① 用户问:「What time do you close?」

② 把这句话转成一串数

③ 拿这串数去已经存过的那些里面找最近的
→ 找到「What are your store hours?」,**相似度 0.82**

④ 0.82 **超过了 0.7 这条线** → **直接返回它的答案,一次模型都不用调**

(如果没超过 → 老老实实调模型生成,**并把这个新的问答对也存进缓存**)

图说:**这四步就是「语义缓存」的全部。**
**0.7 是书给的阈值;0.82 是我们为演示编的相似度值。**

那个陷阱:相似度比的是相对,不是绝对

书专门为这件事开了一小节,而它是这一章最该记住的一句话2:

如果库里只存了一条,或者新来的问题和所有已存的都差很远, 系统仍然可能返回「最接近的那一条」——哪怕它根本不相干。 因为相似度搜索比的是相对的接近程度,不是绝对的质量。

缓存里目前只有一条: 「退货政策是什么?」 → 「30 天内可退。」

用户问: 「你们几点关门?」

找最近的一条 → **只有那一条,所以它就是最近的**

**没有阈值的话:返回「30 天内可退」** ← **答非所问,而且用户不会知道**

图说:**「最接近」和「够接近」是两件事。**
相似度搜索只回答前者,**后者必须你自己划一条线。**

两条防线,缺一不可:

防线具体做什么
① 设一个相似度阈值书给的起步值是 0.7
② 够不着就回落达不到阈值,就当缓存里没有,老实调模型

书后面还给了经验带:0.7 到 0.8 通常是平衡点。 并且点破了阈值设低的后果:你会拿别的问题的答案去回答这个问题。3

判断(我们的,不是书里的): 这个陷阱之所以危险,是因为它的失败是静默的。 缓存返回一个不相干的答案,系统不报错、日志上是一次「缓存命中」、 各项性能指标反而更好看(省了一次模型调用)。 换句话说:阈值设错,你的面板会显示一切都改善了。 如果错,会错在: 如果你的缓存里已经存了成千上万条、覆盖面很广, 「最接近的那条」多半确实相关,这个陷阱的实际发生率会低很多。 判据是:把缓存命中的那些问答对随机抽一批人工看一眼—— 出现答非所问,就把阈值往上调。

缓存怎么保证不过期

书给了三条,各治一种「旧了」4:

做法具体怎么做它治什么
版本号改了知识库或者系统提示词,就把版本号加一,旧版本的条目自动失效治「底层资料变了,缓存还在答旧的」
给条目挂日期比如挂一个「政策生效日期」,日期变了就不信这条旧答案治「某一类内容有明确的有效期」
有选择地缓存只缓存稳定的话题和常见问答;「这件还有货吗」这类永远实时答治「有些问题根本就不该缓存」

第三条最省事也最容易被忘: 判断一个问题该不该进缓存,比判断缓存该不该过期简单得多。

5. 按难度换模型:八九成的问题用不上最贵的那个

这一节讲这一章的第二个承重机制。

先看现象:两头都不对

全都发给最强的模型 → 成本飙升。 全都用便宜的模型 → 高级问题答不好。5

所以要在中间画一条线:简单的走小模型,复杂的走大模型。 这套「按问题难度决定用哪个模型」的做法,就叫模型路由。

三种做法,以及它们各自的代价

做法怎么判代价
① 按规则猜查关键词(法律、医疗、监管、税务、研究),或者看问题长不长必错,见下
② 训一个小分类器(分类器就是一个只负责「把输入归到几个类别之一」的小程序)拿标注好难易的问题去训它,让它把新问题标成「简单 / 复杂」要标数据、要训练、要维护
③ 先便宜后升级先用便宜模型答一遍,评估回答的把握程度或连贯性,不够好再升级边界问题要连打两次,延迟更高

书给的那个反例,一句话就把 ① 判死了

「请用 100 字以内详述新的税收法规变化。」 ——这句话很短,但毫无疑问是复杂问题。 纯靠规则的做法会把它路由错,让便宜模型产出一个平庸甚至错误的回答。6

这个例子的杀伤力在于它同时打穿了两条规则: 它不长(所以按长度判会判成简单),而「税收」这个词你可能压根没写进关键词表。

书推荐的做法:让一个小模型来做路由决策

做法:用一个便宜的小模型 + 第 05 章那个函数调用,让它判断这个问题该走哪条路。

书给了三条好处7:

好处为什么
不用维护关键词表新的问法出现时它自己能适应,不需要你回去加词
每次决策都带出理由出了问题你能看见它当时是怎么想的——规则式给不了这个
成本仍然很低路由这一步用的是小模型,判断是智能的,花费是便宜的

注意这一条和第 16 章那条「判意图不许用关键词」是同一件事的第二次出现 ——书在三个不同的地方(护栏、判意图、路由)给出了同一个诊断: 凡是要判断「用户到底想要什么」的地方,关键词表都不够用。

收益与最大的那个风险

如果 80% 到 90% 的流量能用小模型处理,每次查询的费用就大幅下降, 只有真正复杂的那 10% 到 20% 走贵的。8

而风险书说得很准:

最大的风险是分类不足——路由判得太粗,把复杂问题标成了简单, 于是用户看到一个不完整或者错误的答案。

注意这个风险是不对称的:

把简单问题误判成复杂 → **多花一点钱,答案照样对** ← 可以接受
把复杂问题误判成简单 → **答案是错的,而且用户不知道** ← 不可接受

图说:**所以路由的阈值应该往「宁可判成复杂」那一侧偏。**
(这个不对称是我们指出来的;书只说了「分类不足是风险」,没有讲这层不对称。)

6. 四个模式怎么叠着用

这一节收尾,而书最后那一句是全章最实在的一句。

用户的问题进来

① **路由**:先用小模型判这题难不难

② **语义缓存**:不管难题简单题,都先查一下缓存
(书特意说明:**高级问题偶尔也会重复,所以缓存对它同样有用**)

③ 缓存没有 → 按第 ① 步的判断,发给对应的模型

④ **攒批**:如果是不着急的活,和别的请求一起攒批发出去

⑤ **流式**:要给用户看的,边生成边吐字

图说:**这四个不是四选一,是叠着用的。**[^9]

而书最后补的那一句,值得单独留:

还可以再加一步:如果用户的问题只是简单的事实检索, 可能根本就不需要模型——直接查知识库就行。

这句话是整章的顶。 前面四个模式做的都是同一件事——优化 (有针对性地改动某一处,让整件事更快或者更省)「怎么用模型」; 而最省的那一步是往上退一格,问「这一步到底要不要用模型」。

7. 作者的判断与证据

书里给了证据的:

说法证据是什么
精确匹配缓存复用率低给了四句答案相同的问法,一眼看出它们对不上
相似度搜索会返回不相干的「最接近」一条完整的机制说明,而且给出了两条防线
阈值 0.7 到 0.8 是平衡点一个具体的经验区间,但书没有给实测数据
离线批量作业省一半成本、最长等 24 小时一对具体的数,而且互为参照
那句税法题会被规则路由判错一个杀伤力很强的具体反例,不需要数据也成立
80–90% 的流量能走小模型一个比例区间,书没有说这是从哪测出来的

作者的推测或没给证据的:

说法它是什么
流式 vs 定稿各自适合哪些场景一张经验对照表
「模型中途改主意」这个流式风险一句合理的担心,没有实例
三种路由做法的优劣一张经验表,没有任何一种的准确率数据
三条缓存新鲜度做法三条合理的工程建议,没有案例

8. 边界与局限

  • 没有一个真实的成本数字。 整章讲省钱,却没有一处给出「优化前多少钱、优化后多少钱」。 最接近的是「省一半」和「80–90%」两个比例,都没有基数;

  • 缓存命中率没有目标值。 上了语义缓存之后,命中率到多少算成功? 书没给,而没有这个数你没法判断值不值得做;

  • 没有讲缓存的存储成本。 每存一条都要存一串数,几十万条之后这个库本身多大、多贵? 第 08 章讲过向量的内存账,但这一章没有把它接过来;

  • 路由错了之后怎么补救,没讲。 「分类不足」被点了名, 但如果小模型答完发现不行,能不能升级重答?(那正是第 ③ 种做法)—— 书把它列成一种路由做法,却没有把它当成前两种的兜底来讲;

  • 流式和评测怎么配合,没讲。 第 17 章那套评测都是对着一段完整回答做的, 而流式输出的内容在中途可能被自己纠正——那评测该评哪一版?书完全没碰;

  • 具体的模型名和阈值会过时。 0.75 这类默认值、某某模型的价格, 一年之内会变一遍。要记的是那个陷阱、那条不对称,和「先问要不要用模型」。

9. 可带走的

全章那条走查,一行写完: 「你们今天几点关门」被问 300 次 → 每次都发最贵的模型 → 加精确匹配缓存,四种问法各存一条,复用率极低 → 换成按意思找:转成一串数,找到相似度 0.82 的一条,过了 0.7 这条线就直接返回但库里只有一条时它也会返回那一条——因为比的是相对不是绝对 → 所以必须阈值兜底,够不着就回落到模型 → 再看分工:80–90% 走小模型, 而「请用 100 字以内详述新税法」很短却很复杂,靠长度和关键词一定判错于是路由决策本身交给小模型做,每次带出理由。

  1. 流式输出换来「它在听在答」的感觉,代价是没定稿的内容提前给用户看到了 ——法律、医疗这类场景要慎用;
  2. 「批处理」有两个意思: 你自己在应用里攒批(亚秒级延迟,抹平流量尖峰)、 官方的离线批量作业(省一半成本,但最长等 24 小时、全有或全无);
  3. 选哪一种只有一个判据:用户在不在等;
  4. 精确匹配缓存必然复用率低,因为答案相同的问法有无穷多种;
  5. 按意思找缓存四步: 转成一串数 → 找最近的 → 过了阈值就直接返回 → 没过就调模型并把新的问答对存进去;
  6. 最该记住的陷阱:相似度搜索比的是相对接近程度,不是绝对质量。 库里只有一条时,那一条就是「最接近的」;
  7. 所以必须设阈值 + 回落两道防线。书给的起步值是 0.7,经验带是 0.7 到 0.8;
  8. 这个陷阱的失败是静默的:命中率上升、成本下降、面板一片大好,而答案是错的;
  9. 缓存新鲜度三条: 改了知识库或系统提示词就升版本号、给条目挂日期、 只缓存稳定话题(「还有货吗」永远实时答);
  10. 模型路由:八九成的流量用不上最贵的模型;
  11. 靠关键词和长度做路由一定会错——「请用 100 字以内详述新税法」很短但很复杂;
  12. 推荐做法是用小模型 + 函数调用来做路由决策,好处是不用维护词表、每次决策带理由、 而且本身很便宜;
  13. 路由的风险不对称: 简单误判成复杂只是多花钱,复杂误判成简单是给用户错答案。 所以阈值该往「宁可判成复杂」那一侧偏;
  14. 四个模式是叠着用的,不是四选一;
  15. 最省的一步在最上面:如果问题只是简单的事实检索,可能根本不需要模型。

10. 原文地图

主题原书章原文位置
四个模式总览Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:375(搜「Presenting answers incrementally」)
流式输出与适用场景表Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:402(搜「token streaming example」) · text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:574(搜「real-time assistants」)
「批处理」的两个意思Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:442(搜「System-level vs」) · text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:522(搜「wait up to 24 hours」)
精确匹配缓存的四句问法Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:598(搜「THE NAIVE APPROACH」) · text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:602(搜「local_dictionary_cache」)
语义缓存四步Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:636(搜「Semantic caching works by」)
那个陷阱与阈值 0.7Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:647(搜「POOR MATCHES」) · text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:654(搜「are considered valid」)
阈值经验带 0.7–0.8Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:838(搜「often strikes the right balance」)
缓存新鲜度三条Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:840(搜「KEEPING THE CACHE FRESH」)
自建 vs 现成缓存方案Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:804(搜「COMPARING FAISS AND GPTCACHE」)
路由问题的两面Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:885(搜「OVERKILL OR UNDERSERVED」)
三种路由做法Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:901(搜「implement such a router」)
小模型做路由的三条好处Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:1040(搜「adapts to new」)
那句税法题Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:1047(搜「tax regulation changes」)
80–90% 与分类不足Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:1067(搜「80–90% of your traffic」)
四个模式叠加与「可能不需要模型」Chapter 9: Evaluation and Performancetext/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:1085(搜「COMBINING FALLBACK」)

Footnotes

  1. 出处:「Chapter 9: Evaluation and Performance」第 443 段(text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:443,搜「two different things」)与第 522 段(同文件 :522,搜「wait up to 24 hours」)。书点名的官方机制是 OpenAI 的 Batch API,提交时要指定一个完成时间窗;示例里填的是 24 小时。

  2. 出处:「Chapter 9: Evaluation and Performance」第 647 段(text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:647,搜「POOR MATCHES」)与第 654 段(同文件 :654,搜「are considered valid」)。上面那个「缓存里只有退货政策一条」的例子是我们为演示编的;书只给了机制说明。

  3. 出处:「Chapter 9: Evaluation and Performance」第 838 段(text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:838,搜「often strikes the right balance」)。书里另一处示例把阈值设成了 0.75(同文件 :772,搜「set_similarity_threshold」)。

  4. 出处:「Chapter 9: Evaluation and Performance」第 840 段(text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:840,搜「KEEPING THE CACHE FRESH」)。自建方案与现成方案的取舍在第 804 段(同文件 :804,搜「COMPARING FAISS AND GPTCACHE」):自建的好处是阈值、失效判断、元数据全在自己手里,代价是这些逻辑都要自己写和维护;现成方案几行代码就能跑,代价是它强制自己的缓存与检索模式。

  5. 出处:「Chapter 9: Evaluation and Performance」第 885 段(text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:885,搜「OVERKILL OR UNDERSERVED」)。三种路由做法在第 901 段(同文件 :901,搜「implement such a router」)。

  6. 出处:「Chapter 9: Evaluation and Performance」第 1047 段(text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:1047,搜「tax regulation changes」)。

  7. 出处:「Chapter 9: Evaluation and Performance」第 1040 段(text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:1040,搜「adapts to new」)。

  8. 出处:「Chapter 9: Evaluation and Performance」第 1067 段(text/12-ch09-chapter-9-evaluation-and-performance-for-llms-an.txt:1067,搜「80–90% of your traffic」)。「风险不对称」那层分析是我们补的;书只写了「分类不足」是主要风险。