侧边栏壁纸
博主头像
牧云

怀璧慎显,博识谨言。

  • 累计撰写 133 篇文章
  • 累计创建 13 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

AI聊天机器人

秋之牧云
2026-03-17 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

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检测:通过配置 outagedetectionoutagedetectionintervalp6spy可以记录执行时间超过设定阈值的 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

0

评论区