init: RAG 知识库服务初始提交

- 后端 API(Flask + Gunicorn)
- RAG 引擎(混合检索 + 云端 Reranker + 引用溯源)
- 文档解析(MinerU + 多格式支持)
- Docker 生产部署配置
- 排除前端项目、敏感配置、模型文件
This commit is contained in:
lacerate551
2026-06-04 17:35:27 +08:00
commit 100d1a06eb
158 changed files with 64534 additions and 0 deletions

View File

@@ -0,0 +1,179 @@
# RAG 系统数据归属与前后端协作方案
> **文档类型**: 架构设计
> **创建日期**: 2026-04-13
> **状态**: 已确认
> **目标**: 梳理数据存储归属、明确前后端组与 RAG 组的职责边界
---
## 一、数据存储清单
### 1.1 当前系统中的所有数据库
| 数据库文件 | 存储内容 | 表数量 |
|-----------|----------|--------|
| `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 集合 |
### 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 | 低 |
---
## 二、数据归属划分
### 2.1 前后端组管理的数据
| 数据类型 | 说明 |
|----------|------|
| 用户账户信息 | 账号、密码、个人信息 |
| 用户认证 Token | Token 生成与验证 |
| 权限角色定义 | 角色与权限的映射关系 |
| 组织架构 | 部门、岗位信息 |
| 业务主数据 | 学生学籍、课程安排等 |
**存储**:前后端组的用户数据库/认证系统
**传递方式**:通过网关注入 HTTP Header
### 2.2 RAG 组管理的数据
| 数据类型 | 说明 |
|----------|------|
| 向量数据库 | 所有知识库向量 |
| 文档内容 | PDF/Word/Excel 原始文件 |
| 题目与试卷数据 | 出题相关 |
| 批阅报告 | 考试批卷结果 |
| 知识点与关联关系 | 题库分析 |
| 文档变更追踪 | 同步服务 |
| 会话历史 | 对话记录 ✅ |
| 纲要与缓存 | 文档结构化数据 |
**存储**:本地 SQLite + ChromaDB
---
## 三、核心原则
| 原则 | 说明 |
|------|------|
| **用户认证归前后端** | 登录、密码、Token 生成由前后端组负责 |
| **业务数据归 RAG** | 与知识库、出题、批卷相关的数据由 RAG 组管理 |
| **用户 ID 作为关联键** | 使用 user_id 关联两边数据,不存储完整用户信息 |
| **网关传递用户信息** | 通过 HTTP Header 注入RAG 系统不实现登录 |
---
## 四、数据流向图
### 4.1 用户信息流向
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 用户登录 │────▶│ 前后端认证 │────▶│ 网关注入 │
│ │ │ 系统 │ │ Header │
└─────────────┘ └─────────────┘ └──────┬──────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 用户数据库 │ │ RAG 系统 │
│ (前后端组) │ │ 接收用户信息 │
│ │ │ │
│ • 账号密码 │ │ • X-User-ID │
│ • 个人信息 │ │ • X-User-Role│
│ • 角色权限 │ │ • X-User-Dept│
└─────────────┘ └──────┬──────┘
┌─────────────┐
│ RAG 数据库 │
│ │
│ 存储 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 │ ✓ 文档变更追踪 │
├─────────────────────────────────────────┴─────────────────────────────────┤
│ 数据关联:通过 user_id / student_id │
│ RAG 系统调用前后端 API 获取用户详情 │
└─────────────────────────────────────────────────────────────────────────┘
```