一. 📂 核心实体关系与整体架构
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区分空间数据。 子流程:
-
文档上传与校验
-
用户选择目标空间(如“工作空间”),上传文档至前端,后端接收并校验:
-
权限:验证用户是否为空间所有者,通过
spaces.ws_id表确认。 -
格式与大小:支持PDF,单文件≤260MB。
-
重复检测:计算文件哈希(SHA-256),查询
rag_user_space_file表(space_id+file_hash+file_name),若存在则视为重复,拒绝上传。
-
-
原始文档存储:上传至对象存储,路径格式:
shared_kb/${space_id}/${file_id}/${filename}(按空间隔离存储)。(待确认,涉及用户在知识库中上传的文档,在个人云盘上的存储路径,而且目前要求文件目录是已存在才能在此目录下上传文件)
-
-
文档解析(微软Document Intelligence集成)
-
调用微软
-
输入:对象存储中的文档URL(通过签名URL授权访问)。
-
输出:结构化文本段落(含页码、章节),过滤冗余信息。
-
-
-
文本分块与元数据标注
-
分块策略:按语义完整性切割(段落优先,长段落拆分为句子)。
-
元数据标注:每个分块关联
file_id、space_id(核心!用于向量库检索时的空间过滤)、文档内位置信息。
-
-
向量化(微软向量化服务集成)
-
调用微软Azure OpenAI
Embeddings API,使用text-embedding-ada-002模型生成1536维向量,批量处理。 -
向量与分块绑定:
vector_id\=分块chunk_id(UUID),确保一一对应。
-
-
双库存储(单向量数据库设计)
-
元数据入库:
rag_user_space_file表:ws_id、space_id、file_id、file_name、file_hash、valid、pid、m_pid、create_time、update_time。
-
向量入库(腾讯云VectorDB单库):
-
唯一向量数据库(rag_documents)和集合(rag_chunks),所有空间的分块向量存储于此。
-
向量元数据强制携带
space_id,用于检索时的空间过滤(支持多空间联合检索)。 -
索引设计:HNSW向量索引(余弦相似度)+
space_id字段索引,document_id字段索引,page_number字段索引,sparse_vector字段索引,expire_at索引,支持“向量相似性+多空间过滤”的复合查询。
-
-
3. 检索与问答模块(单空间检索支持)
核心功能:用户可指定单个空间进行检索(如“在工作空间或学习空间中查询”),不选默认为当前用户进入的空间进行检索,从单向量数据库中过滤出有权访问的分块,生成回答。 关键流程:
-
问题与空间选择
-
用户输入问题(如“Python安装步骤”),默认检索当前用户进入的空间。
-
后端校验用户对所选空间的权限(所有者或被授权访问),过滤掉无权访问的空间。
-
-
向量检索(单空间过滤)
-
问题向量化:生成1536维向量。
-
带多空间过滤的检索:调用VectorDB
-
检索向量:问题向量;
-
过滤条件:
file_id IN (file_id_1, file_id_2, ...)(用户有权访问的空间列表); -
返回数量:Top 5-10(根据空间数量动态调整);
-
-
结果解析:获取
chunk_id、space_id、相似度得分,关联元数据查询分块文本、文档名称及所属空间等。
-
-
提示词组装与大模型调用
-
提示词模板
-
调用大模型生成回答
-
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混合方案
-
核心逻辑:结合缓存与持久化优势,采用“缓存优先”策略:
-
优先查询Redis缓存,命中则直接返回数据;
-
缓存未命中/失效时,查询MySQL数据库获取数据;
-
将数据库查询结果同步写入Redis并设置合理有效期(如7天或者15天)。
-
-
性能特点:兼顾Redis的高速查询与MySQL的持久化存储,规避缓存失效风险,综合性能最优。
-
适用场景:高并发实时访问+数据持久化需求的核心业务场景(如高频查询的解析结果存储)。
redis+Mysql存储方案流程图
知识库文件解析内容管理表
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小时)、热点向量、检索结果。
五. ⚛️ 典型场景示例
-
用户A创建多空间:
- 登录系统→创建“工作空间”(
space_1)和“学习空间”(space_2)→spaces表记录两条数据,ws_id=A。
- 登录系统→创建“工作空间”(
-
用户A向多空间上传文档:
- 向
space_1上传工作手册.pdf,向space_2上传Python教程.pdf→分别解析、分块、向量化→向量存入VectorDB(携带space_1/space_2标记)。
- 向
-
用户A跨空间检索:
- 提问“安装步骤”,选择检索
space_1和space_2→权限校验通过→问题向量化→VectorDB检索space_id IN (space_1, space_2)→返回两个空间的相关分块→大模型整合回答,标注来源空间。
- 提问“安装步骤”,选择检索
-
用户A删除空间:
- 删除
space_2→级联删除space_2下的文档、分块及VectorDB中space_2的向量→仅保留space_1的数据。
- 删除
-
基本问答场景时序图:
暂无评论,快来抢沙发!