XinheBot 芯禾巡检平台

复杂文档解析模块(多文档 OCR 解析)· 产品需求文档(PRD)
版本 V3.0 | 洪妍灵 | 2026-09-27 | 状态:待评审
目录
  1. 背景与目标
  2. 范围与术语
  3. 用户与使用场景
  4. 功能需求
  5. 技术架构与选型
  6. 数据管理方案
  7. RAG 检索链路
  8. RAG 索引优化
  9. Map-Reduce 层级递归摘要
  10. 应对高并发处理方案
  11. A2A 机器人集群跨地域协作协议方案
  12. 非功能需求
  13. 优先级与里程碑
  14. 验收标准
  15. 风险与应对
  16. 附录:简历项目描述建议

1. 背景与目标

1.1 背景

复杂文档解析是 AI Agent / RAG 知识库的通用前置能力,也直接对应岗位任职要求第6条:“具备复杂文档解析经验,能处理 PDF/Office/CSV/图片/扫描件中的文本、表格、图片及版面结构”。在 XinheBot 巡检平台中,该模块是四大新增模块之「多文档 OCR 解析」的深化实现,支撑巡检资料、图纸、扫描件的多模态知识管理与 RAG 问答。

1.2 产品目标

1.3 核心价值

让非结构化文档“传得进、分得清、查得到、能溯源”——支持 GB 级大文件安全上传与异步处理;不只提取文字,更保留版面与坐标;不只入库,更能被 RAG 与空间检索引用到原文位置。

2. 范围与术语

2.1 支持的文件类型

类别文件类型处理方式
原生文本文档PDF(可复制文字)、Word、Excel、PPT、CSV直接解析,无需 OCR
图片 / 扫描件JPG、PNG、TIFF、扫描 PDF图像预处理 + OCR
复杂图件CAD 矢量(DXF/DWG)、图纸截图矢量走 ezdxf;截图走 OCR

2.2 抽取能力

2.3 术语表

术语说明
OCR光学字符识别,将图片/扫描件中的文字转为可检索文本
版面结构文档中标题、段落、表格、图片等元素的类型、位置与层级关系
版面坐标(bbox)元素在页面中的矩形坐标,用于溯源与图文定位
图文联合将正文文本与图片/图纸的识别结果按元数据关联,实现联合检索
分片上传将大文件按固定大小切分后逐片上传,支持断点续传与秒传
幂等同一操作重复执行结果一致,用于防重复上传与重复解析
向量化将文本/图注切片转为向量,存入向量库供语义检索
Map-Reduce 摘要先分片并行生成局部摘要,再逐层合并生成层级摘要
结构化输出按统一 Schema 输出 {type, text, bbox, page, metadata} 等元素

3. 用户与使用场景

用户角色场景核心诉求
知识库/业务运营上传大体积 PDF、扫描件、图纸说明大文件可靠上传、文档 OCR 解析、入库,供 RAG 问答
空间数据管理员上传 CAD 图纸、巡检影像图件解析、结构化、空间入库与检索
巡检运维人员查询设备资料、历史报告快速检索到原文,溯源到页码与位置,查看长文档摘要
研发/Agent 调用Agent 需要读取文档工具解析能力封装为 MCP 工具,供 LangGraph 调用

4. 功能需求

4.1 文档路由与解析调度

功能需求描述优先级
自动路由自动判断文件类型(PDF/Office/CSV/图片/扫描件),分派对应解析器P1
统一调度以 Unstructured 为统一编排框架,屏蔽不同文件解析器差异,输出统一 Element 结构P1
异步任务Redis/Celery 任务队列驱动异步解析,支持批量、失败重试、限流P0
服务化解析独立服务化,Docker 部署,按需扩容P1

4.2 原生文本文档解析(PDF/Office/CSV)

功能需求描述优先级
文本 PDFpdfplumber 提取文字、表格,保留版面坐标P1
Office 文档docx/xlsx/pptx 提取段落、表格、内嵌图片,保留层级P1
CSVpandas 直接读取为结构化表格数据P1

4.3 扫描件与图片 OCR

功能需求描述优先级
图像预处理角度矫正、去噪、二值化、对比度增强,提升识别率P1
主力识别PaddleOCR 本地识别文字、表格、标注(离线、可微调、低成本)P1
版面检测PP-Structure 区分标题/正文/表格/图片区块,输出像素 bboxP1
兜底引擎低置信度自动降级 DeepSeek-OCR(VLM 版面理解,复杂图文/复杂表格)P2
双引擎策略:PaddleOCR 本地为主(离线可用、可微调、批量成本低);DeepSeek-OCR 兜底(版面理解强、适配密集图文与复杂表格),二者可切换。

