/ AI Agent  LangChain  记忆管理  向量数据库  LLM  智能体开发  RAG  Python 

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 作为默认上下文

随着 LangGraphAutoGen 等多 Agent 框架的成熟,记忆管理正在向更复杂的方向演进——多 Agent 共享记忆池、跨模态记忆(图文混合)、主动记忆整合等都是值得关注的前沿方向。

建议将记忆管理能力封装为独立的微服务,通过 REST API 向多个 Agent 提供统一的记忆读写接口,这样既便于维护,又能在不同 Agent 之间共享用户上下文。

发布评论

热门评论区: