一. 📂 核心实体关系与整体架构

1. 实体关系定义(ER模型)

<colgroup><col width="216"><col width="216"><col width="295"></colgroup>

实体

核心属性

关系约束

知识库(KnowledgeBase)

唯一标识,对应向量库中的唯一向量数据库

一对多关联空间(唯一知识库包含所有空间)。

空间(Space)

space_id(唯一)、名称、描述、所有者user_id

多对一关联知识库(属于唯一共用知识库);多对一关联用户(一个用户可拥有多个空间,空间归属唯一用户)。

用户(User)

user_id(唯一)、账号信息

一对多关联空间(一个用户可创建/拥有多个空间)。

文档(Document)

file_id(唯一)、文件名、哈希值、存储路径

多对一关联空间(属于某空间)。

二. 🔱 核心模块设计与流程

1. 用户与空间管理模块(支持多空间)

核心功能:管理用户与多个空间的一对多关系,支持空间的创建/删除/切换,关联至唯一知识库。 关键逻辑:

  • 知识库初始化:系统部署时创建唯一共用知识库(向量数据库rag_documents下的唯一集合rag_chunks),所有空间默认关联此知识库。

  • 空间创建与归属:

    • 用户可手动创建多个空间(如“工作空间”“学习空间”),每个空间生成唯一space_id,并记录ws_id(空间所有者)。

    • 空间属性:名称、描述、创建时间、ws_id(关联用户)。

  • 权限控制:

    • 所有者权限:用户对自己创建的空间拥有完全操作权限(上传/删除文档、检索、删除空间)。

存储表设计:

  • 用户空间管理表rag_user_space

  • 空间文件管理表rag_user_space_file

  • 空间笔记管理表rag_user_space_note

2. 文档处理模块(多空间适配)

核心功能:支持用户向自己的多个空间上传文档,解析后存储至单向量数据库,通过space_id区分空间数据。 子流程:

  1. 文档上传与校验

    • 用户选择目标空间(如“工作空间”),上传文档至前端,后端接收并校验:

      • 权限:验证用户是否为空间所有者,通过spaces.ws_id表确认。

      • 格式与大小:支持PDF,单文件≤260MB。

      • 重复检测:计算文件哈希(SHA-256),查询rag_user_space_file表(space_id+file_hash+file_name),若存在则视为重复,拒绝上传。

    • 原始文档存储:上传至对象存储,路径格式:shared_kb/${space_id}/${file_id}/${filename}(按空间隔离存储)。(待确认,涉及用户在知识库中上传的文档,在个人云盘上的存储路径,而且目前要求文件目录是已存在才能在此目录下上传文件)

  2. 文档解析(微软Document Intelligence集成)

    • 调用微软

      • 输入:对象存储中的文档URL(通过签名URL授权访问)。

      • 输出:结构化文本段落(含页码、章节),过滤冗余信息。

  3. 文本分块与元数据标注

    • 分块策略:按语义完整性切割(段落优先,长段落拆分为句子)。

    • 元数据标注:每个分块关联file_idspace_id(核心!用于向量库检索时的空间过滤)、文档内位置信息。

  4. 向量化(微软向量化服务集成)

    • 调用微软Azure OpenAI Embeddings API,使用text-embedding-ada-002模型生成1536维向量,批量处理。

    • 向量与分块绑定:vector_id\=分块chunk_id(UUID),确保一一对应。

  5. 双库存储(单向量数据库设计)

    • 元数据入库:

      • rag_user_space_file表:ws_idspace_idfile_idfile_namefile_hashvalidpidm_pidcreate_timeupdate_time
    • 向量入库(腾讯云VectorDB单库):

      • 唯一向量数据库(rag_documents)和集合(rag_chunks),所有空间的分块向量存储于此。

      • 向量元数据强制携带space_id,用于检索时的空间过滤(支持多空间联合检索)。

      • 索引设计:HNSW向量索引(余弦相似度)+space_id字段索引,document_id字段索引,page_number字段索引,sparse_vector字段索引,expire_at索引,支持“向量相似性+多空间过滤”的复合查询。