4.4 CAD 与复杂图件解析(图文联合)

功能需求描述优先级
矢量 CADezdxf 读取 DXF 图层、图元、标注文字、坐标、块信息,结构化入 PostGISP1
图纸截图CAD 导出 PNG/TIFF 走 OCR,提取图面文字与图注P1
坐标映射图片像素坐标映射回地理坐标,实现图文与空间联动P2
图文关联文档内嵌图片识别结果与正文段落按元数据(图片ID/页码/坐标)绑定P1
关键前提:CAD 矢量文件(.dwg/.dxf)不等于图片,OCR 不能读取矢量图层、坐标,只能识别导出截图上的文字。矢量走 ezdxf,截图才走 OCR。

4.5 版面结构保留

不输出纯文本大段;每个元素保留坐标与类别,示例:

{ type:"table", text:"表格内容", bbox:[x1,y1,x2,y2], page:3 }

好处:RAG 溯源到原文页码与位置;GIS 场景可将图片像素坐标映射地理坐标。

4.6 表格识别与处理

4.7 结构化输出与入库

功能需求描述优先级
结构化输出统一 Element Schema:type/text/bbox/page/metadataP1
清洗切片按版面区块分块,标题+正文关联,表格转结构化文本,带坐标/页码元数据P1
入库结构化元数据入 PostGIS,切片向量化入 Milvus,支撑 RAG 混合检索P1

4.8 大文件上传(Django 分片上传)

支撑 GB 级大文件(图纸、长报告、大影像)可靠上传,避免单次请求超时、断连重传、内存占用过高。

功能需求描述优先级
前端分片浏览器端将大文件按固定分片大小(如 5MB)切片,逐片上传并携带分片序号P0
秒传检测按文件 MD5 判断是否已存在,存在则直接返回已完成,跳过重复上传P0
分片上传接口POST /api/upload/chunk,接收分片并落盘/直传 MinIOP0
断点续传GET /api/upload/progress 返回已接收分片集合,缺失分片自动补传P0
合并还原POST /api/upload/merge,服务端校验全部分片后合并还原,二次校验大小与哈希P0
并发分片多分片可并行上传,服务端按分片序号幂等去重P1
校验与限制文件类型、大小上限(如单文件 ≤2GB)、分片大小一致性校验P1
Django 实现要点:基于 Django REST Framework 提供 check / chunk / progress / merge 四类接口;分片临时存 MinIO 或本地临时目录(带租户+文件标识前缀);合并后触发 Celery 异步解析任务;合并后计算全文件哈希作为幂等键,重复上传直接命中秒传。

4.9 大文件异步处理机制

机制需求描述优先级
任务超时解析任务设超时阈值(如 10 分钟),超时标记失败/可重试;超大文件按页/章节拆分子任务,避免单任务超长P0
内存占用流式/分块读取,OCR 按页处理逐块释放;限制单任务内存峰值,大文件不整体载入内存P0
并发控制信号量/队列限流(如单机 N 个解析并发),按租户配额,防止 OOM 与接口压垮P0
失败重试瞬时错误指数退避重试(如最多 3 次);永久错误落库标记、支持人工重跑;失败原因可追溯P0
重复处理(幂等)以 文件MD5 + 任务ID 作幂等键,Redis 校验防重复解析;已处理文件直接返回结果P0
数据一致性任务状态机 pending→processing→success/failed;成功后才提交结构化数据与向量入库;失败回滚/标记,避免半成品入库;PostGIS 与 Milvus 采用事务/补偿保证一致P0
闭环:上传完成后自动进入异步解析队列;解析状态全程可查(进度/失败原因/重试次数);只有成功落库后才对外提供检索,保证用户看到的一定是完整结果。

5. 技术架构与选型

双技术栈定位:同一套业务能力,两套技术方案——Django(Python)主版本 + SpringBoot(Java)备选版本,按需选用,体现技术选型能力。业务能力完全一致:分片上传、异步任务、文档解析、RAG 索引、Map-Reduce 长文档摘要,只是后端语言框架不同。

5.1 Django(Python)主版本技术路线

5.1.1 整体架构(异步流水线)

