AI Agent 记忆管理实战:让你的智能体真正记住上下文

为什么 AI Agent 需要记忆管理?
大语言模型(LLM)本质上是无状态的——每次调用都是一次全新的对话,模型对之前发生的事情一无所知。对于简单的问答场景,这并不是问题;但当我们构建需要持续工作的 AI Agent 时,缺乏记忆会导致以下问题:
- 无法记住用户的个人偏好和历史操作
- 每轮对话都要重复提供相同的背景信息
- 多步骤任务执行中断后无法恢复
- 长对话超出 Token 窗口后信息丢失
因此,记忆管理成为构建生产级 AI Agent 的必备能力。业界通常将记忆分为四个层次:短期记忆(In-Context Memory)、外部记忆(External Memory)、情景记忆(Episodic Memory)和语义记忆(Semantic Memory)。
短期记忆:对话历史的管理策略
短期记忆是最直接的方案——把对话历史直接塞入 Prompt。但 LLM 的 Context Window 有限,随着对话增长,我们需要合理的截断和压缩策略。
LangChain 提供了多种开箱即用的 Memory 组件:
from langchain.memory import (
ConversationBufferMemory,
ConversationSummaryMemory,
ConversationBufferWindowMemory,
ConversationTokenBufferMemory
)
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# 1. 滑动窗口记忆:只保留最近 K 轮对话
window_memory = ConversationBufferWindowMemory(k=5)
# 2. Token 限制记忆:按 Token 数控制记忆长度
token_memory = ConversationTokenBufferMemory(
llm=llm,
max_token_limit=2000
)
# 3. 摘要记忆:自动将旧对话压缩为摘要
summary_memory = ConversationSummaryMemory(llm=llm)
# 实战:使用摘要记忆构建持久对话
from langchain.chains import ConversationChain
chain = ConversationChain(llm=llm, memory=summary_memory, verbose=True)
response = chain.predict(input="我叫张伟,是一名 Python 后端工程师")
response = chain.predict(input="我最近在学习 AI Agent 开发")
response = chain.predict(input="你还记得我叫什么名字吗?")
print(response) # 模型会正确回忆起"张伟"
对于实时性要求高的场景,推荐使用 ConversationTokenBufferMemory,它能精确控制每次 API 调用的 Token 消耗;对于长时间对话,ConversationSummaryMemory 通过动态摘要保留关键信息,是更优的选择。
长期记忆:向量数据库的引入
短期记忆无法跨会话持久化。要让 Agent 真正"记住"用户,需要引入外部存储。向量数据库是目前最主流的方案——将记忆内容嵌入为向量,通过语义相似度检索相关记忆。
以下是基于 Chroma 向量数据库实现长期记忆的完整示例:
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.memory import VectorStoreRetrieverMemory
import chromadb
# 初始化持久化向量存储
persist_dir = "./agent_memory_db"
embeddings = OpenAIEmbeddings()
vectorstore = Chroma(
collection_name="agent_long_term_memory",
embedding_function=embeddings,
persist_directory=persist_dir
)
# 创建基于向量检索的记忆
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
memory = VectorStoreRetrieverMemory(retriever=retriever)
# 存储记忆片段
memory.save_context(
{"input": "我最喜欢的编程语言是 Python"},
{"output": "已记录您偏好 Python"}
)
memory.save_context(
{"input": "我在北京工作,每天坐地铁上班"},
{"output": "已记录您在北京工作"}
)
memory.save_context(
{"input": "我有一只叫做「代码」的橘猫"},
{"output": "已记录您的宠物信息"}
)
# 语义检索:查找与"宠物"相关的记忆
result = memory.load_memory_variables({"prompt": "告诉我关于你的猫"})
print(result["history"])
# 输出:Human: 我有一只叫做「代码」的橘猫
# AI: 已记录您的宠物信息
# 持久化到磁盘
vectorstore.persist()
print("记忆已持久化,下次启动可直接加载")
向量记忆的核心优势在于语义检索——即使用户问的方式不同,系统也能找到最相关的历史记忆。这比简单的关键词匹配强大得多。
结构化记忆:用 JSON 存储用户画像
除了非结构化的对话记忆,很多场景需要维护结构化的用户状态,例如用户偏好、任务进度、个人档案等。推荐使用 JSON 文件或 Redis 存储,配合 Agent 的工具调用能力进行读写。
import json
import os
from datetime import datetime
from langchain.tools import tool
from langchain.agents import initialize_agent, AgentType
from langchain.chat_models import ChatOpenAI
USER_PROFILE_PATH = "./user_profiles/{user_id}.json"
def load_profile(user_id: str) -> dict:
path = USER_PROFILE_PATH.format(user_id=user_id)
if os.path.exists(path):
with open(path) as f:
return json.load(f)
return {"user_id": user_id, "preferences": {}, "history": []}
def save_profile(user_id: str, profile: dict):
path = USER_PROFILE_PATH.format(user_id=user_id)
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(path, "w") as f:
json.dump(profile, f, ensure_ascii=False, indent=2)
@tool
def remember_user_preference(user_id: str, key: str, value: str) -> str:
"""记住用户的某个偏好或信息"""
profile = load_profile(user_id)
profile["preferences"][key] = value
profile["history"].append({
"timestamp": datetime.now().isoformat(),
"action": f"记录偏好: {key}={value}"
})
save_profile(user_id, profile)
return f"已记住:{key} = {value}"
@tool
def recall_user_info(user_id: str, query: str) -> str:
"""回忆用户的某个信息"""
profile = load_profile(user_id)
prefs = profile.get("preferences", {})
if query in prefs:
return f"{query}: {prefs[query]}"
# 模糊匹配
matches = {k: v for k, v in prefs.items() if query.lower() in k.lower()}
return json.dumps(matches, ensure_ascii=False) if matches else "未找到相关记忆"
# 将工具绑定到 Agent
llm = ChatOpenAI(model="gpt-4o", temperature=0)
agent = initialize_agent(
tools=[remember_user_preference, recall_user_info],
llm=llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True
)
记忆管理最佳实践与踩坑总结
经过实际项目的验证,以下是构建 AI Agent 记忆系统时的关键经验:
- 分层存储:短期对话历史用 Token Buffer,中期用摘要压缩,长期用向量数据库——三层结合效果最佳
- 记忆隔离:不同用户的记忆必须严格隔离,以 user_id 作为命名空间,避免信息泄露
- 遗忘机制:实现 TTL(Time-To-Live)清理过期记忆,防止向量库无限膨胀
- 检索调优:向量检索的 top-k 值不宜过大(推荐 3-5),过多的记忆反而会引入噪声,降低回答质量
- 记忆蒸馏:定期用 LLM 对原始记忆进行摘要提炼,提取关键事实存入结构化存储,提升检索效率
- 冷启动问题:新用户没有记忆时,提供通用的 persona prompt 作为默认上下文
随着 LangGraph、AutoGen 等多 Agent 框架的成熟,记忆管理正在向更复杂的方向演进——多 Agent 共享记忆池、跨模态记忆(图文混合)、主动记忆整合等都是值得关注的前沿方向。
建议将记忆管理能力封装为独立的微服务,通过 REST API 向多个 Agent 提供统一的记忆读写接口,这样既便于维护,又能在不同 Agent 之间共享用户上下文。
发布评论
热门评论区: