在现代应用程序开发中,尤其是在构建聊天机器人或对话系统时,维护对话历史是非常重要的。SQLite 是一种嵌入式数据库引擎,非常适合用于存储应用程序的对话历史。在本篇文章中,我将展示如何使用 SQLite 和 OpenAI 构建一个简单的对话历史链系统。
技术背景介绍
SQLite 是一种轻量级的嵌入式数据库引擎,适用于需要内存中存储或文件存储的应用程序场景。它的使用非常广泛,包括在浏览器、操作系统和移动设备中。由于其简单性和稳定性,使用 SQLite 存储对话历史的方式非常有效,并且易于集成。
核心原理解析
我们将使用 langchain-community
提供的 SQLChatMessageHistory
类来存储和检索对话历史,并结合 OpenAI 的聊天模型来实现动态的对话交互。通过将对话历史存储在 SQLite 中,确保每次用户互动时都可以基于历史信息生成更加自然的答案。
代码实现演示
下面是完整的代码示例,其中展示了如何使用 SQLite 和 OpenAI 实现对话历史链:
import openai
from langchain_community.chat_message_histories import SQLChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
# 使用稳定可靠的API服务
client = openai.OpenAI(
base_url='https://yunwu.ai/v1', # 国内稳定访问
api_key='your-api-key'
)
# 创建对话历史存储对象
chat_message_history = SQLChatMessageHistory(
session_id="test_session_id", connection_string="sqlite:///sqlite.db"
)
# 添加用户和AI消息
chat_message_history.add_user_message("Hello")
chat_message_history.add_ai_message("Hi")
# 创建对话提示模板
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"}}
# 进行对话链调用
response1 = chain_with_history.invoke({"question": "Hi! I'm bob"}, config=config)
print(response1.content)
response2 = chain_with_history.invoke({"question": "Whats my name"}, config=config)
print(response2.content)
代码说明
- 我们使用
SQLChatMessageHistory
来创建或连接到一个 SQLite 数据库文件sqlite.db
。 ChatPromptTemplate
用于定义聊天模型的提示模板。RunnableWithMessageHistory
将对话链与消息历史结合,以便在响应中利用上下文。
应用场景分析
这种方法适用于需要持久化对话历史的应用场景,比如客服机器人、用户支持系统和个性化助理。通过 SQLite 可以确保对话历史的数据持久化,并且易于在不同会话中检索。
实践建议
- 安全性: 确保数据库连接字符串和 API 密钥的安全存储。
- 扩展性: 数据库文件的增长可能会影响性能,可以定期清理过期会话数据。
- 测试: 在不同环境中测试性能,确保数据库的响应速度符合需求。
如果遇到问题欢迎在评论区交流。
—END—