趋近智
尽管基本内存缓冲区将对话历史存储在易失性内存中,但生产应用通常要求数据持久性。交互可能跨越多个会话,需要长期保存用户特定上下文 (context),或者需要在应用重启和部署后依然存在。实现持久化记忆存储可以满足这些要求,确保对话上下文不会丢失。
本节将介绍如何配置和使用LangChain记忆模块的持久化存储后端。我们将介绍常见的数据库选择,并演示LangChain的抽象层如何让集成变得简单。
内存存储对于短时交互或开发来说简单快速。然而,它在生产环境中存在明显局限:
持久化存储通过将对话历史保存到数据库或文件系统等持久性存储中来解决这些问题。这使得:
LangChain通过其BaseChatMessageHistory接口,提供对各种存储解决方案的内置支持。后端的选择依赖于您的应用规模、现有基础设施和具体要求。
PostgreSQL、MySQL、SQLite或SQL Server等数据库提供结构化存储、ACID一致性以及强大的查询功能。
SQLChatMessageHistory(使用SQLAlchemy)。需要一个表来存储消息,通常包含会话ID、消息类型(人类/AI)和内容。这些数据库提供更大的灵活性,对于大型数据集通常具有更好的横向扩展性。
RedisChatMessageHistory。通常将消息存储在与会话ID关联的Redis列表中。MongoDBChatMessageHistory。将消息作为文档存储在集合中,通常通过会话ID进行索引。CassandraChatMessageHistory。直接在文件中存储历史记录是适用于特定情况的简单选择。
FileChatMessageHistory。通常将消息以JSON或文本形式保存在以会话ID命名的文件中。ChatMessageHistory抽象核心思想是将消息存储与对话逻辑分离。LangChain使用BaseChatMessageHistory的实现来处理从不同后端(如Redis或SQL)保存和获取消息的细节。
在现代LangChain表达式语言(LCEL)中,您无需手动将历史对象传递给记忆类。相反,您可以使用RunnableWithMessageHistory。这个包装器接受一个工厂函数,该函数接受session_id并为该会话返回相应的BaseChatMessageHistory实例。这确保在链运行前自动加载正确的历史记录,并在完成后进行更新。
让我们看看如何使用LCEL配置不同后端的持久性。
首先,确保您已安装必要的库:pip install redis langchain-community。
from langchain_community.chat_message_histories import RedisChatMessageHistory
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
# 配置
REDIS_URL = "redis://localhost:6379/0" # 替换为您的Redis实例URL
# 1. 定义历史工厂
# 此函数为给定会话ID返回历史对象
def get_redis_history(session_id: str):
return RedisChatMessageHistory(session_id=session_id, url=REDIS_URL)
# 2. 设置LLM和提示
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个乐于助人的助手。"),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}")
])
# 3. 创建链
# 注意这里我们不绑定记忆;链是无状态逻辑
chain = prompt | llm
# 4. 用消息历史包装
# 这增加了有状态的持久性层
chain_with_history = RunnableWithMessageHistory(
chain,
get_redis_history,
input_messages_key="input",
history_messages_key="chat_history"
)
# 5. 使用会话配置调用
config = {"configurable": {"session_id": "user123_conversation456"}}
# 第一次交互
response1 = chain_with_history.invoke({"input": "Hi! My name is Bob."}, config=config)
print(response1.content)
# 第二次交互(记忆从Redis加载)
response2 = chain_with_history.invoke({"input": "What is my name?"}, config=config)
print(response2.content)
# 验证消息是否在Redis中(使用redis-cli):
# > KEYS *
# > LRANGE message_store:user123_conversation456 0 -1
在此范例中,RunnableWithMessageHistory使用在config中找到的session_id调用get_redis_history。它将加载的消息注入到提示的chat_history占位符中,并自动将新的交流保存回Redis。
首先,安装所需的库:pip install sqlalchemy langchain-community。
from langchain_community.chat_message_histories import SQLChatMessageHistory
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
# 配置
DB_CONNECTION = "sqlite:///langchain_memory.db"
# 1. 定义历史工厂
def get_sql_history(session_id: str):
# 如果表不存在,它会自动创建
return SQLChatMessageHistory(
session_id=session_id,
connection_string=DB_CONNECTION,
table_name="message_store"
)
# 2. 设置LLM和提示(与Redis范例相同)
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个乐于助人的旅行代理。"),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}")
])
# 3. 创建链
chain = prompt | llm
# 4. 用消息历史包装
chain_with_history = RunnableWithMessageHistory(
chain,
get_sql_history,
input_messages_key="input",
history_messages_key="chat_history"
)
# 与特定会话ID的交互
config = {"configurable": {"session_id": "user789_chat001"}}
chain_with_history.invoke({"input": "I want to plan a trip to Italy."}, config=config)
response = chain_with_history.invoke({"input": "What was the destination I mentioned?"}, config=config)
print(response.content)
# 验证SQLite数据库中的消息:
# > sqlite3 langchain_memory.db
# > SELECT * FROM message_store WHERE session_id = 'user789_chat001';
这种设置允许您通过更改传递给RunnableWithMessageHistory的工厂函数,轻松切换后端。
在生产环境中实现持久化记忆时,请考虑以下事项:
session_id列(或等效列)进行索引对于快速查询来说是必要的。监控查询性能,并在需要时考虑数据库扩展方法(读副本、分片)。通过仔细选择和配置使用LangChain的BaseChatMessageHistory实现的持久化后端,您可以构建能够有效维护长期对话上下文 (context)的有状态LLM应用。这个持久化层是迈向提供连续且连贯用户体验的生产就绪系统的一大步。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•