
一、独立对话from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_openai import ChatOpenAI from openai import OpenAI client OpenAI( api_keysk-4*************************, base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1, ) completion client.chat.completions.create( modelqwen3.5-plus, messages[ {role: system, content: You are a helpful assistant.}, {role: user, content: 薛之谦是谁}, ], ) print(completion.model_dump_json()) completion client.chat.completions.create( modelqwen3.5-plus, messages[ {role: system, content: You are a helpful assistant.}, {role: user, content: 他有哪些代表作}, ], ) print(completion.model_dump_json())运行结果运行上面代码我们会发现运行到第二个问题的时候他并不知道所谓的他是谁可见正常情况下模型是没有记忆的上面两个问题是两个独立的对话。要想让模型有记忆我们要引入记忆模块。二、引入ConversationBufferMemory基础记忆在对话系统中让模型记住之前的对话内容是至关重要的。LangChain提供了多种记忆机制让大语言模型能够维持对话的连续性。本文将按照从基础到进阶的顺序详细介绍各种记忆模块的使用方法。from langchain.memory import ConversationBufferMemory from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_openai import ChatOpenAIfrom langchain.memory import ConversationBufferMemory基础记忆用来储存历史对话每当有新的对话时就添加进去memory ConversationBufferMemory(return_messagesTrue) memory.load_memory_variables({})初始化记忆memory.load_memory_variables({})是查看当前记忆memory.save_context({input: 我的名字是小a}, {output: 你好小a})# memory.load_memory_variables({}) memory.save_context({input: 我在北京}, {output: 好的我记住了}) memory.load_memory_variables({})保存对话上下文prompt ChatPromptTemplate.from_messages( [ (system, 你是一个AI助手。), MessagesPlaceholder(variable_namehistory),#表示消息列表的模板,在这里用于在提示模板里留出后续填入历史消息的位置 (human, {user_input}) ] ) model ChatOpenAI(modelqwen-plus, openai_api_keysk-4*********************, openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1)在提示模版中预留历史消息的位置这里设置了一个历史消息的占位符叫historychain prompt | model user_input 你知道我的名字吗 history memory.load_memory_variables({})[history] result chain.invoke({ user_input: user_input, history: history }) print(第一轮回答:, result.content)构建链并且凯琪来第一轮对话historymemory.load_memory_variables{}……是加载历史。最后 的memory_save……是保存本轮对话。memory.save_context({input: user_input}, {output: result.content}) user_input 根据对话历史告诉我我上一个问题问你的是什么请重复一遍 history memory.load_memory_variables({})[history] result chain.invoke({ user_input: user_input, history: history }) print(第二轮回答:, result.content)上一轮对话内容保存到历史中等第二次对话的时候模型就能记住上一轮的对话。总结ConversationBufferMemory最简单的记忆形式存储所有历史对话MessagesPlaceholder在提示模板中预留位置插入历史消息return_messagesTrue以消息列表形式返回而非字符串每次对话后要手动保存上下文三、ConversationChain简化记忆管理手动管理记忆比较繁琐LangChain提供了ConversationChain来简化这一过程from langchain.chains import ConversationChain #用于对话和加载上下文 from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder model ChatOpenAI(modelqwen-plus, openai_api_keysk-450489d77b3c46f28ebc4f9ac8403e19, openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1) memory ConversationBufferMemory(return_messagesTrue) chain ConversationChain(llmmodel, memorymemory) #直接定义链直接定义链自动管理记忆r1chain.invoke({input: 先清空之前的对话记录}) r2chain.invoke({input: 你好我的名字是小a}) r3chain.invoke({input:我告诉过你我的名字是什么}) print(r1) print(r2) print(r3)自动保存上下文无需手动save_contextr1内容输入是清空之间的对话记录response中已经清空所有对话模型从头开始r2内容输入介绍response中模型进行回应r3内容提问模型检测模型记忆模块response中模型回复记得prompt ChatPromptTemplate.from_messages([ (system, 你是一个热情的助手喜欢用积极的语气回答问题。), MessagesPlaceholder(variable_namehistory), (human, {input}) ]) model ChatOpenAI(modelqwen-plus, openai_api_keysk-450489d77b3c46f28ebc4f9ac8403e19, openai_api_basehttps://dashscope.aliyuncs.com/compatible-mode/v1) memoryConversationBufferMemory(return_messagesTrue) chain ConversationChain(llmmodel, memorymemory, promptprompt) #支持定义提示模板 r4chain.invoke({input: 今天天气怎么样}) r5chain.invoke({input: 你记得我问的上一个问题不是什么}) print(r4) print(r5)修改格式让模型回复更加友好.prompt自定义提示模版创建chain的的时候指定提示模版最后使用自定义提示模版进行对话。r4r5ConversationChain的优势自动管理记忆的保存和加载支持自定义提示模板代码更简洁减少重复代码