文件上传(Django 分片)→ 对象存储 MinIO → Redis/Celery 任务队列(异步解析)→ 文档路由分发 → 分类型解析器 → 结构化元素输出 → PostGIS 入库 → 切片 → Milvus 向量入库 → RAG 检索 / 索引优化 / 层级摘要

5.1.2 技术选型

组件选型职责
统一调度Unstructured文件类型路由、版面分块、统一 Element 输出
原生文本 PDFpdfplumber / PyMuPDF文字、表格、坐标提取
Office/CSVpython-docx / openpyxl / python-pptx / pandas段落、表格、内嵌图片提取
OCR 主力PaddleOCR + PP-Structure本地批量文字/表格/版面识别
OCR 兜底DeepSeek-OCR(VLM)复杂图文、复杂表格增强理解
矢量 CADezdxfDXF 图层、图元、标注、坐标提取
图像预处理OpenCV矫正、去噪、二值化、增强
上传/分片Django REST Framework + Celery分片上传、秒传、断点续传、合并、异步任务
异步任务/限流Celery + Redis任务队列、超时、重试、幂等、并发限流
检索/重排bge-m3 / BM25 / BGE Rerank多路召回、混合检索、重排

5.1.3 双引擎降级策略

PaddleOCR 识别置信度低于阈值,或版面为复杂混排图文时,自动降级 DeepSeek-OCR 二次识别,保证复杂文档识别质量。

5.2 SpringBoot(Java)备选技术路线

5.2.1 选型说明

5.2.2 核心组件

组件选型职责
框架SpringBoot 3.x + Spring Data JPA / MyBatis-Plus业务网关、接口、任务管理
文件分片上传MinIO Java SDK分片存储、合并、MD5 校验、断点续传
异步任务Spring Task / RabbitMQ(替代 Redis+Celery)任务队列,任务状态持久化到 MySQL
幂等 & 并发控制Redisson 分布式锁用请求唯一 ID 防止重复解析任务
数据库PostgreSQL + PostGIS和 Django 版本共用同一套数据库与 MinIO 对象存储
向量库Milvus Java SDK索引写入、检索逻辑和 Python 版本完全一致
文档解析Java 侧不重写 OCR / 文档解析核心,服务化调用见下
跨语言服务化拆分:SpringBoot 作为业务网关,接收文件、管理上传任务、调度任务队列;文档解析、OCR、Map-Reduce 摘要能力封装为独立 Python HTTP/gRPC 服务,Java 远程调用。

理由:PaddleOCR、Unstructured、LangChain、RAGAS 这类 AI 生态,Java 原生支持弱,不适合在 Java 内部重写解析管线,采用跨语言服务调用是工程最优方案。

5.2.3 分片上传接口设计(SpringBoot)

接口作用
POST /api/file/init文件上传初始化,计算 MD5,校验是否已存在,返回 uploadId(秒传判断)
POST /api/file/chunk上传单个分片,携带 uploadId、分片序号、文件块
GET /api/file/chunk/list查询已上传分片列表,前端断点续传使用
POST /api/file/merge分片全部上传完成,触发合并,创建异步文档解析任务

5.2.4 异步任务管控(和 Django 相同约束:超时、内存、并发、重试、幂等、数据一致性)

机制SpringBoot 实现
任务超时MQ 消息设置 TTL,超时任务写入失败表,人工后台查看
内存占用文件分片落 MinIO,不加载完整文件到 JVM 内存,只处理元数据;解析服务在 Python 侧独立进程,隔离内存风险
并发控制Redisson 分布式锁 + 全局并发数配置,限制同时解析的文档数量
失败重试分级重试,临时性错误(网络抖动)自动重试 3 次;解析失败(文件损坏)标记终止,不再重试
防重复处理(幂等)uploadId 作为全局唯一业务主键,同一 ID 只允许触发一次解析
数据一致性状态机流转(待上传→上传完成→解析中→成功/失败),数据库事务保证状态更新;失败触发补偿日志,原始文件保留可重试

5.2.5 RAG 相关能力(Java 侧职责)

5.2.6 Django vs SpringBoot 对比

