AI Agent 的记忆系统:短期、长期与矢量记忆如何协同工作

为什么 AI 对话每次都要重新解释背景?
为什么同一个问题换了个问法,AI 就答不上来了?
答案藏在 AI Agent 的记忆系统里。
今天从技术角度拆解:短期记忆、长期记忆、矢量记忆——这三个东西是怎么配合工作的。
01 短期记忆:上下文窗口

什么是短期记忆?
就是 AI 正在"思考"时能访问的信息——也就是我们常说的 上下文窗口(Context Window)。
以 Claude 为例:
Haiku:200K tokens ≈ 15万字 ≈ 一本中篇小说 Sonnet 4.6:200K tokens Opus 4:200K tokens
它存储的内容:
对话历史(用户说了什么、AI 回复了什么) 当前任务的背景信息 正在处理的文件内容 Agent 内部的推理状态
# 上下文窗口示意图conversation = [ {"role": "user", "content": "帮我重构这个函数"}, {"role": "assistant", "content": "好的,我先看看代码..."}, {"role": "user", "content": "改成用 async/await"},# ... 更多对话]# 当前窗口已消耗的 token 数print(f"已使用: {len(conversation) * 150} tokens")短期记忆的问题:贵,且有上限。
每次对话,窗口里的内容都要重新传给模型计算。token 越多,费用越高,速度越慢。
这就是为什么要让 AI "记重要的,忘不重要的"——记忆系统的核心矛盾就在这里。
02 长期记忆:持久化存储

什么是长期记忆?
不依赖上下文窗口,持久化存储的信息。
AI Agent 的长期记忆通常保存在:
.claude/memory/ | ||
典型应用:用户偏好
# 长期记忆示例:记住用户偏好classUserMemory:def__init__(self, user_id: str):self.user_id = user_idself.storage_path = f".claude/memory/{user_id}"defremember(self, key: str, value: str):"""保存用户偏好"""withopen(f"{self.storage_path}/{key}.md", "w") as f: f.write(value)defrecall(self, key: str) -> str:"""读取用户偏好"""try:withopen(f"{self.storage_path}/{key}.md", "r") as f:return f.read()except FileNotFoundError:returnNone# 使用memory = UserMemory("user_123")memory.remember("preferred_language", "Python")memory.remember("code_style", "类型注解必须写")# 下次对话时加载language = memory.recall("preferred_language") # "Python"长期记忆的价值:跨会话积累信息,不需要每次重新解释。
03 矢量记忆:语义搜索的核心

什么是矢量记忆?
把信息转换成向量(Embedding),存储在向量数据库里,需要时通过相似度搜索召回。
这是 AI Agent 记忆系统里最关键的一层。
工作原理:
文本 → Embedding Model → 向量 → 存入向量数据库查询 → Embedding Model → 向量 → 在数据库中搜索相似向量 → 召回相关内容举个例子:
# 矢量记忆示意图documents = ["Claude Code 是 Anthropic 推出的命令行工具","OpenClaw 是一个 Agent 编排框架","wechat-publisher 可以一键发布公众号文章"]# 当用户问 "有什么工具能发公众号?"query = "发公众号的工具"# 向量数据库会找到最相关的文档results = vector_db.search(query, top_k=2)# → ["wechat-publisher 可以一键发布公众号文章"]# → ["Claude Code 是 Anthropic 推出的命令行工具"]为什么需要矢量记忆?
传统的关键词搜索(grep/Lucene)只能匹配字面。
矢量搜索能理解语义——你搜"AI编程工具",能找到"Claude Code",即使文档里没写"AI编程工具"这几个字。
04 三层记忆如何协同

