在构建聊天机器人时,能否有效地记录和管理对话历史是成功的关键。通过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---