AI 长期记忆的 8 种优化策略及 LangChain 代码实现
在基于大模型的 Agent 系统中,长期记忆的状态维护至关重要。根据 OpenAI AI 应用研究主管 Lilian Weng 在《基于大模型的 Agent 构成》中的观点,记忆被视为关键组件之一。本文将结合 LangChain 框架,详细解析 8 种不同的记忆维护方式及其在不同场景中的应用实例。
1. 获取全量历史对话 (ConversationBufferMemory)
适用场景:一般客服场景、短文本交互。
在电信公司的客服聊天机器人场景中,如果用户在对话中先是询问了账单问题,接着又谈到了网络连接问题,ConversationBufferMemory 可以用来记住整个与用户的对话历史。这有助于 AI 在回答网络问题时还记得账单问题的相关细节,从而提供更连贯的服务。
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.save_context({"input": "你好"}, {"output": "怎么了"})
variables = memory.load_memory_variables({})
print(variables)
- 优点:保留所有历史,上下文最完整。
- 缺点:随着对话轮数增加,Token 消耗会线性增长,可能导致超出模型上下文窗口限制。
2. 滑动窗口获取最近部分对话内容 (ConversationBufferWindowMemory)
适用场景:商品咨询场景、对时效性要求高的问答。
在一个电商平台上,如果用户询问关于特定产品的问题(如手机的电池续航时间),然后又问到了配送方式,ConversationBufferWindowMemory 可以帮助 AI 只专注于最近的一两个问题(如配送方式),而不是整个对话历史,以提供更快速和专注的答复。
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=2)
memory.save_context({"input": "手机电池怎么样?"}, {"output": "续航很强"})
memory.save_context({"input": "怎么配送?"}, {"output": "次日达"})
variables = memory.load_memory_variables({})
print(variables)
- 优点:控制 Token 使用,关注近期上下文。
- 缺点:丢失了早期的重要信息,不适合需要长程关联的场景。
3. 获取历史对话中实体信息 (ConversationEntityMemory)
适用场景:法律咨询场景、个性化推荐。
在法律咨询的场景中,客户可能会提到特定的案件名称、相关法律条款或个人信息(如'我在去年的交通事故中受了伤,想了解关于赔偿的法律建议')。ConversationEntityMemory 可以帮助 AI 记住这些关键实体和实体关系细节,从而在整个对话过程中提供更准确、更个性化的法律建议。
from langchain.memory import ConversationEntityMemory
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
memory = ConversationEntityMemory(llm=llm)
_input = {"input": "公众号《LLM 应用全栈开发》的作者是莫尔索"}
memory.load_memory_variables(_input)
memory.save_context(
_input,
{"output": "是吗,这个公众号是干嘛的"}
)
print(memory.load_memory_variables({"input": "莫尔索是谁?"}))
- 优点:结构化提取关键信息,便于检索和推理。
- 缺点:依赖 LLM 的实体抽取能力,可能产生幻觉。
4. 利用知识图谱获取历史对话中的实体及其联系 (ConversationKGMemory)
适用场景:医疗咨询场景、复杂关系推理。
在医疗咨询中,一个病人可能会描述多个症状和过去的医疗历史(如'我有糖尿病史,最近觉得经常口渴和疲劳')。ConversationKGMemory 可以构建一个包含病人症状、疾病历史和可能的健康关联的知识图谱,从而帮助 AI 提供更全面和深入的医疗建议。
from langchain.memory import ConversationKGMemory
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
memory = ConversationKGMemory(llm=llm)
memory.save_context({"input": "小李是程序员"}, {"output": "知道了,小李是程序员"})
memory.save_context({"input": "莫尔索是小李的笔名"}, {"output": "明白,莫尔索是小李的笔名"})
variables = memory.load_memory_variables({"input": "告诉我关于小李的信息"})
print(variables)
- 优点:显式建模实体关系,支持复杂推理。
- 缺点:构建图谱开销较大,实时性略低。
5. 对历史对话进行阶段性总结摘要 (ConversationSummaryMemory)
适用场景:教育辅导场景、长篇文档分析。
在一系列的教育辅导对话中,学生可能会提出不同的数学问题或理解难题(如'我不太理解二次方程的求解方法')。ConversationSummaryMemory 可以帮助 AI 总结之前的辅导内容和学生的疑问点,以便在随后的辅导中提供更针对性的解释和练习。它通过不断将历史对话压缩为摘要来节省空间。
from langchain.memory import ConversationSummaryMemory
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo")
memory = ConversationSummaryMemory(llm=llm)
memory.save_context({"input": "什么是变量?"}, {"output": "变量是存储数据的容器"})
memory.save_context({"input": "如何定义?"}, {"output": "使用 var 关键字"})
variables = memory.load_memory_variables({})
print(variables)
- 优点:极大减少 Token 消耗,保持核心语义。
- 缺点:可能丢失细节,摘要质量依赖 LLM。
6. 需要获取最新对话,又要兼顾较早历史对话 (ConversationSummaryBufferMemory)
适用场景:技术支持场景、故障排查。
在处理一个长期的技术问题时(如软件故障排查),用户可能会在多次对话中提供不同的错误信息和反馈。ConversationSummaryBufferMemory 可以帮助 AI 保留最近几次交互的详细信息,同时提供历史问题处理的摘要,以便于更有效地识别和解决问题。它结合了 Buffer 和 Summary 的优点。
from langchain.memory import ConversationSummaryBufferMemory
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo")
memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=2000)
memory.save_context({"input": "系统报错"}, {"output": "检查日志"})
memory.save_context({"input": "日志为空"}, {"output": "重启服务"})
variables = memory.load_memory_variables({})
print(variables)
- 优点:平衡了细节保留与上下文长度限制。
- 缺点:配置
max_token_limit 需要经验。
7. 回溯最近和最关键的对话信息 (ConversationTokenBufferMemory)
适用场景:金融咨询场景、实时性要求高的对话。
在金融咨询聊天机器人中,客户可能会提出多个问题,涉及投资、市场动态或个人财务规划(如'我想了解股市最近的趋势以及如何分配我的投资组合')。ConversationTokenBufferMemory 可以帮助 AI 聚焦于最近和最关键的几个问题,当超过 Token 限制时自动删除最早的对话片段,同时避免由于记忆过多而导致的信息混淆。
from langchain.memory import ConversationTokenBufferMemory
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo")
memory = ConversationTokenBufferMemory(llm=llm, max_token_limit=1000)
memory.save_context({"input": "股票 A 涨了"}, {"output": "关注基本面"})
memory.save_context({"input": "债券 B 跌了"}, {"output": "注意风险"})
variables = memory.load_memory_variables({})
print(variables)
- 优点:严格限制 Token 数量,自动管理内存。
- 缺点:早期重要信息可能被强制丢弃。
8. 基于向量检索对话信息 (VectorStoreRetrieverMemory)
适用场景:了解最新新闻事件、知识库问答。
用户可能会对特定新闻事件提出问题,如'最近的经济峰会有什么重要决策?'。VectorStoreRetrieverMemory 能够快速从大量历史新闻数据中检索出与当前问题最相关的信息,即使这些信息在整个对话历史中不是最新的,也能提供及时准确的背景信息和详细报道。
from langchain.memory import VectorStoreRetrieverMemory
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
vectorstore = Chroma(embedding_function=OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs=dict(k=1))
memory = VectorStoreRetrieverMemory(retriever=retriever)
PROMPT_TEMPLATE = """以下是人类和 AI 之间的友好对话。AI 话语多且提供了许多来自其上下文的具体细节。如果 AI 不知道问题的答案,它会诚实地说不知道。
以前对话的相关片段:
{history}
(如果不相关,你不需要使用这些信息)
当前对话:
人类:{input}
AI:
"""
prompt = PromptTemplate(input_variables=["history", "input"], template=PROMPT_TEMPLATE)
conversation_with_summary = ConversationChain(
llm=llm,
prompt=prompt,
memory=memory,
verbose=True
)
print(conversation_with_summary.predict(input="你好,我是莫尔索,你叫什么"))
print(conversation_with_summary.predict(input="我喜欢的食物是什么?"))
- 优点:支持海量历史检索,语义匹配精准。
- 缺点:依赖向量数据库,架构复杂度较高。
总结与选型建议
选择合适的记忆机制取决于具体的业务需求、Token 预算以及对上下文精度的要求。
| 记忆类型 | 适用场景 | 优缺点 |
|---|
| ConversationBufferMemory | 短对话、简单任务 | 完整但 Token 消耗快 |
| ConversationBufferWindowMemory | 近期关注、电商咨询 | 轻量但丢失历史信息 |
| ConversationEntityMemory | 个性化、法律/医疗 | 结构好但依赖抽取精度 |
| ConversationKGMemory | 复杂关系推理 | 推理强但构建慢 |
| ConversationSummaryMemory | 长对话、教育辅导 | 省 Token 但细节少 |
| ConversationSummaryBufferMemory | 技术支持、混合场景 | 平衡性好 |
| ConversationTokenBufferMemory | 金融、实时风控 | 严格控流但可能丢信息 |
| VectorStoreRetrieverMemory | 知识库、新闻检索 | 检索准但架构重 |
开发者应根据实际场景的上下文长度限制和对历史信息的敏感度,灵活组合上述策略,以构建高效、智能的 Agent 系统。