[保持对话连续性:如何在AI应用中添加消息历史]

4 阅读2分钟

引言

在构建聊天机器人时,保持对话的连续性对于提升用户体验至关重要。通过记录和管理用户的对话历史,聊天机器人可以更智能地回应用户。在这篇文章中,我们将探讨如何使用RunnableWithMessageHistory类为AI应用程序添加消息历史功能,让您的聊天机器人记住对话上下文,并支持多会话。

主要内容

1. 什么是RunnableWithMessageHistory?

RunnableWithMessageHistory是一个将消息历史添加到某些链中的类。它封装了另一个可运行对象(Runnable),在将消息传递给Runnable之前加载历史消息,并在调用Runnable后保存生成的响应。这使得一个会话能够在设定好的session_id下进行连续对话。

2. 如何存储和加载消息?

要将消息历史设置到应用程序中,必须实现一个get_session_history函数,该函数接收一个session_id并返回一个BaseChatMessageHistory对象。在这个例子中,我们将使用SQLite数据库来实现消息历史。

3. 可运行对象(Runnable)是什么?

RunnableWithMessageHistory可以封装特定类型的可运行对象,例如接受一组BaseMessages作为输入的模型,并返回AI消息内容的字符串或一组BaseMessages作为输出。

代码示例

以下是一个使用RunnableWithMessageHistory的完整代码示例:

# 安装必要的包
!pip install langchain-openai

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

# 设置API密钥
os.environ["OPENAI_API_KEY"] = getpass("Enter your OpenAI API key: ")

# 创建获取会话历史的函数
def get_session_history(session_id):
    return SQLChatMessageHistory(session_id, "sqlite:///memory.db")

# 创建聊天模型
llm = ChatOpenAI(model="gpt-4o-mini")  # 使用API代理服务提高访问稳定性

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

# 调用方法
runnable_with_history.invoke(
    [HumanMessage(content="hi - I'm Bob!")],
    config={"configurable": {"session_id": "123"}},
)

runnable_with_history.invoke(
    [HumanMessage(content="what's my name?")],
    config={"configurable": {"session_id": "123"}},
)

常见问题和解决方案

  • 无法获取会话历史:确保get_session_history函数返回的是BaseChatMessageHistory对象,并验证数据库连接。
  • API访问受限:在某些地区,可能需要使用API代理服务来提高访问稳定性。

总结和进一步学习资源

通过本文,我们了解到如何使用RunnableWithMessageHistory保持对话连续性,为AI应用添加消息历史功能。在实际操作中,可以根据具体需求选择不同的存储方式(如Redis、Postgres等)来优化性能。

进一步学习资源:

参考资料

  • LangChain官方文档
  • SQLite官方文档

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