引言
在构建对话式人工智能(AI)应用时,维护会话上下文是十分重要的。通过保存聊天记录,我们可以使AI在多轮会话中记住用户的信息,从而提供更智能和个性化的响应。在本篇文章中,我们将探讨如何使用RunnableWithMessageHistory类在LangChain框架中添加消息历史。
主要内容
什么是RunnableWithMessageHistory?
RunnableWithMessageHistory是LangChain中的一个类,用于在某些类型的Runnable上添加消息历史。它在将输入传递给Runnable之前加载之前的会话消息,并在调用Runnable后保存生成的响应。这对于维持多个会话特别有用,每个会话通过一个session_id来标识。
如何存储和加载消息?
为了使用RunnableWithMessageHistory,需要定义一个get_session_history函数,该函数以session_id为参数,返回一个实现了消息加载和保存的BaseChatMessageHistory对象。在本例中,我们使用SQLite数据库来存储消息。
from langchain_community.chat_message_histories import SQLChatMessageHistory
def get_session_history(session_id):
return SQLChatMessageHistory(session_id, "sqlite:///memory.db")
SQLiteMessageHistory介绍
SQLChatMessageHistory类用于在SQLite数据库中存储和检索消息,便于会话的持久化。
包装Runnable
RunnableWithMessageHistory可以包装特定类型的Runnable,比如接受消息序列或字典作为输入并输出字符串或消息序列的Runnable。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini") # 常见模型,如OpenAI GPT-4
from langchain_core.runnables.history import RunnableWithMessageHistory
runnable_with_history = RunnableWithMessageHistory(
llm,
get_session_history,
input_messages_key="input",
history_messages_key="history",
)
多会话支持
通过不同的session_id进行多会话支持,每次调用时都必须提供session_id以标识会话。
代码示例
以下是一个完整示例,演示如何使用RunnableWithMessageHistory来维持对话历史:
from langchain_core.messages import HumanMessage
from langchain_core.runnables.history import RunnableWithMessageHistory
# 初始化可调用的ChatModel和历史记录函数
runnable_with_history = RunnableWithMessageHistory(
llm,
get_session_history,
input_messages_key="input",
history_messages_key="history",
)
# 使用会话ID 'abc123' 发起对话
runnable_with_history.invoke(
[HumanMessage(content="hi - im bob!")],
config={"configurable": {"session_id": "abc123"}},
)
# 继续对话,AI将记住用户名称
runnable_with_history.invoke(
[HumanMessage(content="whats my name?")],
config={"configurable": {"session_id": "abc123"}},
)
常见问题和解决方案
问题:区分不同的会话
解决方案是通过不同的session_id来初始化聊天记录。如果一个新的session_id被使用,则将开启一个新的会话,无需记住之前的消息。
问题:性能问题
在使用SQLite等存储机制时,确保数据库连接的稳定性与性能尤为重要,建议在高并发场景下优化存储方案。
总结和进一步学习资源
在这篇文章中,我们讨论了如何使用LangChain的RunnableWithMessageHistory类来维护聊天记录。通过这个方法,我们能够创建更智能的对话式AI应用。
进一步阅读
参考资料
- LangChain官方文档:了解更多关于
RunnableWithMessageHistory的详细信息。 - SQLite使用手册:深入理解如何在SQLite中存储和操作数据。
结束语:'如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!'
---END---