Skip to content
🔗 分享本题
查看我的学习进度 →

Agent 在固定上下文预算内对规则、对话、工具结果、检索片段和工作状态分层压缩

🧠 记忆锚点:规则不丢、最近保真、旧史摘要,工具与检索只留有用。

💡 答案要点

问题背景:

  • LLM 有上下文窗口限制(4K-200K Token 不等)
  • 对话历史、工具返回、检索内容都可能超限
  • 需要策略管理上下文大小

核心策略:

1. 对话历史压缩

方法说明效果
滑动窗口只保留最近 N 轮简单但可能丢失重要上下文
摘要压缩LLM 总结旧对话,保留要点保留关键信息,但有信息损失
重要性筛选保留与当前任务相关的历史更精准,但需要额外判断
python
# 摘要压缩示例
def compress_history(messages, max_turns=10):
    if len(messages) <= max_turns:
        return messages

    # 保留最近 N 轮
    recent = messages[-max_turns:]

    # 压缩旧对话
    old = messages[:-max_turns]
    summary = llm.summarize(f"总结以下对话要点:{old}")

    return [{"role": "system", "content": summary}] + recent

2. 分层记忆管理

┌─────────────────────────────────────────┐
│            分层记忆架构                    │
├─────────────────────────────────────────┤
│ 短期记忆:当前任务上下文(完整)           │
│          ↓ 超过限制时总结                  │
│ 中期记忆:最近重要对话(摘要)             │
│          ↓ 定期归档                        │
│ 长期记忆:向量数据库检索(按需)           │
└─────────────────────────────────────────┘

3. 工具返回裁剪

python
# 工具返回往往很长,需要裁剪
def trim_tool_result(result, max_tokens=2000):
    if len(result) <= max_tokens:
        return result

    # 截断 + 摘要
    truncated = result[:max_tokens]
    summary = llm.summarize(f"总结以下内容要点:{truncated}")
    return summary + "\n[内容已压缩]"

4. RAG 检索上下文优化

策略说明
Top-K 限制只检索最相关的 K 个 Chunk
Token 预算限制每个 Chunk 的最大 Token 数
层级检索先检索摘要层,再检索详细内容
去重压缩多个 Chunk 有重叠时合并

面试话术:

"上下文管理是 Agent 落地的关键工程问题。我的策略是分层记忆:短期保留完整上下文,中期用摘要,长期用向量检索。对于工具返回,我会在传入 LLM 前先做裁剪和摘要,避免无效 Token 消耗。"

📚 参考:Anthropic:Context Windows(长上下文管理)