使用LangChain实现带有历史记录的智能对话功能

482 阅读2分钟

在构建聊天机器人时,能否有效地记录和管理对话历史是成功的关键。通过LangChain的RunnableWithMessageHistory类,我们可以为某些类型的链条添加消息历史记录,从而提高聊天机器人的智能和用户体验。

引言

在构建智能对话系统时,保持对话的上下文是一项复杂但必要的任务。本文旨在指导您如何使用LangChain为聊天模型添加历史记录功能。我们将逐步探讨如何实现这一点,并提供完整的代码示例。

主要内容

如何存储和加载消息

RunnableWithMessageHistory的构建过程中,必须提供get_session_history函数。此函数接受一个session_id并返回一个BaseChatMessageHistory对象,帮助我们保存和加载对话信息。

下面是使用SQLite数据库创建get_session_history对象的示例:

from langchain_community.chat_message_histories import SQLChatMessageHistory

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

包装Runnable对象

RunnableWithMessageHistory可以包装特定类型的Runnable对象,允许我们通过session_id查找相关对话历史。例如,包装一个简单的聊天模型:

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

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

runnable_with_history = RunnableWithMessageHistory(
    model,
    get_session_history
)

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

多会话支持

通过不同的session_id来进行多会话管理。例如:

runnable_with_history.invoke(
    [HumanMessage(content="whats my name?")],
    config={"configurable": {"session_id": "1"}},
)

传递不同的session_id将启动新的聊天历史,因此模型不会记住用户之前的输入。

代码示例

以下是如何使用prompt模板与Runnable结合的示例:

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You're an assistant who speaks in {language}. Respond in 20 words or fewer"),
        MessagesPlaceholder(variable_name="history"),
        ("human", "{input}"),
    ]
)

runnable = prompt | model

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

runnable_with_history.invoke(
    {"language": "italian", "input": "hi im bob!"},
    config={"configurable": {"session_id": "2"}},
)

常见问题和解决方案

  • 如何应对网络限制? 有些地区可能会遭遇API访问限制,建议使用API代理服务以提高访问的稳定性。

  • 历史记录丢失问题? 确保session_id的唯一性,以避免在多会话环境下混乱。

总结和进一步学习资源

通过本文的介绍,我们希望您能顺利实现一个带有消息历史功能的智能对话系统。为了更深入地了解LangChain,您可以访问以下资源:

参考资料

  • LangChain API文档
  • LangChain GitHub仓库

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

---END---