Files
AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/06-技术文档/工具3开发计划深度审查与排雷指南.md
HaHafeng dc6b292308 docs(asl): Complete Tool 3 extraction workbench V2.0 development plan (v1.5)
ASL Tool 3 Development Plan:
- Architecture blueprint v1.5 (6 rounds of architecture review, 13 red lines)
- M1/M2/M3 sprint checklists (Skeleton Pipeline / HITL Workbench / Dynamic Template Engine)
- Code patterns cookbook (9 chapters: Fan-out, Prompt engineering, ACL, SSE dual-track, etc.)
- Key patterns: Fan-out with Last Child Wins, Optimistic Locking, teamConcurrency throttling
- PKB ACL integration (anti-corruption layer), MinerU Cache-Aside, NOTIFY/LISTEN cross-pod SSE
- Data consistency snapshot for long-running extraction tasks

Platform capability:
- Add distributed Fan-out task pattern development guide (7 patterns + 10 anti-patterns)
- Add system-level async architecture risk analysis blueprint
- Add PDF table extraction engine design and usage guide (MinerU integration)
- Add table extraction source code (TableExtractionManager + MinerU engine)

Documentation updates:
- Update ASL module status with Tool 3 V2.0 plan readiness
- Update system status document (v6.2) with latest milestones
- Add V2.0 product requirements, prototypes, and data dictionary specs
- Add architecture review documents (4 rounds of review feedback)
- Add test PDF files for extraction validation

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-23 22:49:16 +08:00

