首页 > 人工智能 > 人工智能 > LangChain框架中的记忆
本节将详细介绍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/ ,如需转载,请注明出处,否则将追究法律责任。