LangChain 入门:Memory 记忆组件详解
什么是 Memory
在构建基于大语言模型(LLM)的应用时,存储对话历史中的信息的能力被称为'记忆'(Memory)。这种机制允许应用程序记住之前的交互内容,从而支持上下文联想和连续对话。记忆组件既可以单独使用,也可以无缝集成到一条链(Chain)中。
记忆的存储生命周期通常覆盖程序执行的全过程,即从开始执行到结束期间产生的所有记忆。一个标准的记忆组件需要支持以下核心操作:
- 读取(Read):获取之前存储的交互内容。
- 写入(Write):将当前的交互内容保存下来。
每条链定义了核心执行逻辑,期望某些输入,这些输入一部分来自用户,另一部分来自记忆组件。在一次与 LLM 的完整交互中,链与记忆组件通常会进行两次交互:
- 读取记忆:将之前的交互内容读取出来,放入到本次的提示词(Prompt)上下文中。
- 写入记忆:将本次的交互结果(包括用户输入和模型输出)写入到记忆当中,以便后续使用。
为什么需要使用记忆组件
在 LangChain 中,如果直接使用 llm.invoke 进行大模型对话,LLM 的记忆范围仅限于单次会话的执行过程。一旦运行结束,再次对话就是新的开始,没有以前的记忆内容。例如,当提问'我刚刚说了什么'时,如果没有记忆组件,模型无法回答前一次的交互内容。
from langchain_community.llms import Tongyi
llm = Tongyi()
print("第一次对话:", llm.invoke("今天天气真好啊"))
print("第二次对话:", llm.invoke("我刚刚说了什么"))
运行上述代码,第二次对话时模型会因为没有上下文而无法识别'刚刚'指代的内容。
而使用记忆组件就可以让 LLM 拥有记忆能力,能够将进行上下文联想。这让与大模型对话时有和真人对话的感觉,能够维持多轮对话的连贯性。
使用步骤
要构建一个具备记忆能力的对话系统,通常需要四个部件组合起来使用:大模型、提示词模板、链、记忆组件。
- 实例化一个 LLM:选择合适的大模型服务。
- 定义记忆组件:根据需求选择合适的 Memory 类型。
- 创建提示词模板:在 Prompt 中预留记忆内容的占位符。
- 使用链将它们链接起来:通过 Chain 将上述组件串联。
四种记忆组件详解
1. ConversationBufferMemory(会话缓冲区)
如实记录列表中所有的对话历史消息,并保留完整的交互记录。随着历史记录的增加,上下文长度会越来越长,导致运行速度变慢,甚至超出大模型的 Token 限制。适用于交互次数少、输入输出字符量不大的场景。
使用方法
import os
from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv())
os.environ["DASHSCOPE_API_KEY"] = "你的 API_KEY"
from langchain_community.llms Tongyi
langchain.chains LLMChain
langchain.prompts PromptTemplate
langchain.memory ConversationBufferMemory
llm = Tongyi()
template =
prompt = PromptTemplate(
template=template,
input_variables=[]
)
memory = ConversationBufferMemory(memory_key=, return_messages=)
chain = LLMChain(
llm=llm,
prompt=prompt,
memory=memory,
verbose=
)
chain.invoke()
chain.invoke()
chain.invoke()
res = chain.invoke()
(res[])


