fix(boundary): 修复多库边界问题、版本管理及删除清理

多库检索与存储修复:
- 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
- 更新多篇现有文档
This commit is contained in:
lacerate551
2026-06-04 23:58:44 +08:00
parent a1a0814633
commit cb75b9b274
50 changed files with 6385 additions and 6248 deletions

View File

@@ -2,36 +2,34 @@
> **文档类型**: 架构设计
> **创建日期**: 2026-04-13
> **状态**: 已确认
> **状态**: 已确认(数据清单更新于 2026-06
> **目标**: 梳理数据存储归属、明确前后端组与 RAG 组的职责边界
---
## 一、数据存储清单
### 1.1 当前系统中的所有数据库
### 1.1 当前系统中的所有数据库4 个 SQLite 文件,按环境子目录分离)
| 数据库文件 | 存储内容 | 表数量 |
|-----------|----------|--------|
| `data/sessions.db` | 会话管理 | 2 表 |
| `data/exam_local.db` | 出题批卷 | 5 表 |
| `data/feedback.db` | 问答质量闭环 | 4 表 |
| `data/outline_cache.db` | 纲要缓存 | 3 表 |
| `data/sync_data.db` | 同步服务 | 5 表 |
| `data/exam_analysis.db` | 题库分析 | 7 表 |
| `knowledge/vector_store/chroma/` | 向量数据库 | 9 集合 |
| 数据库文件 | 环境 | 存储内容 |
|-----------|------|---------|
| `data/prod/knowledge.db` | 生产 | 知识库管理(向量元数据、文档索引等) |
| `data/prod/feedback.db` | 生产 | 问答质量闭环 |
| `data/dev/session.db` | 开发 | 会话管理 |
| `data/dev/exam.db` | 开发 | 出题批卷 |
> **注**:向量数据存储在 `knowledge/vector_store/chroma/` 目录ChromaDB不计入 SQLite 文件。
> `outline_cache.db`、`sync_data.db`、`exam_analysis.db` 已合并或移除。
### 1.2 涉及用户信息的数据
| 数据库 | 表 | 用户字段 | 敏感程度 |
|--------|-----|----------|----------|
| sessions.db | sessions | user_id | 低仅ID |
| sessions.db | messages | 通过session关联 | 低 |
| feedback.db | feedbacks | user_id | 低 |
| sync_data.db | subscriptions | user_id | 低 |
| sync_data.db | notifications | user_id | 低 |
| exam_local.db | student_answers | student_id | 低 |
| exam_local.db | grade_reports | student_id | 低 |
| `data/dev/session.db` | sessions | user_id | 低仅ID |
| `data/dev/session.db` | messages | 通过session关联 | 低 |
| `data/prod/feedback.db` | feedbacks | user_id | 低 |
| `data/dev/exam.db` | student_answers | student_id | 低 |
| `data/dev/exam.db` | grade_reports | student_id | 低 |
---
@@ -54,16 +52,15 @@
| 数据类型 | 说明 |
|----------|------|
| 向量数据库 | 所有知识库向量 |
| 向量数据库 | 所有知识库向量ChromaDB |
| 文档内容 | PDF/Word/Excel 原始文件 |
| 题目与试卷数据 | 出题相关 |
| 批阅报告 | 考试批卷结果 |
| 知识点与关联关系 | 题库分析 |
| 文档变更追踪 | 同步服务 |
| 会话历史 | 对话记录 ✅ |
| 纲要与缓存 | 文档结构化数据 |
| 知识库元数据 | 文档索引、向量关联(`knowledge.db` |
| 题目与试卷数据 | 出题相关(`exam.db` |
| 批阅报告 | 考试批卷结果(`exam.db` |
| 会话历史 | 对话记录(`session.db` |
| 问答反馈 | 质量闭环数据(`feedback.db` |
**存储**:本地 SQLite + ChromaDB
**存储**:本地 SQLite(按 `data/prod/``data/dev/` 环境分离) + ChromaDB
---
@@ -102,6 +99,10 @@
┌─────────────┐
│ RAG 数据库 │
│ │
│ • knowledge.db│
│ • feedback.db │
│ • session.db │
│ • exam.db │
│ 存储 user_id │
│ 不存用户详情 │
└─────────────┘
@@ -156,7 +157,7 @@ GET /api/users/{user_id}
|--------|------|------|
| 学生答卷存储 | `exam_pkg/manager.py` | 改为只存储 student_id不存 student_name |
| 批阅报告生成 | `exam_pkg/manager.py` | 生成报告时调用前后端接口获取姓名 |
| 用户信息获取 | `services/user_info.py`建) | 封装调用前后端接口的逻辑 |
| 用户信息获取 | `services/user_info.py`待创建) | 封装调用前后端接口的逻辑,当前尚未实现 |
---
@@ -171,9 +172,10 @@ GET /api/users/{user_id}
│ ✓ 组织架构数据 │ ✓ 题目试卷管理 │
│ ✓ 业务主数据(学生/课程等) │ ✓ 批阅报告(仅存 student_id
│ ✓ 网关配置 │ ✓ 反馈与质量分析 │
│ ✓ 提供用户信息查询 API │ ✓ 文档变更追踪
│ ✓ 提供用户信息查询 API │ ✓ 知识库元数据knowledge.db
├─────────────────────────────────────────┴─────────────────────────────────┤
│ 数据关联:通过 user_id / student_id │
│ RAG 系统调用前后端 API 获取用户详情 │
│ 数据库按环境分离data/prod/knowledge.db, feedback.dbdata/dev/session.db, exam.db
└─────────────────────────────────────────────────────────────────────────┘
```