SQL (SQLAlchemy)
结构化查询语言(SQL) 是一种用于编程的特定领域语言,专为管理存储在关系数据库管理系统(RDBMS)中的数据或在关系数据流管理系统(RDSMS)中进行流处理而设计。它在处理结构化数据方面特别有用,即包含实体和变量之间关系的数据。
SQLAlchemy 是一个开源的
SQL工具包和 Python 编程语言的对象关系映射器(ORM),采用 MIT 许可证发布。
该笔记本介绍了一个SQLChatMessageHistory类,允许将聊天历史存储在SQLAlchemy支持的任何数据库中。
请注意,若要将其与除 SQLite 以外的数据库一起使用,您需要安装相应的数据库驱动程序。
设置
该集成位于 langchain-community 包中,因此我们需要安装它。我们还需要安装 SQLAlchemy 包。
pip install -U langchain-community SQLAlchemy langchain-openai
这也是可选但有益的步骤,可以通过设置LangSmith来实现最佳级别的可观测性
# os.environ["LANGSMITH_TRACING"] = "true"
# os.environ["LANGSMITH_API_KEY"] = getpass.getpass()
用法
使用存储时,您只需提供以下两项内容:
- 会话ID - 会话的唯一标识符,例如用户名、电子邮件、聊天ID等。
- 连接字符串 - 一个指定数据库连接的字符串。它将被传递给SQLAlchemy的create_engine函数。
from langchain_community.chat_message_histories import SQLChatMessageHistory
chat_message_history = SQLChatMessageHistory(
session_id="test_session", connection_string="sqlite:///sqlite.db"
)
chat_message_history.add_user_message("Hello")
chat_message_history.add_ai_message("Hi")
API 参考:SQL聊天消息历史
chat_message_history.messages
[HumanMessage(content='Hello'), AIMessage(content='Hi')]
链式调用
我们可以轻松地将此消息历史类与LCEL Runnables结合使用
为此,我们将使用 OpenAI,因此需要安装它
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful assistant."),
MessagesPlaceholder(variable_name="history"),
("human", "{question}"),
]
)
chain = prompt | ChatOpenAI()
chain_with_history = RunnableWithMessageHistory(
chain,
lambda session_id: SQLChatMessageHistory(
session_id=session_id, connection_string="sqlite:///sqlite.db"
),
input_messages_key="question",
history_messages_key="history",
)
# This is where we configure the session id
config = {"configurable": {"session_id": "<SESSION_ID>"}}
chain_with_history.invoke({"question": "Hi! I'm bob"}, config=config)
AIMessage(content='Hello Bob! How can I assist you today?')
chain_with_history.invoke({"question": "Whats my name"}, config=config)
AIMessage(content='Your name is Bob! Is there anything specific you would like assistance with, Bob?')