“聊天机器人” 的小功能 —— SSE 实时流渲染 AI 大模型的回答,还需要添加以下功能:

  • 开启新对话;

  • 左侧栏展示历史对话,方便查看之前的问答内容;

  • 右侧栏:

    • 对话框:支持动态选择不同的 AI 大模型;

    • 对话框:支持勾选联网搜索;

    • 与 AI 大模型的聊天消息记录,需要存储到数据库中,后续也需要从服务端来获取;

创建表

分析完接下来需要开发的功能后,我们需要在 PostgreSQL 数据库中,新建两张表。

聊天对话表

用户点击 “开启新对话”,即在此表添加一条对话记录,以 UUID 作为对话的唯一标识。

为什么要使用 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);

聊天消息表

每一个对话中,可以包含多条消息。它们是一对多的关系。聊天消息表建表语句如下:

-- 聊天消息表
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);

执行 SQL 语句

接着,打开 DataGrip, 在 console 控制台中,将以上 SQL 全部复制进去,Ctrl + S 全选,点击左上角的 “执行” 按钮即可。