在今天的文章中,我们将深入探讨如何使用SQLite数据库来存储会话数据,并利用AI来实现一个简单的会话链。这对于开发聊天机器人或智能助理时尤为有用,因为它能有效地记录和管理用户交互历史。让我们一步步实现这一应用。
技术背景介绍
SQLite是一个用C语言编写的数据库引擎,它广泛用于多种应用程序中,因其嵌入式的特性被大量部署。与传统数据库不同,SQLite是一个库,软件开发人员可以将其嵌入到自己的应用程序中。
核心原理解析
在这个示例中,我们将使用SQLChatMessageHistory来管理聊天消息历史,背后以SqliteEntityStore作为存储。这可以让我们轻松地记录每次人机交互的信息。然后,我们将结合OpenAI的API,实现一个基于历史记录的对话链,这样AI就能记住会话上下文。
代码实现演示
我们将分为两个部分来实现:首先是消息存储,然后是结合AI的会话链。
消息历史存储
首先,我们创建一个用来存储聊天历史的SQLChatMessageHistory实例:
from langchain_community.chat_message_histories import SQLChatMessageHistory
# 创建消息历史存储实例
chat_message_history = SQLChatMessageHistory(
session_id="test_session_id", # 为每个会话提供一个唯一的ID
connection_string="sqlite:///sqlite.db" # 如果数据库不存在,将被自动创建
)
# 添加用户和AI的消息
chat_message_history.add_user_message("Hello")
chat_message_history.add_ai_message("Hi")
# 输出当前会话的所有消息
print(chat_message_history.messages)
# 输出: [HumanMessage(content='Hello'), AIMessage(content='Hi')]
结合AI的会话链
接下来,我们需要安装langchain-openai库,并配置OpenAI的API密钥:
pip install -U langchain-openai
export OPENAI_API_KEY='your-openai-api-key' # 设置OpenAI的API密钥
然后,我们设置会话链:
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",
)
# 配置会话ID
config = {"configurable": {"session_id": "test_session_id"}}
# 测试会话链
response = chain_with_history.invoke({"question": "Hi! I'm bob"}, config=config)
print(response) # 输出: AIMessage(content='Hello Bob! How can I assist you today?')
response = chain_with_history.invoke({"question": "Whats my name"}, config=config)
print(response) # 输出: AIMessage(content='Your name is Bob! Is there anything specific you would like assistance with, Bob?')
应用场景分析
这样设置的会话链特别适合需要记住用户上下文的对话系统,如客服聊天机器人、个人助理应用等。使用SQLite作为存储可以确保在嵌入式环境中不增加复杂性,并且它的轻量级特性非常适合移动应用。
实践建议
- 数据库连接字符串可根据实际应用需求进行配置,以满足多用户环境的需求。
- 在生产环境中,请确保API密钥和数据库文件的安全性。
- 可以根据需要扩展
SQLChatMessageHistory类,添加更多的处理逻辑。
如果遇到问题欢迎在评论区交流。
—END—

被折叠的 条评论
为什么被折叠?



