如何为你的聊天机器人添加消息历史功能

128 阅读2分钟

引言

在构建聊天机器人时,能够在对话中传递和存储状态至关重要。RunnableWithMessageHistory 类允许我们将消息历史添加到某些类型的链中,帮助创建更加动态和记忆深刻的聊天体验。在这篇文章中,我们将深入探讨如何在聊天机器人中实现消息历史功能,并分享一些实用的代码示例。

主要内容

什么是 RunnableWithMessageHistory?

RunnableWithMessageHistory 类包装了另一个 Runnable,并为其管理聊天消息历史。它加载先前的对话消息,并在调用 Runnable 后保存生成的响应。通过使用 session_id,它还支持多个会话,从而可以在一次交互中保存和加载不同的对话历史。

如何存储和加载消息

定义 get_session_history 函数

首先,我们需要实现一个 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")

包装一个 Runnable

RunnableWithMessageHistory 可以包装某些类型的 Runnables。具体来说,它可以用于任何输入或输出为 BaseMessages 或字典的 Runnables。

例如,假设我们有一个简单的聊天模型,我们可以像这样包装它:

from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from getpass import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass()  # 输入你的API密钥

model = ChatOpenAI(model="gpt-4o-mini")

runnable_with_history = RunnableWithMessageHistory(
    model,
    get_session_history,
)

# 使用API代理服务提高访问稳定性
response = runnable_with_history.invoke(
    [HumanMessage(content="hi - im bob!")],
    config={"configurable": {"session_id": "1"}}
)

print(response.content)

代码示例

以下是一个完整的代码示例展示如何实现一个支持消息历史的简单聊天模型:

from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_community.chat_message_histories import SQLChatMessageHistory
from langchain_core.messages import HumanMessage
import os

def get_session_history(session_id):
    return SQLChatMessageHistory(session_id, "sqlite:///memory.db")

os.environ["OPENAI_API_KEY"] = "your_openai_api_key"  # 使用API代理服务提高访问稳定性

model = ChatOpenAI(model="gpt-4o-mini")

runnable_with_history = RunnableWithMessageHistory(
    model,
    get_session_history,
)

response = runnable_with_history.invoke(
    [HumanMessage(content="Hello, what is my name?")],
    config={"configurable": {"session_id": "session123"}}
)
print(response.content)

常见问题和解决方案

如何处理多个会话?

通过使用不同的 session_id,可以轻松管理多个会话。每个 session_id 对应一个独立的消息历史。

如何确保数据的持久性?

可以选择合适的数据库后端(如 SQLite、Redis 或 Postgres)来存储会话数据。

总结和进一步学习资源

通过使用 RunnableWithMessageHistory,我们可以轻松为聊天机器人添加消息历史功能,从而提升用户体验。推荐进一步查看 LangChain 文档 以深入理解更多高级功能。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---