token、上下文窗口,以及模型为什么会"忘掉中间"
token 不等于字
模型看到的不是字符,是 token。英文大致按子词切分,中文取决于分词器 —— 有的按字,有的按常见双字组合。所以不能拿字数直接估 token 数,差得远的时候会让你误判预算。
要准确数字只能实测:用对应模型的 tokenizer 跑一遍,或者调用官方的 count tokens 接口。
上下文窗口到底是什么
它约束的是单次请求里输入 + 输出加起来的 token 上限。几个常见误解:
- 不是"记忆容量"。会话历史是每次请求重新发过去的,模型本身不保存任何东西。
- 不是"发满就更聪明"。长上下文里信息密度被稀释,反而更容易漏掉细节。
- 超出上限不是只有"报错"这一种表现,有些接口会静默截断,把最早的内容丢掉 —— 表现就是"它怎么忘了开头说的"。
长文档中间的信息容易被忽略
这一点有实证研究支撑(Liu 等人 2023 年关于长上下文检索位置的实验):把同一条关键信息放在文档开头或结尾,模型的召回率明显高于放在中间。这个现象被称作 "lost in the middle"。
对实践的直接影响:
| 做法 | 原因 |
|---|---|
| 关键约束放开头和结尾各写一次 | 首尾位置召回率更高 |
| 长文档先摘要再喂,不要整篇硬塞 | 降低无关信息的稀释 |
| 需要精确引用时用检索,不要靠"读全文" | 定位到片段比大海捞针可靠 |
一种省 token 的工程习惯
与其把所有历史都堆进上下文,不如维护一份结构化摘要:当前目标、已确认的事实、待办事项。每次请求只发这份摘要 + 最近几轮对话。这样既控住了长度,也不会因为早期对话被截断而丢掉关键前提。
本文为个人学习记录,可能存在错误或已过时,仅供参考。
← 返回笔记列表