当AI Agent需要处理超长历史记忆(如数千轮对话或跨天任务上下文)时,受限于大模型的上下文窗口长度和推理效率,应如何设计高效、可扩展的记忆管理机制?请结合实际场景,系统阐述记忆的分层存储、摘要生成、检索策略、更新与刷新机制,并说明各组件的协同方式与权衡考量。
Agent 的记忆模块是将 LLM 从无状态函数转变为有状态智能体的关键组件。三层 Memory 架构:In-Context Memory(当前上下文,有限)、Short-Term Buffer(会话历史缓冲)、Long-Term Storage(向量库 + 知识图谱,无限)。核心挑战:如何在上下文窗口有限的前提下,让 Agent 既记住近期对话的细节,又能检索到久远但相关的历史信息。
三层 Memory 架构
Layer 1: In-Context Memory(有限,实时)|- System Prompt(只读指令)
|- Working Memory(当前工作空间)
|- Recent Messages(最近消息)
Layer 2: Short-Term Buffer(会话级,临时)
|- Session History(会话历史)
|- Temporary Scratchpad(临时草稿)
|- 存储:Redis(低延迟,TTL 过期)
Layer 3: Long-Term Storage(跨会话,持久)
|- Vector Database(向量语义检索)
|- Knowledge Graph(图谱关系推理)
|- User Profiles(用户画像)
|- 存储:Milvus / Qdrant + PostgreSQL
数据库存储格式设计
# Milvus 向量数据库 Schema(用于长期记忆语义检索) from pymilvus import CollectionSchema, FieldSchema, DataTypefields = [
FieldSchema(name="doc_id", dtype=DataType.VARCHAR,
max_length=128, is_primary=True),
FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=65535),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536),
FieldSchema(name="metadata", dtype=DataType.JSON),
FieldSchema(name="created_at", dtype=DataType.INT64),
]
# metadata 字段存储关键信息metadata = {
"user_id": "USR001",
"session_id": "SESSION_001",
"memory_type": "episodic", # episodic / semantic / procedural
"importance": 0.85, # 重要性分数
"access_count": 3, # 访问次数(强化记忆用)
"last_accessed": "2024-01-15T10:30:00Z"
}
多轮对话的 Query 改写
def rewrite_query_with_history(query: str, history: list) -> str:if not has_pronoun(query):
return query
prompt = (
f"对话历史:{format_history(history[-3:])}\n"
f"当前问题:{query}\n"
"请将当前问题改写为独立完整的问题(不含代词):"
)
return llm.generate(prompt)
# 示例: # 历史:用户之前问了意外险相关问题 # 当前:「那摔伤算吗?」-> 改写为「意外险中摔伤是否在保障范围内?」
检索综合评分公式
综合分数 = alpha * 语义相关性 + beta * 时间衰减 + gamma * 重要性时间衰减:decay = exp(-lambda * (now - last_accessed) / days)
重要性:access_count / max_access_count(越常被调取越重要)
超长历史的管理策略
层次化摘要(MemGPT 方案):原始对话 -> 每日摘要 -> 每周摘要 -> 长期精华
新对话发生时:查近期详细记录 + 早期概要,详细与全局兼顾
记忆遗忘机制(参考艾宾浩斯遗忘曲线):
长时间未访问 -> 降低权重 -> 最终删除
经常被访问 -> 增加权重 -> 永久保留
将操作系统虚拟内存管理引入 LLM:主上下文(有限)+ 外部存储(无限)。LLM 通过函数调用自主决定何时读写记忆,实现「无限上下文」的幻觉效果。Berkeley NeurIPS 2023 提出。
2025 年最新方案:基于图的可扩展 Memory 架构。相比 OpenAI 方案提升 26% 准确率,降低 91% p95 延迟,节省 90%+ token 成本。支持 ADD/UPDATE/DELETE/NOOP 四种写入决策。
语义记忆(Semantic):事实知识,通过 RAG 实现;情景记忆(Episodic):具体事件和经历,存对话历史;程序记忆(Procedural):如何执行任务,通过工作流模板积累。
每条 Memory Entry 必须携带:content(文本)、embedding(向量)、metadata(user_id/session_id/importance/memory_type/access_count)。importance 和 access_count 是检索排序的关键字段。
被问Agent 的长期记忆怎么实现,不要只说用向量数据库。正确答案:我们用三层架构:Layer 1 是当前上下文窗口的 In-Context Memory;Layer 2 是 Redis 存储的短期会话历史(TTL 24小时);Layer 3 是 Milvus 向量库存储的长期记忆(持久化)。检索时综合考虑语义相关性 + 时间衰减 + 访问频率三个维度加权排序。多轮对话中,我们在检索前做 Query 改写,把『那摔伤算吗』这类含代词的问题改写为『意外险中摔伤是否在保障范围内』,检索召回率提升约 12%。