note/app_prd/文档转换.md

228 lines
10 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.

# 产品需求文档:通用文档转换与管理服务 (UDC-M)
**Universal Document Converter & Manager - Backend Service**
| 文档版本 | V2.0 |
| :------- | :------------------------------ |
| **最后更新** | 2025-12-09 |
| **状态** | 待开发 |
| **涉及端** | 后端 API, 异步 Worker, 对象存储, 关系型数据库 |
| | |
---
## 1. 项目背景与目标
### 1.1 背景
在构建智能题库、知识库或 RAG 应用时,文档不仅是需要被“消费”的临时素材,更是核心的**数字资产**。当前的痛点在于:
1. 缺乏统一的文档仓库,原始文件容易丢失。
2. 不同格式PDF, Word, Excel解析标准不一。
3. 解析过程中的图片/公式资源难以复用。
### 1.2 目标
构建一个**具备资产管理能力**的高性能文档服务。
* **资产沉淀**所有上传的原始文档PDF, DOCX, XLSX, 图片等)均永久存储,并支持去重和历史记录查询。
* **格式归一**:将异构文档转换为标准 Markdown供 AI 使用)或 PDF/DOCX供人阅读
* **资源云化**:自动提取文档内的图片/公式,转为 MinIO 永久链接。
* **样式定制**:支持 Word 模板渲染。
---
## 2. 系统架构设计
系统采用 **API 服务 + 关系型数据库 + 异步任务队列** 的架构。
### 2.1 核心组件
1. **API Gateway (FastAPI)**:
* 提供文档上传、查询、转换接口。
* 负责文件 Hash 计算与秒传校验。
2. **Metadata DB (PostgreSQL)**:
* 存储文档元数据文件名、大小、Hash、上传人
* 存储转换任务记录Task History
3. **Task Broker (Redis)**: 维护任务队列 (`gpu-queue`, `cpu-queue`)。
4. **Worker Cluster (Celery)**:
* **GPU Worker**: MinerU (PDF/Image -> Markdown)。
* **CPU Worker**: Pandoc/Pandas/WPS-RPC (Office -> Markdown, Markdown -> Docx)。
5. **Storage (MinIO)**:
* `udc-raw`: **[永久]** 存放用户上传的原始文件(按 `hash/filename` 存储)。
* `udc-assets`: **[永久]** 存放解析出的图片资源。
* `udc-results`: **[永久]** 存放转换结果MD/PDF
* `udc-templates`: **[永久]** 样式模板。
---
## 3. 功能需求详细说明
### 3.1 文档管理 (DMS Core)
* **上传与去重**:用户上传文件时,计算 SHA256。若库中已存在该 Hash则直接返回现有的 `document_id`(秒传),不重复上传 MinIO。
* **版本/历史**:同一个 `document_id` 可以对应多个 `task_id`(例如:第一次解析失败,修正 bug 后重新解析;或者分别转换为 Markdown 和 PDF
* **元数据检索**:支持按文件名、上传时间、文件类型查询文档。
### 3.2 转换路由策略 (Conversion Strategy)
| 输入格式 | 目标格式 | 引擎 | 逻辑说明 |
| :--- | :--- | :--- | :--- |
| **PDF / Image** | Markdown | **MinerU** (GPU) | 强依赖 GPU提取截图并替换链接。 |
| **DOCX** | Markdown | **Pandoc** | 提取内嵌图片,保留 LaTeX 公式。 |
| **DOC** | Markdown | **WPS-RPC** -> PDF -> **MinerU** | 解决老旧 MathType 公式渲染问题。 |
| **XLSX** | Markdown | **Pandas** | 纯文本拼接,忽略内嵌图。 |
| **Markdown** | DOCX | **Pandoc** | 支持 `--reference-doc` 模板定制。 |
### 3.3 资产与链接处理
* **图片处理**:所有转换产生的图片,均重命名为 MD5 Hash存入 `udc-assets`
* **Markdown 清洗**:输出的 Markdown 中,所有图片链接必须是 MinIO 的完整 URL`https://oss.example.com/udc-assets/a1b2...jpg`),禁止出现相对路径。
---
## 4. 数据库设计 (PostgreSQL Schema)
使用 SQLModel 定义,支撑 DMS 能力。
### 4.1 Table: `documents` (文档主表)
| 字段 | 类型 | 说明 |
| :--- | :--- | :--- |
| `id` | UUID (PK) | 文档唯一标识 |
| `file_hash` | VARCHAR(64) | SHA256唯一索引 (Unique) |
| `filename` | VARCHAR | 原始文件名 |
| `file_type` | VARCHAR | 扩展名 (pdf, docx) |
| `file_size` | BIGINT | 字节数 |
| `storage_path` | VARCHAR | MinIO 路径 (`udc-raw/hash/filename`) |
| `created_at` | TIMESTAMP | 上传时间 |
### 4.2 Table: `conversion_tasks` (转换历史表)
| 字段 | 类型 | 说明 |
| :--- | :--- | :--- |
| `id` | UUID (PK) | 任务 ID |
| `document_id` | UUID (FK) | 关联文档 |
| `target_format` | VARCHAR | markdown, pdf, docx |
| `status` | VARCHAR | queued, processing, success, failed |
| `result_url` | VARCHAR | 结果文件下载链接 |
| `error_msg` | TEXT | 失败原因 |
| `created_at` | TIMESTAMP | 任务创建时间 |
| `completed_at` | TIMESTAMP | 完成时间 |
---
## 5. API 接口定义 (RESTful)
**Base URL**: `/api/v1`
### 5.1 文档管理
* **POST** `/documents`
* **功能**:上传新文档(支持秒传)。
* **Body**: `file` (binary)
* **Response**: `{"document_id": "...", "is_exist": true/false}`
* **GET** `/documents`
* **功能**:分页查询文档列表。
* **Query**: `page`, `size`, `keyword`
### 5.2 转换服务
* **POST** `/conversions`
* **功能**:发起转换任务。
* **Body**:
* `document_id` (必填): 指向已上传的文档 ID。
* `target_format` (必填): `markdown`, `docx` 等。
* `template_id` (选填): 样式模板 ID。
* `force_ocr` (选填): Boolean。
* **Response**: `{"task_id": "..."}`
### 5.3 任务与结果
* **GET** `/conversions/{task_id}`
* **功能**:查询状态及结果。
* **Response**:
```json
{
"status": "success",
"result": {
"content": "# Markdown内容...",
"file_url": "https://minio.../res.md"
}
}
```
### 5.4 辅助接口
* **POST** `/templates`: 上传 Word 样式模板。
* **GET** `/files/{path}`: 文件代理下载(用于预览)。
---
## 6. 存储策略 (MinIO)
* **udc-raw**: **永久存储**。目录结构建议:`/{year}/{month}/{hash}.ext`。
* **udc-assets**: **永久存储**。用于存放 OCR 截图,目录结构:`/{hash_prefix}/{hash}.jpg`。
* **udc-results**: **永久存储**。建议保留转换历史。
* **udc-temp**: **1天过期**。用于打包下载的临时 ZIP 文件。
---
## 7. 非功能需求 (NFR)
1. **大文件支持**: API 需支持 Stream 上传避免内存溢出Nginx 需放开 `client_max_body_size`
2. **GPU 调度**: 通过 Celery 限制 GPU Worker 的并发数(建议 1:1 或 1:2防止显存 OOM。
3. **超时控制**:
* PDF/OCR 任务:超时设定为 10 分钟。
* Office 转换任务:超时设定为 1 分钟。
4. **可观测性**: 关键节点开始转换、MinerU调用、上传MinIO需打 Log并在 Redis 记录进度百分比。
---
## 8. 技术选型与开发规范 (Technology Stack)
本系统采用 **"AI-Native"** 的开发策略技术选型优先考虑与大模型LLM的兼容性、社区文档丰富度以及类型系统的完备性以实现极致的 **Vibe Coding** 开发体验。
### 8.1 核心技术栈 (Core Stack)
| 组件 | 选型 | 版本要求 | 选型理由 |
| :--- | :--- | :--- | :--- |
| **开发语言** | **Python** | **3.10+** | 必须启用强类型提示 (Type Hints)MinerU/Pandas 等核心库的原生语言LLM 生成代码质量最高。 |
| **Web 框架** | **FastAPI** | Latest | 自动生成 OpenAPI 文档;基于 Pydantic 的类型验证是 AI 理解业务逻辑的最佳桥梁。 |
| **数据验证** | **Pydantic** | **V2** | 通过定义 Class Schema 驱动开发AI 可根据 Schema 自动补全业务代码。 |
| **异步队列** | **Celery** | Latest | 处理 PDF OCR 等长耗时任务的工业级标准;配合 Redis 使用。 |
| **包管理** | **uv** | Latest | 极速 Python 包管理器(比 pip 快 10-100 倍),保障开发心流不被打断。 |
| **数据库** | **PostgreSQL** | 14+ | 优异的 JSONB 支持;配合 SQLModel 使用体验最佳。 |
| **ORM 框架** | **SQLModel** | Latest | 结合 SQLAlchemy 和 Pydantic让数据库操作与数据验证统一降低 AI 上下文切换成本。 |
| **对象存储** | **MinIO** | Latest | S3 兼容协议;用于存储海量非结构化数据。 |
### 8.2 Vibe Coding 开发工作流
为确保 AI 辅助编码的准确性和可维护性,开发过程需严格遵循以下工作流:
1. **Schema First (模型驱动)**
* 在编写业务逻辑前,**必须先定义 Pydantic/SQLModel**。
* *理由*Schema 是 AI 理解数据的“骨架”骨架定义好AI 填充“血肉”(逻辑)的准确率极高。
2. **微提交策略 (Micro-Commits)**
* **原则**:将 Git Commit 视为“游戏存档点”。
* **操作**:每当 AI 完成一个独立功能如“完成MinIO上传函数”**立即 Commit**。
3. **模块化上下文 (Modular Context)**
* **强制分包**`routers/`, `services/`, `models/`, `tasks/`
* *理由*:模块化让开发者可以只将相关文件喂给 AI避免 Token 超限和幻觉。
4. **环境隔离**
* 使用 `uv venv` 创建虚拟环境,依赖变更后运行 `uv sync`
### 8.3 关键依赖库
* **PDF/OCR**: `magic-pdf` (MinerU SDK) - **需 GPU 环境**
* **Word**: `pypandoc` (Pandoc 包装), `python-docx`
* **Excel**: `pandas`, `openpyxl`
* **WPS调用**: `pywpsrpc` (如果部署在 Linux) 或 `pywin32` (如果部署在 Windows 节点)。
---
## 9. 开发阶段规划
### Phase 1: 核心资产管理 (DMS)
* 搭建 FastAPI + PostgreSQL + MinIO。
* 实现文件上传、SHA256 去重、元数据存储。
* 实现基础的 API`POST /documents`, `GET /documents`
### Phase 2: CPU 转换能力
* 集成 Redis + Celery。
* 实现 `Pandoc` (Docx->MD) 和 `Pandas` (Excel->MD) Worker。
* 实现 Markdown 图片提取与 MinIO 上传逻辑。
### Phase 3: GPU 转换能力与优化
* 部署 MinerU 环境,实现 PDF -> Markdown。
* 实现 WPS/Windows 节点集成(解决老旧 Doc 公式)。
* 完善样式模板功能。