实际的 AI Agent 不会只用一种记忆,而是三层协同:
用户提问 ↓1. 短期记忆:检查当前对话上下文 ↓2. 长期记忆:加载用户偏好、项目背景 ↓3. 矢量记忆:搜索历史经验、相关文档 ↓综合所有信息 → Agent 推理 → 回复一个具体场景:
用户:帮我优化这个图片处理模块↓ 短期记忆当前在处理 user-upload 模块,文件是 image_processor.py↓ 长期记忆该用户上次偏好:喜欢函数式风格、讨厌过度封装↓ 矢量记忆找到 3 个月前类似的优化案例:用 VectorDB 缓存 + 流式处理↓ Agent 综合信息输出:基于上次案例的优化建议 + 符合用户偏好的代码风格05 技术实现:从零搭建记忆系统

用 Python 简单实现一个三层记忆系统:
from dataclasses import dataclassfrom typing importOptionalimport json@dataclassclassMemorySystem:"""三层记忆系统的简化实现""" short_term: list = None# 对话历史 long_term_path: str = ".claude/memory/"# 持久化路径 vector_store: dict = None# 简化版向量存储def__post_init__(self):self.short_term = []self.vector_store = {}defadd_short_term(self, role: str, content: str):"""添加到短期记忆(对话历史)"""self.short_term.append({"role": role, "content": content})defsave_long_term(self, key: str, value: str):"""保存到长期记忆(文件系统)"""withopen(f"{self.long_term_path}{key}.json", "w") as f: json.dump({"key": key, "value": value}, f)defload_long_term(self, key: str) -> Optional[str]:"""从长期记忆读取"""try:withopen(f"{self.long_term_path}{key}.json", "r") as f:return json.load(f)["value"]except FileNotFoundError:returnNonedefadd_to_vector_store(self, content: str, metadata: dict):"""添加到矢量记忆(简化版:存储原始内容)"""# 实际项目中应使用 FAISS / ChromaDB / Pinecone vector_id = len(self.vector_store)self.vector_store[vector_id] = {"content": content, "metadata": metadata}defsearch_vector(self, query: str, top_k: int = 3) -> list:"""矢量搜索(简化版:按关键词匹配)""" results = []for vid, item inself.vector_store.items():if query.lower() in item["content"].lower(): results.append(item)return results[:top_k]# 使用示例memory = MemorySystem()# 短期记忆memory.add_short_term("user", "帮我重构图片上传模块")# 长期记忆memory.save_long_term("user_style", "喜欢函数式风格,避免过度封装")# 矢量记忆memory.add_to_vector_store("上次重构:图片压缩用 Sharp 库,WebP 格式转换", {"date": "2025-12-01", "type": "refactor"})# 查询style = memory.load_long_term("user_style") # "喜欢函数式风格,避免过度封装"context = memory.search_vector("图片 压缩 重构") # 找到相关记录生产环境推荐工具:
| ChromaDB | ||
| FAISS | ||
| Pinecone | ||
| Milvus | ||
| MemGPT | ||
| LangChain Memory |
06 设计记忆系统的关键原则

原则 1:按需加载,不要全量塞入
窗口空间有限。把对当前任务最有用的记忆优先加载。
# 不好:全部加载context = all_user_memories # 可能爆窗口# 好:按任务相关性筛选context = filter_relevant(memories, current_task) # 只加载相关的原则 2:定期遗忘,保留最重要的
短期记忆要设上限。超过就压缩或归档。
MAX_SHORT_TERM = 50# 最多保留 50 条对话defcompress_if_needed(messages):iflen(messages) > MAX_SHORT_TERM:# 保留最近 20 条 + 摘要return [ summarize(messages[:-20]), *messages[-20:] ]原则 3:矢量存储要定期更新
过时的信息会误导 AI。设置 TTL 或定期重建索引。
总结
| 短期记忆 | |||
| 长期记忆 | |||
| 矢量记忆 |
三者配合:
短期记忆管当前 长期记忆管经验 矢量记忆管检索
懂了这个系统,你就理解了 AI Agent 为什么能"记住你"——而不是每次都像个陌生人一样从头开始。
夜雨聆风