Skip to content

数据库设计 ​

本章节将详细介绍如何使用 tio-boot 系统开发一个面向校园领域的搜索问答系统。该系统旨在为用户提供高效、智能的问答服务,涵盖以下主要功能:

功能概述 ​

  • 推荐问题:根据用户输入智能推荐相关问题,提升用户体验。
  • 会话管理:有效管理用户与系统之间的对话会话,确保对话的连贯性。
  • 历史记录管理:记录并管理用户的历史查询,便于后续参考和分析。
  • 意图识别:通过自然语言处理技术识别用户的查询意图,提供精准回答。
  • 提示词生成:自动生成提示词,辅助用户更好地表达查询需求。
  • 智能问答 调用大模型进行推理,生成答案。

vector ​

sql
CREATE EXTENSION IF NOT EXISTS vector;

数据库设计 ​

为了实现上述功能,系统设计了多个数据表以存储和管理相关数据。以下将详细介绍各个数据表的结构及其用途。

1. llm_question_recommend(推荐问题) ​

用于存储系统推荐的问题,帮助用户快速找到相关信息。

sql
drop table if exists llm_question_recommend;
CREATE TABLE "llm_question_recommend" (
  "id" BIGINT PRIMARY KEY,
  "orders" INT4,
  "avatar" VARCHAR,
  "title" VARCHAR,
  "content" VARCHAR,
  "env" VARCHAR,
  "remark" VARCHAR,
  "creator" VARCHAR DEFAULT ''::VARCHAR,
  "create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updater" VARCHAR DEFAULT ''::VARCHAR,
  "update_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "deleted" INT2 NOT NULL DEFAULT 0,
  "tenant_id" INT8 NOT NULL DEFAULT 0
);

表字段说明

  • id: 主键,唯一标识一条推荐问题记录。
  • orders: 排序字段,用于控制推荐问题的展示顺序。
  • avatar: 问题的图标 URL,增强视觉效果。
  • title: 问题的标题,简要描述问题主题。
  • content: 问题的具体内容,提供详细的信息。
  • env: 环境字段,标识问题所属的环境或模块。
  • remark: 备注信息,用于记录附加说明。
  • creator: 创建者信息,记录谁创建了该记录。
  • create_time: 创建时间,记录记录的创建时间。
  • updater: 更新者信息,记录谁更新了该记录。
  • update_time: 更新时间,记录记录的最后更新时间。
  • deleted: 删除标志,0表示未删除,1表示已删除。
  • tenant_id: 租户 ID,支持多租户环境。

示例数据插入:

sql
INSERT INTO "public"."llm_question_recommend" VALUES
(1, 1, 'https://firebasestorage.googleapis.com/v0/b/rumi-bdb43.appspot.com/o/public%2Ftmp%2Fimg_v3_02cd_bd6fe904-94f1-4986-9d65-0175e22746eh.png?alt=media', '课程与教授', '我们有没有推荐的适合R区域的简单课程?', 2, NULL, '', '2024-07-16 12:34:36.651846', '', '2024-07-16 12:34:36.651846', 0, 0),
(2, 2, 'https://firebasestorage.googleapis.com/v0/b/rumi-bdb43.appspot.com/o/public%2Ftmp%2Fimg_v3_02cd_7b40632d-d0f6-4328-99ce-2e36d966709h.png?alt=media', '作业帮助', 'SJSU主校区附近有哪些最好的或有名的餐厅?', 2, NULL, '', '2024-07-16 12:34:36.651846', '', '2024-07-16 12:34:36.651846', 0, 0),
(3, 3, 'https://firebasestorage.googleapis.com/v0/b/rumi-bdb43.appspot.com/o/public%2Ftmp%2Fimg_v3_02cd_32d2f8af-a364-4a10-a9b0-4a5d6686b27h.png?alt=media', '校园导览', '如何注册课程,以及注册的截止日期和程序是什么?', 2, NULL, '', '2024-07-16 12:34:36.651846', '', '2024-07-16 12:34:36.651846', 0, 0),
(4, 4, 'https://firebasestorage.googleapis.com/v0/b/rumi-bdb43.appspot.com/o/public%2Ftmp%2Fimg_v3_02cd_e638ecb7-73d6-45d4-805d-001f2065142h.png?alt=media', '校园生活', '学生可以免费进入橄榄球比赛吗?', 2, NULL, '', '2024-07-16 12:34:36.651846', '', '2024-07-16 12:34:36.651846', 0, 0);

2. llm_chat_session(会话管理) ​

用于管理用户与系统之间的对话会话,确保对话的连续性和一致性。

