1. PostgreSQL + PGvector 向量数据库
1.1. pgvector 扩展
pgvector 是一个为 PostgreSQL 开发的扩展,它增加了对存储和搜索高维向量的支持。这使得您可以在您的关系型数据旁边直接存储由 ML 模型生成的向量嵌入(Embeddings),并使用近似最近邻(ANN)算法进行高效相似性搜索。
1.2. 创建表
1.2.1. 聊天对话表
用户点击 “开启新对话”,即在此表添加一条对话记录,以 UUID 作为对话的唯一标识(我们可观察 DeepSeek 官网的 url , 也是使用的 UUID )。UUID 好处是难以猜测,不像自增 ID 那样容易被人遍历,从而爬取所有对话内容,增强了数据安全性。
-- 聊天对话表
CREATE TABLE t_chat (
id BIGSERIAL PRIMARY KEY, -- 主键
uuid VARCHAR(60) UNIQUE NOT NULL, -- 对话 UUID
summary VARCHAR(60), -- 对话摘要
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建时间
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -- 更新时间
);
-- 为表添加注释
COMMENT ON TABLE t_chat IS '聊天对话表';
-- 为字段添加注释
COMMENT ON COLUMN t_chat.id IS '主键ID,自增唯一标识';
COMMENT ON COLUMN t_chat.uuid IS '对话UUID,全局唯一标识';
COMMENT ON COLUMN t_chat.summary IS '对话摘要(最大长度60字符)';
COMMENT ON COLUMN t_chat.create_time IS '记录创建时间(默认当前时间)';
COMMENT ON COLUMN t_chat.update_time IS '记录最后更新时间(默认当前时间)';
-- 添加索引
CREATE INDEX idx_chat_update_time ON t_chat (update_time);
1.2.2. 聊天消息表
每一个对话中,可以包含多条消息。它们是一对多的关系。
-- 聊天消息表
CREATE TABLE t_chat_message (
id BIGSERIAL PRIMARY KEY, -- 主键ID,自增唯一标识
chat_uuid VARCHAR(60) NOT NULL, -- 关联的对话表的UUID
content TEXT NOT NULL, -- 消息内容
role VARCHAR(12), -- 消息角色(如:user/assistant)
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -- 消息创建时间
);
-- 为表添加注释
COMMENT ON TABLE t_chat_message IS '聊天消息记录表';
-- 为字段添加注释
COMMENT ON COLUMN t_chat_message.id IS '主键ID,自增唯一标识';
COMMENT ON COLUMN t_chat_message.chat_uuid IS '关联的对话UUID,与t_chat表的uuid字段关联';
COMMENT ON COLUMN t_chat_message.content IS '消息内容';
COMMENT ON COLUMN t_chat_message.role IS '消息发送者角色(如:user-用户,assistant-助手)';
COMMENT ON COLUMN t_chat_message.create_time IS '消息创建时间(默认当前时间)';
-- 添加索引
create index idx_chat_message_create_time on t_chat_message (create_time);
create index idx_chat_message_uuid on t_chat_message (chat_uuid);
2. 整合 MyBatis Plus: 操作 PostgreSQL 数据库
2.1. 依赖
<dependencies>
<!-- Mybatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<!-- PostgreSQL 驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>2.2. 配置数据源
spring:
datasource:
driver-class-name: org.postgresql.Driver # 数据库驱动类名
url: jdbc:postgresql://localhost:5432/robot # 数据库连接 URL
username: postgres # 数据库用户名
password: postgres # 数据库密码
hikari: # HikariCP 连接池配置
pool-name: AI-Robot-HikariCP # 自定义连接池名称
auto-commit: true # 是否自动提交事务
connection-timeout: 30000 # 连接超时时间(毫秒)
idle-timeout: 600000 # 空闲连接存活最大时间(毫秒)
max-lifetime: 1800000 # 连接最大存活时间(毫秒)
minimum-idle: 5 # 最小空闲连接数
maximum-pool-size: 20 # 最大连接池大小
connection-test-query: SELECT 1 # 连接测试查询
validation-timeout: 5000 # 验证连接的有效性2.3. 配置包扫描
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.qiushengxue.ai.robot.domain.mapper")
public class MybatisPlusConfig {
}2.4. 创建 DO 实体类和 Mapper 接口
省略
2.5. p6spy 组件打印实际执行 SQL
p6spy 是一个针对数据库访问进行拦截和记录的工具,它通过代理 JDBC 驱动程序来工作。这意味着你的应用程序可以像往常一样使用 JDBC,而 p6spy 会在幕后记录所有的 SQL 语句及其执行时间。这对于开发和调试过程中的 SQL 优化非常有用。
p6spy不仅限于记录 SQL 日志,它还提供了一些高级功能,如:
慢SQL检测:通过配置
outagedetection和outagedetectioninterval,p6spy可以记录执行时间超过设定阈值的 SQL 语句。自定义日志格式:通过
logMessageFormat,你可以自定义 SQL 日志的输出格式,包括时间戳、执行时间、SQL 语句等。日志输出控制:
appender配置项允许你选择日志输出到控制台、文件或日志系统。
p6spy是一个强大的工具,它为 MyBatis-Plus 用户提供了便捷的 SQL 分析与打印功能。通过合理配置,你可以在开发和测试阶段有效地监控和优化 SQL 语句。然而,由于性能损耗,建议在生产环境中谨慎使用。
2.5.1. 添加依赖
<!-- p6spy 组件 -->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>${p6spy.version}</version>
</dependency>2.5.2. p6spy 配置
spy.properties
# 模块列表,根据版本选择合适的配置
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志格式
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
# 日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 取消JDBC驱动注册
deregisterdrivers=true
# 使用前缀
useprefix=true
# 排除的日志类别
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动列表
# driverlist=org.h2.Driver
# 开启慢SQL记录
outagedetection=true
# 慢SQL记录标准(单位:秒)
outagedetectioninterval=2
# 过滤 flw_ 开头的表 SQL 打印
filter=true
exclude=flw_*
2.5.3. 修改驱动类
将驱动类改为使用 com.p6spy.engine.spy.P6SpyDriver ; 再将数据库 url 连接,修改前缀为 jdbc:p6spy 跟着冒号,后面对应数据库连接地址:
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver # 数据库驱动类名
url: jdbc:p6spy:postgresql://localhost:5432/robot # 数据库连接 URL
评论区