LangChain记忆管理怎么配置

wen python案例 2

本文目录导读:

LangChain记忆管理怎么配置

  1. 核心步骤:将记忆注入链
  2. 常见的记忆类型及配置
  3. 高级配置:自定义输入/输出键 & 返回消息格式
  4. 在 Agent 中使用记忆
  5. 持久化记忆(保存到文件/数据库)
  6. 总结建议

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 变成 HumanMessageAIMessage 列表,对后续处理更友好。


在 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

如果你有特定的应用场景(比如客服、角色扮演、代码助手),我可以帮你进一步细化配置。

上一篇LangChain文档加载器丰富吗

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!