
🧠 记忆锚点:当前任务进工作记忆,经历进情节,知识进语义,做法进程序。
💡 答案要点
记忆分类(四类):
┌─────────────────────────────────────────────────────┐
│ Agent 记忆体系 │
├───────────┬───────────┬───────────┬─────────────────┤
│ 工作记忆 │ 情节记忆 │ 语义记忆 │ 程序记忆 │
│ 当前对话 │ 历史事件 │ 知识概念 │ 技能/流程 │
│ in-context│ 向量DB │ 知识图谱 │ 工具调用链 │
│ 临时 │ 可查询 │ 持久化 │ 持久化 │
└───────────┴───────────┴───────────┴─────────────────┘工程实现(分层架构):
展开 Python 代码示例(39 行)
python
class AgentMemory:
def __init__(self):
# Layer 1: 工作记忆(当前 context window)
self.working_memory = [] # 当前对话消息列表
self.max_working_tokens = 4000 # 工作记忆上限
# Layer 2: 情节记忆(历史对话向量化)
self.episodic_memory = VectorDB() # Chroma/Pinecone
# Layer 3: 语义记忆(持久知识库)
self.semantic_memory = KnowledgeBase()
def remember(self, message: dict):
"""写入记忆"""
self.working_memory.append(message)
# 超出工作记忆上限 → 压缩 → 写入情节记忆
if self._count_tokens() > self.max_working_tokens:
self._compress_to_episodic()
def recall(self, query: str) -> list:
"""检索相关记忆"""
# 1. 先查工作记忆(最近对话,直接用)
recent = self.working_memory[-3:]
# 2. 再查情节记忆(历史对话中相关的)
episodic = self.episodic_memory.search(query, top_k=3)
# 3. 再查语义知识库
semantic = self.semantic_memory.search(query, top_k=2)
return recent + episodic + semantic
def _compress_to_episodic(self):
"""工作记忆 → 情节记忆(摘要后向量化存储)"""
old_turns = self.working_memory[:-3] # 保留最近3轮
summary = llm_summarize(old_turns)
self.episodic_memory.add(summary, metadata={"timestamp": now()})
self.working_memory = self.working_memory[-3:] # 裁剪实际项目中的记忆策略选择:
| 场景 | 推荐策略 | 原因 |
|---|---|---|
| 简单客服机器人 | 工作记忆(最近5轮) | 简单够用,成本低 |
| 个人助手 | 工作记忆 + 情节记忆 | 需要记住用户偏好 |
| 知识库问答 | 工作记忆 + 语义记忆 | 需要检索外部知识 |
| 复杂多轮Agent | 四层全用 | 复杂任务需要全局记忆 |
面试话术:
示例表达(仅在能用本人经历或可复现实验佐证时使用): "我把 Agent 记忆分四层:工作记忆(当前 context,4K token 上限)、情节记忆(历史对话压缩后存向量DB)、语义记忆(知识库 RAG)、程序记忆(工具调用链缓存)。超出工作记忆上限时,自动压缩老对话写入情节记忆,下次 recall 时语义搜索取回。实测减少 token 消耗 60%,响应速度提升40%。"