深色模式
上下文与记忆
是什么
管理 Agent 在一次会话内(短期)和跨会话(长期)可用的事实与状态。
为什么需要
没有记忆,Agent 每轮都从零开始;记忆太多,上下文窗口被噪声淹没、成本飙升。记忆管理的核心是"该忘的忘、该记的记、该检索的检索"。
核心概念
- 短期记忆:当前对话的 messages 列表,受上下文窗口约束。
- 长期记忆:跨会话保留的知识,常存于向量库 / 数据库 / 文件。
- 上下文压缩:对超长历史做摘要、去重、裁剪,保留关键决策与结论。
- 写入触发:重要结论(用户偏好、任务状态)主动落库,而非全量保留。
最小范式(长期记忆检索)
python
# 写入
vec.upsert(text="用户偏好用 kubectl 而非 UI 操作集群", metadata={"type": "preference"})
# 读取:每次请求前,按当前用户意图检索相关记忆注入 system
hits = vec.search(query=user_query, top_k=3)
memory_block = "\n".join(h["text"] for h in hits)
messages = [
{"role": "system", "content": f"已知用户背景:\n{memory_block}"},
{"role": "user", "content": user_query},
]1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
压缩策略
- 滚动摘要:每 N 轮把历史压成一段摘要,保留在 system。
- 关键事件保留:工具调用结果、用户确认、最终决策——这些优先保留,闲聊可丢。
- 分层:最近 3 轮原文 + 更早的摘要 + 检索到的长期记忆。
常见陷阱
- 全量塞历史:长对话直接超窗口、成本爆炸。
- 噪声注入:检索回大量弱相关内容,反而干扰决策——需要重排与阈值过滤。
- 记忆污染:把模型幻觉当事实写入长期记忆,越积越错。写入前校验来源。
参考
- LangChain Memory 模块文档
- LlamaIndex Memory / Index 文档
- 向量数据库官方文档(Milvus / Qdrant / pgvector)