本文目录导读:

LangChain 中的记忆管理(Memory)用于让链(Chain)或代理(Agent)能够记住历史对话中的信息,配置记忆主要分为选择记忆类型和集成到链中两步。
以下是几种常见场景的配置方法:
核心步骤:将记忆注入链
无论哪种记忆类型,最终都需要传入 ConversationChain 或自定义的 LLMChain 中。
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain_openai import ChatOpenAI # 以OpenAI为例
# 1. 初始化大模型
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 2. 初始化记忆对象
memory = ConversationBufferMemory()
# 3. 创建对话链,传入 memory 参数
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True # 可选,打印内部运行日志
)
# 4. 使用
conversation.predict(input="你好,我的名字是张三")
conversation.predict(input="我叫什么名字?") # 会正确回答“张三”
常见的记忆类型及配置
A. 基础版:对话缓冲记忆 (ConversationBufferMemory)
- 特点:简单存储所有历史对话。
- 限制:Token消耗会无限增长。
from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory()
B. 窗口记忆 (ConversationBufferWindowMemory)
- 特点:只保留最近 K 轮对话,防止Token爆炸。
- 适用:长对话但只需短期记忆。
from langchain.memory import ConversationBufferWindowMemory # 只保留最近2轮对话 memory = ConversationBufferWindowMemory(k=2)
C. 摘要记忆 (ConversationSummaryMemory)
- 特点:用 LLM 对历史对话进行摘要总结,只存储摘要。
- 适用:需要长期记忆但需控制Token成本。
from langchain.memory import ConversationSummaryMemory # 需要传入 LLM 来进行摘要 memory = ConversationSummaryMemory(llm=llm)
D. 向量存储记忆 (VectorStoreRetrieverMemory)
- 特点:将历史存入向量数据库,根据当前输入检索最相关的一段历史。
- 适用:超长对话、需要按语义回忆特定内容。
from langchain.memory import VectorStoreRetrieverMemory
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
# 先建一个向量数据库
vectorstore = FAISS.from_texts([""], OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
memory = VectorStoreRetrieverMemory(retriever=retriever, memory_key="history")
E. 组合记忆 (ConversationSummaryBufferMemory)
- 特点:混合使用,当Token数不超过阈值时用完整对话,超过后用摘要。
- 适用:兼顾细节和成本。
from langchain.memory import ConversationSummaryBufferMemory
memory = ConversationSummaryBufferMemory(
llm=llm,
max_token_limit=500 # 超过500 Token后触发摘要
)
高级配置:自定义输入/输出键 & 返回消息格式
默认记忆会从链的输入中提取 input 键,并返回 history 键,如果你的链变量名不同,需要配置:
memory = ConversationBufferMemory(
memory_key="chat_history", # 默认是 "history"
input_key="user_input", # 如果你的输入变量名不是 "input"
output_key="bot_response", # 如果你的输出变量名不是 "response"
return_messages=True # 以 LangChain Message 对象形式存储(更推荐)
)
return_messages=True 会使 chat_history 变成 HumanMessage 和 AIMessage 列表,对后续处理更友好。
在 Agent 中使用记忆
Agent 使用记忆需注意:需要显式地将记忆注入提示模板(Prompt Template)。
from langchain.agents import AgentExecutor, create_react_agent
from langchain.memory import ConversationBufferMemory
from langchain.prompts import PromptTemplate
# 1. 在提示模板中增加 {chat_history} 占位符
prompt = PromptTemplate.from_template("""
你是一个助手,以下是历史对话:
{chat_history}
用户:{input}
你的回答:
""")
# 2. 创建记忆
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 3. 创建Agent
agent = create_react_agent(llm, tools, prompt) # tools为工具列表
# 4. 使用 AgentExecutor 并传入 memory
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory,
verbose=True
)
# 5. 使用
agent_executor.invoke({"input": "帮我查一下天气"})
agent_executor.invoke({"input": "我刚问了什么?"}) # 可以记忆
持久化记忆(保存到文件/数据库)
默认记忆存储在内存变量中,程序重启后会丢失,如需持久化,可手动保存/加载:
# 保存
import json
with open("memory.json", "w") as f:
json.dump(conversation.memory.chat_memory.messages, f, default=str)
# 加载
from langchain.schema import messages_from_dict
with open("memory.json", "r") as f:
loaded_messages = json.load(f)
conversation.memory.chat_memory.messages = [messages_from_dict(msg) for msg in loaded_messages]
总结建议
| 你的需求 | 推荐记忆类型 |
|---|---|
| 简单对话(<10轮) | ConversationBufferMemory |
| 控制Token,只记最近 | ConversationBufferWindowMemory(k=5) |
| 长对话,节省Token | ConversationSummaryMemory |
| 超长对话,按需检索 | VectorStoreRetrieverMemory |
| 长期对话,兼顾细节和成本 | ConversationSummaryBufferMemory |
如果你有特定的应用场景(比如客服、角色扮演、代码助手),我可以帮你进一步细化配置。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播