
🧠 记忆锚点:规则不丢、最近保真、旧史摘要,工具与检索只留有用。
💡 答案要点
问题背景:
- 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}] + recent2. 分层记忆管理
┌─────────────────────────────────────────┐
│ 分层记忆架构 │
├─────────────────────────────────────────┤
│ 短期记忆:当前任务上下文(完整) │
│ ↓ 超过限制时总结 │
│ 中期记忆:最近重要对话(摘要) │
│ ↓ 定期归档 │
│ 长期记忆:向量数据库检索(按需) │
└─────────────────────────────────────────┘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 消耗。"