摘要:AI Agent 为什么总是"失忆"?本文深度解析 Agent Memory(智能体记忆)的核心原理,涵盖5种记忆策略、3个代码示例,以及主流开源框架对比。让你的 AI 从"每次都是陌生人"变成"越用越懂你"。
你的 AI 有多"健忘"?
你有没有遇到过这种情况:
你:我上次说喜欢简洁的回答,怎么又给我写这么长?
AI:抱歉,我不记得您之前的偏好...
每次和 AI Agent 对话都像"第一次见面"——它不记得你是谁、你喜欢什么、上次聊了什么。
这不是 AI 的错,而是因为它没有"记忆系统"(Agent Memory)。
今天这篇文章,我会用最通俗的方式,讲清楚 AI Agent 记忆系统的核心原理,让你明白为什么有些 AI 越用越聪明,而有些永远在"失忆"。无论你是 AI 开发者还是产品经理,都能从中找到让 AI 更智能的解决方案。
一、为什么 AI Agent 需要记忆系统?
大语言模型(LLM)有一个天然限制:上下文窗口。
你可以把它想象成 AI 的"工作记忆"——就像人类的短期记忆,容量有限。即使 GPT-4o 支持 128K tokens,对于长期运行的 Agent 来说仍然不够。
更重要的是:
- 对话结束 = 记忆清零:
关掉窗口,下次打开 AI 完全不认识你 - 上下文越长,成本越高:
Token 数量直接影响 API 费用 - 早期信息容易被"遗忘":
长对话中,前面的内容可能被忽略
Agent Memory 的核心目标:让 AI 在跨会话、长时间交互中保持连贯性和个性化。
二、AI Agent 记忆的三种类型
借鉴认知科学,Agent 的记忆分为三层:
1. 工作记忆(Working Memory)
- 特点:
任务级、临时、结构化 - 类比:
你心算 24×3 时,脑子里暂存的中间结果 - 存储:
内存中的字典/对象
2. 短期记忆(Short-term Memory)
- 特点:
容量小、时效短、上下文相关 - 类比:
刚查到的电话号码,拨完号就忘了 - 存储:
对话历史列表(Context Window)
代码示例:最简单的短期记忆实现
from openai import OpenAI
client = OpenAI()
classShortTermMemory:
"""短期记忆:维护对话历史列表"""
def__init__(self):
self.messages = [{"role":"system", "content":"你是一个有帮助的助手。"}]
defchat(self, user_input: str) -> str:
# 1. 用户输入加入记忆
self.messages.append({"role":"user", "content": user_input})
# 2. 调用 API(携带完整对话历史 = 短期记忆)
response = client.chat.completions.create(
model="gpt-4o", messages=self.messages
)
# 3. 助手回复也加入记忆
reply = response.choices[0].message.content
self.messages.append({"role":"assistant", "content": reply})
return reply
# 使用示例
memory = ShortTermMemory()
memory.chat("我叫小明,正在学 Python")
memory.chat("你还记得我叫什么吗?") # ✅ 能记住:你叫小明
局限性:对话历史会越来越长,Token 消耗不断增加,且程序重启后记忆丢失。
3. 长期记忆(Long-term Memory)
- 特点:
持久存储、可检索、可结构化 - 类比:
你记得"10年前去过巴黎",也记得"骑自行车的技巧" - 存储:
数据库 / 向量库 / 知识库
长期记忆又细分为:
- 情景记忆:
记录特定事件("上次用户说喜欢简洁回答") - 语义记忆:
抽象知识("巴黎是法国首都") - 程序性记忆:
技能和流程(调用工具链、执行计划) - 偏好记忆:
用户画像("用户喜欢用中文回复")
三、AI Agent 记忆存储:5种策略对比
| 原始对话 | |||
| 摘要保存 | |||
| 事实抽取 | |||
| 向量存储 | |||
| 知识图谱 |
工程实践建议:多数生产级系统采用混合策略——短期用原始对话,长期用事实抽取 + 向量存储。
代码示例:用 Embedding + 向量检索实现长期记忆
import numpy as np
from openai import OpenAI
client = OpenAI()
classLongTermMemory:
"""长期记忆:基于 Embedding 语义检索"""
def__init__(self):
self.memories = [] # {"content": str, "embedding": list}
def_get_embedding(self, text: str) -> list:
"""调用 OpenAI Embedding API 生成向量"""
response = client.embeddings.create(
model="text-embedding-3-small", input=text
)
return response.data[0].embedding
defadd_memory(self, content: str):
"""存储一条记忆"""
embedding = self._get_embedding(content)
self.memories.append({"content": content, "embedding": embedding})
defsearch(self, query: str, top_k: int = 3) -> list:
"""语义检索最相关的记忆"""
ifnotself.memories:
return []
query_emb = np.array(self._get_embedding(query))
scored = []
for mem inself.memories:
mem_emb = np.array(mem["embedding"])
# 余弦相似度
sim = np.dot(query_emb, mem_emb) / (
np.linalg.norm(query_emb) * np.linalg.norm(mem_emb)
)
scored.append((sim, mem["content"]))
scored.sort(key=lambda x: x[0], reverse=True)
return [content for _, content in scored[:top_k]]
# 使用示例
memory = LongTermMemory()
memory.add_memory("小明是后端开发者,主要用 Python 和 FastAPI")
memory.add_memory("小明喜欢简洁的回答风格")
memory.add_memory("小明的项目用 PostgreSQL 数据库")
# 跨会话后,语义检索
results = memory.search("你用什么技术栈?")
print(results) # ✅ 返回:小明是后端开发者,主要用 Python 和 FastAPI
核心优势:即使用户问"技术栈",也能匹配到"Python 和 FastAPI"——这就是语义检索的威力。
四、AI Agent 短期记忆的5种修剪策略
对话历史会不断膨胀,必须主动修剪。5种策略:
1. 滑动窗口
只保留最近的 N 条消息,超出则从头部丢弃。
- 优点:
实现极简 - 缺点:
可能丢失重要早期信息
2. Token 限制裁剪
按 Token 数量控制,超限时从最旧消息开始移除。
- 优点:
精确控制成本 - 缺点:
仍按时间顺序丢弃
3. 摘要压缩
用 LLM 将旧对话压缩成摘要,用摘要替代原始消息。
- 优点:
不丢失关键信息 - 缺点:
额外 LLM 调用有延迟和成本
4. 重要性评分
对每条消息打分(基于关键词、角色、时间等),优先保留高分消息。
- 优点:
智能保留关键信息 - 缺点:
评分规则需要针对场景调优
5. 分层修剪
结合多种策略,不同阶段使用不同的修剪方式:
对话开始 → 滑动窗口(轻量级) 达到中等长度 → 重要性评分(智能判断) 达到长度上限 → 摘要压缩(压缩旧消息) 会话结束 → 事实抽取(沉淀到长期记忆)
工程实践建议:简单场景用滑动窗口 + Token 裁剪即可;复杂 Agent 推荐分层修剪。
代码示例:滑动窗口 + 摘要压缩
from openai import OpenAI
client = OpenAI()
classSmartMemory:
"""智能记忆:滑动窗口 + 摘要压缩"""
def__init__(self, max_turns: int = 10, summarize_threshold: int = 15):
self.messages = []
self.summary = ""# 压缩后的摘要
self.max_turns = max_turns
self.threshold = summarize_threshold
defadd(self, role: str, content: str):
self.messages.append({"role": role, "content": content})
# 超过阈值时,用 LLM 压缩旧消息为摘要
iflen(self.messages) > self.threshold * 2:
self._compress()
# 超过窗口大小时,丢弃最早的消息
whilelen(self.messages) > self.max_turns * 2:
self.messages.pop(0)
def_compress(self):
"""将旧消息压缩为摘要"""
to_summarize = self.messages[:-4] # 保留最近4条
to_keep = self.messages[-4:]
conversation = "\n".join(
f"{m['role']}:{m['content']}"for m in to_summarize
)
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role":"system",
"content":"将对话压缩为简洁摘要,保留关键信息。"
}, {"role":"user", "content": conversation}]
)
self.summary = response.choices[0].message.content
self.messages = to_keep
defget_context(self) -> list:
result = []
ifself.summary:
result.append({"role":"system", "content":f"[历史摘要] {self.summary}"})
result.extend(self.messages)
return result
# 使用示例
memory = SmartMemory()
# 对话超过阈值时,自动压缩旧消息为摘要
# 摘要保留关键信息,新消息保持原文
效果:对话越长,越智能——旧消息被压缩成摘要,新消息保持原文,兼顾信息保留和成本控制。
五、AI Agent 记忆如何融入系统?
一个完整的 Agent 系统,记忆贯穿整个生命周期:
用户输入
│
▼
① 记忆检索 → 从存储中检索相关记忆
│
▼
② 上下文构建 → 将检索到的记忆注入 Prompt
│
▼
③ LLM 推理 → 基于记忆+当前输入生成响应
│
▼
④ 记忆存储 → 将新的交互信息写入记忆
│
▼
⑤ 记忆管理 → 压缩、合并、清理过期记忆
关键设计原则:
- 不要把所有东西都存进上下文
— 只检索与当前对话最相关的记忆 - 记忆需要定期维护
— 合并重复记忆、清理过期信息 - 区分记忆类型
— 不同类型用不同的存储和检索策略 - 保护用户隐私
— 敏感信息加密存储,提供遗忘/删除机制
六、主流 AI Agent 记忆框架对比
| Mem0 | ||
| LlamaIndex Memory | ||
| LangChain Memory | ||
| OpenAI Agents SDK | ||
| agents.md |
总结:你的 Agent 需要什么记忆?
你的 Agent 需要什么记忆?
│
├── 只需要当前对话 → 对话历史列表
│
├── 对话很长但只需最近内容 → 滑动窗口
│
├── 需要跨会话记住事实 → 向量检索
│
└── 完整的个性化体验 → 多层架构
记住:没有记忆的 Agent 每次对话都是"失忆"状态;有记忆的 Agent 能记住你是谁、你喜欢什么、上次聊了什么,越用越聪明。
参考资料
解密prompt系列55.Agent Memory的工程实现 - Mem0 & LlamaIndex Agent 记忆系统完整实现系列 MemOS 源码笔记 — 记忆分类 Agentic Memory: 大模型智能体的统一记忆管理框架 一口气读完 Agent Memory 的 21 篇核心论文
如果这篇文章对你有帮助,欢迎点赞、收藏、转发!
关注我,获取更多 AI Agent 和大模型技术干货!
夜雨聆风