多轮对话的历史怎么压缩?四种记忆策略与成本对比
多轮会话最反直觉的一点:聊得越久越贵,而且不是线性变贵。因为模型没有记忆,第十轮要把前九轮重发一遍——你最活跃的用户,恰恰是成本曲线最陡的那批。
这篇讲四种历史管理策略。token 累加的原理见 token 是怎么算的。
策略一:全量历史
每轮把完整对话发过去。最简单,效果最好(模型什么都记得),成本最高。
成本特征:随轮次呈平方级增长。第 N 轮的输入约等于前 N−1 轮的总和,累计下来增长很快。
适用:轮次天然很少的场景(三五轮就结束)、或者单轮内容极短的场景。
风险:长会话会撞上上下文窗口上限,触发报错或静默截断。见长文本任务的四个成本陷阱。
策略二:滑动窗口
只保留最近 N 轮,更早的直接丢弃。
成本特征:每轮输入基本恒定,成本随轮次线性增长。这是最大的改进——从平方变线性。
实现要点:按 token 数而不是轮数来截断更准确,因为每轮长度不一。留一个固定的 token 预算给历史,超了就从最早的开始丢。
代价:模型真的会忘。用户提到「刚才说的那个」时接不上,体验割裂。
适用:任务型对话,每轮相对独立,不太需要回溯很早的内容。
策略三:摘要压缩
把较早的历史用小模型压成一段摘要,和最近几轮原文一起发。
成本特征:接近线性,但比纯滑窗略高(多了摘要本身的长度和生成摘要的调用成本)。摘要用轻量档模型生成,这部分成本通常可以忽略。
实现要点:
- 触发时机:历史超过某个 token 阈值时才压缩,别每轮都压。
- 增量压缩:新摘要基于「旧摘要 + 新增的几轮」生成,而不是每次从头压全部历史。
- 保留原文尾部:最近两三轮保持原文,摘要只覆盖更早的部分。用户对最近内容的引用最频繁。
代价:摘要会丢细节,尤其是具体的数字、名称、代码片段。
适用:需要长期上下文连贯性的场景,是多数对话产品的默认选择。
策略四:结构化记忆
把关键事实抽取成结构化数据(用户偏好、已确认的需求、任务状态),每次只带这份结构化记忆加最近几轮。
成本特征:最省。结构化记忆通常很短,且增长缓慢。
实现要点:
- 用小模型从对话里抽取事实,写入记忆存储
- 抽取要有明确的字段定义,别让模型自由发挥
- 记忆要能更新和删除,不然会越积越多且互相矛盾
- 检索时按相关性取,不是全量带上
代价:工程复杂度最高。抽取质量不好会导致「记错了」,比「忘了」更糟。
适用:长期陪伴型产品、需要跨会话记忆的 Agent。
怎么选
按会话长度和产品形态:
- 短会话(三五轮) → 全量,别过度设计
- 中等长度、任务导向 → 滑动窗口,简单有效
- 长会话、需要连贯性 → 摘要压缩,主流选择
- 跨会话、需要长期记忆 → 结构化记忆,配合前面任一种
实践中常见的是组合:结构化记忆存关键事实 + 摘要覆盖中段 + 原文保留最近几轮。三层各司其职。
别忘了缓存这一层
历史管理和提示缓存有个容易踩的冲突:如果你的裁剪策略每轮都改变请求前缀,缓存会持续失效。
正确的拼装顺序是:固定的 system prompt 和工具定义放最前面(这部分交给缓存),变化的历史和用户输入放后面。这样无论历史怎么裁,前缀都是稳定的。
详见提示缓存命中率上不去。
摘要压缩的实现细节
摘要是最常用的策略,但做得好不好差别很大。几个关键细节:
摘要要保留什么。 明确告诉小模型该留什么:用户的目标、已经确认的事实、待办事项、明确的偏好。该丢什么也要说:寒暄、重复确认、已经完成且不再相关的内容。不给指令的话,模型会均匀压缩,把关键信息和废话一起削薄。
摘要要保留原始表述的关键部分。 具体的数字、专有名词、代码片段、URL 这些经不起转述,摘要时要求原样保留。否则用户问「刚才那个数字」时就找不回来了。
摘要的长度要设上限。 否则随着会话变长,摘要本身也会越来越长,退化成另一种形式的全量历史。给一个固定的 token 预算,超了就再压一次。
摘要失败要有兜底。 生成摘要的调用也可能失败或超时。失败时退化成滑动窗口,而不是整个流程卡住。
怎么判断历史管理出了问题
用户不会说「你的历史裁剪策略有问题」,他们只会说「它怎么忘了我刚说的」。所以要靠指标提前发现:
指标一:单次会话的平均输入 token 数。 突然上涨说明裁剪没生效;持平但成本上涨说明是别的问题。
指标二:会话轮次分布。 如果大量会话在某个轮次附近突然中止,可能是撞到了上下文上限导致报错,用户放弃了。
指标三:用户重复表述的比例。 用户反复说同一件事,通常意味着模型忘了。这个指标不好自动统计,但可以抽样人工看。
指标四:上下文超限的报错次数。 这个最直接,有就说明裁剪策略没兜住。
四个指标里,前两个自动统计,后两个定期抽查,基本能覆盖常见问题。
一个实测建议
历史策略的效果很难靠推理判断,建议实测:拿一批真实的长会话日志,用不同策略各跑一遍,对比两个数——总 token 消耗,以及在需要回溯的问题上的回答质量。
第二个指标需要人工评,但样本不用多,二三十条有代表性的就能看出差距。评完之后再决定用哪种,比凭感觉选靠谱得多。成本这一侧代进月成本估算器就有数了。
三个高频问题
问:为什么多轮会话越聊越贵? 因为模型没有记忆,每轮都要重发全部历史。不做管理的话,成本随轮次呈平方级增长。
问:摘要压缩会丢信息吗? 会。所以要在提示里明确要求保留数字、专有名词、代码片段这类经不起转述的内容,并保留最近几轮原文。
问:结构化记忆和摘要能一起用吗? 能,而且是成熟产品的常见做法:结构化记忆存关键事实,摘要覆盖中段,最近几轮保留原文。
一句话记住
多轮会话的成本曲线由历史策略决定,而不是由模型单价决定。从全量改成滑窗,成本增长从平方级降到线性级,这个收益比任何比价都大。先把历史管好,再去纠结用哪家的模型。