3. 检索与问答模块(单空间检索支持)

核心功能:用户可指定单个空间进行检索(如“在工作空间或学习空间中查询”),不选默认为当前用户进入的空间进行检索,从单向量数据库中过滤出有权访问的分块,生成回答。 关键流程:

  1. 问题与空间选择

    • 用户输入问题(如“Python安装步骤”),默认检索当前用户进入的空间。

    • 后端校验用户对所选空间的权限(所有者或被授权访问),过滤掉无权访问的空间。

  2. 向量检索(单空间过滤)

    • 问题向量化:生成1536维向量。

    • 带多空间过滤的检索:调用VectorDB

      • 检索向量:问题向量;

      • 过滤条件:file_id IN (file_id_1, file_id_2, ...)(用户有权访问的空间列表);

      • 返回数量:Top 5-10(根据空间数量动态调整);

    • 结果解析:获取chunk_idspace_id、相似度得分,关联元数据查询分块文本、文档名称及所属空间等。

  3. 提示词组装与大模型调用

    • 提示词模板

    • 调用大模型生成回答

4. 增量更新与单库维护模块(多空间适配)

核心功能:支持多空间的文档更新/删除,在单向量数据库中精准维护数据,确保多空间数据一致性。 关键逻辑:

  • 文档更新:

    • 用户在指定空间更新或者删除文档:

      • file_id+space_id更新本地业务表。

      • 调用VectorDB DeleteDocument接口,按file_id+space_id更新向量记录。

      • 删除旧文档及分块的元数据记录。

      • 新文档执行“解析→分块→向量化→双库存储”(关联原空间space_id)。

  • 空间删除:

    • 用户删除某空间时,级联删除:

      • 该空间下所有文档(rag_user_space_file表,按space_id)。

      • 向量库中该空间的所有向量(调用VectorDB DeleteDocument,按space_id过滤删除)。

  • 单库优化:

    • 每周对VectorDB执行索引优化。

    • 定期清除向量数据,节省向量存储成本(比如定时删除两天前的记录)。

    • 定时清除“冷数据”等

三. ✅ 文件解析和向量库向量管理机制设计

方案:Redis + MySQL混合方案

  • 核心逻辑:结合缓存与持久化优势,采用“缓存优先”策略:

    1. 优先查询Redis缓存,命中则直接返回数据;

    2. 缓存未命中/失效时,查询MySQL数据库获取数据;

    3. 将数据库查询结果同步写入Redis并设置合理有效期(如7天或者15天)。

  • 性能特点:兼顾Redis的高速查询与MySQL的持久化存储,规避缓存失效风险,综合性能最优。

  • 适用场景:高并发实时访问+数据持久化需求的核心业务场景(如高频查询的解析结果存储)。

redis+Mysql存储方案流程图

image

知识库文件解析内容管理表

