Files
rag/docs/架构与部署方案.md
lacerate551 100d1a06eb init: RAG 知识库服务初始提交
- 后端 API(Flask + Gunicorn)
- RAG 引擎(混合检索 + 云端 Reranker + 引用溯源)
- 文档解析(MinerU + 多格式支持)
- Docker 生产部署配置
- 排除前端项目、敏感配置、模型文件
2026-06-04 17:35:27 +08:00

451 lines
16 KiB
Markdown
Raw 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 服务架构与部署方案
## 一、系统架构概览
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 前端应用 │
│ (Vue/React Web/App) │
└─────────────────────────────────────┬───────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ 后端网关 │
│ (Nginx / API Gateway / Spring Cloud) │
│ │
│ 职责: │
│ • 用户认证 (登录/Token验证) │
│ • 权限控制 (角色/部门/接口权限) │
│ • Header 注入 (X-User-ID, X-User-Role, X-User-Department) │
│ • 请求路由与负载均衡 │
└─────────────────────────────────────┬───────────────────────────────────────┘
┌─────────────────┴─────────────────┐
│ │
▼ ▼
┌───────────────────────────────┐ ┌───────────────────────────────────────┐
│ 后端业务服务 │ │ RAG 服务 │
│ (Java/Spring Boot/Go) │ │ (Python/Flask) │
│ │ │ │
│ 职责: │ │ 职责: │
│ • 用户账户管理 │ │ • 向量存储 (ChromaDB) │
│ • 组织架构/角色权限 │ │ • BM25 索引 │
│ • 会话管理 (对话历史) │ │ • 文档解析与分块 │
│ • 审计日志 │ │ • 知识库问答 (RAG) │
│ • 反馈记录 │ │ • 文档同步与向量化 │
│ • 业务主数据 (学生/课程等) │ │ • 出题能力 │
│ • 题库/试卷管理 │ │ │
│ │ │ │
│ 数据库: │ │ 数据存储: │
│ • MySQL/PostgreSQL │ │ • ChromaDB (向量库) │
│ │ │ • 文件系统 (documents/) │
│ │ │ • SQLite (同步状态哈希) │
└───────────────────────────────┘ └───────────────────────────────────────┘
```
---
## 二、职责分工详解
### 2.1 RAG 组(本项目)负责
| 模块 | 功能 | 数据存储 |
|------|------|----------|
| **向量存储** | ChromaDB 向量库管理 | `vector_store/chroma/` |
| **BM25 索引** | 关键词检索 | 内存/文件 |
| **文档解析** | PDF/Word/Excel 解析与分块 | 临时处理 |
| **知识库问答** | Agentic RAG 问答引擎 | - |
| **文档同步** | 文件变更检测与向量化 | SQLite (哈希记录) |
| **出题能力** | 基于知识库生成题目 | 无状态 |
### 2.2 后端组负责
| 模块 | 功能 | 数据存储 |
|------|------|----------|
| **用户认证** | 登录/注册/Token 管理 | MySQL/PostgreSQL |
| **权限控制** | 角色/部门/接口权限 | MySQL/PostgreSQL |
| **会话管理** | 对话历史记录 | MySQL/PostgreSQL |
| **审计日志** | 操作日志记录 | MySQL/PostgreSQL |
| **反馈系统** | 用户反馈收集 | MySQL/PostgreSQL |
| **业务主数据** | 学生/课程/组织架构 | MySQL/PostgreSQL |
| **题库管理** | 题目存储/试卷管理 | MySQL/PostgreSQL |
| **网关路由** | 请求路由/Header 注入 | - |
### 2.3 数据归属对照表
| 数据类型 | 存储位置 | 管理方 | 说明 |
|----------|----------|--------|------|
| 向量数据 | ChromaDB | RAG 组 | 文档 embedding |
| 文档哈希 | SQLite | RAG 组 | 同步状态检测 |
| 原始文档 | 文件系统 | RAG 组 | documents/ 目录 |
| 用户账户 | MySQL/PG | 后端组 | 账号密码信息 |
| 会话历史 | MySQL/PG | 后端组 | 对话记录 |
| 审计日志 | MySQL/PG | 后端组 | 操作日志 |
| 反馈记录 | MySQL/PG | 后端组 | 用户反馈 |
| 题库数据 | MySQL/PG | 后端组 | 题目/试卷 |
---
## 三、接口协作规范
### 3.1 后端调用 RAG 服务
后端通过 HTTP 调用 RAG API需注入 Header
```
X-User-ID: 用户唯一标识
X-User-Name: 用户名(可选)
X-User-Role: 用户角色(可选)
X-User-Department: 部门(可选)
```
### 3.2 RAG 服务提供的接口
#### 问答接口
| 接口 | 方法 | 说明 |
|------|------|------|
| `/chat` | POST | 普通聊天 |
| `/rag` | POST | 知识库问答 |
| `/rag/stream` | POST | 流式问答 |
| `/search` | POST | 混合检索 |
#### 向量库管理
| 接口 | 方法 | 说明 |
|------|------|------|
| `/collections` | GET | 向量库列表 |
| `/collections` | POST | 创建向量库 |
| `/collections/<name>` | PUT | 修改向量库 |
| `/collections/<name>` | DELETE | 删除向量库 |
#### 文档管理
| 接口 | 方法 | 说明 |
|------|------|------|
| `/documents/upload` | POST | 上传文件 |
| `/documents/batch-upload` | POST | 批量上传 |
| `/documents/list` | GET | 文档列表 |
| `/documents/<path>` | DELETE | 删除文档 |
| `/documents/<path>/status` | GET | 处理状态 |
#### 切片管理
| 接口 | 方法 | 说明 |
|------|------|------|
| `/documents/<path>/chunks` | GET | 查看切片 |
| `/chunks` | POST | 新增切片 |
| `/chunks/<id>` | PUT | 修改切片 |
| `/chunks/<id>` | DELETE | 删除切片 |
#### 同步服务
| 接口 | 方法 | 说明 |
|------|------|------|
| `/sync` | POST | 触发同步 |
| `/sync/status` | GET | 同步状态 |
#### 出题接口
| 接口 | 方法 | 说明 |
|------|------|------|
| `/exam/generate` | POST | 生成题目 |
| `/exam/grade` | POST | 批改答案 |
### 3.3 后端需要提供的接口
RAG 服务可能需要调用后端获取用户信息:
```
GET /api/users/{user_id}
响应:
{
"user_id": "xxx",
"username": "用户名",
"name": "真实姓名",
"role": "admin/manager/user",
"department": "部门名称"
}
```
---
## 四、合并前准备工作
### 4.1 RAG 组需完成
- [x] 权限控制简化(依赖后端网关)
- [x] 移除会话管理依赖
- [x] 移除审计日志依赖
- [x] 更新 API 文档
- [ ] 清理测试数据和临时文件
- [ ] 整理依赖列表 (requirements.txt)
- [ ] 准备环境变量配置模板
### 4.2 后端组需完成
- [ ] 设计数据库表结构
- [ ] 实现用户认证接口
- [ ] 实现会话管理接口
- [ ] 实现审计日志接口
- [ ] 配置网关路由和 Header 注入
- [ ] 提供 RAG 服务调用的接口
### 4.3 双方需确认
- [ ] 接口协议和字段格式
- [ ] 错误码规范
- [ ] 部署环境和网络配置
- [ ] 文件存储方案(本地/NFS/OSS
---
## 五、Linux 部署方案
### 5.1 部署架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Linux 服务器 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Nginx │ │ 后端服务 │ │ RAG 服务 │ │
│ │ :80/443 │───▶│ :8080 │ │ :5001 │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
│ │ │ │ │
│ │ ▼ ▼ │
│ │ ┌─────────────┐ ┌─────────────┐ │
│ │ │ MySQL/PG │ │ ChromaDB │ │
│ │ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ documents/ │ ◀── 文档存储目录 │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
### 5.2 环境准备
```bash
# 1. 系统依赖
sudo apt update
sudo apt install -y python3.10 python3.10-venv python3-pip
# 2. 创建部署用户
sudo useradd -m -s /bin/bash rag
sudo su - rag
# 3. 创建目录结构
mkdir -p /home/rag/rag-service/{app,documents,vector_store,logs}
```
### 5.3 RAG 服务部署
```bash
# 1. 上传代码
cd /home/rag/rag-service
# 将项目代码上传到 app/ 目录
# 2. 创建虚拟环境
python3.10 -m venv venv
source venv/bin/activate
# 3. 安装依赖
pip install -r app/requirements.txt
# 4. 配置环境变量
cat > .env << EOF
# 生产环境配置
DEV_MODE=false
DOCUMENTS_PATH=/home/rag/rag-service/documents
VECTOR_STORE_PATH=/home/rag/rag-service/vector_store
# API 配置(如果需要)
DASHSCOPE_API_KEY=your_api_key
EOF
# 5. 初始化向量库
python -c "from knowledge.manager import get_kb_manager; get_kb_manager()"
# 6. 测试启动
cd app && python main.py --port 5001
```
### 5.4 Systemd 服务配置
```bash
# 创建服务文件
sudo cat > /etc/systemd/system/rag-service.service << 'EOF'
[Unit]
Description=RAG Knowledge Service
After=network.target
[Service]
Type=simple
User=rag
Group=rag
WorkingDirectory=/home/rag/rag-service/app
Environment="PATH=/home/rag/rag-service/venv/bin"
EnvironmentFile=/home/rag/rag-service/.env
ExecStart=/home/rag/rag-service/venv/bin/python main.py --port 5001
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable rag-service
sudo systemctl start rag-service
# 查看状态
sudo systemctl status rag-service
```
### 5.5 Nginx 配置
```nginx
# /etc/nginx/sites-available/rag-service
upstream rag_backend {
server 127.0.0.1:5001;
}
server {
listen 80;
server_name your-domain.com;
# 请求体大小限制(文件上传)
client_max_body_size 50M;
# RAG API 代理
location /rag-api/ {
proxy_pass http://rag_backend/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 注入用户信息(由认证模块设置)
proxy_set_header X-User-ID $http_x_user_id;
proxy_set_header X-User-Name $http_x_user_name;
proxy_set_header X-User-Role $http_x_user_role;
proxy_set_header X-User-Department $http_x_user_department;
# SSE 支持
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 300s;
}
# 图片文件
location /images/ {
alias /home/rag/rag-service/documents/images/;
}
}
```
### 5.6 网关 Header 注入示例
后端网关在转发请求到 RAG 服务时注入 Header
```java
// Spring Cloud Gateway 示例
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("rag-service", r -> r.path("/rag-api/**")
.filters(f -> f
.stripPrefix(1)
.addRequestHeader("X-User-ID", "#{request.getAttribute('userId')}")
.addRequestHeader("X-User-Role", "#{request.getAttribute('userRole')}")
.addRequestHeader("X-User-Department", "#{request.getAttribute('userDept')}")
)
.uri("http://127.0.0.1:5001"))
.build();
}
```
---
## 六、联调测试清单
### 6.1 后端接口测试
- [ ] 用户认证接口可用
- [ ] 网关正确注入 Header
- [ ] 会话管理接口可用
### 6.2 RAG 接口测试
```bash
# 测试 RAG 服务(带 Header
curl -X POST http://localhost:5001/rag \
-H "Content-Type: application/json" \
-H "X-User-ID: test-user" \
-H "X-User-Role: admin" \
-d '{"message": "测试问题"}'
# 测试向量库列表
curl -X GET http://localhost:5001/collections \
-H "X-User-ID: test-user"
# 测试文件上传
curl -X POST http://localhost:5001/documents/upload \
-H "X-User-ID: test-user" \
-F "file=@test.pdf" \
-F "collection=public_kb"
```
### 6.3 端到端测试
- [ ] 前端 → 后端 → RAG 请求链路通
- [ ] 用户认证正确传递
- [ ] 权限控制生效
- [ ] 文件上传下载正常
- [ ] 问答功能正常
---
## 七、运维监控
### 7.1 日志管理
```bash
# RAG 服务日志
tail -f /home/rag/rag-service/logs/rag.log
# Systemd 日志
journalctl -u rag-service -f
```
### 7.2 健康检查
```bash
# 添加到监控脚本
curl -f http://localhost:5001/health || alert "RAG service down"
```
### 7.3 备份策略
```bash
# 备份向量库
tar -czf backup_$(date +%Y%m%d).tar.gz vector_store/
# 备份文档
rsync -av documents/ backup/documents/
# 备份同步状态
sqlite3 data/knowledge.db ".backup backup/knowledge.db"
```
---
## 八、故障排查
| 问题 | 可能原因 | 解决方案 |
|------|----------|----------|
| 401 未认证 | 缺少 X-User-ID | 检查网关 Header 注入 |
| 向量检索失败 | ChromaDB 损坏 | 重建向量库 |
| 文件上传失败 | 权限/空间问题 | 检查目录权限和磁盘空间 |
| 内存不足 | 向量模型占用 | 增加 swap 或内存 |
| 服务启动慢 | 模型加载 | 预热模型或使用更小模型 |