LangChain 记忆组件详解
前言
在构建基于大语言模型(LLM)的聊天程序时,让模型具备'记忆'能力至关重要。LangChain 框架为此提供了专门的 Memory 组件,旨在管理对话历史中的信息,以便将上下文有效地发送给 LLM,从而提升回答的相关性和连贯性。
随着 Token 上限的提升,我们可以将多次对话的历史信息和 LLM 的返回结果作为 Prompt 的增量输入,帮助 LLM 更好地理解用户意图。本文将深入探讨 LangChain 中 Memory 组件的工作原理及三种核心类型的使用场景。
Memory 交互机制
记忆组件的作用类似于一个存储库,支持信息的写入(保存)和读取。在与 LLM 的每一次交互循环中,链(Chain)会与记忆组件进行两次关键交互:
- 读取阶段:在用户提交输入后、发送给 LLM 之前,链从记忆组件中读取历史对话信息,将其增强到用户的当前输入中,形成完整的 Prompt。
- 写入阶段:在 LLM 返回结果后,链会将当前的用户输入和模型输出写入记忆组件,更新对话历史记录。
这种机制确保了对话的连续性,使模型能够记住之前的约定或上下文。
Memory 组件类型
LangChain 提供了多种记忆组件类型,以适应不同的对话长度和上下文需求。主要包括 ConversationBufferMemory、ConversationBufferWindowMemory 和 ConversationSummaryMemory。
1. ConversationBufferMemory
ConversationBufferMemory 是最基础的记忆组件,它忠实地记录与 LLM 的所有对话历史,直到达到 Token 限制。
代码示例
from langchain.memory import ConversationBufferMemory
# 实例化 memory 组件
memory = ConversationBufferMemory()
# save_context 方法存储对话及 LLM 的输出
memory.save_context({"input": "Hi, LangChain!"}, {"output": "Hey!"})
print(memory)
运行上述代码,可以看到内部结构包含 HumanMessage(用户输入)和 AIMessage(模型输出):
chat_memory=ChatMessageHistory(messages=[HumanMessage(content='Hi, LangChain!', ...), AIMessage(content='Hey!', ...)])
...
获取消息数据
可以通过 chat_memory.messages 直接访问消息对象数组:
memory.chat_memory.messages
或者使用 load_memory_variables 方法将对话历史转换为文本格式,便于注入 Prompt:
memory.load_memory_variables({})