94 lines
6.5 KiB
Markdown
Raw Permalink 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.
# **🔍 深度架构审查与排雷指南:工具 3 全文智能提取 V1.2**
**审查人:** 资深架构师 & 资深研发工程师
**审查对象:** 《工具 3全文智能提取工作台 V2.0 开发计划 (v1.2 融合PKB版)》
**审查结论:** 战略方向(对接 PKB极佳但在**领域驱动边界DDD**、**大模型上下文污染**、**队列扇出模式Fan-out及鉴权生命周期**上存在高危漏洞,需立即修正。
## **🚨 致命隐患一:跨 Schema 直接查询打破了微服务边界**
### **❌ 计划中的问题 (Task 3.3b & 7.4)**
计划中提到PkbBridgeService 直接通过 Prisma Client 查询 pkb\_schema.PkbDocument。
**架构灾难预警:** 这是一个典型的“大泥球Big Ball of Mud”反模式。虽然现在 PKB 和 ASL 在同一个 PostgreSQL 实例里,但它们分属不同的 Schema。如果直接在 ASL 的代码里写 prisma.pkbDocument.findFirst(),两个模块的底层数据结构将被**强行物理耦合**。未来一旦 PKB 模块修改了表结构或者做微服务拆分ASL 将瞬间崩溃。
### **✅ 架构师修正方案:建立“防腐层 (ACL)”**
绝不允许跨业务域直接读写数据库!必须通过 **Service 内部方法调用(进程内调用)****依赖注入** 来实现。
1. 在 PKB 模块暴露一个内部只读服务接口,例如 PkbExportService.ts。
2. ASL 的 PkbBridgeService 只能调用 PkbExportService.getDocumentsForAsl() 来获取所需的数据storageKey, extractedText
3. **收益:** 这样 ASL 拿到的是 DTO数据传输对象而不是 Prisma 的底层 Model 实例,彻底解耦。
## **🚨 致命隐患二:双解析引擎导致的“大模型上下文污染”**
### **❌ 计划中的问题 (Task 2.2)**
计划中设计的流水线是:输入 A (PKB 的 pymupdf4llm 纯文本) \+ 输入 B (MinerU 提取的高保真 HTML 表格),然后一起丢给 DeepSeek-V3 提取数据。
**算法灾难预警:** PKB 里的 extractedText由 pymupdf 提取)中,其实**已经包含了一份“排版完全错乱的垃圾表格文本”**。如果你把这段错乱的文本,连同 MinerU 完美的 HTML 表格一起喂给 LLM大模型的注意力机制会被严重干扰。它很可能会在两份冲突的数据中产生“幻觉”导致提取出的数值张冠李戴。
### **✅ 研发修正方案:在 Prompt 中建立“强制隔离区”**
必须在 DynamicPromptBuilder 组装 User Prompt 时,对 LLM 下达极其严厉的隔离指令:
\# 待处理文献素材
\<FULL\_TEXT\>
{PKB\_Extracted\_Text}
\</FULL\_TEXT\>
\<HIGH\_FIDELITY\_TABLES\>
{MinerU\_HTML\_Tables}
\</HIGH\_FIDELITY\_TABLES\>
\# 特别警告 (CRITICAL WARNING)
\<FULL\_TEXT\> 区域中的表格数据可能因解析原因存在行列错位。
\*\*当您提取任何基线特征、人数、结局指标等表格数据时,必须【绝对优先】且【仅】参考 \<HIGH\_FIDELITY\_TABLES\> 区域的内容!\*\* 只有当高保真表格中找不到数据时,才允许在正文文本中寻找。
## **🚨 致命隐患三pg-boss 批处理的任务粒度过粗**
### **❌ 计划中的问题 (Task 2.3)**
计划中 extractBatch(jobId) 负责处理一次性勾选的 100 篇文献,并在内部使用了 P-Queue 控制并发。
**容错灾难预警:** 如果这 100 篇文献作为一个单一的 pg-boss Job当提取到第 99 篇时Node.js 容器因为内存溢出OOM重启了或者服务器断电。pg-boss 会判定整个 Job 失败并**从第 1 篇开始重试**!这将导致极其严重的时间浪费和 API Token 烧毁。
### **✅ 架构师修正方案:采用“扇出模式 (Fan-out Workflow)”**
后台任务的粒度必须细化到\*\*“单篇文献”\*\*。
1. **父任务 (Manager Job)** 用户点击开始,创建一个父任务。父任务扫描这 100 篇文献,向 pg-boss 队列派发 **100 个子任务 (Child Jobs)**,然后父任务结束。
2. **子任务 (Worker Job)** 专门处理 extractOne(literatureId)。如果第 99 篇失败了pg-boss 只会重试第 99 篇的子任务,前面 98 篇的成果绝对安全。
3. **SSE 进度追踪:** SSE 监听器不再监听单一的 Job而是监听 AslExtractionTask 表中 successCount \+ failedCount 的变化。
## **🚨 致命隐患四:前端 PDF 签名 URL (Signed URL) 过期问题**
### **❌ 计划中的问题 (Task 5.3)**
计划写道:“遵循 OSS 规范使用签名 URL1 小时过期。在左侧 iframe 中预览 PDF”。
**体验灾难预警:** 工具 3 是一个重度“人机协同 (HITL)”工作台。医生复核 50 篇文献可能需要好几天,他们经常会让浏览器 Tab 挂在后台。如果用户吃个午饭回来(超过 1 小时),继续点击下一篇文献或查看当前 PDF 时,左侧的 iframe 会直接抛出 403 Forbidden签名已过期严重打断心流。
### **✅ 研发修正方案:动态获取与刷新策略**
绝对不能在 Step 1 列表接口里就把 URL 签好发给前端。
1. **懒加载签名 (Lazy Signing)** 只有当医生点击“复核提单”,抽屉打开、需要渲染左侧 PDF 时,前端才发起一个轻量级请求 GET /api/v1/asl/extraction/results/:id/pdf-url实时获取只有 10 分钟有效期的专属 URL 赋给 iframe。
2. **前端拦截:** 如果 iframe 加载失败或返回 403前端组件自动捕获并静默重新请求上述接口刷新 URL对用户完全透明。
## **💡 额外架构加分项 (Nice-to-Haves)**
除了排雷,为了让 V2.0 真正达到企业级水准,建议加入以下设计:
1. **SSE 初次连接状态同步 (Hydration on Connect)**
当用户刷新页面重建 SSE 连接时,后端必须在建立连接的第一时间(握手阶段),下发一个包含当前完整进度和最后 50 条日志的 sync 事件。否则用户只能干等下一个增量日志触发,页面会有一段时间是“空白”的。
2. **零成本标优 (Cost Saving Tag)**
既然因为复用 PKB 省去了大量 pymupdf4llm 的算力成本和时间,建议在终端日志 (Terminal) 里高亮打印:
\[System\] Fast-path engaged: Reused full-text Markdown from PKB. Saved \~12s.
这不仅能让用户感知到系统的高效,也能在展示产品时凸显技术优势。
### **📋 总结**
计划在合并了 PKB 之后整体非常精彩,极大精简了业务流。请团队重点调整 **Prisma 跨模块调用的解耦方式****pg-boss 的子任务分发机制**,确保底层基座稳固后,再进入 Sprint 1 的开发。