上下文压缩编辑
上下文管理:压缩、编辑、缓存策略
·约 8 分钟阅读
上下文窗口再大也有上限。在生产级 AI 应用中,上下文管理决定了应用的质量和成本。本文讲解三大核心策略:Compaction(压缩摘要)、Context Editing(自动裁剪)、Prompt Caching(缓存复用)。
你将学到什么
- 上下文溢出的问题和解决方案
- Compaction:自动压缩对话历史
- Context Editing:选择性裁剪上下文
- Prompt Caching:缓存重复内容降本 90%
- 三大策略的最优组合
上下文溢出的问题
当对话越来越长,最终会超出上下文窗口。简单的截断方式会导致 Claude 丢失早期的重要信息。
常见溢出场景:
- 长时间多轮对话(客服、编程助手)
- 大量参考文档 + 对话历史
- Agent 多次工具调用的历史记录
策略一:Compaction(压缩摘要)
用 Claude 自己来压缩历史对话——保留关键信息,丢弃冗余内容。
def compact_history(messages, max_tokens=50000):
"""当历史超过阈值时,压缩早期消息"""
# 估算当前 token 数
total_chars = sum(len(str(m["content"])) for m in messages)
estimated_tokens = total_chars // 2 # 粗略估算
if estimated_tokens < max_tokens:
return messages # 不需要压缩
# 将早期消息压缩为摘要
early_messages = messages[:-6] # 保留最近 6 条
recent_messages = messages[-6:]
summary_response = client.messages.create(
model="claude-haiku-4-5", # 用便宜的模型做压缩
max_tokens=2000,
messages=[{
"role": "user",
"content": "请将以下对话历史压缩为简洁摘要,保留所有重要信息和决定:\n\n"
+ format_messages(early_messages)
}]
)
summary = summary_response.content[0].text
return [
{"role": "user", "content": f"[之前对话摘要]\n{summary}"},
{"role": "assistant", "content": "好的,我已了解之前的对话内容。"},
*recent_messages
]
要点:
- 用 Haiku 做压缩(成本低、速度快)
- 保留最近几轮原始对话(最新上下文不能丢)
- 压缩摘要要包含关键决策和信息
策略二:Context Editing(选择性裁剪)
不是压缩所有内容,而是选择性删除不再需要的部分。
def edit_context(messages):
"""删除不再需要的上下文"""
edited = []
for msg in messages:
content = str(msg["content"])
# 删除已完成的工具调用详情(只保留结果)
if "tool_result" in content and len(content) > 1000:
# 只保留工具调用结果的摘要
msg = simplify_tool_result(msg)
# 删除大块代码(如果后续已经修改过)
# 删除冗余的解释性文字
edited.append(msg)
return edited
适合裁剪的内容:
- 已完成的工具调用的详细输入/输出
- 被后续修改覆盖的旧代码
- 重复的解释性内容
- 临时的中间结果
策略三:Prompt Caching
缓存不变的内容(system prompt、参考文档),后续请求只需 0.1x 的价格。
# 第一次请求:写入缓存
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
system=[
{
"type": "text",
"text": long_system_prompt, # 比如 10K token 的指令
"cache_control": {"type": "ephemeral"}
},
{
"type": "text",
"text": reference_docs, # 比如 50K token 的参考文档
"cache_control": {"type": "ephemeral"}
}
],
messages=[{"role": "user", "content": "基于以上文档回答问题"}]
)
# 第二次请求:自动命中缓存
# 只要 system prompt 相同的前缀部分匹配,就会命中
# 节省 90% 的输入 token 费用
缓存规则:
- 缓存存活 5 分钟(TTL)
- 前缀匹配——只要前面部分相同就能命中
- 最小缓存 1024 token(Sonnet/Opus)、2048 token(Haiku)
最优组合策略
┌─────────────────────────────────────────────────┐
│ Prompt Caching │
│ ┌──────────────────────────────────────┐ │
│ │ System Prompt + 参考文档(缓存) │ │
│ └──────────────────────────────────────┘ │
│ ┌──────────────────────────────────────┐ │
│ │ 压缩后的历史摘要(Compaction) │ │
│ └──────────────────────────────────────┘ │
│ ┌──────────────────────────────────────┐ │
│ │ 裁剪后的最近对话(Context Editing) │ │
│ └──────────────────────────────────────┘ │
│ ┌──────────────────────────────────────┐ │
│ │ 最新用户消息 │ │
│ └──────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
实战练习
Tip: 为你的 AI 应用实现上下文管理。
- 实现 Compaction 函数,在对话超过 20 轮时自动压缩
- 在 system prompt 上启用 Prompt Caching
- 对比有/无上下文管理时的成本和响应质量
关键要点
Note: 本文核心总结
- Compaction:用便宜模型压缩历史,保留关键信息
- Context Editing:选择性删除冗余内容
- Prompt Caching:缓存不变的内容,节省 90% 费用
- 三者组合使用效果最佳