开场:对话越长越贵、越长越笨、越长越危险
每一轮对话都要把全部历史重新发给模型。于是三个问题同步恶化:对话越长,费用越高、注意力越分散、离窗口上限越近。
这三个问题决定了:上下文不能放任不管。本文把上下文管理讲透:先看清"三长"问题的本质,再给出删、压、留的决策框架,最后是本地压缩 vs LLM 压缩的流水线顺序。
一、三个必须管理上下文的理由
| 问题 | 机理 | 后果 |
|---|---|---|
| 越长越贵 | 每轮都要重发全部历史,Token 消耗逐轮递增 | 费用像滚雪球 |
| 越长越笨 | 注意力"两头热、中间冷",中间信息最容易被忽略 | 模型抓不住重点 |
| 越长越危险 | 上下文窗口有上限,满了之后最早的信息被直接丢弃 | 关键记忆悄悄消失 |
逐轮递增的 Token 账单
| 轮次 | 单次调用成本(示意) |
|---|---|
| 第 1 轮 | $0.010 |
| 第 2 轮 | $0.024 |
| 第 3 轮 | $0.042 |
| 第 4 轮 | $0.064 |
| 第 5 轮 | $0.090 |
| 第 6 轮 | $0.120 |
| 第 7 轮 | $0.156 |
| 第 8 轮 | $0.196 |
第 8 轮的单次调用成本是第 1 轮的 20 倍,因为每一轮都要把前面所有对话重新发送给模型。对话不是免费的流水账:越长越贵、越长越笨、越长越危险——上下文管理是 AI 产品的基本功,没有可选的余地。
二、决策框架:什么能删、什么能压、什么不能动
压缩不是全删或全留,是在信息价值和 Token 成本之间找平衡。好的压缩策略像一个有经验的编辑:知道什么是废话可以砍,什么是用户的原话必须留。
| 类别 | 内容 | 动作 |
|---|---|---|
| ✅ 可以删 | 旧的工具调用结果、已处理完的中间步骤、重复的确认消息 | 直接删 |
| 🔶 可以压缩 | AI 的长篇回复、多轮讨论的结论、搜索/查询的详细结果 | 摘要替代 |
| 🔒 不能动 | 用户的原始消息、System Prompt、关键的偏好设定 | 永不触碰 |
模拟:同一段 8 轮对话的不同策略
原始(不压缩):2,445 Token
| 策略 | 做法 | 效果 |
|---|---|---|
| A:删旧工具 | 只删工具返回的原始列表 | 中等节省,信息无损 |
| B:压 AI 输出 | 把 AI 长回复替换为摘要 | 更高节省,结论保留 |
| C:激进全压 | 连用户消息一起压缩 | 最高节省,但危险 |
压缩不是全删或全留,是在信息价值和 Token 成本之间找平衡。
三、用户的话是「圣物」
用户输入删了,就回不来了。AI 的输出可以摘要、工具结果可以截断,但用户的原话删了就回不来了——而且用户一定会发现:「我明明说了 xxx,你怎么忘了?」
两种压缩方式的后果对比
方案 A:删了用户的消息(灾难)
用户:帮我写一篇关于 AI 的文章,风格要轻松幽默。
AI:好的!我来写一篇轻松幽默风格的 AI 科普文章…(长篇输出)
用户:不错,但开头太正式了,用一个有趣的故事开头。
AI:修改后的版本:从我家猫开始讲起…
用户(第 5 轮):语气再轻松一点,像我之前说的那种幽默感。
AI:好的,我来调整语气。(但 AI 已经不知道用户之前要求了什么风格,输出了一篇严肃的学术文章…)
用户:「我明明说了要轻松幽默,你怎么忘了?!」
方案 B:只压缩 AI 的输出(正确)
用户:帮我写一篇关于 AI 的文章,风格要轻松幽默。
AI(已压缩):[摘要] 写了一篇轻松幽默风格的 AI 科普文(800字)
用户:不错,但开头太正式了,用一个有趣的故事开头。
AI(已压缩):[摘要] 改用有趣故事开头,修改版本(900字)
用户(第 5 轮):语气再轻松一点,像我之前说的那种幽默感。
AI:明白!您之前提到要「轻松幽默」的风格,我在保持故事开头的基础上,把语气调得更活泼…
用户:「对对对,就是这个感觉!」
用户消息 = 圣物。 用户输入的每一句话都承载着需求、偏好和上下文。一旦删除,AI 不仅丢失了信息,更丢失了用户的信任:「连我说的话都记不住,这 AI 有什么用?」
压缩优先级(从高到低)
- 优先删:工具/函数调用的原始输出——搜索结果、API 返回的 JSON,处理完就没用了 → 直接删
- 其次压:AI 的长篇回复——AI 自己说的话可以用摘要替代,核心结论保留即可 → 摘要压缩
- 绝不动:用户的原始消息——用户说了什么、要了什么、偏好是什么,这些都是圣物 → 不可删
宁可删 AI 自己说的 1000 字,也别动用户说的 10 个字。
四、本地压缩 vs LLM 压缩:先免费后花钱
压缩上下文有两条路:本地处理零成本但粗糙,LLM 摘要有成本但精准。答案是:都用,但有先后顺序。
| 维度 | 本地压缩 | LLM 压缩 |
|---|---|---|
| 原理 | 正则匹配、字符截断、模板替换 | 让另一个 LLM 读一遍后写摘要 |
| 成本 | 零(纯本地计算) | 要花钱(调用一次 API) |
| 延迟 | <1ms | 1~5 秒 |
| 效果 | 粗糙,可能丢关键信息 | 精准,能保留核心语义 |
| 适合场景 | 工具输出、JSON 结果、重复内容 | 多轮对话摘要、复杂上下文浓缩 |
案例对比:同一段 10 轮对话(4,200 Token)
| 方式 | 压缩后 | 节省 | 耗时 | 费用 |
|---|---|---|---|---|
| 本地压缩 | 2,300 Token(截断工具输出) | 45% | <1ms | ¥0 |
| LLM 压缩 | 680 Token(对话摘要) | 84% | ~2.5s | ¥0.008 |
LLM 压缩的摘要长这样:
对话摘要:用户计划北京→上海出行。已确定:高铁 G1 次(07:00-11:28),商务座,¥1748,余票 3 张;酒店选定浦东香格里拉;当前需求:整理出行清单。(用户所有原始消息已完整保留)
推荐流程:先免费后花钱
- 本地截断:删掉工具输出、截断超长 JSON
- 模板替换:把重复结构替换为占位符
- 检查是否够:还超窗口?进入下一步
- LLM 摘要:花钱让 AI 精炼上下文
先用免费的方法尽量压,实在压不下去了再花钱请 AI 帮忙,这个顺序不能反。 本地压缩和 LLM 压缩是流水线上的先后环节,无需二选一。
结语:上下文管理三板斧
三长问题逼你管,删压留框架定边界,先免费后花钱是流水线。
回顾全文:对话越长越贵、越长越笨、越长越危险,三长问题没有可选的余地,必须管理;删压留框架给出边界——工具输出直接删、AI 回复摘要压、用户消息是圣物;本地压缩和 LLM 压缩不是二选一,而是先免费后花钱的流水线,本地截断、模板替换、检查水位、LLM 收尾。
记住那句最关键的:宁可删 AI 自己说的 1000 字,也别动用户说的 10 个字。 上下文管理的本质,是知道什么必须留下,什么可以放手。