sql
drop table if exists llm_chat_session;
CREATE TABLE "llm_chat_session" (
  "id" bigint PRIMARY KEY,
  "user_id" VARCHAR,
  "name" VARCHAR,
  "school_id" INT8,
  "app_id" INT8,
  "type" VARCHAR,
  "chat_type" INT4,
  "remark" VARCHAR(256),
  "creator" VARCHAR(64) DEFAULT '',
  "create_time" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updater" VARCHAR(64) DEFAULT '',
  "update_time" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "deleted" SMALLINT DEFAULT 0,
  "tenant_id" BIGINT NOT NULL DEFAULT 0
);
CREATE INDEX "ix_llm_chat_session_user_id" ON "llm_chat_session" (user_id);
CREATE INDEX idx_llm_chat_session_query
ON llm_chat_session (user_id, chat_type, deleted, school_id, create_time DESC);
CREATE INDEX idx_llm_chat_session_query_no_school
ON llm_chat_session (user_id, chat_type, deleted, create_time DESC);
  • id: 主键,唯一标识一个会话。
  • user_id: 用户 ID,标识会话所属的用户。
  • name: 会话名称,用户自定义。
  • school_id: 学校 ID,标识会话所属的学校。
  • app_id: 应用 ID,标识会话所属的应用。
  • type: 会话类型描述,进一步描述会话的用途或类别。
  • chat_type: 会话类型,数值表示不同的会话类型。
  • remark: 备注信息,用于记录附加说明。
  • creator: 创建者信息,记录谁创建了该会话。
  • create_time: 创建时间,记录会话的创建时间。
  • updater: 更新者信息,记录谁更新了该会话。
  • update_time: 更新时间,记录会话的最后更新时间。
  • deleted: 删除标志,0表示未删除,1表示已删除。
  • tenant_id: 租户 ID,支持多租户环境。

索引创建:

为了优化查询性能,特别是按user_id进行查询,创建了如下索引:

sql

3. llm_chat_history(聊天历史) ​

记录用户与系统的对话历史,便于回溯和分析。

sql
DROP TABLE IF EXISTS llm_chat_history;
CREATE TABLE "llm_chat_history" (
  "id" bigint PRIMARY KEY,
  "session_id" bigint,
  "model" varchar,
  "role" VARCHAR NOT NULL,
  "content" VARCHAR,
  "citations" varchar,
  "type" varchar default 'text',
  "images" JSONB,
  "metadata" JSONB,
  "args" JSONB,
  "code_result" jsonb,
  "hidden" BOOLEAN DEFAULT FALSE,
  "liked" BOOLEAN,
  "remark" VARCHAR(256),
  "creator" VARCHAR(64) DEFAULT '',
  "create_time" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updater" VARCHAR(64) DEFAULT '',
  "update_time" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "deleted" SMALLINT DEFAULT 0,
  "tenant_id" BIGINT NOT NULL DEFAULT 0
);

CREATE INDEX idx_llm_chat_history_session_id ON llm_chat_history(session_id);
  • id: 主键,唯一标识一条对话记录。
  • session_id: 会话 ID,关联到llm_chat_session表,标识该对话记录所属的会话。
  • role: 角色,标识对话的发起者,如user或assistant。
  • content: 对话内容,存储具体的提问或回答。
  • metadata: 元数据,存储与对话相关的额外信息,格式为 JSON。
  • hidden: 隐藏标志,false表示可见,true表示隐藏。
  • liked: 点赞标志,true表示已点赞,false表示未点赞。
  • remark: 备注信息,用于记录附加说明。
  • creator: 创建者信息,记录谁创建了该记录。
  • create_time: 创建时间,记录记录的创建时间。
  • updater: 更新者信息,记录谁更新了该记录。
  • update_time: 更新时间,记录记录的最后更新时间。
  • deleted: 删除标志,0表示未删除,1表示已删除。
  • tenant_id: 租户 ID,支持多租户环境。

4. llm_school_dict(学校字典) ​

存储学校相关信息,支持系统的多学校环境配置。

sql
drop table if exists llm_school_dict;
CREATE TABLE "public"."llm_school_dict" (
  "id" BIGINT NOT NULL PRIMARY KEY,
  "rmp_school_id" INT4,
  "full_name" VARCHAR,
  "abbr_name" VARCHAR,
  "bot_name" VARCHAR,
  "domain_name" varchar,
  "remark" VARCHAR,
  "creator" VARCHAR DEFAULT ''::VARCHAR,
  "create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updater" VARCHAR DEFAULT ''::VARCHAR,
  "update_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "deleted" INT2 NOT NULL DEFAULT 0,
  "tenant_id" INT8 NOT NULL DEFAULT 0
);

5. llm_user_asked_questions(用户提问记录) ​

记录用户提出的问题,支持问题分析和推荐功能。

sql
drop table if exists llm_user_asked_questions;
CREATE TABLE "llm_user_asked_questions" (
  "id" BIGINT PRIMARY KEY,
  "content" VARCHAR,
  "remark" VARCHAR(256),
  "creator" VARCHAR(64) DEFAULT '',
  "create_time" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updater" VARCHAR(64) DEFAULT '',
  "update_time" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "deleted" SMALLINT DEFAULT 0,
  "tenant_id" BIGINT NOT NULL DEFAULT 0
);