对比项Django (Python) 方案SpringBoot (Java) 备选方案
开发速度开发速度快,AI / 文档生态原生支持,原型快速落地慢,AI 组件需要跨服务调用,开发成本更高
并发能力中等,适合本项目日活 200 场景高,适合上万 QPS、高并发上传场景
内存风险Celery worker 控制并发,需管控大文件加载JVM 内存隔离,文件不落内存,稳定性更强
维护成本Python 环境依赖多,部署要管理 conda/docker企业运维成熟,适合传统政企 Java 技术栈对接
适用场景AI 文档解析、RAG、Agent 快速迭代高并发、企业内部 Java 微服务集成场景

5.2.7 简历可直接复用描述

设计双技术栈备选方案,主链路采用 Django 实现分片大文件上传与 Celery 异步文档解析;同时提供 SpringBoot 备选架构,SpringBoot 负责文件网关、任务调度、权限与 RAG 检索服务;文档 OCR 解析、Map-Reduce 层级递归摘要等 AI 能力独立封装为 Python 微服务,Java 通过 HTTP/gRPC 跨语言调用;使用 Redisson 分布式锁保证任务幂等,实现任务超时管控、并发限流、失败重试、状态机保障数据一致性;两套方案共用 MinIO、PostGIS、Milvus 存储层,可根据业务并发规模灵活切换。

5.2.8 面试口述精简版

我设计了两套后端实现方案。主方案 Django,适合快速开发 AI 文档解析、RAG 与 Agent 能力。备选 SpringBoot 方案,适合对接企业 Java 微服务或者高并发场景。SpringBoot 负责分片上传、任务管理、RAG 检索、租户权限;但 OCR、文档解析、Map-Reduce 长文档摘要这些 AI 相关逻辑,不放在 Java 内部开发,单独封装 Python 服务,Java 远程调用。通过 Redisson 分布式锁做幂等,同样实现任务超时、并发控制、失败重试,使用状态机保证数据一致性。两套方案底层存储 MinIO、PostGIS、Milvus 是共用的,可以按需切换。

6. 数据管理方案

存储层选型存放内容
原始文件MinIO 对象存储原始 PDF、Word、DXF、图片、扫描件、分片临时文件;版本、文件ID、租户ID、MD5
结构化元数据PostgreSQL + PostGIS文档信息、版面元素(文本/表格/图片区块/坐标)、GIS 空间字段、表格 JSON、解析任务状态
向量库Milvus文本切片、图注 VLM 摘要向量,供语义检索
任务/缓存Redis任务状态、幂等键、失败重试、限流、进度缓存
倒排索引ElasticsearchBM25 关键词检索,与向量库联合混合检索

6.1 数据流转

原始文件分片上传 → 合并校验 + 幂等键入库 → Redis/Celery 触发异步任务 → Unstructured 调度解析(原生/OCR)→ 结构化结果写 PostGIS,切片向量化写 Milvus → 原始文件存 MinIO → RAG 检索时同时召回文本 + 关联图件 + 空间位置

6.2 多租户隔离

以 tenant_id 做行级隔离,不同客户/租户的文档、图件、分片与任务数据隔离,沿用既有 RBAC 权限体系。

6.3 异构数据源清洗

面向地质勘察报告、钻孔图表、CAD 图纸截图、扫描件等复杂排版异构数据源(图文混排、百万级行列大表格、倾斜/模糊扫描件),传统"全文 OCR + 固定长度切块"会拍平表格结构、切断语义边界,导致 RAG 召回噪声大、行列关系丢失。本节定义按"版面块"为单位的清洗与入库方案。

6.3.1 清洗链路(按块分割 → 分块解析 → 分类入库 → 多索引)

阶段处理内容输出
① 版面检测LayoutLM / PaddleLayout 对页面做视觉语义分块,识别文本块、表格块、图纸/图片块、标题块、注释块、公式块,输出各块 bbox 坐标页面语义块集合
② 分块单独解析文本块直接提取;表格块交给表格识别引擎还原为 Markdown/JSON 二维结构,保留表头与行列关系;图纸块走 OCR 提取图内文字 + VLM 生成图注摘要结构化块 + 图注摘要
③ 分类入库打标签每个块写入统一 schema,携带块类型(text/table/image/drawing)、页码、bbox、文档ID、租户ID、表格行列数等元字段;原始图纸图片落 MinIO,结构化块写 PostGIS带元数据的块记录
④ 多索引构建向量索引(Milvus,语义召回)+ 元数据索引(PostGIS,按块类型/租户/文档过滤)+ 倒排索引(ES,BM25 关键词)三路并行;表格块同时保留整表 JSON 以支持整表召回向量库 + 元数据 + ES 联合索引

