一句话定义:历史重发(History Resend)是指调用大模型对话接口时,客户端每一轮都要把从第一句到当前这句的全部对话内容重新打包发一遍,因为模型自己并不记得上一轮说过什么。
模型是无状态的
大模型 API 的一次调用,本质上是一次独立的前向计算:给一段文本,算出下一段文本。服务端不会替你保存“这个用户刚才聊到哪了”。你感觉它“记得上文”,其实是客户端(或 SDK、Agent 框架)把历史消息拼成一个数组,连同新问题一起提交上去。换句话说,记忆不在模型里,在你每次请求的正文里。
打个比方:你请了一位每天都会失忆的顾问。每问一个新问题,你都得先把之前说过的所有话复述一遍,他才接得上。第 1 轮复述 1 句,第 10 轮复述 10 句,第 50 轮就要复述 50 句。
成本为什么是平方,不是线性
设每轮新增内容大约是固定量 L(用户这句 + 模型上一轮的回答)。第 n 轮的输入约等于前 n−1 轮的总和,也就是约 nL。那么聊到第 N 轮的累计输入是:
L × (1 + 2 + 3 + … + N) = L × N(N+1)/2
这是 O(N²)。直觉上“聊 100 轮就是 10 轮的量”是错的,实际差了十几倍。
| 轮数 N | 线性直觉下的累计量 | 实际累计输入(按每轮新增 1 单位算) |
|---|---|---|
| 10 | 10 | 55 |
| 50 | 50 | 1,275 |
| 100 | 100 | 5,050 |
所以长会话的账单不是慢慢涨,是越往后每一条消息越贵。
容易混淆的几个概念
- AI 词典:上下文窗口">上下文窗口(context window):单次请求最多能装多少 token。窗口决定你“第几轮会撞墙”,历史重发决定你“撞墙之前已经付了多少”。两者一个是天花板,一个是水位。
- 提示缓存(prompt caching):服务端把重复前缀的计算结果复用起来,降低延迟和重复计算的费用。注意它不改变“你仍然要发”这个事实,只是让重复的部分更便宜。具体折扣与命中条件各家不同,以官方页面为准。
- 记忆 / 检索增强(memory / RAG):把历史压缩成摘要,或只检索相关片段放进去。本质仍是重发,只是发得更少,把平方曲线压平一些。
- 微调(fine-tuning):改的是模型权重;普通对话不会让模型“学会”你的偏好,会话结束,历史就没了。
对实际工作的意义
做产品的人要意识到:会话长度是要花钱的设计变量。常见做法是保留最近若干轮、对更早的历史做滚动摘要、把稳定不变的长文档放在最前面以便命中前缀缓存、以及在合适的时机提示用户“开个新会话”。做成本估算时,别用“平均每次请求多少 token”去乘请求数,要按会话轮数建模。
普通用户也值得知道:那些“什么都记得”的聊天机器人,背后是平方级的成本在支撑。一次聊到几十轮之后,把关键结论复制出来、开个新会话接着聊,往往又快又省。
