第 6 课 · 历史会越堆越长:摆在哪、砍哪些
读这一课前你需要会什么:读过第 1、3、4 课。 你需要知道:它脑子里什么都不存、所以每轮要把过去整个重发一遍(第 1、3 课), 以及那个循环会转很多圈(第 4 课)。 出现的每一个新词都会当场用大白话讲清。讲不清楚的地方就是我的问题,请直接标出来。
这一课结束时你会
- 说得出为什么「摆在哪」比「写什么」更值钱——而且知道那个差距有多大;
- 说得出为什么改一个字会让账单翻倍;
- 说得出历史堆不下时该按什么顺序砍,以及哪一种砍法是错的。
1. 先看第 4 课那个循环转久了会怎样
第 4 课那个例子只转了三圈。把问题换成「帮我比一遍这 20 个城市的天气」呢?
第 1 圈:发出去 ~200 个 token
第 2 圈:发出去 ~400 个 ← 上一圈的调用和结果都要跟着发
第 3 圈:发出去 ~600 个
……
第 20 圈:发出去 ~15000 个
每一圈发出去的东西都包含前面所有圈。 这是第 1 课那条「它脑子里什么都不存」的账单版本。
两个后果同时发生:
| 后果 | 表现 |
|---|---|
| 越来越贵、越来越慢 | 第 20 圈发出去的东西是第 1 圈的 75 倍 |
| 迟早装不下 | 它一次能看的量是有上限的 |
这一课讲怎么对付这两件事。而且这 两件事的解法方向相反—— 一个要「别改」,一个要「多砍」。
2. 顶层全景:两件事,不是一件
很多人把这一课的内容笼统叫「上下文管理」,其实是两件不同的事:
┌─ 摆在哪 ──────────────────────────────────┐
│ 同样这些内容,按什么顺序排 │
│ 管的是:它听不听话 + 账单 │
│ 规矩:稳定的排前面,变的排后面,前面别动 │
└───────────────────────────────────────────┘
┌─ 砍哪些 ──────────────────────────────────┐
│ 装不下的时候扔什么 │
│ 管的是:塞不塞得下 + 会不会失忆 │
│ 规矩:一条从不花钱到花钱的阶梯,先便宜后贵 │
└───────────────────────────────────────────┘
图说:这两件事经常打架——砍东西会动到前面,而动到前面就毁了账单。
§4.6 讲这个冲突怎么解。
先给一个词,后面全靠它:
上下文窗口 = 它一次最多能看多少个 token。
超过这个量,请求直接被拒。但没超也不等于没事——这一点 §4.4 会讲。
3. 主走查:那 20 个城市,每一层在哪里介入
盯住那个 20 城市的例子,看一段文字从 200 涨到 15000 的路上,各层怎么管它。 下面的数字是我为了讲清楚编的量级, 不是实测值。
第 1 圈:200 个 token,一切正常
┌─ 稳定的部分 ────────────────┐
│ 系统提示 ~80 │ ← 每一圈都一模一样
│ 工具定义 ~60 │ ← 每一圈都一模一样
└─────────────────────────────┘
┌─ 变的部分 ──────────────────┐
│ 用户那句话 ~30 │
└─────────────────────────────┘
这时候要做的唯一一件事:把稳定的排前面。 为什么,§4.3 讲。