6.3.2 检索期配套策略

query → 意图分类 → 块类型路由(限定 table / text / drawing)→ 三路混合召回 → BGE Rerank → LLM 生成 → 溯源到页码 + bbox

6.3.3 与传统方案对比

维度传统全文 OCR + 固定长度切块本方案(按块分割 + 多索引)
表格结构行列被拍平成乱序文本,字段错位还原 Markdown/JSON,行列关系保留,支持整表召回
语义边界标题/正文/表格易被一刀切断按视觉语义块切分,不跨块切断
检索精度所有内容混合召回,噪声高按块类型元数据过滤,降低无关召回
多模态图片仅 OCR 文字,无图像语义图注 VLM 摘要 + 图片向量,支持图文联合召回
计算成本低版面检测 + 表格识别开销更高,需异步队列(Redis/Celery)兜底
开发复杂度低需维护版面模型、多类型块 schema、多索引联动
适用边界:纯文字 Word、简单公文等无复杂排版的文档,沿用原生解析 + 固定切块即可;本方案主要服务于地质勘察报告、钻孔统计表、CAD 截图、扫描图纸等芯禾平台核心异构数据源场景。

7. RAG 检索链路

7.1 检索流程

query → 意图分类 / 知识库路由 → 多路召回(bge-m3 向量 + BM25 + 关键词)→ BGE Rerank 重排 → LLM 生成 → 溯源引用
阶段说明优先级
路由意图分类,按标签路由到对应知识库(设备/巡检/图纸/制度)P1
多路召回bge-m3 向量 + BM25 倒排 + 关键词三路并行召回,取并集P1
重排BGE Rerank 对召回结果精排,取 TopK 送入大模型P1
生成基于召回片段生成答案,附引用来源(文档/页码/bbox)P0
溯源返回引用位置,支持定位原文与图件,抑制幻觉P0
评测RAGAS 三维评测(忠实度/相关性/答案质量)驱动优化P1

8. RAG 索引优化

优化项说明优先级
切片策略按版面区块分块,标题+正文关联,带重叠窗口,避免表格被拆碎P1
元数据增强切片携带页码、坐标、表格结构、图注摘要,支持精确定位与过滤P1
表格索引表格转 Markdown 结构化索引,支持整表召回,不因分块丢失行列关系P1
多路索引向量库(Milvus)+ 倒排(ES)统一 schema,混合检索P1
索引维护增量更新、删除重建、去重、向量索引参数(HNSW)调优P2
Query 优化低相关 query 自动重写,降低无效检索率P1
评测反馈RAGAS 指标驱动 chunk size / overlap / topK 调参P2

9. Map-Reduce 层级递归摘要

9.1 背景

针对超大/超长文档(长报告、图纸集、历史资料),单次送入模型会超出上下文限制,且细节易丢失。采用 Map-Reduce 层级递归摘要,先并行分片摘要,再逐层合并,保证覆盖完整、可溯源。

9.2 实现思路

阶段说明
Map(分片摘要)将文档按版面/章节切片,并行送入大模型生成局部摘要(叶子摘要),保留各切片溯源
Reduce(层级合并)相邻叶子摘要逐层合并生成更高层摘要,递归合并直至根摘要(全文摘要)
层级输出分块摘要 → 章节摘要 → 全文摘要;每层摘要可回溯到原切片位置

9.3 应用场景

10. 应对高并发处理方案:万级日活用户支撑(SpringBoot + Django 双版本对比)

10.1 业务容量前提定义

目标容量:日活 1 万用户。RAG、VLM 多模态图文分析属于重型请求,单次请求包含文档 IO、OCR 解析、向量检索、大模型推理,不能简单按普通 Web 接口估算 QPS。用户访问分散在工作 8 小时,平均 QPS 很低;业务峰值预估并发 QPS 约 50~100。

核心瓶颈不在 Web 应用接口,瓶颈优先级排序:

  1. vLLM LLM/VLM GPU 推理服务
  2. Milvus 向量库检索
  3. 大文件 OCR、文档解析等 CPU 密集任务
  4. 业务数据库读写压力

架构设计核心思路:重型任务异步解耦、分层缓存、服务无状态、独立推理集群、流量熔断限流。两套业务能力完全一致,仅后端技术栈不同,用于不同阶段选型。

10.2 方案 A:SpringBoot 高并发生产方案(推荐用于线上万用户生产环境)