6. llm_vector_embedding(向量嵌入) ​

存储文本的向量表示,用于高效的相似性搜索和意图识别。

sql
CREATE TABLE "llm_vector_embedding" (
  "id" BIGINT PRIMARY KEY,
  "t" VARCHAR,
  "v" VECTOR,
  "m" VARCHAR,
  "md5" VARCHAR
);

CREATE INDEX "idx_llm_vector_embedding_md5" ON "llm_vector_embedding"(
  "md5" ASC NULLS LAST
);

CREATE INDEX "idx_llm_vector_embedding_md5_m" ON "llm_vector_embedding" USING btree (
  "md5" ASC NULLS LAST,
  "m" ASC NULLS LAST
);

7. llm_intent_question(意图问题) ​

存储与特定意图相关的问题,辅助系统进行意图识别和分类。

sql
drop table if exists llm_intent_question;
CREATE TABLE "llm_intent_question" (
  "id" INT8 PRIMARY KEY,
  "question" VARCHAR,
  "category_id" INT8,
  "remark" VARCHAR,
  "creator" VARCHAR DEFAULT ''::VARCHAR,
  "create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updater" VARCHAR DEFAULT ''::VARCHAR,
  "update_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "deleted" INT2 NOT NULL DEFAULT 0,
  "tenant_id" INT8 NOT NULL DEFAULT 0,
  "question_vector" VECTOR
);

8. llm_intent_classification(意图分类) ​

定义系统支持的意图类别,帮助系统进行精准的意图识别和响应。

sql
drop table if exists llm_intent_classification;
CREATE TABLE "public"."llm_intent_classification" (
  "id" INT8 PRIMARY KEY,
  "name" VARCHAR,
  "description" VARCHAR,
  "action" VARCHAR,
  "prompt" VARCHAR,
  "additional_info" VARCHAR,
  "include_general" INT2 NOT NULL DEFAULT 1,
  "remark" VARCHAR,
  "creator" VARCHAR DEFAULT ''::VARCHAR,
  "create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updater" VARCHAR DEFAULT ''::VARCHAR,
  "update_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "deleted" INT2 NOT NULL DEFAULT 0,
  "tenant_id" INT8 NOT NULL DEFAULT 0,
  "env" VARCHAR
);

9. 提示词管理 ​

sql
drop table if exists llm_chat_prompt;
CREATE TABLE llm_chat_prompt  (
  id bigint primary key,
  name varchar(255) NOT NULL,
  prompt text NOT NULL,
  env varchar(255) DEFAULT 'dev',
  remark varchar(256) NULL DEFAULT NULL,
  login_date TIMESTAMP WITHOUT TIME ZONE,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted SMALLINT NOT NULL DEFAULT 0,
  tenant_id BIGINT NOT NULL DEFAULT 0
);

10. llm_chat_completion (大模型请求和响应记录) ​

sql
drop table if exists llm_chat_completion;
CREATE TABLE llm_chat_completion (
  id BIGINT primary key,
  request jsonb,
  response jsonb,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted SMALLINT NOT NULL DEFAULT 0,
  tenant_id BIGINT NOT NULL DEFAULT 0
);

llm_html_preview (大模型请求和响应记录) ​

sql
drop table if exists llm_html_preview;
CREATE TABLE llm_html_preview (
  id BIGINT primary key,
  md5 varchar,
  html text,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted SMALLINT NOT NULL DEFAULT 0,
  tenant_id BIGINT NOT NULL DEFAULT 0
);

llm_document_parsed_file_cache

sql
DROP TABLE IF EXISTS "public"."llm_document_parsed_file_cache";

CREATE TABLE "public"."llm_document_parsed_file_cache" (
  "id" bigint PRIMARY KEY,
  "md5" VARCHAR,
  "file_id" bigint,
  "output" jsonb,
  "content" text,
  "elapsed" BIGINT,
  "model" VARCHAR, 
  "task_id" varchar,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted SMALLINT NOT NULL DEFAULT 0,
  tenant_id BIGINT NOT NULL DEFAULT 0  
);

ai_audio_asr_cache

sql
DROP TABLE IF EXISTS "public"."ai_audio_asr_cache";

CREATE TABLE "public"."ai_audio_asr_cache" (
  "id" bigint PRIMARY KEY,
  "md5" VARCHAR,
  "file_id" bigint,
  "output" jsonb,
  "content" text,
  "elapsed" BIGINT,
  "model" VARCHAR, 
  "task_id" varchar,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted SMALLINT NOT NULL DEFAULT 0,
  tenant_id BIGINT NOT NULL DEFAULT 0  
);

结论 ​

通过上述数据库设计,系统能够有效地管理和处理用户的查询、对话会话、历史记录以及意图识别等核心功能。合理的表结构和索引设计确保了系统的高效性和可扩展性,为校园搜索问答系统的稳定运行提供了坚实的基础。

MIT Licensed