在基于大模型的 Agent 应用中,长期记忆的状态维护至关重要。在 OpenAI AI 应用研究主管 Lilian Weng 的博客《基于大模型的 Agent 构成》中,将记忆视为关键的组件之一。本文结合 LangChain 框架,详细讨论在多轮对话中实现长期记忆保持的 8 种方式及代码示例。
1. 获取全量历史对话
一般客服场景 在电信公司的客服聊天机器人场景中,如果用户在对话中先是询问了账单问题,接着又谈到了网络连接问题,ConversationBufferMemory 可以用来记住整个与用户的对话历史,可以帮助 AI 在回答网络问题时还记得账单问题的相关细节,从而提供更连贯的服务。
技术原理:该内存类型简单地将所有输入和输出追加到列表中,直到达到上下文窗口限制。 优缺点:优点是保留信息完整;缺点是随着对话增长,Token 消耗快,可能超出模型限制。
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.save_context({"input": "你好"}, {"output": "怎么了"})
variables = memory.load_memory_variables({})
print(variables)
2. 滑动窗口获取最近部分对话内容
商品咨询场景 在一个电商平台上,如果用户询问关于特定产品的问题(如手机的电池续航时间),然后又问到了配送方式,ConversationBufferWindowMemory 可以帮助 AI 只专注于最近的一两个问题(如配送方式),而不是整个对话历史,以提供更快速和专注的答复。
技术原理:仅保留最近的 K 条消息,丢弃更早的历史记录。 优缺点:优点是节省 Token,聚焦当前话题;缺点是无法回溯早期关键信息。
from langchain.memory import ConversationBufferWindowMemory
# 只保留最后 1 次互动的记忆
memory = ConversationBufferWindowMemory(k=1)
3. 获取历史对话中实体信息
法律咨询场景 在法律咨询的场景中,客户可能会提到特定的案件名称、相关法律条款或个人信息。ConversationEntityMemory 可以帮助 AI 记住这些关键实体和实体关系细节,从而在整个对话过程中提供更准确、更个性化的法律建议。
技术原理:利用 LLM 从对话中提取实体及其关系,存储在结构化记忆中。 优缺点:优点是有利于处理复杂关系;缺点是需要额外的提取开销。
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": "某公众号的作者是张三"}
memory.load_memory_variables(_)
memory.save_context(
_,
{: }
)
(memory.load_memory_variables({: }))


