解析Agent上下文管理的核心挑战(token限制、信息衰减),系统介绍分层摘要、结构化记忆、多Agent协作等策略,并提供生产级混合方案(锚定+分层+RAG)的代码示例与选择对照表。
Tags:
上下文管理是构建可靠 AI Agent 的核心技术。本文系统梳理了主流的上下文管理策略和最佳实践。
为什么需要上下文管理?
LLM 有固定的 context window(上下文窗口)限制,需要解决三个核心问题:
- 长度限制
:对话/任务越长,越容易超出 token 限制 - 信息衰减
:早期关键信息在长上下文末尾被"稀释" - 噪声干扰
:无关步骤/错误尝试会干扰当前推理
常见的上下文管理策略
2️⃣
分层上下文 + 摘要总结
将上下文分为两层:
- 当前工作层
:最近几轮完整对话(全部保留) - 历史摘要层
:更早对话由 LLM 压缩成摘要
# 伪代码示例
class LayeredContext:
def __init__(self, max_recent=5):
self.max_recent = max_recent
self.recent_messages = [] # 当前工作层
self.summary = "" # 历史摘要层
def add_message(self, msg):
self.recent_messages.append(msg)
if len(self.recent_messages) > self.max_recent:
# 触发摘要压缩
old_messages = self.recent_messages[:-self.max_recent]
self.summary = self.compress_to_summary(old_messages, self.summary)
self.recent_messages = self.recent_messages[-self.max_recent:]
def build_prompt(self):
return [
{"role": "system", "content": f"历史对话摘要:\n{self.summary}"},
*self.recent_messages
]✓ 优点
token 可控,保留历史信息
✗ 缺点
摘要可能丢失细节
适用场景:多步骤任务、编码助手
5️⃣
结构化记忆分区
Claude Code / OpenClaw 这类成熟 agent 常用:
6️⃣
多 Agent 协作的上下文管理
在多 agent 场景下:
- 协调者 Agent
:只保留任务目标、整体进度、各 agent 接口契约 - 工作者 Agent
:只拿到自己负责子任务的详细上下文 - 上下文传递
:通过"任务描述+结果摘要"的方式在 agent 间传递
推荐:生产级混合方案
class SmartContextManager:
def __init__(self, max_tokens=100000, keep_recent=8):
self.max_tokens = max_tokens
self.keep_recent = keep_recent
self.anchor_messages = [] # 锚定信息(目标、约束)
self.recent_messages = [] # 最近轮次
self.memory_db = None # 向量记忆库(可选)
def add_anchor(self, msg):
"""锚定信息永远不压缩"""
self.anchor_messages.append(msg)
def add_message(self, msg):
self.recent_messages.append(msg)
if self.estimate_tokens() > self.max_tokens * 0.7:
self.compress()
def compress(self):
"""分层压缩"""
if len(self.recent_messages) > self.keep_recent:
# 把超出的移到摘要/向量库
to_archive = self.recent_messages[:-self.keep_recent]
if self.memory_db:
self.memory_db.add(to_archive)
else:
self.summary = self.summarize(to_archive, self.summary)
self.recent_messages = self.recent_messages[-self.keep_recent:]
def build_context(self, query=None):
"""构建最终上下文,支持检索"""
context = self.anchor_messages.copy()
if self.summary:
context.append({"role": "system",
"content": f"之前对话摘要:\n{self.summary}"})
if self.memory_db and query:
# 动态召回相关记忆
retrieved = self.memory_db.search(query, top_k=3)
context.append({"role": "system",
"content": f"检索到的相关历史:\n{retrieved}"})
context.extend(self.recent_messages)
return context选择对照表
一句话总结
关键信息锚定置顶,近期对话完整保留,远期历史压缩归档,需要的时候检索召回 👍
对 ai感兴趣可以进群聊聊
没有评论:
发表评论