会话级记忆只存当前对话,任务级记忆只存单个任务,而长期记忆的核心作用是“跨会话、跨任务保存关键信息”,比如用户偏好、行业知识、历史任务总结等,即使会话结束、任务完成,也能检索复用,解决智能体“重启会话即遗忘”的痛点。

举个例子:用户上周告诉智能体“我是做养老行业的,专注于智能照护领域”,这周重启会话时,智能体仍能记住这个信息,无需用户重复说明;再比如,上个月完成的“养老智能体需求分析”任务总结,这个月开发同类智能体时,可通过长期记忆快速检索复用,提升开发效率。

长期记忆的核心是“语义级存储与检索”,不是简单保存文本,而是将关键信息转成向量(Embedding),存入向量数据库,需要时通过语义检索找到最相关的记忆,拼接进Prompt。以下是工业界最常用的实现方式,附完整可执行代码、向量数据库选择建议和落地技巧。

一、核心原理:长期记忆的实现逻辑

长期记忆的实现逻辑可概括为3步:

  1. 存储:将关键信息(用户偏好、任务总结、行业知识)通过Embedding模型转成向量(一串数字,代表文本语义);
  2. 持久化:将向量存入向量数据库,实现长期保存(重启应用后记忆不丢失);
  3. 检索:当需要使用记忆时,将当前查询转成向量,通过语义检索从向量数据库中找到最相关的记忆,拼接进Prompt。

核心优势:语义检索——即使查询语句与记忆中的文本不完全一致,也能找到相关记忆(比如记忆中是“智能照护”,查询“照护提醒”也能检索到),比传统的关键词检索更精准。

二、最常用实现:向量存储检索记忆(VectorStoreRetrieverMemory)

向量存储检索记忆是LangChain中最常用的长期记忆形式,支持多种向量数据库(Chroma、FAISS、Pinecone等),开发简单、可扩展性强,适合绝大多数智能体的长期记忆需求。以下以Chroma向量数据库为例(轻量、易部署,新手首选),附完整可执行代码。

可执行代码(工业级落地)

from langchain.memory import VectorStoreRetrieverMemory
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI

# 1. 初始化向量数据库(用于长期存储记忆向量,实现持久化)
# embeddings:用于将文本转成向量,需替换为自己的API密钥
embeddings = OpenAIEmbeddings(api_key="你的API密钥")
# persist_directory:持久化存储路径,重启应用后记忆不丢失(可自定义路径)
vectorstore = Chroma(embedding_function=embeddings, persist_directory="./long_term_memory_db")
# 检索器:每次检索最相关的2条记忆(k值可调整,根据需求选择)
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})

# 2. 初始化长期记忆(绑定向量数据库检索器)
long_term_memory = VectorStoreRetrieverMemory(retriever=retriever)

# 3. 存入长期记忆(关键信息:用户偏好、任务总结、行业知识等,避免存无关闲聊)
# 示例1:存入用户偏好
long_term_memory.save_context(
    {"input": "我是做养老行业的,专注于智能照护领域,主要服务社区养老服务中心"},
    {"output": "已记录你的行业、专注领域和服务场景,后续将优先提供相关方案"}
)
# 示例2:存入任务总结(已完成的养老智能体需求分析)
long_term_memory.save_context(
    {"input": "养老智能体需求分析总结:核心功能为照护提醒、用药提醒、健康数据监测,适配老年用户,支持语音控制和设备对接"},
    {"output": "已保存任务总结,后续开发同类智能体可直接复用该需求"}
)
# 示例3:存入行业知识(养老行业政策)
long_term_memory.save_context(
    {"input": "养老智能体开发相关政策:可申请智能养老设备研发补贴,需符合老年用户操作便捷性标准,对接社区医疗系统"},
    {"output": "已记录相关政策,后续开发将结合政策要求设计方案"}
)

# 4. 检索长期记忆(新会话中,智能体自动检索相关记忆,实现个性化交互)
# 示例1:检索用户行业信息
user_query1 = "我做什么行业的?专注于哪个领域?"
memory_context1 = long_term_memory.load_memory_variables({"input": user_query1})
print(f"用户查询:{user_query1}")
print(f"检索到的长期记忆:{memory_context1}")

# 示例2:检索任务总结(开发新的养老智能体时)
user_query2 = "之前做的养老智能体有哪些核心需求?"
memory_context2 = long_term_memory.load_memory_variables({"input": user_query2})
print(f"\n用户查询:{user_query2}")
print(f"检索到的长期记忆:{memory_context2}")

