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()  # 启动主程序

参考资料

posted @ 2025-04-01 17:48  向着朝阳  阅读(152)  评论(0)    收藏  举报