引言
在构建聊天机器人时,保持对话的连续性对于提升用户体验至关重要。通过记录和管理用户的对话历史,聊天机器人可以更智能地回应用户。在这篇文章中,我们将探讨如何使用RunnableWithMessageHistory
类为AI应用程序添加消息历史功能,让您的聊天机器人记住对话上下文,并支持多会话。
主要内容
1. 什么是RunnableWithMessageHistory?
RunnableWithMessageHistory
是一个将消息历史添加到某些链中的类。它封装了另一个可运行对象(Runnable),在将消息传递给Runnable之前加载历史消息,并在调用Runnable后保存生成的响应。这使得一个会话能够在设定好的session_id下进行连续对话。
2. 如何存储和加载消息?
要将消息历史设置到应用程序中,必须实现一个get_session_history
函数,该函数接收一个session_id
并返回一个BaseChatMessageHistory
对象。在这个例子中,我们将使用SQLite数据库来实现消息历史。
3. 可运行对象(Runnable)是什么?
RunnableWithMessageHistory
可以封装特定类型的可运行对象,例如接受一组BaseMessages
作为输入的模型,并返回AI消息内容的字符串或一组BaseMessages
作为输出。
代码示例
以下是一个使用RunnableWithMessageHistory
的完整代码示例:
# 安装必要的包
!pip install langchain-openai
import os
from getpass import getpass
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import SQLChatMessageHistory
# 设置API密钥
os.environ["OPENAI_API_KEY"] = getpass("Enter your OpenAI API key: ")
# 创建获取会话历史的函数
def get_session_history(session_id):
return SQLChatMessageHistory(session_id, "sqlite:///memory.db")
# 创建聊天模型
llm = ChatOpenAI(model="gpt-4o-mini") # 使用API代理服务提高访问稳定性
# 使用RunnableWithMessageHistory
runnable_with_history = RunnableWithMessageHistory(
llm,
get_session_history,
input_messages_key="input",
history_messages_key="history",
)
# 调用方法
runnable_with_history.invoke(
[HumanMessage(content="hi - I'm Bob!")],
config={"configurable": {"session_id": "123"}},
)
runnable_with_history.invoke(
[HumanMessage(content="what's my name?")],
config={"configurable": {"session_id": "123"}},
)
常见问题和解决方案
- 无法获取会话历史:确保
get_session_history
函数返回的是BaseChatMessageHistory
对象,并验证数据库连接。 - API访问受限:在某些地区,可能需要使用API代理服务来提高访问稳定性。
总结和进一步学习资源
通过本文,我们了解到如何使用RunnableWithMessageHistory
保持对话连续性,为AI应用添加消息历史功能。在实际操作中,可以根据具体需求选择不同的存储方式(如Redis、Postgres等)来优化性能。
进一步学习资源:
参考资料
- LangChain官方文档
- SQLite官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---