CREATE TABLE `rag_file_analysis` (
                                  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
                                  `user_id` int(11) NOT NULL DEFAULT '0' COMMENT 'user_id',
                                  `ws_id` int(11) NOT NULL DEFAULT '0' COMMENT '万兴账号id',
                                  `space_id` varchar(64) NOT NULL DEFAULT '' COMMENT '空间ID',
                                  `file_id` varchar(64)  NOT NULL DEFAULT '' COMMENT '文件id,唯一字符串',
                                  `content` longtext COMMENT '解析的内容',
                                  `valid` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否有效 1有效,0删除',
                                  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                                  PRIMARY KEY (`id`),
                                  KEY `idx_user_id` (`user_id`),
                                  KEY `idx_space_id` (`space_id`),
                                  KEY `idx_file_id` (`file_id`) USING BTREE,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库文件解析内容管理表';

四. 💠 业务表设计

1. 关系型数据库(核心表)

用户空间管理表

CREATE TABLE `rag_user_space` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `ws_id` int(11) NOT NULL DEFAULT '0' COMMENT '万兴账号id',
  `space_id` varchar(64) NOT NULL DEFAULT '' COMMENT '空间ID',
  `space_name` varchar(255) NOT NULL DEFAULT '' COMMENT '空间名称',
  `desc` varchar(255) NOT NULL DEFAULT '' COMMENT '空间描述',
  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '各产品端pid',
  `m_pid` int(11) NOT NULL DEFAULT '0' COMMENT '主pid',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_ws_id` (`ws_id`),
  KEY `idx_space_id` (`space_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户空间管理表';

空间文件管理表

CREATE TABLE `rag_user_space_file` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `ws_id` int(11) NOT NULL DEFAULT '0' COMMENT '万兴账号id',
  `space_id` varchar(64) NOT NULL DEFAULT '' COMMENT '空间ID',
  `file_id` varchar(64) NOT NULL DEFAULT '' COMMENT '文档ID',
  `file_name` varchar(255) NOT NULL DEFAULT '' COMMENT '文档名称',
  `file_hash` varchar(255) NOT NULL DEFAULT '' COMMENT '文件哈希值',
  `valid` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1有效,0无效',
  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '各产品端pid',
  `m_pid` int(11) NOT NULL DEFAULT '0' COMMENT '主pid',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_ws_id` (`ws_id`),
  KEY `idx_space_file_id` (`space_id`, `file_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='空间文件管理表';

空间笔记管理表

CREATE TABLE `rag_user_space_note` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `ws_id` int(11) NOT NULL DEFAULT '0' COMMENT '万兴账号id',
  `space_id` varchar(64) NOT NULL DEFAULT '' COMMENT '空间ID',
  `content` text COMMENT '笔记内容',
  `valid` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1有效,0无效',
  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '各产品端pid',
  `m_pid` int(11) NOT NULL DEFAULT '0' COMMENT '主pid',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_ws_id` (`ws_id`),
  KEY `idx_space_id` (`space_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='空间笔记管理表';

知识库文件解析内容管理表

CREATE TABLE `rag_file_analysis` (
                                  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
                                  `user_id` int(11) NOT NULL DEFAULT '0' COMMENT 'user_id',
                                  `ws_id` int(11) NOT NULL DEFAULT '0' COMMENT '万兴账号id',
                                  `space_id` varchar(64) NOT NULL DEFAULT '' COMMENT '空间ID',
                                  `file_id` varchar(64)  NOT NULL DEFAULT '' COMMENT '文件id,唯一字符串',
                                  `content` longtext COMMENT '解析的内容',
                                  `valid` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否有效 1有效,0删除',
                                  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                                  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                                  PRIMARY KEY (`id`),
                                  KEY `idx_user_id` (`user_id`),
                                  KEY `idx_space_id` (`space_id`),
                                  KEY `idx_file_id` (`file_id`) USING BTREE,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识库文件解析内容管理表';

2. 对象存储与缓存

  • 对象存储路径:shared_kb/${space_id}/${file_id}/${filename},按空间隔离。(如果按这种存储路径,文件上传模块应该需要开发支持创建对应的目录)

  • 缓存内容:用户的空间列表(user:{ws_id}:spaces,过期1小时)、热点向量、检索结果。

五. ⚛️ 典型场景示例

  1. 用户A创建多空间:

    • 登录系统→创建“工作空间”(space_1)和“学习空间”(space_2)→spaces表记录两条数据,ws_id=A
  2. 用户A向多空间上传文档:

    • space_1上传工作手册.pdf,向space_2上传Python教程.pdf→分别解析、分块、向量化→向量存入VectorDB(携带space_1/space_2标记)。
  3. 用户A跨空间检索:

    • 提问“安装步骤”,选择检索space_1space_2→权限校验通过→问题向量化→VectorDB检索space_id IN (space_1, space_2)→返回两个空间的相关分块→大模型整合回答,标注来源空间。
  4. 用户A删除空间:

    • 删除space_2→级联删除space_2下的文档、分块及VectorDB中space_2的向量→仅保留space_1的数据。
  5. 基本问答场景时序图:

image