ConversationBufferMemory 用法
目录
背景和价值
开发多轮对话,如果不使用 ConversationBufferMemory,开发需要自己维护历史消息。
langchain
load_memory_variables 加载当前记忆中的对话历史,返回一个字典,包含指定 memory_key 对应的历史记录。
save_context 将此对话的上下文保存到缓存中
# 假设已有对话历史
memory.save_context({"user_input": "你好"}, {"output": "你好!有什么可以帮您?"})
# 加载历史
history = memory.load_memory_variables({})
print(history)
# 输出: {'chat_history': [HumanMessage(content='你好'), AIMessage(content='你好!有什么可以帮您?')]}
LLMChain底层调用 ConversationBufferMemory原
2. 当使用 ConversationChain 或带记忆的链时
如果你将 ConversationBufferMemory 与链(如 ConversationChain)结合使用,链会在以下场景自动调用这两个方法:
(1) load_memory_variables 的调用时机
- 在链运行时(
chain.run()/chain.invoke()):
链会先调用memory.load_memory_variables(),将历史对话注入到当前提示词中。例如:from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory(memory_key="history") chain = ConversationChain(llm=llm, memory=memory) # 第一次调用:history 为空 response1 = chain.invoke({"input": "你好"}) # 内部自动调用 load_memory_variables(),获取空历史 # 第二次调用:history 包含第一轮对话 response2 = chain.invoke({"input": "我刚才说了什么?"}) # 自动加载历史并注入提示词
(2) save_context 的调用时机
- 在链完成响应后:
链会自动调用memory.save_context(),将当前输入和输出保存到记忆。例如:# 上述代码中,每次 chain.invoke() 后: memory.save_context( inputs={"input": "你好"}, outputs={"output": response1["response"]} )
代码示例
from langchain_openai import ChatOpenAI
import os
# from langchain.memory import ChatMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.prompts.prompt import PromptTemplate
from langchain_core.prompts.prompt import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
def create_llm() -> ChatOpenAI:
"""创建并返回配置好的大模型实例"""
return ChatOpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY") or "your_api_key_here",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
model="qwen2.5-math-7b-instruct"
)
llm= create_llm()
DEFAULT_TEMPLATE = """以下是人类与AI之间的友好对话描述。AI表现得很健谈,并提供了大量来自其上下文的具体细节。如果AI不知道问题的答案,它会真诚地表示不知道。
当前对话:
{history}
Human: {input}
AI:"""
PROMPT = PromptTemplate(input_variables=["history", "input"], template=DEFAULT_TEMPLATE)
memory = ConversationBufferMemory(memory_key="history")
conversation = LLMChain(
llm=llm,
prompt = PROMPT,
memory=memory,
verbose=True,
)
def main():
# 1. 获取用户输入
user_input = ""
while (True):
user_input = input("请输入文本:")
if(user_input == "exit"):
print("程序结束")
break
# 2. 处理数据
resp =conversation.invoke(input=user_input)
print("output =",resp)
print(memory.load_memory_variables({}))
if __name__ == "__main__":
main() # 启动主程序

浙公网安备 33010602011771号