多库检索与存储修复: - RRF 融合去重改用 (collection, chunk_id) 复合键,修复同名文件结果被吞 - DocStore 存储路径加 collection 前缀,修复跨库同名切片数据覆盖 - search_multiple 去重改用复合键 - chunk_id 解析改用 rsplit 兼容下划线文件名 上传与版本管理修复: - 同名文件上传改为覆盖模式,自动清理旧切片 - 修复首次上传不创建版本记录 - 修复覆盖上传版本号回退到 v1 - sync ADDED 分支改用动态版本号生成 - _generate_version_id 改为基于全部版本递增 - 废止/恢复操作同步 SQLite 版本记录 - mark_document_as_superseded 改为仅更新 SQLite 删除清理修复: - 删除文档时同步清理 SQLite 版本记录和变更日志 - 删除向量库时同步清理该库所有版本记录 - cleanup 改为清理 SQLite 记录而非 ChromaDB 测试: - test_version_management.py: 27 条版本管理单元测试 - test_edge_cases.py: 28 条边界用例测试 - test_upload_dedup.py: 5 条上传去重测试 - e2e_risk_test.py: 27 条端到端风险测试 文档: - 新增风险边界问题修复注意事项.md(面向后端的对接文档) - 新增向量库边界风险分析.md - 更新多篇现有文档
5.4 KiB
5.4 KiB
多向量库实现权限划分详细说明
1. 架构目标与背景
本项目早期采用单一Chroma向量库体系,所有文档数据混合存储,并在检索层采用软性过滤。为满足企业级数据权限隔离、部门级知识库自治管理的要求,本项目统筹规划重构为「多向量库体系」,将public_kb(公共知识库)与dept_{department}(部门私有知识库)在 Chroma 中进行物理分隔,实现在数据存储基座维度的鉴权与隔离。
2. 权限控制策略与角色模型
系统主要通过 auth/gateway.py 与网关注入的 Header 信息配合,进行请求身份的判定与映射。
2.1 网关注入的用户信息
API 服务会在接受请求前,解析来自网关传递的 HTTP Header:
X-User-ID:用户唯一标识符X-User-Role:用户角色(admin / manager / user)X-User-Department:用户所属部门标识(如:finance, hr, tech 等)
2.2 角色与集合访问权限规则
根据系统预设的 COLLECTION_PERMISSIONS 规则表,不同类别的用户具有不同层级的读写能力:
- Admin(超级管理员)
- Read(跨库查询):
*(所有向量库均可访问检索) - Write / Delete / Sync:
*(可进行全局库维护操作)
- Read(跨库查询):
- Manager(部门管理员)
- Read:
public_kb,dept_{自己所在部门} - Write / Delete / Sync: 仅限
dept_{自己所在部门}
- Read:
- User(普通员工)
- Read:
public_kb,dept_{自己所在部门} - Write / Delete / Sync: 无任何写入/修改/删除权限。
- Read:
3. 多库混合检索与结果合并
将文档隔离为多个不同的库集合后,依然通过以下机制保障检索质量与执行效率:
3.1 独立BM25缓存与协程并发查询
- 完全解耦索引:每个子向量库均配备对应的独立
BM25.pkl关键词索引结构(如bm25_index_public.pkl,bm25_index_finance.pkl)。 - 协程并行加载:在使用大维度混合查询(比如跨多部门或公共+个人部门)时,知识库引擎通过
asyncio.gather并行向相应的分离集合及BM25文件发起并发读取,整体耗时比单一库顺序扫描具备极大优势(多线程下总耗时稳定在 50~70ms 内)。
3.2 智能库路由 (knowledge/router.py)
Agentic RAG在正式下发检索前,加入了一层轻量级意图预判节点(Router):
- 意图降噪:大模型/关键词正则检测若发现用户的查询(如:"财务部报销规范")具有极强的部门属性,则缩小检索范围仅查匹配的库。
- 动态寻址:过滤掉权限不匹配库的同时,避免去不相干的知识库进行检索从而拉低相似度分值,极大提高了用户问答查询效率。
3.3 RRF (Reciprocal Rank Fusion) 多库融合重排
当请求在数个子向量库查得片段后,返回的多路向量由于采用了“同源 Embedding 模型”(例如BGE),其余弦相似度在不同子库的数据集之间是完全等价和客观可比较的。 最终数据层依靠融合模块汇聚所有库的 Top-K 记录,经过全局倒排算法(RRF)以及多维分数权重融合重排,保证了隔离存储不影响任何语义搜寻与内容关联。
4. 相关代码路径总结
4.1 鉴权与路由
auth/gateway.py:主要负责网关鉴权与鉴权路由逻辑。knowledge/router.py:LLM 智能知识库请求目标路由。
4.2 knowledge/ 核心模块(Mixin 架构)
知识库管理器 KnowledgeBaseManager 采用 Mixin 组合模式,各职责拆分到独立模块:
| 模块 | Mixin 类 | 职责 |
|---|---|---|
knowledge/base.py |
— | 配置常量、数据类定义(CollectionInfo, SearchResult, BM25Index)、辅助函数 |
knowledge/manager.py |
KnowledgeBaseManager |
主入口,组合所有 Mixin,提供多库并发管理与工厂方法 |
knowledge/collection.py |
CollectionMixin |
向量库(ChromaDB Collection)的创建、删除、查询等集合管理功能 |
knowledge/document.py |
DocumentMixin |
文档级别的管理方法,包括文档计数、文档列表、文档元信息查询 |
knowledge/search.py |
SearchMixin |
多源融合检索:单向量库检索 + BM25 混合检索 + RRF 融合排序 + 多库并行检索 + 废止版本检测 |
knowledge/permission.py |
PermissionMixin |
基于角色和部门的向量库访问控制,权限校验(admin / manager / user) |
knowledge/processing.py |
ProcessingMixin |
图片/表格的智能处理:图片过滤、VLM 描述生成、表格摘要生成、原始数据存储 |
knowledge/chunk.py |
ChunkMixin |
文档切片(Chunk)的 CRUD 操作:新增、修改、删除、分页查询切片 |
knowledge/index.py |
IndexMixin |
BM25 关键词检索索引的生命周期管理:懒加载、持久化、从向量库重建 |
knowledge/document_versions.py |
DocumentVersionQuery |
文档版本历史查询、获取当前生效版本、版本变更日志记录 |
4.3 辅助服务
knowledge/sync.py:知识库同步服务 — 使用 watchdog 监控文档目录变更,自动检测文件哈希差异并触发增量向量化。knowledge/cleanup.py:文档版本自动清理 — 定期清理 superseded 状态的旧版本,控制存储成本。
4.4 离线迁移脚本
scripts/rebuild_multi_kb.py:从单库直接转换为多库分治物理结构的离线迁移脚本。