记忆模块Memory

在最开始我们就通过实验知道LLM 本身是没有记忆的,每一次LLM的API调用都是一个全新的会话。但在某些应用程序中,如:聊天机器人,让LLM记住以前的历史交互是非常重要,无论是在短期的还是长期的。langchain中的“Memory”即对话历史(message history)就是为了实现这一点。

#用于创建对话链
from langchain.chains import ConversationChain
#用于存储对话历史,以便在后续对话中参考
from langchain.memory import ConversationBufferMemory

from langchain_openai import ChatOpenAI
import warnings
warnings.filterwarnings("ignore")

# 初始化大模型(需配置OPENAI_API_KEY)
API_KEY = "xxxxxxxxx"
llm = ChatOpenAI(model="deepseek-chat",
                   openai_api_key=API_KEY,
                   openai_api_base="https://api.deepseek.com")

#实例化一个对话缓冲区,用于存储对话历史
memory = ConversationBufferMemory()
#创建一个对话链,将大语言模型和对话缓冲区关联起来。
conversation = ConversationChain(
    llm=llm,
    memory=memory,
)

conversation.invoke("今天早上猪八戒吃了2个人参果。")
print("记忆1: ", conversation.memory.buffer)
print()

conversation.invoke("下午猪八戒吃了1个人参果。")
print("记忆2: ", conversation.memory.buffer)
print()

conversation.invoke("晚上猪八戒吃了3个人参果。")
print("记忆3: ", conversation.memory.buffer)
print()

conversation.invoke("猪八戒今天一共吃了几个人参果?")
print("记忆4: ", conversation.memory.buffer)

1. 导入必要的模块

from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
import warnings
warnings.filterwarnings("ignore")
  • ConversationChain:用于创建对话链
  • ConversationBufferMemory:用于存储对话历史
  • ChatOpenAI:用于连接 OpenAI 兼容的 API(这里使用的是 deepseek)
  • warnings:用于忽略警告信息

2. 初始化大模型

API_KEY = "xxxxxxxxx"
llm = ChatOpenAI(model="deepseek-chat",
                   openai_api_key=API_KEY,
                   openai_api_base="https://api.deepseek.com")
  • 配置 API 密钥(需要替换为实际的 API 密钥)
  • 使用 ChatOpenAI 连接到 deepseek-chat 模型
  • 指定 API 基础地址为 deepseek 的 API 地址

3. 创建对话缓冲区

memory = ConversationBufferMemory()
  • 创建一个对话缓冲区实例,用于存储对话历史

4. 创建对话链

conversation = ConversationChain(
    llm=llm,
    memory=memory,
)
  • 创建对话链,将大语言模型和对话缓冲区关联起来
  • 这样对话链就具备了记忆功能

5. 进行多轮对话

conversation.invoke("今天早上猪八戒吃了2个人参果。")
print("记忆1: ", conversation.memory.buffer)
print()

conversation.invoke("下午猪八戒吃了1个人参果。")
print("记忆2: ", conversation.memory.buffer)
print()

conversation.invoke("晚上猪八戒吃了3个人参果。")
print("记忆3: ", conversation.memory.buffer)
print()

conversation.invoke("猪八戒今天一共吃了几个人参果?")
print("记忆4: ", conversation.memory.buffer)

预期输出

记忆1:  人类: 今天早上猪八戒吃了2个人参果。
AI: 好的,我知道了猪八戒今天早上吃了2个人参果。

记忆2:  人类: 今天早上猪八戒吃了2个人参果。
AI: 好的,我知道了猪八戒今天早上吃了2个人参果。
人类: 下午猪八戒吃了1个人参果。
AI: 了解,猪八戒下午又吃了1个人参果。

记忆3:  人类: 今天早上猪八戒吃了2个人参果。
AI: 好的,我知道了猪八戒今天早上吃了2个人参果。
人类: 下午猪八戒吃了1个人参果。
AI: 了解,猪八戒下午又吃了1个人参果。
人类: 晚上猪八戒吃了3个人参果。
AI: 明白了,猪八戒晚上还吃了3个人参果。

记忆4:  人类: 今天早上猪八戒吃了2个人参果。
AI: 好的,我知道了猪八戒今天早上吃了2个人参果。
人类: 下午猪八戒吃了1个人参果。
AI: 了解,猪八戒下午又吃了1个人参果。
人类: 晚上猪八戒吃了3个人参果。
AI: 明白了,猪八戒晚上还吃了3个人参果。
人类: 猪八戒今天一共吃了几个人参果?
AI: 猪八戒今天一共吃了6个人参果(早上2个 + 下午1个 + 晚上3个)。

关键功能说明

  1. 对话记忆:ConversationBufferMemory会存储所有的对话历史
  2. 上下文理解:模型能够根据之前的对话内容回答当前问题
  3. 状态保持:每轮对话后,对话历史都会被更新并保存

 功能设计:多轮对话

from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
import warnings
warnings.filterwarnings("ignore")

# 实例化一个对话缓冲区,用于存储对话历史
memory = ConversationBufferMemory()
# 创建一个对话链,将大语言模型和对话缓冲区关联起来。
conversation = ConversationChain(
    llm=llm,
    memory=memory,
)

print("欢迎使用对话系统!输入 '退出' 结束对话。")

while True:
    user_input = input("你: ")
    if user_input.lower() in ['退出', 'exit', 'quit']:
        print("再见!")
        break
    response = conversation.predict(input=user_input)
    print(f"AI: {response}")

# 打印出对话历史,即 memory.buffer 的内容
print("对话历史:", memory.buffer)

 

posted @ 2025-11-05 23:04  星火撩原  阅读(13)  评论(0)    收藏  举报