Files
rag/docs/MinerU模型部署指南.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

550 lines
14 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.
# MinerU 模型部署指南
> 解决服务器部署时的模型路径配置问题
---
## 一、当前配置分析
### 1.1 MinerU 模型路径机制
MinerU 通过以下方式确定模型路径:
```python
# 1. 读取环境变量 MINERU_MODEL_SOURCE
model_source = os.getenv('MINERU_MODEL_SOURCE', "huggingface")
# 2. 如果是 local 模式,读取配置文件
if model_source == 'local':
config = read_config() # 读取 ~/mineru.json
models_dir = config.get('models-dir')
# 3. 否则从 HuggingFace 自动下载到缓存目录
else:
# 默认下载到 ~/.cache/huggingface/hub/
pass
```
### 1.2 配置文件位置
MinerU 配置文件查找顺序:
1. **环境变量指定**`MINERU_TOOLS_CONFIG_JSON`
2. **默认位置**`~/mineru.json`(用户主目录)
**Windows**`C:\Users\<username>\mineru.json`
**Linux**`/root/mineru.json``/home/<user>/mineru.json`
### 1.3 MinerU 在线 API 模式
项目同时支持 MinerU 在线 API 解析,通过 `.env.production` 中的 `MINERU_API_TOKEN` 环境变量配置。当设置了该 Token 时,可直接调用 OpenDataLab 云端 API 进行文档解析,无需在本地部署模型。
### 1.4 当前项目使用方式
查看 `parsers/mineru_parser.py` 第 186-197 行:
```python
cmd = [
str(mineru_exe),
"-p", str(file_path),
"-o", str(output_dir),
"-m", "auto",
"-b", backend,
"-l", lang,
# ...
]
```
**关键发现**
- 代码中**没有硬编码路径**
- 使用命令行调用 `mineru` 可执行文件
- MinerU 自动读取配置文件或环境变量
- 所有配置均通过 `.env.production` 环境变量注入,不依赖 `config.py` 硬编码
---
## 二、问题场景
### 场景 1开发环境本机
```
模型位置C:\Users\qq318\.cache\huggingface\hub\
配置文件C:\Users\qq318\mineru.json可能不存在
模型来源:首次运行时自动从 HuggingFace 下载
```
### 场景 2生产环境服务器 Docker
```
问题:
1. Docker 容器内用户目录是 /root/
2. 模型没有打包到镜像中
3. 首次启动会尝试下载模型(可能失败或很慢)
```
---
## 三、解决方案
### 方案 A本地模型模式推荐
**适用场景**
- 服务器无法访问 HuggingFace
- 需要离线部署
- 希望加快启动速度
#### Step 1下载模型到项目目录
在**本机**执行:
```bash
# 激活虚拟环境
cd C:\Users\qq318\Desktop\rag-agent
venv\Scripts\activate
# 创建模型目录
mkdir models\mineru
# 下载所有模型
mineru-models-download -s huggingface -m all -d models\mineru
```
**说明**
- `-s huggingface`:从 HuggingFace 下载
- `-m all`下载所有模型pipeline + vlm
- `-d models\mineru`:指定下载目录
#### Step 2创建配置文件
在项目根目录创建 `mineru.json`
```json
{
"models-dir": {
"pipeline": "/app/models/mineru/pipeline",
"vlm": "/app/models/mineru/vlm"
},
"config_version": "1.3.1"
}
```
**注意**:路径使用 Docker 容器内的路径 `/app/`
#### Step 3生产环境 Dockerfile
当前项目使用 `deploy/Dockerfile.prod`(基于 Python 3.10-slimCPU-only PyTorch
```dockerfile
# Dockerfile.prod - 生产环境优化版
# ================================
# 特点CPU-only、精简依赖、最小化镜像
FROM python:3.10-slim
WORKDIR /app
# 使用阿里云镜像源
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources \
&& sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources
# 系统依赖(精简版)
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
poppler-utils \
libmagic1 \
curl \
&& rm -rf /var/lib/apt/lists/*
# ==================== PyTorchCPU 模式) ====================
# 先从阿里云安装 PyTorch 依赖(避免从 PyPI 下载超时)
RUN pip install --no-cache-dir networkx sympy mpmath typing-extensions \
-i https://mirrors.aliyun.com/pypi/simple/
# 再从 PyTorch 官方源下载 CPU-only 版本(约 200MB跳过依赖解析
RUN pip install --no-cache-dir --no-deps torch --index-url https://download.pytorch.org/whl/cpu
# 设置 PyTorch 使用 CPU 模式
ENV CUDA_VISIBLE_DEVICES=""
# ==================== Python 依赖 ====================
COPY requirements-prod.txt .
RUN pip install --no-cache-dir -r requirements-prod.txt \
-i https://mirrors.aliyun.com/pypi/simple/
# ==================== 应用代码 ====================
COPY . .
# ==================== MinerU 配置 ====================
# 生产环境使用本地模型
RUN mkdir -p /root && echo '{\n\
"models-dir": {\n\
"pipeline": "/app/models/mineru/pipeline",\n\
"vlm": "/app/models/mineru/vlm"\n\
},\n\
"config_version": "1.3.1"\n\
}' > /root/mineru.json
ENV MINERU_MODEL_SOURCE=local
ENV MINERU_TOOLS_CONFIG_JSON=/root/mineru.json
# ==================== 数据目录 ====================
RUN mkdir -p knowledge/vector_store documents models .data
# ==================== 环境变量 ====================
ENV APP_ENV=prod
ENV PYTHONUNBUFFERED=1
EXPOSE 5001
# 生产模式启动
CMD ["gunicorn", "-c", "deploy/gunicorn.conf.py", "deploy.wsgi:app"]
```
#### Step 4构建镜像
```bash
# 从项目根目录执行构建
docker-compose -f deploy/docker-compose.prod.yml up -d --build
# 或单独构建镜像
docker build -f deploy/Dockerfile.prod -t rag-service:latest .
# 查看镜像大小
docker images rag-service
```
**预期镜像大小**:约 5-8GB包含模型
---
### 方案 B挂载模型目录灵活
**适用场景**
- 多个容器共享模型
- 模型文件太大,不想打包到镜像
- 需要动态更新模型
#### Step 1在服务器上准备模型
```bash
# 在服务器上创建模型目录
mkdir -p /data/mineru-models
# 方式1从本机上传
scp -r models/mineru/* user@server:/data/mineru-models/
# 方式2在服务器上下载
ssh user@server
cd /data/mineru-models
pip install mineru[all]
mineru-models-download -s huggingface -m all -d /data/mineru-models
```
#### Step 2创建配置文件
在服务器上创建 `/data/mineru.json`
```json
{
"models-dir": {
"pipeline": "/models/pipeline",
"vlm": "/models/vlm"
},
"config_version": "1.3.1"
}
```
#### Step 3Docker Compose 配置
当前项目使用 `deploy/docker-compose.prod.yml`
```yaml
# docker-compose.prod.yml - 生产环境部署配置
version: '3.8'
services:
rag-service:
build:
context: ..
dockerfile: deploy/Dockerfile.prod
container_name: rag-service
env_file:
- .env.production
ports:
- "5001:5001"
volumes:
# 数据目录挂载(代码在镜像内,不挂载)
- ../knowledge/vector_store:/app/knowledge/vector_store
- ../documents:/app/documents
- ../models:/app/models
- ../.data:/app/.data
- ../data:/app/data
restart: unless-stopped
shm_size: '256m'
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 2G
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:5001/health || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
```
**关键配置说明**
- `env_file: .env.production`:通过 `.env.production` 文件注入所有环境变量(包括 `MINERU_API_TOKEN``DASHSCOPE_API_KEY` 等),不使用 `config.py` 硬编码
- `../models:/app/models`将宿主机模型目录挂载到容器内Dockerfile.prod 中已配置 `MINERU_MODEL_SOURCE=local``MINERU_TOOLS_CONFIG_JSON=/root/mineru.json`
- 端口映射 `5001:5001`,容器名为 `rag-service`
#### Step 4启动服务
```bash
# 从项目根目录执行
docker-compose -f deploy/docker-compose.prod.yml up -d
```
---
### 方案 C自动下载模式不推荐
**适用场景**
- 服务器可以访问 HuggingFace
- 不介意首次启动慢
#### 配置
```dockerfile
# Dockerfile 不需要复制模型
# 首次启动时自动下载到 /root/.cache/huggingface/
# docker-compose.yml
services:
rag-service:
volumes:
# 持久化模型缓存
- mineru-cache:/root/.cache/huggingface
environment:
- MINERU_MODEL_SOURCE=huggingface # 或不设置
volumes:
mineru-cache:
```
**缺点**
- 首次启动需要下载 5-8GB 模型
- 依赖网络连接
- 可能因为网络问题失败
---
## 四、环境变量配置(.env.production
生产环境所有配置通过 `deploy/.env.production` 文件注入,不依赖 `config.py` 硬编码。
### 4.1 .env.production 示例
```bash
# .env.production - 生产环境配置
# 部署到服务器时复制到 deploy/.env.production
# 环境标识
APP_ENV=prod
# LLM API
DASHSCOPE_API_KEY=<your-api-key>
DASHSCOPE_BASE_URL=<your-base-url>
DASHSCOPE_MODEL=mimo-v2.5
RAG_CHAT_MODEL=mimo-v2.5
INTENT_MODEL=mimo-v2.5
VLM_MODEL=qwen-vl-plus
# MinerU 在线 API可选设置后无需本地模型
MINERU_API_TOKEN=<your-mineru-api-token>
# 网络搜索(按需开启)
ENABLE_WEB_SEARCH=false
SERPER_API_KEY=<your-serper-key>
# Rerank ONNX 加速CPU 服务器建议关闭)
RERANK_USE_ONNX=false
```
### 4.2 MinerU 模型路径配置方式
| 方式 | 配置位置 | 说明 |
|------|----------|------|
| `MINERU_API_TOKEN` 环境变量 | `.env.production` | 使用 MinerU 云端 API无需本地模型 |
| `mineru.json` 配置文件 | `/root/mineru.json`(容器内) | 指定本地模型路径Dockerfile.prod 已自动生成 |
| `MINERU_MODEL_SOURCE` 环境变量 | Dockerfile.prod 中设置 | `local` 使用本地模型,`huggingface` 自动下载 |
---
## 五、验证部署
### 5.1 检查模型路径
进入容器检查:
```bash
# 进入容器
docker exec -it rag-service bash
# 检查配置文件
cat /root/mineru.json
# 检查模型目录
ls -lh /app/models/mineru/pipeline/
ls -lh /app/models/mineru/vlm/
# 测试 MinerU
python -c "from mineru.utils.config_reader import read_config; print(read_config())"
```
### 5.2 测试解析
```bash
# 在容器内测试
cd /app
python parsers/mineru_parser.py documents/test.pdf
```
### 5.3 查看日志
```bash
# 查看容器日志
docker logs -f rag-service
# 应该看到类似输出:
# [INFO] MinerU 配置: local 模式
# [INFO] 模型路径: /app/models/mineru/pipeline
```
---
## 六、模型文件清单
### Pipeline 模型(必需)
```
models/mineru/pipeline/
├── Layout/
│ ├── model.pt
│ └── config.json
├── MFD/
│ ├── yolov8_mfd.pt
│ └── config.json
├── MFR/
│ ├── unimernet_small.pt
│ └── config.json
├── OCR/
│ ├── det_db.pth
│ ├── rec_crnn.pth
│ └── config.json
└── TableRec/
├── table_rec.pt
└── config.json
```
**总大小**:约 3-4GB
### VLM 模型(可选,高精度模式)
```
models/mineru/vlm/
├── qwen2-vl/
│ ├── model.safetensors
│ ├── config.json
│ └── tokenizer/
└── ...
```
**总大小**:约 4-5GB
---
## 七、常见问题
### Q1: 镜像太大怎么办?
**A**: 使用方案 B挂载模型目录镜像只包含代码模型在宿主机。
### Q2: 如何更新模型?
**A**:
- 方案 A重新构建镜像
- 方案 B直接替换宿主机上的模型文件重启容器
### Q3: 模型下载失败怎么办?
**A**:
1. 使用国内镜像:`export HF_ENDPOINT=https://hf-mirror.com`
2. 手动下载后上传到服务器
3. 使用方案 A 在本机下载后打包
### Q4: 如何减少模型大小?
**A**:
- 只下载 pipeline 模型(不下载 vlm
- 使用 `mineru-models-download -m pipeline` 而不是 `-m all`
### Q5: 配置文件不生效?
**A**: 检查:
1. 环境变量 `MINERU_MODEL_SOURCE=local` 是否设置
2. 配置文件路径是否正确:`/root/mineru.json`
3. 配置文件格式是否正确JSON 语法)
4. 模型目录路径是否存在
### Q6: 如何使用 MinerU 在线 API 代替本地模型?
**A**: 在 `.env.production` 中设置 `MINERU_API_TOKEN=<your-token>`无需在本地部署模型。Token 可从 OpenDataLab 平台获取。
---
## 八、推荐方案总结
| 方案 | 优点 | 缺点 | 适用场景 |
|------|------|------|----------|
| **方案 A打包到镜像** | 部署简单、启动快 | 镜像大、更新麻烦 | 单机部署、离线环境 |
| **方案 B挂载目录** | 灵活、易更新、多容器共享 | 需要管理宿主机文件 | 多节点、生产环境 |
| **方案 C自动下载** | 镜像小 | 首次启动慢、依赖网络 | 测试环境 |
| **在线 API** | 无需本地模型、镜像最小 | 依赖网络、有调用限制 | 轻量部署、测试环境 |
**生产环境推荐**:方案 B挂载模型目录+ `.env.production` 环境变量注入
---
## 九、部署检查清单
部署前检查:
- [ ] 模型文件已下载到 `models/mineru/` 目录
- [ ] 创建了 `deploy/.env.production` 配置文件(含 `MINERU_API_TOKEN` 等环境变量)
- [ ] 确认使用 `deploy/Dockerfile.prod``deploy/docker-compose.prod.yml`
- [ ] 测试了本地解析功能
- [ ] 确认模型文件大小3-8GB
部署后检查:
- [ ] 容器启动成功:`docker ps | grep rag-service`
- [ ] 配置文件存在:`docker exec rag-service cat /root/mineru.json`
- [ ] 模型目录存在:`docker exec rag-service ls /app/models/mineru`
- [ ] 环境变量正确:`docker exec rag-service env | grep MINERU`
- [ ] 健康检查通过:`curl http://localhost:5001/health`
- [ ] 测试解析功能:上传一个 PDF 测试
- [ ] 查看日志无错误:`docker logs -f rag-service`
---
**文档版本**: v1.1
**最后更新**: 2026-06-04
**维护者**: RAG 服务开发组