整体架构链路:前端 H5 移动端 / PC 端 → Envoy 网关 → SpringBoot 微服务集群 → Redis 缓存 + 消息队列 → PostgreSQL+PostGIS → MinIO 对象存储 → Milvus 向量库 → vLLM 推理集群
flowchart LR FE["前端 H5 / PC"] --> GW["Envoy 网关
限流·熔断·鉴权·负载均衡"] GW --> SB["SpringBoot 微服务集群
K8s 无状态 · 弹性扩缩容"] SB --> RC["Redis 缓存
会话·热点·断点"] SB --> MQ["消息队列
RocketMQ / RabbitMQ"] MQ --> TK["异步重型任务
解析·OCR·索引·VLM"] SB --> PG[("PostgreSQL + PostGIS
主从 · 读写分离")] TK --> MI["MinIO 对象存储"] TK --> MV[("Milvus 向量库
分布式分片")] SB --> MV GW --> VV["vLLM 推理集群
多卡张量并行"] TK --> VV

接入网关层(Envoy)

应用服务层(SpringBoot)

异步任务层(RocketMQ/RabbitMQ)

存储层

推理服务层(vLLM 集群,独立部署)

SpringBoot 方案优势:Java 生态成熟稳定,线程模型、分布式组件、K8s 云原生、分布式事务、监控告警体系完善;高并发场景下 CPU 密集任务调度稳定性更强,适合企业正式上线、对外客户访问、强 SLA 保障场景。

10.3 方案 B:Django 高并发扩容方案(原型 / 内部业务备选)

整体架构链路:前端 H5 → Nginx 反向代理网关 → Gunicorn+Uvicorn ASGI 异步 Worker → Django 应用集群 → Redis + Celery 消息队列 → PostgreSQL+PostGIS → MinIO → Milvus → vLLM 推理集群
flowchart LR FE["前端 H5"] --> NG["Nginx 反向代理
限流·静态资源·排队"] NG --> DJ["Django 应用集群
Gunicorn + Uvicorn ASGI"] DJ --> RC["Redis 缓存
会话·检索·断点"] DJ --> CL["Celery 任务队列
Redis Broker"] CL --> TK["异步任务
解析·OCR·索引·VLM"] DJ --> PG[("PostgreSQL + PostGIS
读写分离")] TK --> MI["MinIO 对象存储"] TK --> MV[("Milvus 向量库")] CL --> VV["vLLM 推理集群"]

接入层:Nginx 反向代理、静态资源托管、请求限流、连接数控制,做请求排队,拦截超限请求。

Django 应用层

异步任务层:Celery + Redis。文档解析、OCR、长文档摘要、向量入库、VLM 图像分析全部丢入 Celery 异步队列;任务状态持久化,支持失败重试、幂等校验。

存储与推理层:存储、向量库、vLLM 推理集群,和 SpringBoot 方案完全一致。

Django 方案优缺点
✅ 优点:Python 生态对 AI 库友好,PyMuPDF、PaddleOCR、LangGraph、RAGAS 可直接集成,原型迭代速度快,开发成本低。
❌ 短板:受 Python GIL 全局解释器锁限制,单机 CPU 密集计算场景存在性能瓶颈;大规模集群运维成本高于 Java,不适合超高并发、强 SLA 生产场景。
适用场景:内部 Demo、原型验证、中小流量内部知识库场景。

10.4 技术选型决策总结

10.5 面试口述精简版(可直接背诵)

如果平台达到日活 1 万用户,首先要区分峰值并发。RAG+VLM 属于重型请求,瓶颈不在 Web 接口,主要瓶颈是 vLLM 的 GPU 推理、Milvus 向量检索、文档 OCR 解析这类 CPU 重型任务。

生产环境优先采用 SpringBoot 微服务架构: 同时我们也设计了 Django 扩容方案,Django 配合 Celery+Redis,同样可以实现异步任务、缓存、多实例部署。但受 Python GIL 限制,大量 CPU 密集场景下,大规模并发稳定性弱于 Java。所以选型策略:原型阶段 Django 快速验证业务;万用户规模线上生产,切换 SpringBoot 方案保障高并发稳定性。

10.6 面试预判问题 & 应答

预判问题应答思路
Q1:万用户访问,最大瓶颈在哪?瓶颈不在 Web 接口。第一瓶颈是 vLLM 的 GPU 推理;第二是 Milvus 向量检索;第三是大文件 OCR、文档解析这类 CPU 重型任务。所以架构上必须把推理、解析任务和 web 接口解耦,异步化,不能同步阻塞。
Q2:Django 用 Celery 扛并发,最多能扛多少?什么场景下必须换 Java?异步任务模型下,Celery 可以横向增加 worker 节点。但大量 CPU 密集计算场景,GIL 会限制单机算力。当业务大量并发的复杂业务计算、分布式事务、强 SLA 要求,就更适合 Java SpringBoot。如果只是 AI 文档业务,以 IO 等待、GPU 推理为主,Django+Celery 也可以支撑万级日活。
Q3:怎么做限流、防止大文件上传打垮后端?网关层做请求限流,分片上传,文件直传 MinIO,后端不接收完整文件流;任务队列做任务数量限流,超过阈值直接排队或拒绝新任务,防止服务雪崩。

11. A2A 机器人集群跨地域协作协议方案(MCP vs A2A vs gRPC vs MQ)

11.1 背景与定位

Agent 间通信的两个层次:MCP 解决「Agent 怎么用工具」,A2A 解决「Agent 与 Agent 怎么协作」。 MCP(Model Context Protocol)标准化 Agent↔工具(检索、数据库、文档解析服务)的调用;A2A(Agent2Agent)是 Google 牵头、50+ 企业共同制定的开放协议,解决 Agent↔Agent 之间的能力发现、协商、任务委派与协作。二者互补:MCP 把工具接入 Agent,A2A 让多个 Agent(各管理一个机器人或集群)互联成协作网络。

11.2 A2A 协议核心机制

机制说明
Agent Card 能力注册每个 Agent 在 /.well-known/agent-card.json 声明身份、能力 skills、endpoint、认证方式;新机器人部署即注册即被发现
Task 任务生命周期submitted→working→input-required→completed/failed/canceled;派发即返回 task id,后台执行、状态可查
异步长任务委派后立即返回,后台执行;用轮询 / SSE 流式 / push 推送取状态,容忍高延迟
增量产物回流长任务过程中可返回进度、图片/视频等 artifact,适合巡检证据回传
协商与人工介入任务可停在 input-required / auth-required,支持人机协同(异常巡检需人工确认)
企业级安全内置 OAuth2 / Bearer / apiKey 认证,多租户可用
异构互操作JSON-RPC 2.0 over HTTP(S),任意语言实现即可互联

11.3 为什么适合机器人集群协调

11.4 为什么适合全球分布式部署

11.5 协议选型对比:MCP vs A2A vs gRPC vs MQ

对比维度MCPA2A(本项目采用)gRPC消息队列(Kafka/MQ)
定位Agent ↔ 工具调用标准化Agent ↔ Agent 协作标准化通用高性能 RPC异步消息解耦
通信方式JSON-RPC over HTTP/SSEJSON-RPC 2.0 over HTTP(S)HTTP/2 二进制 Protobuf发布订阅 / 队列
长任务 / 异步以同步调用为主Task 生命周期,原生异步长任务需自行实现流式/异步异步原生,无任务语义
跨公网分布式可跨网络,但面向本地工具标准 HTTP,天然跨公网需统一网络栈/服务发现,跨组织难需共享 broker 集群,跨地域部署重
能力发现按 MCP 服务声明工具Agent Card 能力注册依赖注册中心无内建发现
依赖 / 运维轻量轻量,任意语言实现契约文件 + 代码生成broker 集群高可用运维成本高
适用场景让 Agent 调用数据库/解析等工具多机器人集群跨地域协调、任务委派内部微服务高性能调用事件流、削峰填谷
MCP vs A2A vs gRPC vs MQ 协议选型对比表
图 11-1 协议选型对比表(MCP vs A2A vs gRPC vs MQ)

选型结论:MCP 解决 Agent↔工具,不解决 Agent↔Agent;gRPC 高效但要求统一网络栈/服务发现,跨组织跨公网难;消息队列需共享 broker 集群,跨地域部署重且有单点风险。A2A 作为开放对等、异步长任务、跨公网的协议,最贴合分布式自治机器人集群。本项目采用 A2A 作为 Agent 间通信标准,MCP 仍用于接入文档解析、向量库等工具。

11.6 落地到 XinheBot 机器人集群(Graineye)

粮仓/园区节点分布多地 → 每个节点跑一个「本地调度 Agent」,通过 Agent Card 向中央协调 Agent 注册在线能力(哪些 UAV、哪些巡检机器人);中央只做全局编排,用 tasks/send 委派巡检任务,本地 Agent 用 LangGraph 编排机器人执行;UAV 长航时任务走 Task 生命周期,断网时本地缓存、恢复后推送回执;VLM 图片分析产物作为 artifact 回流。执行与容错下沉到各地,中央只做编排。

11.7 面试口述精简版

机器人集群跨地域协调,我采用 A2A 开放协议作为 Agent 间通信标准。核心三点:一是 Task 异步长任务模型,巡检/巡逻这种分钟级任务派发后立即返回、后台执行,用轮询/SSE/推送取状态,容忍跨地域高延迟;二是 Agent Card 能力注册,新机器人部署即被发现,无需硬编码;三是标准 HTTP + 无中心自治,各区域集群本地自治,断网不影响其他区域,天然支持全球分布式。对比下来,MCP 管 Agent↔工具、gRPC 要统一网络栈、消息队列要共享 broker,A2A 最贴合 Agent↔Agent 的分布式自治集群。

12. 非功能需求

13. 优先级与里程碑

阶段内容说明
阶段一大文件分片上传 + 原生 PDF/Office/CSV 解析 + 结构化入库 + 异步机制打通上传-解析-入库主链路
阶段二扫描件/图片 OCR(PaddleOCR 主力)+ 版面检测 + DeepSeek-OCR 兜底覆盖扫描件与图纸截图
阶段三CAD 矢量 ezdxf + 图文联合 + 坐标映射形成完整图文与空间联动能力
阶段四RAG 检索链路 + 索引优化 + Map-Reduce 层级摘要服务问答与长文档理解

14. 验收标准

14.1 原生文档

14.2 扫描件与图片

14.3 CAD 与图文联合

14.4 大文件上传与异步处理

14.5 检索、索引与摘要

14.6 Django(Python)主版本技术路线验收

14.7 SpringBoot(Java)备选技术路线验收

15. 风险与应对

风险影响应对
低质量/倾斜扫描件识别差识别错误率高图像预处理矫正增强 + 规则/LLM 校验纠错
复杂表格错位表格还原失真表格整表结构化,不拆碎;复杂表格走 DeepSeek-OCR
OCR 与 CAD 概念混淆矢量图纸解析失败矢量走 ezdxf,截图才走 OCR,明确双链路
分片丢失/不完整合并失败、文件损坏分片序号校验 + 合并前完整性检查 + 断点补传
大批量解析 OOM / 超时阻塞主流程分块流式 + 并发限流 + 超时拆子任务 + 失败重试
重复上传/重复解析数据冗余、算力浪费MD5 秒传 + 幂等键去重,Redis 校验
PostGIS 与 Milvus 不一致检索结果与元数据不匹配状态机 + 事务/补偿,成功后才对外可见
长文档摘要上下文超限摘要截断、信息丢失Map-Reduce 层级递归摘要 + 溯源
多租户数据泄漏合规风险tenant_id 行级隔离,沿用 RBAC
跨语言调用网络开销服务间调用延迟升高、链路抖动增加熔断、降级机制,控制服务间调用稳定性
服务间版本与接口契约维护接口变更导致联调成本上升维护 OpenAPI 契约,统一版本管理与变更评审
双栈日志链路排查复杂问题定位成本高统一 traceId 贯穿 Java 与 Python 日志链路,集中日志平台

16. 附录:简历项目描述建议

开发多类型复杂文档解析流水线,支持 PDF、Word、Excel、CSV、图片、扫描件解析;基于 Unstructured 统一调度解析引擎,原生文档提取文本、表格与版面坐标;扫描件与图片采用 PaddleOCR 批量识别,复杂图文使用 DeepSeek-OCR 增强版面理解;基于 Django 实现大文件分片上传、秒传、断点续传与异步合并;通过 Celery+Redis 实现解析任务的超时控制、内存管控、并发限流、失败重试、幂等去重与数据一致性;经 ezdxf 解析 DXF 矢量 CAD 图纸,实现图文联合与空间联动;打通 RAG 混合检索、索引优化与 Map-Reduce 层级递归摘要链路;解析结果结构化存入 PostgreSQL(+PostGIS),原始文件存入 MinIO,切片送入 Milvus 向量库,支撑 RAG 知识库问答与长文档理解。