乐于分享
好东西不私藏

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

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

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/
数据库
用户偏好、配置信息
SQLite、PostgreSQL
KV 存储
快速读取的键值对
Redis、etcd
外部服务
跨 Agent 共享信息
API 调用

典型应用:用户偏好

# 长期记忆示例:记住用户偏好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
Facebook 开源、大规模
向量数据库
Pinecone
云服务、生产级
向量数据库
Milvus
国产、开源、大规模
记忆框架
MemGPT
大模型记忆管理
记忆框架
LangChain Memory
与 LangChain 集成

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 或定期重建索引。


总结

记忆类型
存储位置
生命周期
用途
短期记忆
Context Window
当前会话
正在处理的任务
长期记忆
文件/数据库
持久化
用户偏好、项目背景
矢量记忆
向量数据库
持久化
历史经验、语义搜索

三者配合:

  • 短期记忆管当前
  • 长期记忆管经验
  • 矢量记忆管检索

懂了这个系统,你就理解了 AI Agent 为什么能"记住你"——而不是每次都像个陌生人一样从头开始。