Files
rag/docs/数据归属与协作方案.md
lacerate551 cb75b9b274 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
- 更新多篇现有文档
2026-06-04 23:58:44 +08:00

182 lines
8.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RAG 系统数据归属与前后端协作方案
> **文档类型**: 架构设计
> **创建日期**: 2026-04-13
> **状态**: 已确认(数据清单更新于 2026-06
> **目标**: 梳理数据存储归属、明确前后端组与 RAG 组的职责边界
---
## 一、数据存储清单
### 1.1 当前系统中的所有数据库4 个 SQLite 文件,按环境子目录分离)
| 数据库文件 | 环境 | 存储内容 |
|-----------|------|---------|
| `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 涉及用户信息的数据
| 数据库 | 表 | 用户字段 | 敏感程度 |
|--------|-----|----------|----------|
| `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 | 低 |
---
## 二、数据归属划分
### 2.1 前后端组管理的数据
| 数据类型 | 说明 |
|----------|------|
| 用户账户信息 | 账号、密码、个人信息 |
| 用户认证 Token | Token 生成与验证 |
| 权限角色定义 | 角色与权限的映射关系 |
| 组织架构 | 部门、岗位信息 |
| 业务主数据 | 学生学籍、课程安排等 |
**存储**:前后端组的用户数据库/认证系统
**传递方式**:通过网关注入 HTTP Header
### 2.2 RAG 组管理的数据
| 数据类型 | 说明 |
|----------|------|
| 向量数据库 | 所有知识库向量ChromaDB |
| 文档内容 | PDF/Word/Excel 原始文件 |
| 知识库元数据 | 文档索引、向量关联(`knowledge.db` |
| 题目与试卷数据 | 出题相关(`exam.db` |
| 批阅报告 | 考试批卷结果(`exam.db` |
| 会话历史 | 对话记录(`session.db` |
| 问答反馈 | 质量闭环数据(`feedback.db` |
**存储**:本地 SQLite`data/prod/``data/dev/` 环境分离) + ChromaDB
---
## 三、核心原则
| 原则 | 说明 |
|------|------|
| **用户认证归前后端** | 登录、密码、Token 生成由前后端组负责 |
| **业务数据归 RAG** | 与知识库、出题、批卷相关的数据由 RAG 组管理 |
| **用户 ID 作为关联键** | 使用 user_id 关联两边数据,不存储完整用户信息 |
| **网关传递用户信息** | 通过 HTTP Header 注入RAG 系统不实现登录 |
---
## 四、数据流向图
### 4.1 用户信息流向
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 用户登录 │────▶│ 前后端认证 │────▶│ 网关注入 │
│ │ │ 系统 │ │ Header │
└─────────────┘ └─────────────┘ └──────┬──────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 用户数据库 │ │ RAG 系统 │
│ (前后端组) │ │ 接收用户信息 │
│ │ │ │
│ • 账号密码 │ │ • X-User-ID │
│ • 个人信息 │ │ • X-User-Role│
│ • 角色权限 │ │ • X-User-Dept│
└─────────────┘ └──────┬──────┘
┌─────────────┐
│ RAG 数据库 │
│ │
│ • knowledge.db│
│ • feedback.db │
│ • session.db │
│ • exam.db │
│ 存储 user_id │
│ 不存用户详情 │
└─────────────┘
```
---
## 五、接口协作
### 5.1 前后端组调用 RAG 系统的接口
| 场景 | API | Header 需要 |
|------|-----|-------------|
| 用户聊天 | `POST /chat``/rag` | X-User-ID, X-User-Role |
| 获取历史 | `GET /sessions`, `GET /history/<id>` | X-User-ID |
| 上传文档 | `POST /documents/upload` | X-User-ID, X-User-Role, X-User-Department |
| 出题 | `POST /exam/generate` | X-User-ID, X-User-Role |
| 批卷 | `POST /exam/grade` | X-User-ID, X-User-Role |
### 5.2 RAG 系统调用前后端组的接口
**需要前后端组提供**
```
GET /api/users/{user_id}
响应:
{
"user_id": "xxx",
"username": "用户名",
"name": "真实姓名",
"role": "admin/manager/user",
"department": "部门名称"
}
```
---
## 六、确认结果
### 用户选择
| 问题 | 用户选择 | 说明 |
|------|---------|------|
| 会话历史归属 | **RAG组管理** | 会话历史由 RAG 系统存储,前后端组通过 API 查询 |
| 学生姓名处理 | **存ID调接口** | 只存储 student_id需要时调用前后端接口获取姓名 |
| 需要的前后端接口 | **获取用户信息接口** | 需要前后端组提供根据 user_id 获取用户信息的 API |
### RAG 系统需要修改的地方
| 修改项 | 文件 | 说明 |
|--------|------|------|
| 学生答卷存储 | `exam_pkg/manager.py` | 改为只存储 student_id不存 student_name |
| 批阅报告生成 | `exam_pkg/manager.py` | 生成报告时调用前后端接口获取姓名 |
| 用户信息获取 | `services/user_info.py`(待创建) | 封装调用前后端接口的逻辑,当前尚未实现 |
---
## 七、最终方案
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 前后端组 │ RAG 组 │
├─────────────────────────────────────────┼─────────────────────────────────┤
│ ✓ 用户账户与认证 │ ✓ 知识库与向量存储 │
│ ✓ 权限角色管理 │ ✓ 会话历史存储 │
│ ✓ 组织架构数据 │ ✓ 题目试卷管理 │
│ ✓ 业务主数据(学生/课程等) │ ✓ 批阅报告(仅存 student_id
│ ✓ 网关配置 │ ✓ 反馈与质量分析 │
│ ✓ 提供用户信息查询 API │ ✓ 知识库元数据knowledge.db
├─────────────────────────────────────────┴─────────────────────────────────┤
│ 数据关联:通过 user_id / student_id │
│ RAG 系统调用前后端 API 获取用户详情 │
│ 数据库按环境分离data/prod/knowledge.db, feedback.dbdata/dev/session.db, exam.db
└─────────────────────────────────────────────────────────────────────────┘
```