林逍遥 AI林逍遥 AI
登录
上下文压缩编辑

上下文管理:压缩、编辑、缓存策略

·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 应用实现上下文管理。

  1. 实现 Compaction 函数,在对话超过 20 轮时自动压缩
  2. 在 system prompt 上启用 Prompt Caching
  3. 对比有/无上下文管理时的成本和响应质量

关键要点

Note: 本文核心总结

  • Compaction:用便宜模型压缩历史,保留关键信息
  • Context Editing:选择性删除冗余内容
  • Prompt Caching:缓存不变的内容,节省 90% 费用
  • 三者组合使用效果最佳
二维码
微信公众号:lingxiaoyao

关注公众号,获取最新 AI 教程和课程更新

加载评论中...