使用LangChain添加聊天记录:构建智能对话机器人的基础

184 阅读3分钟

引言

在构建对话式人工智能(AI)应用时,维护会话上下文是十分重要的。通过保存聊天记录,我们可以使AI在多轮会话中记住用户的信息,从而提供更智能和个性化的响应。在本篇文章中,我们将探讨如何使用RunnableWithMessageHistory类在LangChain框架中添加消息历史。

主要内容

什么是RunnableWithMessageHistory?

RunnableWithMessageHistory是LangChain中的一个类,用于在某些类型的Runnable上添加消息历史。它在将输入传递给Runnable之前加载之前的会话消息,并在调用Runnable后保存生成的响应。这对于维持多个会话特别有用,每个会话通过一个session_id来标识。

如何存储和加载消息?

为了使用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")

SQLiteMessageHistory介绍

SQLChatMessageHistory类用于在SQLite数据库中存储和检索消息,便于会话的持久化。

包装Runnable

RunnableWithMessageHistory可以包装特定类型的Runnable,比如接受消息序列或字典作为输入并输出字符串或消息序列的Runnable。

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")  # 常见模型,如OpenAI GPT-4

from langchain_core.runnables.history import RunnableWithMessageHistory

runnable_with_history = RunnableWithMessageHistory(
    llm,
    get_session_history,
    input_messages_key="input",
    history_messages_key="history",
)

多会话支持

通过不同的session_id进行多会话支持,每次调用时都必须提供session_id以标识会话。

代码示例

以下是一个完整示例,演示如何使用RunnableWithMessageHistory来维持对话历史:

from langchain_core.messages import HumanMessage
from langchain_core.runnables.history import RunnableWithMessageHistory

# 初始化可调用的ChatModel和历史记录函数
runnable_with_history = RunnableWithMessageHistory(
    llm,
    get_session_history,
    input_messages_key="input",
    history_messages_key="history",
)

# 使用会话ID 'abc123' 发起对话
runnable_with_history.invoke(
    [HumanMessage(content="hi - im bob!")],
    config={"configurable": {"session_id": "abc123"}},
)

# 继续对话,AI将记住用户名称
runnable_with_history.invoke(
    [HumanMessage(content="whats my name?")],
    config={"configurable": {"session_id": "abc123"}},
)

常见问题和解决方案

问题:区分不同的会话

解决方案是通过不同的session_id来初始化聊天记录。如果一个新的session_id被使用,则将开启一个新的会话,无需记住之前的消息。

问题:性能问题

在使用SQLite等存储机制时,确保数据库连接的稳定性与性能尤为重要,建议在高并发场景下优化存储方案。

总结和进一步学习资源

在这篇文章中,我们讨论了如何使用LangChain的RunnableWithMessageHistory类来维护聊天记录。通过这个方法,我们能够创建更智能的对话式AI应用。

进一步阅读

参考资料

  1. LangChain官方文档:了解更多关于RunnableWithMessageHistory的详细信息。
  2. SQLite使用手册:深入理解如何在SQLite中存储和操作数据。

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

---END---