ITPub博客

首页 > 人工智能 > 人工智能 > LangChain框架中的记忆

LangChain框架中的记忆

原创 人工智能 作者:brucexia 时间:2025-12-29 09:16:14 0 删除 编辑

本节将详细介绍LangChain 框架中的记忆(Memory )系统,包括概念、接口实现和实际应用。

记忆的概念

在LangChain 框架中,记忆是一种机制,用于存储和检索对话历史或其他上下文信息,使得模型能够“记住”之前的交互内容。这对于构建有状态的聊天机器人尤为重要,因为它允许对话具有连贯性和上下文感知能力。LangChain 提供了多种记忆类型,包括:

l   ConversationBufferMemory :存储完整对话历史。

l   ConversationBufferWindowMemory :存储最近 N 条消息。

l   ConversationSummaryMemory :存储对话摘要。

l   EntityMemory :基于实体提取的记忆。

l   VectorStoreRetrieverMemory :使用向量数据库存储和检索记忆。

记忆组件通常与ChatOpenAI 等聊天模型结合使用,通过memory_key 参数将对话历史注入模型调用中。

8.4.2  BaseChatMessageHistory 接口及其子类

BaseChatMessageHistory 是LangChain 中用于管理消息历史的抽象基类,定义了消息存储和检索的标准接口。其主要方法包括:

l   add_user_message(message:str) :添加用户消息。

l   add_ai_message(message:str) :添加AI 回复。

l   clear() :清空消息历史。

l   messages :获取所有消息(属性)。

其常见子类说明如下。

1 )内存存储实现

l   ChatMessageHistory :内存中的存储消息(临时存储)。

2 )持久化存储实现

l   FileChatMessageHistory :基于文件存储(如JSON 、CSV )。

l   RedisChatMessageHistory :使用Redis 存储。

l   MongoDBChatMessageHistory :使用MongoDB 存储。

l   SQLChatMessageHistory :使用SQL 数据库(如SQLite 、PostgreSQL )。

l   CassandraChatMessageHistory :使用Cassandra 存储。

这些实现允许消息历史在会话间持久化,或在分布式系统中=共享。

8.4.3  RunnableWithMessageHistory

RunnableWithMessageHistory 是LangChain 中用于构建带记忆功能的可运行组件的工具类。它允许将消息历史与链或模型结合,自动管理对话上下文的注入和更新。其核心功能包括:

l   自动从用户输入和模型输出中提取消息。

l   将历史消息格式化为模型可接受的输入格式。

l   支持多种记忆类型和消息历史存储方式。

【示例 8.10 】RunnableWithMessageHistory (LangChain+Qwen )。

# 登录阿里云百炼平台,创建 API-KEY 并替换代码中的 " 你的 API 密钥 "

# 请确保你安装了最新版的 LangChain 相关包

#pip install -U langchain langchain-community langchain-core dashscope

from langchain _ community.chat _ models import ChatTongyi

from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder

from langchain _ core.runnables import RunnablePassthrough, RunnableWithMessageHistory

from langchain _ community.chat _ message _ histories import ChatMessageHistory

 

import os

# 设置你的 DashScope API Key (通义千问)

os.environ["DASHSCOPE _ API _ KEY"] = " 你的 API 密钥 "  # 替换为你的实际密钥

 

# 创建聊天模型(使用 Qwen )

chat = ChatTongyi(model="qwen-max")  # 可选 : qwen-turbo, qwen-plus, qwen-max

 

# 创建提示模板,包含历史消息占位符

prompt = ChatPromptTemplate.from _ messages([

    ("system", " 你是一个有用的助手。 "),

    MessagesPlaceholder(variable _ name="history"),

    ("human", "{input}")

])

 

# 创建链

chain = prompt | chat

 

# 包装为带有历史记录的链

chain _ with _ history = RunnableWithMessageHistory(

    chain,

    lambda session _ id: ChatMessageHistory(),  # 历史记录工厂函数

    input _ messages _ key="input",

    history _ messages _ key="history"

)

 

# 使用链

response = chain _ with _ history.invoke(

    {"input": " 你好! "},

    config={"configurable": {"session _ id": "user123"}}

)

print(response.content)

输出:

你好!有什么我能帮助你的吗?

基于LangChain 的聊天机器人

使用LangChain 构建聊天机器人时,记忆组件是关键一环。以下是一个完整示例,展示如何结合RunnableWithMessageHistory 和ConversationBufferMemory 构建一个简单的聊天机器人。

【示例 8.11 】 基于LangChain 的聊天机器人(适配LangChain 最新版+Qwen )。

# 依赖安装(确保版本兼容)

#pip install --upgrade langchain langchain-community langchain-core dashscope

# 登录阿里云 DashScope 控制台,创建 API Key 并替换代码中的 "your _ dashscope _ api _ key"

from langchain _ community.chat _ models import ChatTongyi

from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder

from langchain _ community.chat _ message _ histories import ChatMessageHistory

from langchain _ core.runnables import RunnableWithMessageHistory  # ✅ 修正导入路径

import os

 

# 设置 DashScope API Key (请替换为你自己的)

api _ key=os.getenv("DASHSCOPE _ API _ KEY")

 

# 1. 创建聊天模型(使用 Qwen )

chat _ model = ChatTongyi(

    model="qwen-plus",  # 可选 : qwen-turbo, qwen-plus, qwen-max

    api _ key=api _ key,

    temperature=0.7

)

 

# 2. 创建提示模板

prompt _ template = ChatPromptTemplate.from _ messages([

    ("system", " 你是一个友好的 AI 助手,名字叫小智。 "),

    MessagesPlaceholder(variable _ name="chat _ history"),

    ("human", "{user _ input}")

])

 

# 3. 创建处理链

chain = prompt _ template | chat _ model

 

# 4. 创建历史记录存储字典

store = {}

 

def get _ session _ history(session _ id: str) -> ChatMessageHistory:

    if session _ id not in store:

        store[session _ id] = ChatMessageHistory()

    return store[session _ id]

 

# 5. 创建带有历史记录的链

chatbot = RunnableWithMessageHistory(

    chain,

    get _ session _ history,

    input _ messages _ key="user _ input",

    history _ messages _ key="chat _ history"

)

 

# 6. 模拟对话

def chat(session _ id, message):

    response = chatbot.invoke(

        {"user _ input": message},

        config={"configurable": {"session _ id": session _ id}}

    )

    return response.content

 

# 测试对话

session = "user _ 123"

print("AI:", chat(session, " 你好! "))

print("AI:", chat(session, " 你叫什么名字? "))

print("AI:", chat(session, " 我们刚才聊了什么? "))

输出:

AI: 你好呀!有什么我可以帮你的吗? 😊

AI: 我叫小智,很高兴认识你! 🌟 有什么问题或者需要帮助的吗?

AI: 我们刚刚聊到我是小智,一个友好且乐于助人的 AI 助手! 🌟 你还问我我们之前聊了什么,现在你看到的就是我们的最新对话啦!有什么其他想知道的吗? 😊

这个实现完整展示了LangChain 的对话记忆功能,能够跨多个交互回合保持上下文一致性。



本文节选自《AI Agent智能体开发实践》,获出版社和作者授权发布。




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/18841117/viewspace-3106516/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2022-02-14

  • 博文量
    219
  • 访问量
    196305