多库检索与存储修复: - 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 - 更新多篇现有文档
182 lines
8.3 KiB
Markdown
182 lines
8.3 KiB
Markdown
# 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.db)data/dev/(session.db, exam.db)│
|
||
└─────────────────────────────────────────────────────────────────────────┘
|
||
```
|