# 示例3:检索行业政策(对接政策要求时)
user_query3 = "开发养老智能体有哪些政策支持?"
memory_context3 = long_term_memory.load_memory_variables({"input": user_query3})
print(f"\n用户查询:{user_query3}")
print(f"检索到的长期记忆:{memory_context3}")

实操要点

  • 向量数据库选择(新手重点):
    • Chroma:轻量、易部署,支持本地持久化,无需复杂配置,新手首选;
    • FAISS:Facebook开源,本地部署,检索速度快,适合数据量较大的场景;
    • Pinecone:云端部署,无需维护服务器,适合生产环境、大规模记忆存储。
  • k值设置:每次检索最相关的k条记忆,推荐k=2-3,避免检索过多无关记忆导致Prompt冗余。
  • 记忆内容筛选:长期记忆只存“关键信息”(用户偏好、任务总结、核心知识),不存无关闲聊(如“嗯”“好的”),否则会导致检索不精准、存储压力大。
  • 持久化注意:Chroma的persist_directory参数需设置为本地路径,重启应用后,需重新初始化向量数据库(指定相同的persist_directory),才能加载之前的记忆。

三、长期记忆与会话记忆的结合(工业界常用)

实际开发中,长期记忆很少单独使用,通常与会话记忆结合,既保证当前对话连贯,又实现跨会话个性化交互。以下是结合示例,附代码。

from langchain.memory import (
    ConversationBufferWindowMemory,
    VectorStoreRetrieverMemory,
    CombinedMemory
)
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI

# 1. 会话记忆(滑动窗口,保留最近5轮对话,保证当前交互连贯)
short_term_memory = ConversationBufferWindowMemory(k=5, return_messages=True)

# 2. 长期记忆(向量检索,持久化存储用户偏好、任务总结)
embeddings = OpenAIEmbeddings(api_key="你的API密钥")
vectorstore = Chroma(embedding_function=embeddings, persist_directory="./long_term_memory_db")
long_term_memory = VectorStoreRetrieverMemory(retriever=vectorstore.as_retriever(search_kwargs={"k": 2}))

# 3. 组合记忆(将短期记忆和长期记忆组合,统一提取)
total_memory = CombinedMemory(memories=[short_term_memory, long_term_memory])

# 4. 模拟交互,测试组合记忆效果
# 步骤1:存入长期记忆(用户偏好)
long_term_memory.save_context({"input": "我是养老行业的,专注智能照护"}, {"output": "已记录"})

# 步骤2:模拟当前对话(会话记忆)
short_term_memory.save_context({"input": "帮我设计一个养老智能体的界面"}, {"output": "好的,将结合老年用户操作习惯设计界面"})

# 步骤3:提取组合记忆,拼接Prompt
memory_context = total_memory.load_memory_variables({"input": "界面设计需要注意什么?"})
print("组合记忆(会话+长期):")
print(memory_context)

# 步骤4:大模型结合组合记忆,生成个性化回复
llm = ChatOpenAI(model="gpt-3.5-turbo", api_key="你的API密钥")
prompt = f"结合以下记忆,回答用户问题:{memory_context}\n用户问题:界面设计需要注意什么?"
response = llm.invoke(prompt)
print("\n智能体个性化回复:")
print(response.content)

四、长期记忆落地避坑指南

  • 避坑1:长期记忆存所有信息——只存关键信息,无关闲聊、临时对话不要存入,否则会降低检索精度,增加存储压力。
  • 避坑2:不控制检索数量——k值不要设置过大(建议2-3),否则会检索到无关记忆,导致Prompt冗余、Token消耗过高。
  • 避坑3:忽略向量数据库性能——数据量较大时(超过1000条记忆),优先选择FAISS(本地)或Pinecone(云端),Chroma适合中小规模数据。
  • 避坑4:不更新长期记忆——定期清理过期记忆(如过时的行业政策、已失效的用户偏好),避免检索到无效信息。

五、长期记忆落地总结

长期记忆的核心价值是“跨会话、跨任务复用关键信息”,实现智能体的个性化交互和效率提升,落地时需注意:

  • 核心实现:向量存储检索记忆(VectorStoreRetrieverMemory),搭配合适的向量数据库;
  • 新手首选:Chroma向量数据库(轻量、易部署、支持持久化);
  • 最佳实践:与会话记忆结合,兼顾当前对话连贯和跨会话个性化;
  • 关键技巧:筛选记忆内容、控制检索数量、定期更新记忆。

更多推荐