AI Agent 记忆系统设计:从短期上下文到长期知识持久化的工程实践
AI Agent 记忆系统设计从短期上下文到长期知识持久化的工程实践一、多轮对话的失忆困境Agent 为何总是记不住大模型驱动的 Agent 在实际落地中最常被用户吐槽的问题不是回答不够聪明而是记不住之前说过什么。单轮对话中LLM 表现出色但跨会话、跨任务的场景下Agent 的记忆断裂导致重复提问、上下文丢失、决策不一致。这种失忆在客服、项目管理和代码辅助等长周期场景中尤为致命。生产环境的 Agent 系统需要三类记忆能力短期记忆当前会话的上下文窗口、工作记忆跨轮次的任务状态追踪和长期记忆用户偏好、历史决策和领域知识的持久化存储。三者协同才能让 Agent 在复杂任务中保持连贯性。二、记忆分层架构从 Token 窗口到向量持久化Agent 记忆系统的核心挑战在于LLM 的上下文窗口有限即使 128K 也无法覆盖长周期任务而外部存储的检索又存在延迟和相关性衰减。合理的分层架构是解决这一矛盾的关键。graph TB subgraph 记忆分层 A[短期记忆br/Context Window] -- B[工作记忆br/Redis/State Store] B -- C[长期记忆br/Vector DB KV Store] end subgraph 记忆操作 D[写入] -- A A --|滑动窗口淘汰| B B --|重要性评分| C C --|相关性检索| A end subgraph 记忆类型 E[对话历史] -- A F[任务状态] -- B G[用户画像] -- C H[领域知识] -- C end短期记忆直接映射到 LLM 的上下文窗口受 Token 限制采用滑动窗口策略保留最近 N 轮对话。工作记忆存储当前任务的结构化状态如待办列表、中间结果使用 Redis 等低延迟存储。长期记忆则通过向量数据库如 Milvus、Qdrant存储历史对话摘要、用户偏好和领域知识按相关性检索后注入上下文。三、生产级记忆系统实现3.1 短期记忆管理器from dataclasses import dataclass, field from typing import List, Optional import tiktoken dataclass class Message: role: str content: str token_count: int 0 class ShortTermMemory: 短期记忆管理上下文窗口内的对话历史 def __init__(self, max_tokens: int 8000, model: str gpt-4): self.max_tokens max_tokens self.messages: List[Message] [] # 使用 tiktoken 精确计算 Token 数而非粗略估算 self.encoder tiktoken.encoding_for_model(model) self.system_prompt_tokens 0 def _count_tokens(self, text: str) - int: return len(self.encoder.encode(text)) def add(self, role: str, content: str) - None: 添加消息并自动淘汰超出窗口的旧消息 token_count self._count_tokens(content) msg Message(rolerole, contentcontent, token_counttoken_count) self.messages.append(msg) self._evict() def _evict(self) - None: 滑动窗口淘汰保留系统提示 最近的消息 total sum(m.token_count for m in self.messages) self.system_prompt_tokens # 从最早的非系统消息开始淘汰 while total self.max_tokens and len(self.messages) 1: removed self.messages.pop(0) total - removed.token_count def get_context(self) - List[dict]: return [{role: m.role, content: m.content} for m in self.messages]3.2 长期记忆与重要性评分import numpy as np from datetime import datetime dataclass class MemoryEntry: content: str embedding: np.ndarray importance: float # 0-1 重要性评分 access_count: int 0 created_at: datetime field(default_factorydatetime.now) last_accessed: datetime field(default_factorydatetime.now) class LongTermMemory: 长期记忆基于向量检索 重要性评分的持久化存储 def __init__(self, embedding_dim: int 1536): self.embeddings: np.ndarray np.empty((0, embedding_dim)) self.entries: List[MemoryEntry] [] def store(self, content: str, embedding: np.ndarray, importance: float) - None: 存储记忆importance 由 LLM 评分或规则计算 entry MemoryEntry( contentcontent, embeddingembedding, importanceimportance ) self.entries.append(entry) self.embeddings np.vstack([self.embeddings, embedding.reshape(1, -1)]) def retrieve(self, query_embedding: np.ndarray, top_k: int 5, recency_weight: float 0.3, importance_weight: float 0.4, relevance_weight: float 0.3) - List[str]: 混合检索相关性 重要性 时效性 if len(self.entries) 0: return [] # 计算余弦相似度 norms np.linalg.norm(self.embeddings, axis1) query_norm np.linalg.norm(query_embedding) similarities (self.embeddings query_embedding) / (norms * query_norm 1e-8) # 时效性衰减越近期的记忆权重越高 now datetime.now() recency_scores np.array([ 1.0 / (1.0 (now - e.last_accessed).total_seconds() / 86400) for e in self.entries ]) importance_scores np.array([e.importance for e in self.entries]) # 加权融合 combined (relevance_weight * similarities importance_weight * importance_scores recency_weight * recency_scores) top_indices np.argsort(combined)[-top_k:][::-1] results [] for idx in top_indices: self.entries[idx].access_count 1 self.entries[idx].last_accessed now results.append(self.entries[idx].content) return results3.3 重要性评分策略记忆写入长期存储前需要评估其值得记住的程度。评分维度包括信息密度是否包含决策或偏好、情感强度用户是否表达了强烈态度、任务关联度是否与当前目标相关。实践中通过 LLM 对记忆内容打分0-1比纯规则评分更准确但需要控制调用成本。四、记忆系统的 Trade-offs 与边界分析延迟与质量的矛盾长期记忆检索需要向量相似度计算在高并发场景下检索延迟可能达到 50-200ms。如果每轮对话都需要检索端到端响应时间会显著增加。折中方案是对高频访问的记忆做缓存仅在缓存未命中时触发向量检索。存储成本与遗忘策略长期记忆无限增长会导致检索质量下降和存储成本上升。需要设计遗忘机制基于重要性评分和访问频率定期淘汰低分记忆。但遗忘策略过于激进会导致关键信息丢失过于保守则检索噪声增大。一致性风险长期记忆中的过时信息可能误导 Agent 决策。例如用户偏好已改变但旧记忆仍被检索到。解决方案是在记忆中增加版本标记和过期时间检索时优先返回最新版本。适用边界记忆系统适合长周期、多轮次的交互场景客服、项目管理、个人助手。对于单轮问答或无状态工具调用场景引入记忆层反而增加复杂度得不偿失。五、总结Agent 记忆系统的设计核心在于分层短期记忆保证当前对话的连贯性工作记忆追踪任务状态长期记忆实现跨会话的知识持久化。工程落地上滑动窗口管理短期上下文向量检索 重要性评分驱动长期记忆的存取三者通过统一的记忆管理器协调。关键落地步骤首先实现短期记忆的滑动窗口确保基础对话连贯其次引入工作记忆管理任务状态最后接入向量数据库实现长期记忆。每一步都需要配合性能监控——记忆检索延迟、命中率、遗忘率——才能在质量与成本之间找到平衡点。