feat(rvw): Implement RVW V2.0 Data Forensics Module - Day 6 StatValidator
Summary: - Implement L2 Statistical Validator (CI-P consistency, T-test reverse) - Implement L2.5 Consistency Forensics (SE Triangle, SD>Mean check) - Add error/warning severity classification with tolerance thresholds - Support 5+ CI formats parsing (parentheses, brackets, 95% CI prefix) - Complete Python forensics service (types, config, validator, extractor) V2.0 Development Progress (Week 2 Day 6): - Day 1-5: Python service setup, Word table extraction, L1 arithmetic validator - Day 6: L2 StatValidator + L2.5 consistency forensics (promoted from V2.1) Test Results: - Unit tests: 4/4 passed (CI-P, SE Triangle, SD>Mean, T-test) - Real document tests: 5/5 successful, 2 reasonable WARNINGs Status: Day 6 completed, ready for Day 7 (Skills Framework) Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
189
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/RVW V2.0 MVP 产品需求文档 (PRD).md
Normal file
189
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/RVW V2.0 MVP 产品需求文档 (PRD).md
Normal file
@@ -0,0 +1,189 @@
|
||||
# **RVW V2.0 MVP 产品需求文档 (PRD)**
|
||||
|
||||
**项目名称:** RVW 智能审稿系统 V2.0 (Intelligent Review Engine)
|
||||
|
||||
**核心战役:** "数据侦探" (Data Forensics) \+ "柔性架构" (Skills Architecture)
|
||||
|
||||
**文档版本:** v1.0 (Draft)
|
||||
|
||||
**优先级:** P0
|
||||
|
||||
**面向对象:** 产品经理、后端工程师、Python 工程师、前端工程师
|
||||
|
||||
## **1\. 项目背景与目标 (Background & Goals)**
|
||||
|
||||
### **1.1 背景**
|
||||
|
||||
当前的 RVW 模块(v3.2)是一个基于 LLM 的“文档阅读器”,能较好地完成稿约规范性和方法学评估。然而,在面对**中文核心期刊**(对政治安全和数据造假的零容忍)和**高水平英文期刊**(对学术深度的要求)时,系统存在以下痛点:
|
||||
|
||||
1. **数据验证能力缺失**:无法识别表格中的数据造假(如 P 值捏造、合计错误)。
|
||||
2. **架构僵化**:无法针对不同期刊配置不同的审稿流程(如 A 期刊查政治,B 期刊查数据)。
|
||||
3. **PDF 解析瓶颈**:复杂表格在 PDF 中识别率低,导致计算不可行。
|
||||
|
||||
### **1.2 核心目标**
|
||||
|
||||
本期项目采用 **“垂直切片 (Vertical Slice)”** 策略,不追求大而全,而是集中兵力攻克核心技术壁垒。
|
||||
|
||||
1. **业务目标**:实现对 **Word 稿件** 中表格数据的\*\*“审计级”验证\*\*,包括算术自洽性和基础统计复核。
|
||||
2. **架构目标**:落地 **Skills (技能)** 架构,将审稿能力原子化,为未来扩展(如政治审查、竞品对标)奠定底座。
|
||||
3. **交付物**:一个能自动提取 Word 表格、计算数据错误、并在前端高亮显示的 MVP 版本。
|
||||
|
||||
## **2\. 用户画像与场景 (User Stories)**
|
||||
|
||||
| 用户角色 | 典型场景 | 期望结果 |
|
||||
| :---- | :---- | :---- |
|
||||
| **期刊初审编辑** | 收到一篇包含 5 个表格的 Word 稿件,怀疑作者捏造了 P 值。 | 上传稿件后,系统自动高亮 Table 1 中的 3 处算术错误,并提示 Table 2 的 P 值与数据不符(计算值 0.04 vs 报告值 0.8)。 |
|
||||
| **系统管理员** | 需要为医学类期刊配置“强制数据检查”,为社科类期刊配置“仅文本检查”。 | 能够在后台通过 Profile 配置文件,灵活组合不同的 Skill(技能)。 |
|
||||
| **开发人员** | 需要快速新增一个“图片查重”功能。 | 能够开发一个新的 Skill 并注册到系统,无需修改核心审稿逻辑代码。 |
|
||||
|
||||
## **3\. MVP 范围定义 (Scope)**
|
||||
|
||||
为了确保 3 周内上线,我们严格划定 MVP 边界:
|
||||
|
||||
| 维度 | ✅ MVP 包含 (In Scope) | ❌ MVP 不包含 (Out of Scope) |
|
||||
| :---- | :---- | :---- |
|
||||
| **文件格式** | **Word (.docx, .doc)** 优先 | PDF, 图片扫描件 |
|
||||
| **表格类型** | **三线表** (Standard Tables) | 跨页断裂表、极其复杂的嵌套表 |
|
||||
| **验证深度** | **L1 (算术)** \+ **L2 (基础 P 值)** | L3 (回归逻辑), L4 (跨表一致性) |
|
||||
| **Skill 数量** | **DataForensicsSkill** (数据侦探) | 政治审查、竞品对标、方法学检查 |
|
||||
| **架构改造** | **Skill Interface**, **Profile Config** | 动态 Profile 管理 UI, 计费系统 |
|
||||
| **前端交互** | **静态报告** (新增数据验证 Tab) | 交互式 Chat, 在线修改表格 |
|
||||
|
||||
## **4\. 详细功能需求 (Functional Requirements)**
|
||||
|
||||
### **4.1 核心功能:数据侦探 (Data Forensics)**
|
||||
|
||||
#### **FR-1: Word 表格精准提取**
|
||||
|
||||
* **输入**:Word 文档流。
|
||||
* **逻辑**:
|
||||
* 识别文档中的所有表格对象。
|
||||
* **关键:合并单元格处理**。对于 Merge Cells,必须采用 **Forward Fill (向前填充)** 策略。
|
||||
* *Case*: 表头 "Group A" 跨了两列,提取后的 DataFrame 这两列的表头都应为 "Group A"。
|
||||
* **关联 Caption**:自动向前回溯,提取表格上方的 "Table X. xxxx" 作为表格标题。
|
||||
* **输出**:结构化的 JSON 数据(包含每个单元格的值、坐标)。
|
||||
|
||||
#### **FR-2: L1 算术自洽性验证**
|
||||
|
||||
* **逻辑**:Python 后端对提取的 DataFrame 进行计算。
|
||||
* **Sum Check**:识别 "Total" 列,验证是否等于其他列之和。
|
||||
* **Percentage Check**:识别 n (%) 格式,验证 n/N 是否等于 %。
|
||||
* **容错**:允许 ±0.1% 的舍入误差。
|
||||
|
||||
#### **FR-3: L2 统计学复核**
|
||||
|
||||
* **逻辑**:针对 T 检验和卡方检验的逆向验证。
|
||||
* **识别**:从表头或单元格中提取 Mean ± SD 或 n (%)。
|
||||
* **计算**:调用 scipy.stats 计算 P 值。
|
||||
* **比对**:将计算出的 P 值与表中报告的 P 值比对。
|
||||
* **阈值**:差异 \> 0.05 视为重大错误(Error),0.01-0.05 视为警告(Warning)。
|
||||
|
||||
### **4.2 架构功能:Skills 引擎**
|
||||
|
||||
#### **FR-4: Skill 接口标准**
|
||||
|
||||
* 系统必须定义统一的 Skill 接口:
|
||||
interface Skill {
|
||||
id: string;
|
||||
run(context: DocumentContext, config: any): Promise\<SkillResult\>;
|
||||
}
|
||||
|
||||
#### **FR-5: Profile 配置驱动**
|
||||
|
||||
* 审稿流程不再硬编码。
|
||||
* 系统读取 journal\_profile.json,其中定义了 skills: \["DataForensicsSkill"\]。
|
||||
* Worker 根据配置依次调度 Skill。
|
||||
|
||||
## **5\. 技术架构与实现 (Technical Architecture)**
|
||||
|
||||
### **5.1 数据流图 (Data Flow)**
|
||||
|
||||
graph LR
|
||||
Word\[Word稿件\] \--\> Python\[Python Microservice\]
|
||||
Python \--"1.提取表格\\n2.Pandas计算"--\> Result\[JSON验证结果\]
|
||||
Result \--\> Node\[Node.js Backend\]
|
||||
Node \--"封装为"--\> Skill\[DataForensicsSkill\]
|
||||
Skill \--\> DB\[Postgres (rvw\_schema)\]
|
||||
DB \--\> UI\[前端报告页\]
|
||||
|
||||
### **5.2 Python 服务升级 (python-extraction)**
|
||||
|
||||
* **新增库**:python-docx, pandas, scipy, libreoffice (Docker内)。
|
||||
* **新增接口**:POST /api/v1/forensics/analyze\_docx。
|
||||
* **核心类**:
|
||||
* DocxTableExtractor: 负责 DOM 解析和清洗。
|
||||
* StatValidator: 负责数学计算。
|
||||
|
||||
### **5.3 Node.js 后端升级**
|
||||
|
||||
* **目录结构**:
|
||||
* modules/rvw/skills/core/: 存放基础接口 (Skill, SkillRegistry)。
|
||||
* modules/rvw/skills/library/: 存放具体实现 (DataForensicsSkill)。
|
||||
* **数据库变更**:
|
||||
* ReviewTask 表增加 contextData (Json) 字段,用于存储 Skill 的输出。
|
||||
|
||||
### **5.4 前端升级 (frontend-v2)**
|
||||
|
||||
* **TaskDetail**:新增一个 Tab "数据验证 (Data Forensics)"。
|
||||
* **展示组件**:
|
||||
* 左侧:渲染还原后的 HTML 表格。
|
||||
* 右侧:错误列表(点击错误项,表格中对应单元格高亮变红)。
|
||||
|
||||
## **6\. 实施路线图 (Roadmap)**
|
||||
|
||||
我们采用 **3 周冲刺** 计划。
|
||||
|
||||
### **Week 1: 攻克算力 (Python & Word)**
|
||||
|
||||
* **目标**:Python API 能跑通,准确提取 Word 表格并算出错误。
|
||||
* **关键任务**:
|
||||
1. 集成 LibreOffice 实现 doc 转 docx。
|
||||
2. 编写 DocxTableExtractor (重点解决合并单元格)。
|
||||
3. 编写 StatValidator。
|
||||
|
||||
### **Week 2: 架构封装 (Node.js)**
|
||||
|
||||
* **目标**:后端代码 Skills 化,不再写死逻辑。
|
||||
* **关键任务**:
|
||||
1. 定义 TypeScript Skill 接口。
|
||||
2. 实现 DataForensicsSkill (调用 Python)。
|
||||
3. 改造 ReviewService 使用 Profile 配置。
|
||||
|
||||
### **Week 3: 前端与交付**
|
||||
|
||||
* **目标**:用户可见。
|
||||
* **关键任务**:
|
||||
1. 开发数据验证报告 UI。
|
||||
2. 全链路联调测试。
|
||||
3. 部署上线。
|
||||
|
||||
## **7\. 验收标准 (Acceptance Criteria)**
|
||||
|
||||
1. **准确性**:上传一份标准的临床三线表 Word 文档,表格数据提取准确率需达到 **99%**(无错行错列)。
|
||||
2. **验证能力**:
|
||||
* 能检出明显的 Sum 错误(如 50+50=90)。
|
||||
* 能检出明显的 P 值错误(如两组数据差异巨大但 P=0.8)。
|
||||
3. **稳定性**:处理 100 页的 Word 文档不超时(或有合理的异步处理机制)。
|
||||
4. **架构规范**:后端代码中不存在硬编码的审稿逻辑,必须通过 Skill 模式调用。
|
||||
|
||||
## **8\. 附录:数据结构示例**
|
||||
|
||||
**Python 返回的 JSON 格式:**
|
||||
|
||||
{
|
||||
"tables": \[
|
||||
{
|
||||
"id": "tbl\_0",
|
||||
"caption": "Table 1\. Baseline Characteristics",
|
||||
"issues": \[
|
||||
{
|
||||
"severity": "ERROR",
|
||||
"cell\_ref": "R3C4",
|
||||
"message": "Calculated P-value (0.03) differs from reported (0.85)",
|
||||
"evidence": { "calc": 0.03, "report": 0.85 }
|
||||
}
|
||||
\],
|
||||
"data": \[ ...二维数组... \]
|
||||
}
|
||||
\]
|
||||
}
|
||||
125
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/RVW V2.0 开发计划深度审查报告.md
Normal file
125
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/RVW V2.0 开发计划深度审查报告.md
Normal file
@@ -0,0 +1,125 @@
|
||||
# **RVW V2.0 开发计划深度审查报告**
|
||||
|
||||
**审查对象:** RVW V2.0 产品升级开发计划 (v1.0)
|
||||
|
||||
**审查日期:** 2026-02-17
|
||||
|
||||
**审查结论:** ✅ **总体通过 (Approved with Recommendations)**
|
||||
|
||||
**核心评价:** 战略转型精准,MVP 边界清晰,但部分工程细节需补全。
|
||||
|
||||
## **1\. 🟢 值得肯定的亮点 (Strengths)**
|
||||
|
||||
这份计划展现了非常成熟的产品思维和架构能力,以下几点是成功的关键:
|
||||
|
||||
### **1.1 战略级的“降维打击” (Word-First Strategy)**
|
||||
|
||||
* **评价**:这是本计划最明智的决策。放弃死磕 PDF 表格识别(业界公认难题),转而利用投稿环节必然存在的 Word 源文件。
|
||||
* **价值**:这一转变直接将数据提取的准确率上限从 \~70% 提升到了 \~99%,使得“数据审计”在技术上成为了可能。这是典型的“用产品策略解决技术难题”。
|
||||
|
||||
### **1.2 极其克制的 MVP 边界 (Scope Management)**
|
||||
|
||||
* **评价**:明确**不包含** PDF、图片、复杂嵌套表、高级回归验证。
|
||||
* **价值**:3-4 周的周期非常短,只有通过这种“垂直切片 (Vertical Slice)”的方式——只做 Word、只做三线表、只做基础统计——才能确保按时交付一个可用的、高质量的“核弹头”功能,避免陷入泥潭。
|
||||
|
||||
### **1.3 架构的前瞻性 (Skills Architecture)**
|
||||
|
||||
* **评价**:引入 SkillRegistry 和 Profile 配置。
|
||||
* **价值**:这解决了“不同期刊需求打架”的根本矛盾。虽然 MVP 阶段只是硬编码配置,但这套代码结构一旦确立,未来通过数据库动态加载配置(V2.1)将零成本过渡。
|
||||
|
||||
### **1.4 数据验证逻辑的严谨性 (Data Forensics)**
|
||||
|
||||
* **评价**:L1 (算术) 和 L2 (统计) 的逻辑设计非常扎实,特别是“CI 与 P 值一致性检查”,这是抓造假的“黄金法则”,且不需要原始数据,落地性极强。
|
||||
|
||||
## **2\. 🟡 存在的欠缺与风险 (Gaps & Risks)**
|
||||
|
||||
尽管大方向正确,但在落地的工程细节上,还有以下盲点需要注意:
|
||||
|
||||
### **2.1 异步通信机制未明确 (Communication Protocol)**
|
||||
|
||||
* **问题**:计划中提到 Node.js 调用 Python Service,但未明确是**同步 HTTP** 还是**异步队列**。
|
||||
* **风险**:
|
||||
* 如果是同步 HTTP:Word 文档解析 \+ Pandas 计算可能耗时较长(特别是大文档)。如果 LibreOffice 转换卡顿,HTTP 请求容易超时 (Timeout)。
|
||||
* **建议**:明确规定 Node.js 与 Python 之间通过 HTTP 通信时必须设置较长的超时时间(如 60s),或者对于大文件(\>10MB)走异步回调模式。考虑到 MVP 简单性,**建议 MVP 走 HTTP,但要在 Python 端做严格的 Time Limit**。
|
||||
|
||||
### **2.2 Word 转 HTML 的渲染一致性 (Rendering Consistency)**
|
||||
|
||||
* **问题**:计划提到前端要渲染“还原后的 HTML 表格”并高亮错误。关于“是否必须转 HTML”及“目的为何”存在技术决策点。
|
||||
* **深度解析**:
|
||||
* **必须性**:对于“数据侦探”功能,生成 HTML 是**必须的**。
|
||||
* **目的**:
|
||||
1. **可视化**:浏览器无法直接渲染 .docx。
|
||||
2. **精准定位(核心)**:前端需根据后端计算出的坐标(如 R3C4)进行高亮。若前端渲染逻辑(如 mammoth.js)与后端提取逻辑(python-docx)对合并单元格或空行的处理不一致,会导致**高亮错位**(后端指第3行,前端亮第4行)。
|
||||
* **风险**:前后端独立解析 Word 导致 DOM 结构与 DataFrame 结构不匹配,造成“所见非所算”。
|
||||
* **建议**:采用 **“后端重绘”** 策略。
|
||||
* Python 接口返回的 JSON 中,**必须包含一份专门用于前端渲染的 HTML 片段**(只保留结构,不还原复杂样式)。
|
||||
* 或者前端完全基于后端返回的结构化 JSON 数据(Data Grid)**重绘表格**。
|
||||
* **原则**:确保 前端 DOM 结构 \=== 后端计算数据结构,从而实现 100% 精准的高亮交互。
|
||||
|
||||
### **2.3 LibreOffice 的容器化挑战 (Docker Complexity)**
|
||||
|
||||
* **问题**:在 Docker/SAE 环境中运行 LibreOffice (Headless) 是个深坑。
|
||||
* **风险**:
|
||||
* **环境配置复杂**:LibreOffice 需要大量的 Linux 依赖库 (libgl, libX11 等),导致 Docker 镜像体积激增(可能增加 500MB+)。
|
||||
* **中文字体缺失**:如果基础镜像未正确配置中文字体,转换后的文档会出现乱码。
|
||||
* **启动慢**:冷启动转换服务可能需要几秒钟,影响接口响应速度。
|
||||
* **建议**:**战略性放弃 LibreOffice**。
|
||||
* **MVP 阶段策略**:**完全移除 LibreOffice**。后端直接限制上传格式为 .docx(Open XML)。如果用户上传 .doc,前端拦截并提示“请另存为 .docx 格式上传”。不要为了 5% 的 .doc 用户,去冒 50% 的工程延期风险。
|
||||
* **后续替代方案**:如果未来必须支持 .doc,建议使用 **Pandoc**。它比 LibreOffice 轻量得多,且不需要 GUI 依赖,非常适合云原生环境。
|
||||
|
||||
### **2.4 错误处理的用户体验 (Error UX)**
|
||||
|
||||
* **问题**:如果 Word 文档格式非常烂(比如用空格对齐表格,而不是真的表格对象),python-docx 会提取失败或提取出空表。
|
||||
* **风险**:用户上传了文档,系统直接报错 500,或者提示“无表格”,用户会很挫败。
|
||||
* **建议**:定义明确的 **Fallback 机制**。如果提取失败,前端应提示:“无法识别标准表格,请检查文档格式是否为标准 Word 表格”,并允许用户降级运行(只跑规范性检查,不跑数据验证)。
|
||||
|
||||
## **3\. 🔴 技术路线修正建议 (Technical Recommendations)**
|
||||
|
||||
基于上述风险,建议对 Week 1 和 Week 2 的技术细节做如下微调:
|
||||
|
||||
### **3.1 Python 提取器的“双模”设计**
|
||||
|
||||
不要只依赖 python-docx。虽然它是核心,但有些 .doc 转 .docx 后 XML 结构会乱。
|
||||
|
||||
* **建议**:保留 pdfplumber 逻辑作为**备胎**。如果 Word 解析失败,尝试将 Word 转 PDF 后再提取表格(虽然 MVP 排除 PDF 上传,但后端可以利用 PDF 中间态来容错)。**(MVP 阶段可选,若工期紧可不做)**
|
||||
|
||||
### **3.2 明确“定位”策略**
|
||||
|
||||
在 FR-6.4(点击错误高亮单元格)中,后端如何告诉前端是哪个格子?
|
||||
|
||||
* **建议**:采用 **R1C1 坐标系**。
|
||||
* Python 返回:issue\_location: { table\_index: 0, row: 2, col: 3 }
|
||||
* 前端:根据该坐标在重绘的表格中添加 CSS class。不要试图用 XPath 或 DOM ID,因为 Word 转出来的 HTML 结构不可控。
|
||||
|
||||
### **3.3 Skill 执行的超时熔断**
|
||||
|
||||
在 FR-5.3(单个 Skill 失败不影响其他)基础上,增加**熔断机制**。
|
||||
|
||||
* **建议**:SkillExecutor 在执行 DataForensicsSkill 时,如果 30 秒无响应,强制 Kill 并标记该 Skill 为 Timeout,继续执行 EditorialSkill。不能因为一个表格算太久卡死整个审稿报告。
|
||||
|
||||
### **3.4 格式兼容策略调整 (Format Compatibility Pivot)**
|
||||
|
||||
针对 Week 1 的环境搭建,做以下明确调整:
|
||||
|
||||
* **决策**:**Week 1 不安装 LibreOffice**。
|
||||
* **执行**:后端上传接口增加白名单校验,仅允许 application/vnd.openxmlformats-officedocument.wordprocessingml.document (.docx)。
|
||||
* **备选**:如果开发团队在 Python 环境中遇到不可逾越的 .docx 解析问题,可尝试引入 **Pandoc** 将 .docx 转为 HTML,然后使用 BeautifulSoup 解析表格,这通常比解析 Word XML 更直观。
|
||||
|
||||
## **4\. 补充的非功能性需求 (NFRs)**
|
||||
|
||||
建议在 PRD 中补充以下技术指标,以便测试验收:
|
||||
|
||||
1. **最大文件限制**:Word 文档 ≤ 20MB(防止内存溢出)。
|
||||
2. **表格大小限制**:单表行数 ≤ 500 行(防止 Pandas 计算卡死)。
|
||||
3. **并发限制**:SAE 实例 Python 服务最大并发数建议设为 5-10,防止 LibreOffice 耗尽 CPU。
|
||||
|
||||
## **5\. 审查结论**
|
||||
|
||||
**该计划文档质量优秀,技术路线选择正确。**
|
||||
|
||||
* **Go/No-Go**: **GO (批准启动)**
|
||||
* **关键路径提醒**:
|
||||
1. **Week 1 Day 1**:**跳过 LibreOffice 配置**,直接开始 python-docx 提取器开发。
|
||||
2. **Week 2 Day 7**:Skill 接口定义要尽早冻结,Node.js 和 Python 的契约(JSON Schema)要先行。
|
||||
|
||||
**建议立即按照计划启动 Week 1 开发。**
|
||||
219
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/RVW V2.0 数据侦探:Word 优先架构技术设计文档.md
Normal file
219
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/RVW V2.0 数据侦探:Word 优先架构技术设计文档.md
Normal file
@@ -0,0 +1,219 @@
|
||||
# **RVW V2.0 数据侦探:Word 优先架构技术设计文档**
|
||||
|
||||
**文档性质:** 最终技术规格说明书 (Final Technical Specification)
|
||||
|
||||
**核心策略:** Word-First (优先处理 .docx/.doc), PDF 作为兜底
|
||||
|
||||
**目标模块:** Python-Service, DataForensicsSkill
|
||||
|
||||
**最后更新:** 2026-02-16
|
||||
|
||||
## **1\. 战略转变:为何选择 Word 优先?**
|
||||
|
||||
针对中文核心期刊的投稿场景,利用 Word 原生结构具有压倒性优势:
|
||||
|
||||
| **特性** | **PDF 处理 (旧方案)** | **Word 处理 (新方案)** | **优势分析** |
|
||||
|
||||
| **表格识别** | 视觉/坐标猜测 (易错) | **对象模型 (Object Model)** | 100% 准确识别表格边界 |
|
||||
|
||||
| **单元格** | 需算法计算合并关系 | **XML 属性读取** | 直接读取 gridSpan/vMerge |
|
||||
|
||||
| **表头匹配** | 寻找附近的文本 | **DOM 节点遍历** | 精确获取 Previous Sibling |
|
||||
|
||||
| **数据清洗** | 需处理乱码/错位 | **纯净文本** | 无需 OCR,编码正确 |
|
||||
|
||||
**结论**:技术路径从“视觉还原”转向\*\*“DOM 解析”\*\*。
|
||||
|
||||
## **2\. 总体处理流水线 (The Pipeline)**
|
||||
|
||||
graph TD
|
||||
Input\[稿件上传\] \--\> FormatCheck{格式检查}
|
||||
|
||||
FormatCheck \--".doc (Binary)"--\> Converter\[LibreOffice 转换服务\]
|
||||
FormatCheck \--".docx (XML)"--\> Parser\[Python-docx 解析器\]
|
||||
Converter \--\> Parser
|
||||
|
||||
subgraph "结构化提取 (Structuring)"
|
||||
Parser \--\> DocTree\[文档对象树\]
|
||||
DocTree \--\> MethodExt\[方法学章节提取\]
|
||||
DocTree \--\> TableExt\[表格对象提取\]
|
||||
end
|
||||
|
||||
subgraph "语义清洗 (Cleaning)"
|
||||
TableExt \--\> CellNorm\[合并单元格填充\]
|
||||
TableExt \--\> HeaderMap\[表头语义映射\]
|
||||
HeaderMap \--\> CleanDF\[Pandas DataFrame\]
|
||||
end
|
||||
|
||||
subgraph "多维验证矩阵 (Verification)"
|
||||
CleanDF & MethodExt \--\> L1\[L1: 算术自洽\]
|
||||
CleanDF & MethodExt \--\> L2\[L2: 统计复核\]
|
||||
CleanDF & MethodExt \--\> L3\[L3: 逻辑一致性\]
|
||||
end
|
||||
|
||||
L1 & L2 & L3 \--\> JSON\[验证报告 JSON\]
|
||||
|
||||
## **3\. 详细技术实现方案**
|
||||
|
||||
### **3.1 预处理层:遗留格式兼容 (.doc to .docx)**
|
||||
|
||||
虽然现在大多是 .docx,但仍需兼容老旧的 .doc。
|
||||
|
||||
* **工具**:LibreOffice (Headless mode) 或 Pandoc。
|
||||
* **Python 实现**:
|
||||
import subprocess
|
||||
|
||||
def convert\_to\_docx(input\_path, output\_path):
|
||||
\# 使用 LibreOffice 无头模式转换
|
||||
cmd \= \['soffice', '--headless', '--convert-to', 'docx', input\_path, '--outdir', output\_path\]
|
||||
subprocess.run(cmd, check=True)
|
||||
|
||||
### **3.2 解析层:基于 python-docx 的精准提取**
|
||||
|
||||
这是核心引擎。相比 pdfplumber,代码逻辑更清晰。
|
||||
|
||||
* **核心库**:python-docx
|
||||
* **关键逻辑一:提取表格与 Caption**
|
||||
在 Word XML 中,Table 节点通常紧跟在描述它的 Paragraph 节点之后。
|
||||
from docx import Document
|
||||
|
||||
def extract\_tables\_with\_captions(doc\_path):
|
||||
doc \= Document(doc\_path)
|
||||
tables\_data \= \[\]
|
||||
|
||||
\# 遍历文档元素(保持顺序)
|
||||
for i, element in enumerate(doc.element.body):
|
||||
if element.tag.endswith('tbl'): \# 发现表格
|
||||
\# 向前回溯找 Caption (通常是表格前的最后一个段落)
|
||||
caption \= find\_prev\_paragraph\_text(doc, i)
|
||||
table\_index \= count\_preceding\_tables(doc, i)
|
||||
table\_obj \= doc.tables\[table\_index\]
|
||||
|
||||
df \= parse\_table\_to\_dataframe(table\_obj)
|
||||
tables\_data.append({"caption": caption, "data": df})
|
||||
return tables\_data
|
||||
|
||||
* **关键逻辑二:处理合并单元格 (The Merge Logic)**
|
||||
Word 中合并单元格在 python-docx 中表现为多个单元格共享相同的文本,或者后续单元格为空。
|
||||
* **策略**:**Forward Fill (向前填充)**。
|
||||
* 如果是横向合并(Header常见):将 "Group A" 填充到其覆盖的所有列。
|
||||
* 如果是纵向合并(分类常见):将 "Adverse Events" 填充到其覆盖的所有行。
|
||||
|
||||
### **3.3 验证层:适应复杂统计的规则引擎**
|
||||
|
||||
基于 Word 提取的高质量 DataFrame,我们可以执行更复杂的验证。
|
||||
|
||||
#### **L1: 算术自洽性 (Arithmetic Consistency)**
|
||||
|
||||
* **输入**:清洗后的 DataFrame。
|
||||
* **逻辑**:
|
||||
* **Regex 识别**:识别格式为 n/N (%) 或 n (%) 的单元格。
|
||||
* **计算**:提取 n 和 N,计算 n/N 是否等于括号内的 % (容错范围 ±0.1%)。
|
||||
* **行/列汇总**:对于 Header 包含 "Total" 的列,检查其是否等于其他分组列之和。
|
||||
|
||||
#### **L2: 统计方法与结果匹配 (Method-Result Check)**
|
||||
|
||||
这是针对“复杂统计”的应对策略。我们不盲目计算,而是先看作者“说了什么”。
|
||||
|
||||
1. **方法学定位**:
|
||||
* 利用 python-docx 查找标题包含 "Statistical Analysis" 或 "统计分析" 的段落。
|
||||
* 提取该段落全文。
|
||||
2. **LLM 意图识别**:
|
||||
* 发送给 LLM:“作者在本段中提到了哪些统计方法?返回 JSON List。”
|
||||
* *Result*: \["Chi-square", "T-test", "Logistic Regression"\]
|
||||
3. **表格结果验证**:
|
||||
* 如果表格包含 "OR (95% CI)",则验证是否匹配 "Logistic Regression"。
|
||||
* 如果表格包含 "HR (95% CI)",则验证是否匹配 "Cox Regression"。
|
||||
* **报警**:如果表格用了 HR 但方法学里只字未提 Cox 回归,标记为 **“方法学描述缺失”**。
|
||||
|
||||
#### **L3: 高级逻辑推断 (Logical Inference) \- *无需原始数据***
|
||||
|
||||
针对无法重算的回归分析(Logistic/Cox),采用**区间逻辑验证**。
|
||||
|
||||
* **黄金法则 (Golden Rule)**:
|
||||
* 对于 Ratio 数据 (OR/HR/RR):
|
||||
* 若 95% CI 跨越 1.0 (例如 0.8 \- 1.2),则 P 值 **必须** ![][image1]。
|
||||
* 若 95% CI 不跨越 1.0 (例如 1.1 \- 1.5),则 P 值 **必须** ![][image2]。
|
||||
* **实现**:
|
||||
* Python 解析 "1.23 (0.91-1.56)" \-\> est=1.23, lower=0.91, upper=1.56。
|
||||
* Python 解析 P 值列。
|
||||
* 执行比对。这能有效发现**编造数据者**常犯的逻辑错误。
|
||||
|
||||
## **4\. API 接口设计 (Python Service)**
|
||||
|
||||
python-extraction 服务新增接口,专门处理 Word。
|
||||
|
||||
**Endpoint**: POST /api/v1/forensics/analyze\_docx
|
||||
|
||||
**Request**:
|
||||
|
||||
{
|
||||
"file\_url": "oss://.../manuscript.docx",
|
||||
"config": {
|
||||
"extract\_images": true, // 是否提取图片(为未来OCR做准备)
|
||||
"check\_level": "STRICT"
|
||||
}
|
||||
}
|
||||
|
||||
**Response**:
|
||||
|
||||
{
|
||||
"methods\_found": \["Chi-square", "Cox Regression"\],
|
||||
"tables": \[
|
||||
{
|
||||
"id": "tbl\_1",
|
||||
"caption": "Table 1\. Baseline Characteristics...",
|
||||
"type": "BASELINE",
|
||||
"issues": \[
|
||||
{
|
||||
"type": "ARITHMETIC\_ERROR",
|
||||
"cell": "R3C2",
|
||||
"message": "Calculated percentage (48.0%) does not match reported (50.0%)"
|
||||
}
|
||||
\]
|
||||
},
|
||||
{
|
||||
"id": "tbl\_2",
|
||||
"caption": "Table 2\. Logistic Regression Analysis...",
|
||||
"type": "REGRESSION",
|
||||
"issues": \[
|
||||
{
|
||||
"type": "LOGIC\_ERROR",
|
||||
"message": "95% CI (0.8-1.2) crosses 1.0, but P-value is 0.03. Contradiction detected."
|
||||
}
|
||||
\]
|
||||
}
|
||||
\]
|
||||
}
|
||||
|
||||
## **5\. MVP 实施计划 (基于 Word 优先)**
|
||||
|
||||
### **阶段一:转换与提取 (Week 1\)**
|
||||
|
||||
1. **Docker 环境**:在 python-extraction 镜像中安装 libreoffice 和 default-jre (用于转换)。
|
||||
2. **Parser 开发**:基于 python-docx 开发 DocxTableExtractor 类,重点解决合并单元格的 DataFrame 还原问题。
|
||||
|
||||
### **阶段二:基础验证 (Week 2\)**
|
||||
|
||||
1. **算术引擎**:实现 n/N % 校验和 Sum 校验。
|
||||
2. **统计复核**:实现基于 Summary Data 的 T 检验/卡方检验逆向计算器。
|
||||
|
||||
### **阶段三:复杂逻辑与集成 (Week 3\)**
|
||||
|
||||
1. **回归逻辑**:实现 CI 与 P 值的逻辑互斥检查。
|
||||
2. **方法学匹配**:实现“方法学章节提取” \+ “LLM 意图识别”流程。
|
||||
3. **前端展示**:在 RVW 报告页渲染结构化的“数据疑点”。
|
||||
|
||||
## **6\. 总结**
|
||||
|
||||
切换到 **Word 优先** 是一个极佳的技术决策:
|
||||
|
||||
1. **避开了 PDF 表格识别的深坑**(不再需要纠结表格线框、跨页断裂)。
|
||||
2. **数据提取准确率预计从 70% 提升至 98%**。
|
||||
3. 使得**复杂逻辑验证(如 CI vs P)** 成为可能,因为我们能精准提取出这两个数值。
|
||||
|
||||
这套方案将使 RVW 在中文核心期刊市场具备极强的技术壁垒。
|
||||
|
||||
[image1]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAXCAYAAACvd9dwAAACiElEQVR4Xu1WO0xUQRR9xJiIX5QsG/b39pdsbGjWhkILowWFUGplYWNjKKAgIVhSEHoLAhF6QmKjhorORAsajRUFiZWNoVgKjFnP2b2j9919j7ewYMzmneRm3j33zOfOzJsZz0uQIEGCBF0ik8lcttxZwPf9LVhTbM3Go5BOp69Af+jqlkqle1YDvlEsFpdQjqIcKhQKD/D9I5VKXQ0IUbkmDS0HAj2AHcFWlL9CTmvCUC6Xb0hCvuPg/4LNah2TkzFru681AWSz2WEIjmDv4A7YeLfALD5kZ4YekAGMGz4AxD/Dvmgun89P2vb89so9QfkK8Ts6dixkWxzAduFesPE4cHB2MMIzuR3La1CDQW9oDpOeI49JqytdQ2tOjHq9fhGN7MO+53K5QRuPgiQRldyh5R2wFdOiWdU8/FHh5xXXW3IK3FIfYAdcVRu0kIF0dC58R9IOXBnGUc5pXiW3qTj+c7tY5TcoFyUe/c8dh2q1et1vn2BvbcxCOjqP5HYU1+Dho/xxapBs0XGxQIWSdPjaxqLwL5ILgTuwvtpAB7D/x0S8YGNxkHo/I/jI5FQSi2G8PmgwATe1hohr30MDUxSg8lMb6xao/y2sE+l8z/IKrdmPOi1hE/S5i8Sf0TrhOvpl4JkET/dTKqCNF2GdkMPAnztf/uOXRsPLP3DPwZ+QupfEX6WvL/parXaNHBJ//7em15qJdb5SAmRvaK0AL3NHYGCPbcK+vDKge+Q4XMh3RffnEQF/D/W3nc8nFrh954uGL6Amry/NnwtwL95iZ7BPYk17jfjtFTnyzEMByU5Tz+3JOMqPOk6Avy3tt34B2knu4v6ALDNPpFirVCojtv5/jb5Orl/xG+Zg7CIpur7pAAAAAElFTkSuQmCC>
|
||||
|
||||
[image2]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAXCAYAAACvd9dwAAACW0lEQVR4Xu1Wv0tbURROEMGi1rYQQsiPm4RA6BwXhzqIHVpoV/0PupQO7SAIHTP0H3AQRdq5CG7i5CbUwUVx0UHoXhySIUXi9yXntuedvJcmr4rL++Bw3/nOufecc3++VCpBggQJEjwwnHO7kK7ItrVHIZvNTsO/7ftWKpVF6wO+VS6Xv6DNoX1SKpWW8f0rk8nMWN87BwNBNpW+SU77hKFarc5JQc5z0G8gn7Qfi/PFK1nSPmMDA7y2nAVm8SWDGTotCSwYPgDYTyFnmisWi2/teK6/cqtoN2Cf17axgYR3XH8Gc9ZmweRsMsKzuEPLa9AHSX/VXD6fL5BHDg3l19I+cTCBQD8w0DXPgTVGQYqIKq5teQ9sxaz4bGkeek74dcXFK67RaEyi8xXkgt/W/i9IIgPBhR8o2oMrQzvaNc2r4r4rjmfuBJO/h7Yp9ugzV6vVHrv+LXUENW3to0IC3Udxh4pr8fJR+gJ9UGzZc97AzjxP3wKGmJBE7rW4EPgL6zzASmcWtxswxIQE+R3BRxanimiG8fqiwQQ81T7E0PFlW167/9+WP8OCSPBLyyv0Zj/qtoS8oi43N/WP2k+4gbgB3MGF8j4siCT+zusymZ+NDx//wDvHoqTvlOhb1PVDX6/XZ8mh8P2/PYeDM3nkxnwKUrICfMw9gcRWbMFO/jLg98ZzeJBfiN+fnQP9Ev0PvM5fLHBXXhcf/gF14yyG3wodN8IjThQKhWcMBjkW6doJcv0V6eBzQvOI9YH+3J60863VdgL8cxm/dwQoiPnI+o0FN8LvV4IECSJxC00v4jBxXopbAAAAAElFTkSuQmCC>
|
||||
@@ -0,0 +1,182 @@
|
||||
# **RVW V2.0 架构升级方案:基于 Skills 的柔性审稿引擎**
|
||||
|
||||
**文档版本:** v2.0 (Strategic Release)
|
||||
|
||||
**最后更新:** 2026-02-16
|
||||
|
||||
**核心理念:** **认知依赖注入 (Cognitive Dependency Injection)** —— 将审稿能力封装为原子化的 Skills,通过配置引擎(Profile)动态注入给 SOP 引擎(报告)和 ReAct 引擎(对话)。
|
||||
|
||||
**架构依据:** 基于《AI Skills 落地应用探讨》与中英文期刊差异化需求。
|
||||
|
||||
## **1\. 核心定义:什么是 RVW Skills?**
|
||||
|
||||
在 V2.0 架构中,Skill 不再是一个简单的函数,它是连接\*\*非确定性大模型(LLM)**与**确定性业务系统(Code)\*\*的桥梁。
|
||||
|
||||
一个标准的 **RVW Skill** 包含三个不可分割的部分(Schema First 原则):
|
||||
|
||||
1. **语义接口 (Semantic Interface)**:告诉 LLM "什么时候用"(例如:"当需要验证药物剂量时调用")。
|
||||
2. **数据契约 (Schema)**:严格定义的输入输出结构(例如:drug\_name: string, dosage: number),确保代码执行的安全性。
|
||||
3. **原生函数 (Native Function)**:实际执行任务的代码(Python/SQL),**“推理在模型,执行在代码”**。
|
||||
|
||||
## **2\. 总体架构:双脑协同与护栏防御体系**
|
||||
|
||||
我们摒弃了 V1.0 的线性流程,采用了 **“双脑协同 \+ 中间件护栏”** 的立体架构。
|
||||
|
||||
### **系统架构图**
|
||||
|
||||
graph TD
|
||||
subgraph "输入层"
|
||||
Doc\[稿件 PDF/Word\]
|
||||
Profile\[期刊配置 Profile\]
|
||||
end
|
||||
|
||||
subgraph "Layer 1: 护栏中间件 (Middleware Guardrails)"
|
||||
direction TB
|
||||
SafeGuard\[🛡️ 政治与合规护栏\]
|
||||
note1\[Pre-Hook: OCR地图/敏感词拦截\<br\>Post-Hook: 幻觉检测\]
|
||||
end
|
||||
|
||||
subgraph "Layer 2: 审稿编排引擎 (The Core)"
|
||||
Registry\[🧩 Skills Registry 技能注册表\]
|
||||
Router\[🚦 Skill Router 动态路由\]
|
||||
Context\[Shared Context 共享上下文\]
|
||||
end
|
||||
|
||||
subgraph "Layer 3: 原子能力库 (Skills)"
|
||||
direction BT
|
||||
S\_Native\[🐍 Python计算 Skill\<br\>(数据造假/统计验证)\]
|
||||
S\_RAG\[🧠 知识检索 Skill\<br\>(医学常识/pgvector)\]
|
||||
S\_Search\[🌍 外部搜索 Skill\<br\>(竞品对标/ASL联动)\]
|
||||
S\_Logic\[⚖️ 逻辑校验 Skill\<br\>(入排标准/pg\_bigm)\]
|
||||
end
|
||||
|
||||
subgraph "输出层 (双脑应用)"
|
||||
SOP\[🧠 左脑: SOP 流程引擎\<br\>(生成静态审稿报告)\]
|
||||
ReAct\[🧠 右脑: ReAct 对话引擎\<br\>(交互式学术 Copilot)\]
|
||||
end
|
||||
|
||||
Doc \--\> SafeGuard
|
||||
SafeGuard \--阻断/通过--\> Router
|
||||
Profile \--\> Router
|
||||
|
||||
Router \--动态加载--\> Registry
|
||||
Registry \<--\> S\_Native & S\_RAG & S\_Search & S\_Logic
|
||||
|
||||
Registry \--\> SOP
|
||||
Registry \--\> ReAct
|
||||
|
||||
SOP \--\> Context
|
||||
Context \<--\> ReAct
|
||||
|
||||
## **3\. 三层防御与赋能体系 (The 3-Layer Capability)**
|
||||
|
||||
### **Layer 1: 政治与合规护栏 (Middleware Guardrail)**
|
||||
|
||||
*针对痛点:中文期刊的政治红线(地图、涉敏言论)。*
|
||||
|
||||
* **性质**:这不是一个可选的 Skill,而是系统级的 **Interceptor (拦截器)**。
|
||||
* **机制**:
|
||||
* **Pre-Hook (输入前)**:
|
||||
* 调用 OCR 识别图片 \-\> 匹配“中国地图特征库” \-\> 缺失藏南/南海 \-\> **熔断拒稿**。
|
||||
* 扫描全文 \-\> 匹配“高危敏感词库” \-\> 命中 \-\> **熔断拒稿**。
|
||||
* **Post-Hook (输出后)**:
|
||||
* 扫描 LLM 生成的审稿意见,防止 AI 产生不当言论。
|
||||
* **配置策略**:中文核心期刊强制开启 (Blocker 级别),英文期刊可降级为 Warning 或关闭。
|
||||
|
||||
### **Layer 2: 原生计算能力 (Native Execution Skills)**
|
||||
|
||||
*针对痛点:数据造假、统计学错误。*
|
||||
|
||||
* **核心原则**:LLM **只写参数,不负责计算**。
|
||||
* **典型 Skill:DataForensicsSkill (数据侦探)**
|
||||
* **Step 1 (LLM)**:从 Markdown 表格中提取数据,生成 JSON:{"group\_a\_n": 50, "group\_a\_mean": 12.5, "group\_a\_sd": 2.1}。
|
||||
* **Step 2 (Python)**:调用 scipy 库复核 P 值,使用 Benford's Law (本福特定律) 检查首位数字分布。
|
||||
* **Step 3 (LLM)**:根据 Python 返回的 {"p\_value\_consistent": false, "benford\_score": 0.04} 生成自然语言警告。
|
||||
|
||||
### **Layer 3: 学术智慧能力 (RAG & Agent Skills)**
|
||||
|
||||
*针对痛点:医学常识错误、竞品对标。*
|
||||
|
||||
* **典型 Skill:MedicalLogicSkill (常识校验)**
|
||||
* **底层支持**:利用 **Postgres (pgvector)** 挂载《临床用药指南》和《诊断学参考值》。
|
||||
* **流程**:提取“卡托普利 500mg” \-\> 向量检索知识库 \-\> 发现正常范围是 12.5-50mg \-\> 触发警告。
|
||||
* **典型 Skill:BenchmarkSkill (竞品对标)**
|
||||
* **联动**:调用 ASL (智能文献) 模块 API。
|
||||
* **流程**:搜索相似文献 \-\> 对比样本量与方法学 \-\> 生成“竞争力分析报告”。
|
||||
|
||||
## **4\. 固定的 vs. 可配置的 (Architecture Boundary)**
|
||||
|
||||
基于“工厂模式”理念,我们将系统划分为“流水线(固定)”和“模具(可配置)”。
|
||||
|
||||
### **✅ 固定的 (Infrastructure \- 平台底座)**
|
||||
|
||||
所有期刊共用,不随业务变化:
|
||||
|
||||
1. **Middleware Pipeline**:支持 Pre/Post Hook 的拦截器架构。
|
||||
2. **Skill Registry**:技能注册与发现机制。
|
||||
3. **Postgres-Only Stack**:
|
||||
* pgvector:承载医学知识库、稿件内容记忆。
|
||||
* pg\_bigm:承载精确的术语匹配(如药物名)。
|
||||
* pg-boss:承载长耗时任务(如全网文献对标)。
|
||||
4. **Python Microservice**:提供 OCR、PDF 解析、统计计算等“硬核”算力。
|
||||
|
||||
### **🎛️ 可配置的 (Journal Profile \- 业务逻辑)**
|
||||
|
||||
通过 JSON 配置定义,适应不同期刊:
|
||||
|
||||
1. **Guardrail Strictness (护栏严格度)**:
|
||||
* "political\_check": "BLOCKER" (中文核心) vs "WARNING" (普通期刊)。
|
||||
2. **Skill Selection (技能组合)**:
|
||||
* **中文组合**:DataForensics \+ MedicalLogic \+ Editorial\_CN。
|
||||
* **英文组合**:Methodology\_CONSORT \+ Benchmark\_PubMed \+ Editorial\_EN。
|
||||
3. **Chat Persona (对话人格)**:
|
||||
* "persona": "严厉的政治审查员" vs "persona": "建设性的学术导师"。
|
||||
|
||||
## **5\. 场景演练:从上传到对话**
|
||||
|
||||
### **场景 A:中文核心期刊(政治与数据为王)**
|
||||
|
||||
1. **上传**:文件经过 **Layer 1 护栏**。OCR 发现地图缺失,直接抛出 FatalError: MapIntegrityViolation,流程终止。用户收到拒稿通知。
|
||||
2. **修正后上传**:通过护栏。
|
||||
3. **SOP 引擎**:自动调用 DataForensicsSkill。Python 后端发现“表1数据标准差异常”,写入报告。
|
||||
4. **ReAct 引擎 (Chat)**:用户问:“为什么说我数据有问题?”
|
||||
* Chat Agent 读取 Shared Context。
|
||||
* 回答:“根据 Benford 定律检测,您数据的首位数字分布偏离自然规律 30%,建议复核原始记录。”
|
||||
|
||||
### **场景 B:英文顶刊(创新与对标为王)**
|
||||
|
||||
1. **上传**:跳过政治护栏(配置为通过)。
|
||||
2. **SOP 引擎**:调用 BenchmarkSkill。ASL 模块检索到 3 篇上个月发表的类似文章,样本量均大于本稿件。
|
||||
3. **报告生成**:在“创新性评估”一栏标注:“样本量竞争力不足 (Low Competitiveness)”。
|
||||
4. **ReAct 引擎 (Chat)**:用户问:“我该怎么修改才能达到发表标准?”
|
||||
* Chat Agent 调用 MethodologySkill。
|
||||
* 回答:“建议参考 *Smith et al. (2025)* 的多中心设计,将样本量扩充至 200 例,并补充亚组分析。”
|
||||
|
||||
## **6\. 开发实施路线图 (Implementation Roadmap)**
|
||||
|
||||
### **Phase 1: 基础设施与定义 (Infrastructure)**
|
||||
|
||||
* \[ \] **定义 Schema**:在 backend/src/modules/rvw/skills/definitions/ 下定义 SkillInterface 和各类 Skill 的 JSON Schema。
|
||||
* \[ \] **建立 Registry**:实现简单的内存级 Skill 注册表。
|
||||
|
||||
### **Phase 2: 护栏与原生技能 (The Hard Stuff)**
|
||||
|
||||
* \[ \] **实现 Middleware**:在 Document Service 中插入 Pre-Hook 逻辑。
|
||||
* \[ \] **开发 Python Skills**:在 python-extraction 服务中新增 /analyze-table 和 /ocr-check 接口。
|
||||
* \[ \] **实现 PoliticalGuardrail**:基础的敏感词匹配 \+ 地图 OCR 占位符。
|
||||
|
||||
### **Phase 3: 学术技能与双脑打通 (The Smart Stuff)**
|
||||
|
||||
* \[ \] **实现 MedicalLogicSkill**:利用现有的 pgvector 基础设施。
|
||||
* \[ \] **集成 ASL**:开发 BenchmarkSkill 调用 ASL 模块 API。
|
||||
* \[ \] **升级 Chat**:让 AIA 组件能读取审稿报告的 Context,并具备 Function Calling 能力。
|
||||
|
||||
## **7\. 总结**
|
||||
|
||||
V2.0 架构不仅仅是功能的堆砌,而是**系统哲学的转变**:
|
||||
|
||||
* 从 **"LLM 尽力而为"** 转向 **"Guardrail 绝对防御"**。
|
||||
* 从 **"单一审稿报告"** 转向 **"交互式学术伙伴"**。
|
||||
* 从 **"文本生成"** 转向 **"工具调用 (Tool Use)"**。
|
||||
|
||||
这套架构将确保 RVW 既能满足中文期刊的“生死红线”,又能满足英文期刊的“学术高度”。
|
||||
226
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/RVW V2.0 统计学深度验证方案(专家二审版).md
Normal file
226
docs/03-业务模块/RVW-稿件审查系统/00-系统设计/RVW V2.0 统计学深度验证方案(专家二审版).md
Normal file
@@ -0,0 +1,226 @@
|
||||
# **RVW V2.0 统计学深度验证方案(专家二审版)**
|
||||
|
||||
**审查人:** 资深生物统计学顾问
|
||||
|
||||
**审查对象:** 《RVW V2.0 统计方法分析报告》
|
||||
|
||||
**核心观点:** 从“无法重算”转向“一致性取证”。即使没有原始数据,数学逻辑的闭环依然存在。
|
||||
|
||||
## **1\. 总体评价**
|
||||
|
||||
原报告的分类(L1/L2/L3)逻辑清晰,准确指出了“没有原始数据无法重拟合模型”这一硬伤。
|
||||
|
||||
**但原报告遗漏了一个关键维度:统计量之间的数学约束关系。**
|
||||
|
||||
在医学论文中,作者报告的统计量(Estimate, SE, CI, P)之间存在严格的铁律。造假者往往只编造了一个好看的 OR 值和 P 值,却算错了 CI,或者编造了 CI 却对应不上 P 值。**这就是我们的突破口。**
|
||||
|
||||
## **2\. 针对“无法验证”方法的破解之道**
|
||||
|
||||
原报告中被标记为 ❌ 无法验证 的方法,其实有 60% 是可以进行**一致性验证**的。
|
||||
|
||||
### **2.1 破解 Logistic / Cox / 线性回归验证**
|
||||
|
||||
**原报告观点**:需原始数据,无法验证。
|
||||
|
||||
**专家修正观点**:**可验证 (一致性)**。利用 **"SE 三角关系"**。
|
||||
|
||||
**原理**:
|
||||
|
||||
回归结果的四个核心指标(Estimate, SE, 95% CI, P)在数学上是锁死的,只要知道其中任意两个,就能推算出另外两个。
|
||||
|
||||
**验证公式 (The Triangle Check)**:
|
||||
|
||||
1. **从 CI 反推 SE**:
|
||||
对于 OR/HR(比值),其置信区间是对称分布在对数尺度上的。
|
||||
![][image1]
|
||||
*(注:1.96 是 95% 置信水平下的 Z 值)*
|
||||
2. **计算 Z 统计量**:
|
||||
![][image2]
|
||||
3. **计算 P 值**:
|
||||
![][image3]
|
||||
*(其中 ![][image4] 是标准正态分布累积函数,Python 中用 scipy.stats.norm.sf(abs(Z))\*2)*
|
||||
|
||||
**实战案例**:
|
||||
|
||||
论文报告:OR \= 2.5, 95% CI (1.1 \- 3.5), P \= 0.001
|
||||
|
||||
**系统验证逻辑**:
|
||||
|
||||
1. 算出 ![][image5]
|
||||
2. 算出 ![][image6]
|
||||
3. 查表得 ![][image7]
|
||||
4. **结论**:报告的 P=0.001 与计算值 P=0.002 高度一致,**通过**。
|
||||
|
||||
**反例 (造假)**:如果作者手写了一个 P=0.0001,系统算出 0.002,差异巨大 \-\> **报警**。
|
||||
|
||||
### **2.2 破解 配对 t 检验 (Paired t-test)**
|
||||
|
||||
**原报告观点**:缺少差值 SD,无法验证。
|
||||
|
||||
**专家修正观点**:**可验证 (边界探测)**。利用 **"相关系数边界法"**。
|
||||
|
||||
**原理**:
|
||||
|
||||
配对数据的标准差 ![][image8] 取决于前后两次测量的相关系数 ![][image9] (范围 \-1 到 1)。
|
||||
|
||||
![][image10]虽然我们不知道 ![][image9],但我们知道 ![][image11]。因此,我们可以算出 ![][image12] 值的**理论最大值**和**理论最小值**。
|
||||
|
||||
**验证逻辑**:
|
||||
|
||||
1. 计算 ![][image13] (假设 r=-1) 和 ![][image14] (假设 r=1)。
|
||||
2. 如果作者报告的 ![][image12] 值跑到了这个范围之外 \-\> **数学上不可能,铁证如山的数据错误/造假**。
|
||||
|
||||
### **2.3 破解 非参数检验 (Mann-Whitney / Wilcoxon)**
|
||||
|
||||
**原报告观点**:需原始秩次,无法验证。
|
||||
|
||||
**专家修正观点**:**可验证 (大样本近似)**。
|
||||
|
||||
**原理**:
|
||||
|
||||
当样本量 ![][image15] 时,非参数检验的统计量(U 值或 W 值)会近似正态分布,作者通常会报告 ![][image16] 值。
|
||||
|
||||
**验证点**:检查 ![][image16] 值与 ![][image17] 值是否对应。
|
||||
|
||||
![][image18]很多造假者会编一个 ![][image19],然后写 ![][image20](实际应为 0.13),这可以直接抓出来。
|
||||
|
||||
## **3\. 统计学常识性验证 (Heuristic Checks)**
|
||||
|
||||
除了公式计算,还有很多基于“医学统计常识”的验证规则,这些规则**极其有效**,且计算成本极低。
|
||||
|
||||
### **3.1 均值与标准差的合理性 (Mean vs SD)**
|
||||
|
||||
**规则**:对于不可能为负数的生理指标(如血压、血糖、手术时间、住院天数),如果 ![][image21],提示数据极度偏态或有误。
|
||||
|
||||
* **Case**:住院天数 ![][image22] 天。
|
||||
* **逻辑**:根据正态分布,这意味着有大量病人的住院天数是负数。这在生物学上是不可能的。
|
||||
* **系统动作**:提示 **"SD 过大,数据可能非正态分布,建议使用中位数描述"**。这虽不是造假,但是严重的方法学错误。
|
||||
|
||||
### **3.2 样本量与自由度 (N vs df)**
|
||||
|
||||
**规则**:很多统计量的自由度 ![][image23] 直接关联样本量 ![][image24]。
|
||||
|
||||
* t 检验:![][image25]
|
||||
* 卡方检验:![][image26]
|
||||
* **验证点**:如果作者报告了 ![][image27],但表格里两组加起来只有 40 人 (![][image28]),那就是直接抄了别人的数据。
|
||||
|
||||
### **3.3 随机分组的“完美”陷阱 (The Table 1 Trap)**
|
||||
|
||||
**规则**:在随机对照试验(RCT)的 Table 1(基线表)中,P 值**不应该全部 \> 0.9**。
|
||||
|
||||
* **逻辑**:随机化意味着差异是随机的,P 值应该均匀分布在 0-1 之间。如果 Table 1 里 10 个指标的 P 值都是 0.95, 0.98, 0.99(即两组数据惊人的一致),这通常是**人工编造数据**的特征(造假者害怕基线不齐,所以把两组编得一模一样)。
|
||||
* **系统动作**:如果检测到 Table 1 中超过 50% 的 P 值 \> 0.9,标记 **"基线数据过于完美 (Too Good To Be True)"**。
|
||||
|
||||
## **4\. 修正后的 RVW V2.0 验证矩阵**
|
||||
|
||||
结合上述分析,我们的验证能力可以大幅扩展:
|
||||
|
||||
| 方法 | 原报告判定 | 专家修正判定 | 验证手段 |
|
||||
| :---- | :---- | :---- | :---- |
|
||||
| **Logistic / Cox** | ❌ 无法验证 | ✅ **强验证** | **SE 三角关系检查** (CI ![][image29] P) |
|
||||
| **Linear Regression** | ❌ 无法验证 | ✅ **强验证** | **SE 三角关系检查** (Beta ![][image29] P) |
|
||||
| **Paired t-test** | ❌ 无法验证 | ⚠️ **边界验证** | **r 值边界探测** (检查 t 值是否越界) |
|
||||
| **Mann-Whitney** | ❌ 无法验证 | ⚠️ **近似验证** | **Z 值一致性** (Z ![][image29] P) |
|
||||
| **Means (SD)** | \- | ✅ **逻辑验证** | **SD \> Mean 检查** (针对正值指标) |
|
||||
| **Table 1** | \- | ⚠️ **概率验证** | **P 值分布检查** (Too Good To Be True) |
|
||||
|
||||
## **5\. 对开发团队的建议**
|
||||
|
||||
### **5.1 优先实现 "SE 三角验证"**
|
||||
|
||||
这是性价比最高的功能。它能覆盖临床研究中最高级的回归分析(也是造假重灾区)。
|
||||
|
||||
**Python 实现思路**:
|
||||
|
||||
import scipy.stats as stats
|
||||
import numpy as np
|
||||
|
||||
def verify\_regression(est, ci\_lower, ci\_upper, p\_reported):
|
||||
\# 1\. 转换到对数尺度 (如果是 OR/HR)
|
||||
log\_est \= np.log(est)
|
||||
log\_lo \= np.log(ci\_lower)
|
||||
log\_hi \= np.log(ci\_upper)
|
||||
|
||||
\# 2\. 反推 SE
|
||||
se\_est \= (log\_hi \- log\_lo) / 3.92
|
||||
|
||||
\# 3\. 计算 Z 和 P
|
||||
z\_score \= abs(log\_est / se\_est)
|
||||
p\_calc \= stats.norm.sf(z\_score) \* 2
|
||||
|
||||
\# 4\. 比对
|
||||
return abs(p\_calc \- p\_reported) \< 0.05
|
||||
|
||||
### **5.2 话术要严谨**
|
||||
|
||||
对于这些高级验证,系统提示语不要说“数据错误”,而要说:
|
||||
|
||||
* **"统计量内部不一致"** (Inconsistent statistics)
|
||||
* **"置信区间与 P 值不匹配"** (CI does not match P-value)
|
||||
* **"标准差相对于均值过大"** (Large SD suggests non-normality)
|
||||
|
||||
## **6\. 总结**
|
||||
|
||||
我们不需要原始数据,依然可以成为福尔摩斯。
|
||||
|
||||
因为**造假者通常不懂统计学原理**,他们编造的数据往往破坏了数学上的协变关系。
|
||||
|
||||
**RVW V2.0 的数据侦探不应止步于“算术题”(L1),完全有能力利用“SE 三角关系”进入高级统计验证(L3近似)的领域。** 请务必将此纳入 MVP 或 V2.1 的核心规划。
|
||||
|
||||
[image1]: <data:image/png;base64,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>
|
||||
|
||||
[image2]: <data:image/png;base64,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>
|
||||
|
||||
[image3]: <data:image/png;base64,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>
|
||||
|
||||
[image4]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAXCAYAAAA7kX6CAAAA1ElEQVR4XmNgGAU0BvLy8ofl5OQeAen/MAzigzC6WqwAqNAYpElBQWEhuhxeoKio6Aa1cTW6HAYA2qIFVXxeVlbWD8puBuJZUNsj0fWANJVBFQZD+WCnAulyEF9aWloYKr8HWR8jVPA/TABdIwgA+d+g6hTBAqKiojxEanwOFbOBiYEEf4IEQYbg0QgznBGu0djYmBUq8R4kga4RyF4L4gMDSAKuCRlAQ/Y9zHQo/gsUD0VXixWQnQCAmqygti1Fl8MKgAofgjTIQdMnCMOcjK52JAAAMg5Z/CE+6oIAAAAASUVORK5CYII=>
|
||||
|
||||
[image5]: <data:image/png;base64,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>
|
||||
|
||||
[image6]: <data:image/png;base64,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>
|
||||
|
||||
[image7]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF8AAAAYCAYAAACcESEhAAAD5klEQVR4Xu1YO2hUQRTdYATFH6JxyWazs/lgSBAsVq2ihYiQIhbaaGenVQRDFGLjBws7ESuJhUhARMUmjaQICCkUBEERlICKEdQiKCRgJOo5u3c2N3fnZVclBnEODG/n3DP33rlv3rx5m0pFRERERERERPw3cM6dz+Vyb3H9Ie09+8LNCjdpx/0tNDc371C5zbS3t6+3miRAf8aPzefzj0DVWU06nV5Dv17X0tKyx2o8stnsamjmLO/R1NSUpV18zdWcqw9ueQlI2ytrW2og5iHJqVi01tbWDexzkkZaAehGsYBeqr73VYb3h4I7pWPx+n1fbo5fhMXmbRrgD9JWKBRWsq9y3WS1C9DQ0LBWHI9ZG7FY0KUEY2LFHjPcGNo7zVm0tbVt4dhMJrNZ8+LvrOo/Q3uuJHzSDiTNVWKHbPVSo1FN0ne1XCnq4WAGtjasno3iOBS0AvCRwUranwo84hrw22U5DcTrZEzoCoYflFwS/cN+JZQvC4E2rfq8GTe0RraOiriESyg+tPtCvtivliudjlLEJyBguyCOj1ubBh836lzpseUk/T4bBOzjltOA/SR94EZu1zwmepr8YlsP7BMyacu/8Tz8piXfIaNpFH5Q82JLKn4v+aTio3VqfgFEUOGUg8R209osoHnB94Ph9kpSRzSP/jm0w5qzUIk3at4XH9duzWvAPp0wH1/8eq5s8XPaaHzx72hebEnF75Z5Lig+uBGJ0av5MuSFwmChNlP1hSGAdthyHnwCjN+7VmNRQ/HDE0pVLz6f8BqKP6Z5sQWLD9SFxqD/bdFc/Qsmb15sy41/rPjcxnbR5p9+VzpdvSaHGu+0+iK8Q3sy+B3Az4AkzjbDp8pqPGB/aDkNVeTWBL7ihejh1N6exLv5Il80miJvtxCxJRaf4Lke9g9oc8ivyy+gxNpKAokOawV89KON+D6Di+97WkfIt8NVy2twtXC8LbKT006VGzscmpOTg4B0i1uFLbI/7aD1aJ5wVYpv4UpHzbC+o6NjnQR6bG2/Cvh4ajkCxTvFGLhexrURk70kCdVbrYEvjj3n82T2XXPwfYK+fR83bhvH2hUncy0vEPyecuac7+TYjbirNC+2xOIzJ2tj325rZSDAUQn0x/t9YhCBFP0LdLdSi517FTDmNsZ8UlTxhujvEb93Byb+lTfc9+ErT40+TsPPbhlXzgf9CUgf+L4GbE+sXtmYQ/mvB/y+hjalNd4w5BPWjZ/EVrvcQF7jnBTadclzIKD5jEL3GXqFK/0tMAnbfZnfVqPhzeujTfbn2Xzg20Tizubm//P6SE5viU6O1a6Gb5yIiIiIiIiIJcZPHI2wZKJtZLsAAAAASUVORK5CYII=>
|
||||
|
||||
[image8]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAAYCAYAAACvKj4oAAADAklEQVR4Xu1XPYsTURSdJREVFUEMwSXJMyEYxEIkWixairiIFhYiKDb+AVFQtLKxsLWxUcRGQVwsRBRJESwsDAgWsuIHuMuihagobKGyxnPWe8PjOJPCIiGQA5fMO+e+N/fe9+7MJEnGGGOMMYaBarW6L4TwCna9WCyuIYfrM+o3ciiVShuQSBd2kuNms7kC159gt2Af1R/cU9gHm9OtVCrzbhgvGf8WrhM6dxjIM6DNgAoW6CXliUajsc70tmpAzrQfKgwcCOI27LPyBPg57EpNeaJcLh+yJKZVI8BPUUfd9qs2UCCIX30SXFDOAa3FBLxXFYVCYa0VoK3aQGEJstLnVesHC76rvCNKcE61gQJH8JwH64Zkn6hfDO6a+bZUc+AI7zKfjmoDB5I8okmGPg8IaNPmk9p/BNa8QR8WULX/QA7rbFOSwD124CenfCbwLix6kpOTkxtVJ6C1qWf1HxHs6NdqtfWq4bW0GgFfDVHvY3wW43uxH2FHfRb2UwtKHqftFH6/x7wjD/GokgQmHLMkN6lGmJbZf14krP9MNYe1xjUf40jvTCsYfK6Y74GYx9qreA9uQmqcmLSXiShPQDuYlUD08Mjsv2AfAUmfFz30BRRiu/KKLD/r8XfK9wDxAaujPAH+DSp0R3kC2mFLMLX/wM9QT9sNrgm7zKC9APbV9AK2FPviaG+x+7i1XaNvrCVphYTwm6L2CAK4qDeLAe0553EnYx67vttu+C1JuSHWfQyf47zGPSvwW+Q1fu/bLwPNR1N6xzDmHOBfYr09yi+DEyG+ZrN7FdwYiPoT0L6or9jdtF0jWET6+Jg9xaesj8Pfr55ZHzt4NEPGxwbX4+ei8kOB9XTvSYfr9+Ca0ZhPySkfR/yFkN5GE3HBhg4EszXYC996brlvfBc9WPzORNM47qQdQ3C1kPIvZ6hAQC0E9sgeMg+5a0zWtEVo84n0LhNPO/bgT4foFTNyYO/V6/WV4d+vqZz1ZQdWFW10wJ3Djp7gX7KYx+7f5EMQ+teYV/wBPwYFnngn/N4AAAAASUVORK5CYII=>
|
||||
|
||||
[image9]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAZCAYAAADjRwSLAAAAi0lEQVR4XmNgGAWDFcjLy/8G4htycnK3gLQ3EH8D4gNAvAesQFlZWQwoOV1WVtYUKPgfpEFFRYVPQUGhA8j+BzNlK1CAA0hHgxTJyMioSElJcUE1vIUp8obSh+E6cQGozq3o4nAgKirKA1IEdJsLuhwcAB3tB1IEchu6HBwAFewhxj2fQMGALj7kAQCeXiVXaN2b2wAAAABJRU5ErkJggg==>
|
||||
|
||||
[image10]: <data:image/png;base64,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>
|
||||
|
||||
[image11]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF8AAAAYCAYAAACcESEhAAACQ0lEQVR4Xu2XvUsjQRjGN0QLORXkiEHyMdkkECysUlxlYy+2lmJzlVja+A8c1xwHV10h11119fVXBGysxMZCRRAEhRRaCKLPe3lX4kM+9mOiG50fvOzsPDOzM8/Mzs56nsPhcDgcDocjJMaYA8QC51siyxmvRaPRmOG8IWTK5fJZLpebZiERMPsS8dAVNs3P6oS2i8XiFIsvDfqxImOEkVus9QJlr7u9sW5+ADq0ast8Mdp0JvXIS8GKRz82ZWyVSmWNtTDAm53Um18oFD6i/i2ihdsM6y8N+rGrpn9iLQqpNh91fKmLNvZYiwra+Yl2fiOZaTabk0j/1fvQSD90LD5rcUil+bKitM5X1uKAPnzD21NEe/8QbdPZtjK4HiO+c3lCyrUQd/IGspiENJovg21jAvY9S/s62rvS64X0RdLycZQ0nvP5eennGN3XESusJWWg+ZIppoWJWq02z/WFGOb/R7YG01mZp5JmPQIT+FAvSUL7MWyl9wSTtC715cpaXFJrfhfBa9/O5/MfWAwLJqCg/VhkLQrBlohxbbMWlYHm28CC+U/oB+8+TlvBQDk/LkYPA4gfrIVlrMwPMHrU832/wVo/UP7E6N5vk3q9Pms6x+A/rA1j5ObjNd2QB1Sr1TJrSUG7m6VSaZnze6ELINZ+Hwb9ATzk/EHAmy/SL0zCHGuJQKM32vBZEHKPB/7isqNGvhXybDlusvYa6EJ48gbpc73f4bKO94TpcZrqF56lf4F+2DjxjRU8qEHhOfMdjjfCIzf0znsbkpgQAAAAAElFTkSuQmCC>
|
||||
|
||||
[image12]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAYCAYAAAA20uedAAAAkElEQVR4XmNgGJ5AXl7+LRCfQBcHAUagxH8gLkKXYJCTkzMGSSoqKoojCzoDcQhQYh9IEsQGYbCkgoJCAFTyDxA/BLFBYnDdDFD7gILpyIJgALNPSkpKBF0OJDkfJIkuDgZAia9AfBVdHATQ/cciDwsIUVFRHqgXjEF8IH3L2NiYFaYTbicIi4uLc8MlBhsAAJtgJhSnxjfGAAAAAElFTkSuQmCC>
|
||||
|
||||
[image13]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAYCAYAAAB0kZQKAAABpUlEQVR4Xu1VPUsDQRBNIIKgpcdpzrtNSuuzCVgI2tiIhYWFrdhb+A/8A5Y2YpNCIhYWWogKgtoKhkC6iJrKMiDi13tm51gGIVHIgXAPHvNmZm92sjt3yeUyZMjwX2CMeQZvdDxN5NHAJ7ihE6khiqKYTZTLZV/nBg5sPgcuo4EzNkFN6nUDRalUWrJNvIEtasb0ujTwPQ/YfF0nUoPMQ7FYHNO53wK1NlHrUMd7Ag/usgkd/wvCMJz2fX9Ex3sCDXTAuo6nCf19KBj7wcIJrUFXra2DO+ArZmcc9hK85vFzbRzHQ/BvwXcpDH0FPgVBMAnbAGvgseQTeJ43arqvZkwftsmC1NhsH7kFsCPrqbFm1eoJycEeWctrLbAu1s3AP+V1O8//fO0yE6S+TxbBPS86flKEbxP8mpOrgA3xbeyDDVk9BT64+b7ATVWRtpNrM+b4PPKK+Ghy2G0aP/YEsRXx+wJPxS0CvQ1uUbsbwFatFf+AFpvOQ1/YxyXPGTyXWE/Y70fyzkO33P8W+C/GOV7TnZd7yDx9NLoHzjr5O/BRZi6DxhfbvXftn6se4gAAAABJRU5ErkJggg==>
|
||||
|
||||
[image14]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAYCAYAAABwZEQ3AAABsElEQVR4Xu2Vv0tCURzFDQyCWqLE0vTp2NTwqKmtpZZoaAhqjfaCGpsaWhsjiJaCEPoHpKGGAmchikAjcJImI6Soz9F75XIXo+EJ4YHDPd9f9329ft99sVgfffTx3xEEQR3e+/5eYIBGvuG2H4gc2Ww2VDP5fD7pxyIDTSzAVRq5VjPSop8XCXK53Ipp5hNWpeXz86JEa15oYssPRA47L6lUatyPRQ6aOVUzvr8noJEGLPv+XsC/X+KBufg4sU30uVnL8Bg2ma0J1lt4R2zX2+sN7qgOlmwAfaF68l+0Pyyg553aWCyRSIwE7Vc6lM36GIbhoDQPvSS2BBs2X5qcDaMnvdhXOp0ekyZnH/tEmn0W9RxbT86UVvxrtrYDOzNiMpkcdmP4iplMZtmxO7Oltw+7IK0cdN3Jq3CBzljb8f99NlXs/KppWHNiNfmMLgbmJGyd1Y5P9RXf/yvolNxN0UfwQJpTGbKxoD0fiq3L5kTm0O+c+Ki5Np7JPwvac9Oqx7/HErd7d4XZ6Mra6Kr77cL+gK/G1PDKLvGXzbI24ZMCNHIIb4xfOQ/YObtPH93wA5DeflglRK8+AAAAAElFTkSuQmCC>
|
||||
|
||||
[image15]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD8AAAAYCAYAAABN9iVRAAACqElEQVR4Xu1WPWgUQRSeIxEUQRGFM/c3d8s1QsDitAnWYmMKLW3S2WgTMKKVjaUpRIKIwVgFQhCboEgKKwlY2ASsJCQoghIEMRaRJH7v7s3m3btZ3OyesXA+eOy+7/3svJl5M2tMQEBAQMB/BmvtZK1WW8NzhwTvL6W9Xq8fBP/F2SE/4HNd+uwHKpXKITWOae1DqFarZ4TPz2azeUT79ACO2y4IasFjv4+iW5rfD0RRdBTf3zI8rnK5XOGxEhcD+mU5fo7bIX/p1wUUdQxOC1jlO5z0mvYB99l4JsWHRqNxXnN5gG+/hnxqtVoHHOfGSk/hR/pVpzNHsR8l1wUYr2ACzuF1kIvf9vhsaC4J8G1wnkltywLkWed844IbYm6V9VOk690J7jbxJmnhYHyLxyC/L5EzemfY2ZEwgjyJA1IC2+04cm1CXpikj6cAVvMkckwZkYPGxMV/IB3PcdKx607HgR2/m8Qnbn0Yf4l3t2rvBXdXz+heIA4ryjmg7VmAXA9onJiYC6Tj+ZTHPST9XPG8s7vB/T4vOegbFEAHBuvU7/3AAE0ATQRNiDamBfU+F7rsuBTFX5R8G3a332PQbHKiWfb5Lu19QAHfeGXTXkUKiPtmO60aI2vxcb8rnhJREPXWY23PiczFI2YRY3qoeVFklMD3tq31nOwEyz0FWdGHSA7k2vaIe4RJu6W49oGHA/qsr0jLp32xWDwseVMqlU7AsNBFMviQouLpmsgFceC9MxkPPBQ1gcLHJIe8ZdrurBZorPXee37R+haYBoOkM5p3gH0Zsq75tBBX3TNt2wsQP+IWwiOXnB8Kn4P+VYS2JwS7YjRmUPBznYQcd2M6sJ1r757m/wTx+9mvn5z27eMT3ePg3kC2INPsc0Pa/zr09gwICAj4V/gN82LuvSPex3QAAAAASUVORK5CYII=>
|
||||
|
||||
[image16]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAXCAYAAADUUxW8AAAAyklEQVR4XmNgGAUDCOTl5U8D8X8o/iInJ/cIhpHEDdH1gQFIUkFBoRGL+B6oxmB0OTAASmgCNR5CFweKNUANrUSXgwOggjVKSkr8aGLBUBv3IItjABkZGSFkvqKiohlII9C/t5DFCQKQQVAb36PL4QUgv0H92IAuhxfg8iPQC+JAsSnIYigAnx+BYvOBcoro4mAACmWojV/R5YCABSSHLggGxsbGrFCNIAWMaNLMQPFfQLwVTRwCYBqB+BmWpAjGsrKyOuj6RgGJAAC82ER8WRO91wAAAABJRU5ErkJggg==>
|
||||
|
||||
[image17]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAYCAYAAAAlBadpAAAAwUlEQVR4XmNgGAUDBOTl5Zvk5OQeAen/UPwMxIeK/YKKPUXXhwJgmtHFZWRkOKFyt9HlwEBUVJQHquAAuhwI4DIYDIASniBJWVlZP3Q5oPMFCWneA5IEuQCLXDNITkFBIQNdDgxwmQwU04TKLUaXAwNxcXFumGYs+Ju0tLQwuh44APkTpBDorHR0OYIAqPEASLOUlJQIuhxBAHMiujhBoK6uzgvVfBpdjiAA+jOBZP8CNcxBClE4VlJS4kdXOwooBACwSUl+C0KXaQAAAABJRU5ErkJggg==>
|
||||
|
||||
[image18]: <data:image/png;base64,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>
|
||||
|
||||
[image19]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAYCAYAAABtGnqsAAACAklEQVR4Xu2XMUvDUBDHU1DpIAhKB2natAUHOygS1N1JEF06+BUEHQRBcNPVj9BF3Bz6BYQOwcHFwV100MFFtCDiINT4P7iE69lEG2xp5P3gSN7/7t7ru7yXl1qWwWAwGAyGIcFxnCuYz/ZWLBYfAhP6gs5LA/jdKzBP61GUSqVTzPvctu0Z3GfpSvWBtq5jQ6hACD7qoje5eDXtG2Ywly3x4Mk8HRMFFVDl+ijeiY4LQcAski60Du2QknE90L40kaSAsF3k1GNXXQACG5VKZUJpNR64KfU0kqSAKJyr9Uiwxydlu1wuL/GyvZF6Wul7ASVUTB6wpX1pJUkBEd+A3cK2eTFFvwMDXNcd5cF8NDPaHwdW7Rzy6r2Y7qNf8Jw8rUfB78BNIY1QHz+dBRkeyKdCSge0Y9keJBh7+rdmRTx0npen9V5A/jv1o/UQOFsUkM/nbamj6quFQmFDaoNEFynOrD8qYC6XG9ca8u+pn24+iw4LctLhoX3Qn3AZ0brmv2xhOjw4/k7qaL+S/q2ATsyHMmmwZ62njbgCYoctw7cWtLEQ5jl+T8ax9ik1qvY+OzpWA7bxFLRr9u1IXwoJ3u2X2kGwr2Nlod2W50DwWdexQ6vV6liQHGd4QtkwKUXQPwiew6P4T98mTcWdOaq44mvkBfZB9zgHFmWMwWAwGAyJ+QJaE9bRDZ1rogAAAABJRU5ErkJggg==>
|
||||
|
||||
[image20]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAAAYCAYAAACyVACzAAACvklEQVR4Xu2Xu4sUQRDGd9FEfCG6Lu6r94WLIhqomZGZiBqYGJp5kYIgghqIRmZysSIiJkYmJnLBRAr6BwiKgXJnoJHBHSj4+L7b6qOmpmd3dm99BP2DZpmvqrq7avqxUypFIpFIJBJROOdutVqtj/j9Je0Tn0X7LtqSjftbNJvNI2puK/1+f5v1yQP+131su91+BalsfTzwOY6WWD2I79TqjUZjk9jeWdufBmOelTmtJtntdrfzuV6vN4xrBvgt4IW/Vc++rzVQwDmft7RE24NUKpUto5x9Z1afFiSxvzTiLXs4JhK6YLQEbVFrll6vt5uxtVptl9alv5ta84zKPwWcTtAZS/60tSGxHbMqFiZ6TiZ8xtos8NtHX4x/2OjXZC65xYZ9PjRfaItoy1YnkmNi9QxwWqAzV1jAdlsSnLO2oiD2DvvodDoHrS0P+F+WmENaR/GuUh+1FWF/n1OsDyGdTFIsOmY6cfJ20R5ZWxGQ2APE/kDrWNs4UOCHMvYerfti4feY1jWwL+fk44u1MWDjWInVU1Sr1c3iGGoreIM7bcwYyoh7ydhJbi5LgWKd0rrGjSlWzg7iWInVU/CcoqM9SKdgA/p5wwnxBrXGSfkvi0UHOtqbYwp8sT7PoliqKN0cPXXwa3xRiuqkaLHoFOxgSspYFc/dOrchVvzRUFGc3IY8PrSugf1xKCc3vA0zOhlbrMFgsFWcXlvbLFjPAV8ann2Z48ENb+6fWsM4l5zarij0Acba3SK5PtOaR2yJ1dfARM6HJjRrMMYNjjPJXweCeT1B3BclrRZQ/x/kypNEUysGz99gu+uf0VebPqHzqiT9or2wBnZ0zw+gGz8nrO8sacufUrST1pYHE3DD1XlfYq8EfL6iMBeNzDOU37ZLsD2V/PZqB14S0qf+HuZYwa36T2gV/NyJRCKRyGT8BrOGGOWU7y1uAAAAAElFTkSuQmCC>
|
||||
|
||||
[image21]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGsAAAAYCAYAAAD9CQNjAAAEoElEQVR4Xu1YTWhcVRR+IanYWhGtIU0ykzuZDIRGaxdRSrQrUUkWVuhCxXYh7aKbQsAuJODCIq66sdXuItKFChJXEiqSxdBFFwbchYiNYEpIFpIUhZYaSeL3vTlncub43iQZY5LC++Dy7jvfueee+3fOfS+KMmTIkCFDhgwZdgrd3d2vhRB+Rvm8ra3tMcpQv+j1MuwicrncU1iUNZRzfO/v79+H+u8oX6EseH3IbqHMS5u1rq6uO1rwviLyGag2+bY7ib6+vkfEp2X1FeIWr6fo6enJqx7KEtt6nd1GC50rAJ4Qpz/2cqK3t/dx4cueA5qF+8sTuwH48R7Kp+JTu+cVsrDUuee5PQE49jXKopcTkM9iAEUvJ/L5/EkZ2JDnCMgHyGMPDHrOolQqtWrI/b8AP6YQPUr0B+N5xfME/ByBTqfofOH5PQE493edxZrzMgW4CQ4sbaJbW1sPymKWPecBncvURc7s9dx2ALZX6acsxPuexyLth/wT8EOi0+919gRksXgCRjxXD7IQzAGJMIs167k0YJKGpc3LnmsUHR0dT8PeOOtie8LrQDYtz3gDRvVzbTPm6pLk6GFPErDxYqhc1N7xHAH5NbT9PpJ+UH+d9mD3ilOtBXeaDKJa0Oim17PQXcrBeU6BMPmC6Ex6biOg/zek7VnPbRWwdV5Dn9isiRbgXkV5xvCp+QrctygrGk1g+10XMpvAL3Mx+SK3a9qsbmrURyHHI0yiTKM86OzsPEQO7X7E+13VTQQ6fFONmpJ6OQgSLvj0nIKDoE5S2Nks4Pxx6ecDz20WaDsFO49KfY72DN2kG9NswFHDVxESTh025LOQjRmduyjz+i4y2qxu2CApB8/fyPHmrRx8ue78qw+sept0sMYQ4nkCXJl8Wr4igoTXYrH4hOe2CtjhVqRP1zy3EdBm1dR1wvX9u0gmP9TJVzoneoo4wTyxYituj/dB8XHANI1v2iin9R358SgrIq/ZGKGygIknuwUdvO2FBI2LscRrrnCpO0AHx2PtuUYQGlwsm68IDfnMp7wdwr+3lAuyAaOEfGVSxZcMccwx9kQQ4Bb8nEDvBGV4PmnleuvEPB2zcunjqpXFYBwP6yteAzrjO1aYi0NqvgrywRwlDHwr+K9hkLtf8xUhY+bkFfH81epKP4m72oSn1A9qaV9zq8b7mLSrgS6+k8W+JUYzEOMhaRWjmLsNB7/xcgLcKXEsMV+FShKuGyI3QkEuGGknf7MIJl/Je7v4vshNp3LdgBrmPELlo/pfk04U5DtS7JYtFyqpIM5XwdwBQiXc/bmuGct42Yg3C54XUI5YcpUd+JyCzj+EfMXKLMD9xHZ2sAQG+hLlKH9EDZ6oLrm680R5bqtAiHmOtvgNZcSaQz4yMvZ7hnLeYK1cIb/faKtk5ZDNoM3zUufPheqvOdRvsA1PEW97qH9mOPpQc1CMjDfK+1WCuw1GfuFARKlawP2wbmId4Ja8ritjjZ6msI0fxQgjBxJ8sxP1wNRHE3TTTtBhq1Oo5ONmp8Ort/LU1yi0rDp668QC5mxb3TCiW2N3z4CD0u+MDBkyZMiQIcPDi38APrqzWc/ilDcAAAAASUVORK5CYII=>
|
||||
|
||||
[image22]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAXCAYAAACS5bYWAAABtklEQVR4Xu1Uu0rEQBTdLQTBQhAxuHlMHiIIdgu2WtgI2qgfYG9nIxaCvR8g2FhZ6B8IW9hZbC0IaiNWNguLCgohnpudyV6vikkWfEAOHMicOXfmTJi5tVqFChUqZPA8b1sp1XZdd9b3/eEgCBS0M9Kl9ztgnS1wUup5gdoLMCEiy4mcN2FTA2NL+vJAr1UqLOpix3HGzBhhN6B1uMdssAse4nsdUv2doQDKhkXdIuqOpQ7tGZzJBNoAXGGe0hggLNW9SJ3CYi7MhL8Qlt6Lvn6JbdsOaXg7c59eA9yPU0w8gJvgq/qdO9sygcEu1rqTHhN2h2tUAP2IaxyYX2IL5yJ/PF8BviteE4bhtPR8AIz3ZK4VfGxl/2yz2RzSB5rCsI7vGxOYWmlmpN7aL+sBpnNtLrRx2bCouaZariHXvM5wmQo4ia2FLjdifPvDYZNGozEudQTew9xTOsAvtsiITQ64SfX6G12DQhgkrOL9tK+vgm0udCzLGjFjuiO6eC0z5UTZsPTAURcLme5uHEXRhBSpXT1q0p9e5gYJLL6gD5SbeNmjch0OePa1l1pomsP03AoV/iPeAJgMqhdN7XcAAAAAAElFTkSuQmCC>
|
||||
|
||||
[image23]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAYCAYAAAD+vg1LAAABhklEQVR4Xu1TsUoDQRQ8MYKijcVxBO9u72zETjhEsBK0tZFACj9AsBQUtBT8gTQ2gljY+SGWNqKNhSBYiSCxU3Qmvo17L5tEErAQBx57+2Z29u3uuyD4x99EURRjxphqlmUrmnMBfgm6uzzP5zTXAQgPEU3EB+JA8xYw3Qd/k6bpMbWa9wLCeYqxaFZzFuRhviUFvGveCwgbvarghv029gKLnhCPOm8Bbkc2HtFcCVEUTUJ4gbjEdFSOd6R1yC2jyhrGW6m4xgh8G4A4heiZpHQDTb3HRG5VjN8Q945xh3CPJjS0OczPmXN1Gt1OZFERAY/fhulzv+jZiOuSJFnUXAsgN+XIayrfsxro16nhu2iuBfTgGQUYx23uJ21kvh65+1WBPNECVmpz/I7jeMblJc+retD5NkDmYlLhHJUvcI54Ff6ltEAgmobOlwCzuggZu2674ZGM1uOKpslhLDQ3FPjQNNb5QWHb8tp8/53DA0ZVMd7gGIbhlNYMDBhuI67QJROa+zV8AvT3eQaeHmMbAAAAAElFTkSuQmCC>
|
||||
|
||||
[image24]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAYCAYAAAD3Va0xAAABGklEQVR4XmNgGAVDHMjLy/fJyck9AtL/QRjI3oEsr6CgwAEUfwWTB+IvQDW5yGpQAFDBP5hiIJcRi/wkoAHG6OIoAKhAEKhwK9D2BqhhOehqgGLPGbBYgAKAiqKBhtkAmSxQg/5hUfMVXQwDABWdBlIsUPYJkGGysrI6MHmgJUpAPB+uARcAavyNxFaEuuo6klgrseGzBlkM5A2QYUpKSvxQPih88AN5RPjAATDQPaCuWg5V8wlZHiuQRwofNHGQQaB0pQSk56DLYwB5LDEEAkDxKVDD7isqKuqjy6MAKSkpEaDCrejiICAjI8MJcxW6HAYAKjoPdPoCdHEYAMpfAeK36OJwANS8AWYbkq0YqVYekhR60cVHwQAAAIOtT/k7msvBAAAAAElFTkSuQmCC>
|
||||
|
||||
[image25]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJcAAAAYCAYAAAD3eW90AAAE0ElEQVR4Xu1Zz2sVVxR+wR9UWixiY8ivOfmFJVG0EKRQuijVhVl0o4KCf4AgrgSVdlWELNy4UEEQQV2IiG66KC00C90VsnETIlIhFbFQEEFU8Gf8vjfnvtx35s7zxTd5k8j94PBmvnNm5rv3njn3zn2VSkRERERERERERETEp4nx8fE1ItI9MDDwg/X5gP9bxN0fHBz82voiIjJAspyEPYPNw36xfgck1s/wzyZJcp6x1t9OQMMDaHikmuf7+vrWGf9l56Mx3veXha6urs9V+/9OG+gOPwbcX7522H3fXwZGRkbWQ8cLpwm5cMrG5AIXjPIiNHzI+hz0pof0AW+tv92AhoOw31XPOesnwD+3XCtghbfcxwC6JtHXt1X7EetHP38Gfs7yZQCzFKTIE+98m+qucQ2BwDO8wPIOTDr6GyVfuwE90zoIbGhGO7XCLlm+FeB5Vzo7O7+w/GIBvf/hZ7Vqf2f90P097ITlywD0zcH+qXgVFufXqB39ccALDQOBj7XBQcB3VAewroSXCeh5rb+uobuNn9Vh3OdaRcHJxd+/qb2/v3+r8d/EVN/rc2UBWt5RI2zCcexX5W55oSk497MBbBxOV2ngpI0D9x1utA+/dxnDY1ql5CSDhg3Uz+OhoaEvVX9dmZZ0AAvVWURy6SxQ7Wv8cs6h9lk/RvTFWQ5A/26GnjM+x8qquqd8no5LOhAd+pXIoOCUB26nJtcb2L9ecpUKaDnIBnrnD9kGrAe6PK7Q9RZRRHJJWlFrfY3zl9TufZRwupxz/uUI6P+TmusqLsjjJP2FKc6vkqsFBUA/O8XyeeDgwy4swk7bezQC4qfxs9qdJwtlmpXYVYeLtQsKQkHJVbf8wPke1X6N51oVjvoxywneTPGHz7sFZHUAHOQD6y1WA16HLN1hfWVBAtOG6NqgkrZzErq3B2LOMhEtb6EfCt0Bu4EKMxLgu+098iCBvqZumh7f9Csw0CELWxev7LZLCDpmGY0hY1vt9Y2Aa97CbliS1YTT3y7Dz0uDqoT4nxjDdZr1lYHEW2/5AHeEOtFZv0q2OkyoPW8mudymcsBaSi6tqJm+BndOUu0HxLw4kk6Rq3gM/37G+f4Qliq5oP8eZz/LV0u6NqB2M21scL3lIOnC/4MN8iGLnxbrFoyNAP2H7Aui4Bs+r/bUOglpMrny0Oq0yHbCRi3PaqS6X4rZNCWP517nsVZUxjWVzEUCz5xicnsUZ4h0QY+DixTmOclNOo7Hoc9fSafNh5YvC9Ayk/e2JbrQlJxklfKT67HlHOCbpXa+PNbnwPHR8aqtN9sBPPOCfaHZj4nbixP97K2oMDTiGx2I6leV5L/tuYPVbqAxY9STt+4YHh7epHoz1YFgW8tKLjz7R+3/6hRnAV1b6O/p6fnK+hwk/fstOy0tIVittE8zVrcON4HH/K0IbvN796wiSdc3nDY/ekCKwNjY2FrbMMn/yye3ykoJydXb27sxoD3zlw8B/oXlHJhUedctJQLaa8b8sPFNg6WQN7H8SoWUkFxFALr3umkJx6Pma3JFwW1ZzMjCLv4ngVaTq1Lwjn8zYDJJuvFa3cBGgv9mY1YMJP1EZXJVN/fKeFOLRqLbKb7ZmOUKq3slaQ8CDTgMu5O3cI6IiIhoC94DOJPKudSTLY0AAAAASUVORK5CYII=>
|
||||
|
||||
[image26]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAP8AAAAYCAYAAAA1SSvwAAAIYUlEQVR4Xu1cXahUVRQe0aDo/8dueu89e67euhQEwaXCioj+0Ad7SCPIiKKHIHoqupKPiS89RIggiBASEpgYEUGED5fqIRTKF1FSocIUjLoUKqnp7fvmrDWuWXN+ZsY754x6PtjMnG/tvc/ea++1ztr77JlarUKFChUqVKhQoUKFChUqVKhQ4TLA5OTkNWNjY497vkJviKJoCXCz58sC2nLPyMjIbZ6vkIx6vf4wbcLzuWChEMIiVPCEl1nwBsh3BEY34WVFQtp73vMVLg1wAD8PDw+PeL5oYH49hPHd7XkPzMdrke8DtPs3fO6Es7hOZbjeavN2AtR3C+q4G/cPXnY5AH2e6cqBo8D7SCeRZpHWebkCinkP8gNQ9Gbm9fIiQcPHJL3d8wRkPyIdk/7McmLI5PhLuUGY4GVhfHz8pozxWyCyeV5QFBYuXHhDRvsawHjeZ8b3BXLyQDiMtAppBvP1DV8uCyjzPdJZqfdeLx8USN9/9TzRie7awM6KIpd4mYJyKlSUU9pTF21ci/S15y0mJiZulHZOexn6sIeyNOdxJWLp0qV3csxEJ43k8yggW4/0peeLAu59CGO03PMKyD9h+0dHR5/zMgKyU5QvXrz4Di/LA8ptyNJNWcB8f9qOXUgxfgK624H8H3k+FahsY1an6RQoz3IORYHtQGg27HkLToy0CaJ9pRPxsqsBnDhZYy2hNOULvKzfQLg9lNU2yLZQzmWBlykgfzurjiyg3HGkPz0/SGDfOIaeV9DpddV/dpgd97zCKLS0cJCAwU520jHk2c18Q0ND1yfIDlCW9XS5ksGJk6dDyE91GjYj32ues4ChPuu5NGB8P8a993qeqMf7TbMhJypBHSuRZ7/nO4HUv9HzgwRpY6rxE8zDaMHzDdAokGEn0g+4nC8VbvD5wD2CSlbj86BUuJqpVpITkDbnDqz0p22C65oIacbLCE5UyI5QL1wbW1mI15L7PE+HhI/5/M7daerKyhVRvFbbx7qRFnl5UQidGf926sHzSUC/ppA2e55AHW8hbfF8GpD3XJrTYZuZ8na0afxpdWD5Myr6P0JnYmUa3YaU9T6XiSF+qByUMS8F0sY84/+ObfW8eldO/nmyScLKEkN6cE+J8f/HGxrjLwVow3EM2jbPW4hjY59aOo92Pyr8LssTqPMukb3Ea6OXVbzm5A6xI1xLXsupMwH/GK9D7Dh43TI5QhyubjfX/zK8tnmKQujM+Nfk5bGox5vBLUYeYsPvasc9SXcE9UsZ0i9e1iHmoexZtPMLJUQPzTkSMtb7IXb8TWeI73vLeuMlesgzfvblVAsJJU6xsPWeIfbyiZ1WyA3bIoM0hHjycMJ3mj70dSSB7aABet4CeVYwH9KJ6OJOP68vJD01+GpE6n3Z8uCmWaYW74AzQrKc5mkYiTFkTjLeq/n0oIwcHQWv1YEMsvHTAPPyeFgHEHowfBOVtUVFQZZxaU/0PKDseZTdY7koXh40xyFkrPeZT52S6iakRAj9htw70/i1b5ZrvMYJMpEV7DA7bjkL3YQZHR190MuKhgzCSs9bhNhA29b74GaCMVzHt010W4/uHIv+Npk8e32dIR6Y5mYZrhdJufPiYHKXTLI7z3K5SZ1Kp2D72B7PW/Ri/IQ4gEOhS8MncM9bec+k/oA/SlnoweBQZhPL+t1/NRCtU74nrvdFxrk3lfQA8ejz+LEt3Rl/kKdU5DYCpLLUp7pW5I2pDEj784yf/WmbuOD2C980TJ1wSF+ZrA2AO2friST0ZBmTh2V36rVwreFWzDUcjCbU8YzPY9HnyTOQxq+vZ5P6o21mf73Mgu320YGUS3L63D9qOAWe+5B8ic4lSOShKcp5ldbn8WMbujN+KGUbCRtuRh28wguiJM9nIXQf9id6XA9pa2rYb0LHaS8TvqUfOsmRVlheQ/XInCcIMgH02qz3m85UlhCpfUG9y+V+mYPXT/DeXg8evRi/GH5fwv4o3qfKnKcE8hyruchK6mzb/AJ3gUm+r+ukv0HOw3SSt1+Q+2fOnzbjx8VW3+hgNjn4Pen9eYiXBUc9XwbYFjoxzysgf5798e/3+bQWpXnjV+fnN+h40MXvjdBomko3jqM5WfF9kz1eievPE/Jwj6Ut0igK0o/MyRsGbMNPnqR8cO3wMgXKTflxJ6Rcy5zBPB8nr+cFQrysaKz3g9lUxPfXpU3NaDPEcyxxb6AIsD0hx/iD3/DDxRgL1iTshUIekIoamfD5TzOzgeRJfZoViZDzqi/ER3tnGUJaXg8+SP91N1838bgWb4Zx3NtgPn++G9ynoXWzT0PBZbym0UOn31ws0cjDPYHme2l9i9DV+es5Bu5/QvWQhhA7qFQ9W9DoogJe9fEebDc+X/EyOgWkVz1PUP9If+g1z//LuL1j8vBU4HTNbO4KTyM6rNfCnck6ZNRvSNt/97xFiF/1tT5goKAXpTDTu/ZVn5/shD4xk7xxGUBblrE9Cfxp0y9NZ1yez4Tnp9355zmHv7UcdPRtLWVTLsgBIUkrrD7rbjdZ0FI30mn745OiYELqk1H7bx3awuwQG8MazyehPoeHfELsYBMP+RCQPSlttilXp8izy+Sf8Wc1zIOw7RwBuJ9M2VJ+F2KiTPsG6yw5n5cgH8nr554RyZliz5cJtidpeVJhblAv8XhvuBidVugRXR/vddBXgtwdZ5jd8mqwbKA966OcH/ZU6B3UL8NozxcF3P9Y/So9ej0X4NhxDD3fEUL8CoLG39g86/ZVRBEIGT/prXBJKP0nvXroyvMV8iHLu0v7xS0qeBNpX95aqixUf+bRH0SX2Z95VGhF6PbPPC5X0AFgklR/4zVH4D7KIE2c6m+8ugN0db/frFT8D4PsXrAZRAtNAAAAAElFTkSuQmCC>
|
||||
|
||||
[image27]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAAAYCAYAAAB3JpoiAAAD6klEQVR4Xu1ZTWsTURRNUUFRUcGQtrZ5SQgUxF1QEdwpgviB2CIILhQXStVNixULgi660KUKQhFciVJ/gaXU4kKELtzYjdpFQV1YpCC2i/oRz0nuG29uJkmFOK0mBy4z79z7vs68d+dNEos10UQTTTTRMHDO9VquHkgmk5cs1/CA2GPpdHqX5esBtov2n1i+YQEx+lOp1Ijh2mBzsIPwbWYZ15u4zug4ib0My4t9ALXKxqDuKFb6KctHDYxhuxprHuUTNiYMiLuC+MnOzs4dmMtaLCIH7il5G1sAgj/DXloeWM2OcW3RpCsKHgxMbNHGUUgM4qgqtzI2l8ut0XEsh/UTJdB/N2xclc/KvMZ0XBhEcK1F1XotEtBnHeDuwiZCeAr+CnYL1sunamPIwbdgeXAPYbdD+CnUuW75qCAaPDPce+HTmrcQwa/BhnHfE6u2cBCQY6PYBgnrIw//3hCegk9YXkNi8h0dHesMT8GHNEdwJ4D/afmoIMKW6OBXbsXUIKAfdsTyJUDAPj4NNDgujfbI0/H+LeTDVu9SBI/93jls4yQJnzpsSiG6uro20pdIJNZbXxTAGI+h/0HNoTwkcyjb/RpLEpwdiODfYTO8J+f9XNnsTNfxEMHfiZg3cH3tQnK4K+ZFDpj2g9dqgtLPHWf55YIrHgzKdqkFBYcOI4j9BLtALVyFHF5YhQg+Zx1+O1mecEXBpw3HfDevOeGZ2/Le0O6AjfGQmOOW15BdMvwnlslkNtl2agGa7Jbx9FufhQh+VXOsC/6B5oL83d7evrXEEQu2U5mAlYDYQbbFo5HiZv1AcH9HJlBRdPFVzZdRwKc+2EXrWyqcvHBjetfzCQhZBhGwkuBspOQ8zRymBZMd8lbHMJ140TXvsVIEd8X0t8fylVDhPTchc23T5DxsSsUFqJFSykRDuU8LhvuZsFQFPm3reki7dU8p2Ww2btupBMTPIWdnfRnzybgqL03EbnPFcX/RPMrTwgeC2/M3P3KCjx90tJ9+X9aQerOG43EvOFbhftKFnLf9acTyBHmmOctHBfT9Bouk1XA8gQRjktx+yJc5Xxn3Pc8R4BZK5hmPxzfoCbIzfVxLVjkWsnF0dEBR/uEFb2bUS5GzLyzQz2HnNUf4BxHWXxRA3/dlDmXGsam4Akf9FDenT1/Qxklct+cKSEoOp4Ud18gnQz58CPjGpO5HXlPm9xYCL9CdErOo4k7bOEI+fL5ZPip4HcJMx0GPx+BeaC5WXHCc41cx6nbYxNQGKj5ytT9w6gK3zJ/2KwJR/agUVT//BLA1BsLSRT2B9kedzXeNDNf8AyJ6uL/0FxtW9xnL/Y/4BXt7gft5jDSHAAAAAElFTkSuQmCC>
|
||||
|
||||
[image28]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEMAAAAYCAYAAAChg0BHAAAC2UlEQVR4Xu1XPWhUQRB+RyIoCiJ4HLm/vZ9CFAvhUMFGiTYptIgBCxs7wVJQ0VJIY2GRJkQEsbDTNBZiJ9jYxcKgiCmUgJUIop0mft+7mbu5yb0cirknuffB8G6/+XZ3dt7u7LsoypAhQ4YM/x6tVmtHCGGiVqud8j4L+I9Dt1Kv1w9437YAFncb9h22Drvl/Qok4ib8b6vV6jy13j8kjDEGiXUdMT30AgIxHlIN7FepVCp7TSLQ4SA7YpCG9ylk8ss6gfcPATmZd0wJtNcYj9FElUrlHLgnhor7YTcfM1wyIJ7zg1owSYOStdXA3GflRSwrh98vhJsy3BoeOW0TSNBR8F8slwgKYZ89r4DvqiSrZ5JhgltdXsi8cmi/JMfFGo7JmdQ2Icnov75CobAbzsewV1H7HHKAWa8DdwKTz+D5TgKZoUUpJsVC4u7Z0Wh/FX7Rcn2PCRbzgE78zMktEg/Y7wiAOy3J+An7aJKRKiTuJcZdLpd3WV+j0dira1JDrTtpNTGwkOt0cjDl0H5Ezuo8ZNANOycJ0F6E3fsDu+vHSIJc73dgH2iRKagKHIvDoTchS14zLg4ejQ7CgHqB7VVgP3su/xcEKaDcDcqxpsDei39SE6KcduTbInmmQ7Z5ihPfulZx1hnvSxtSGBn/KtvNZrPCttdhDZ/IF4vF/THBDxQSeO40ooFXZmgX2g0TbAZJvD8Km9mcH8MDmmeMw+2CFjmatG8Ec/VaUEO9Nu5rJyOYVY6/UYxK1i88j1Gc+TShi4ZNG25KuDi+0H4Jfb8nqEMy9mmjTgI/x9nGDjkiA/0Q/7du1y5EM/DNbTUQw1PEvOC4FcaHuhaE4tcm4z1vdeh3Cdwby5G8IGLaNXu1mgE7YCbp62yvlIFYFiXeVY3b/+/gVas+rRV4PreavwKLLQfz/ChBr+Dl0P1KHU1g8ROSjGk+8/n8Hq8ZKSAJV2Cv/aduhm2I38YfDzwGut3uAAAAAElFTkSuQmCC>
|
||||
|
||||
[image29]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAUCAYAAABroNZJAAAAiklEQVR4XmNgGAWjYKCAlJSUiLy8/CR0cSTACJQ/jS6IAhQUFBqAihTRxZEBUP4JuhgcGBsbswIVPEMXRwdycnLaQDwdXRwEQM78CzIIXQIbAKqdBcRBcAGgF/yBAv+VlJTkgLQkCXgaEF+n1JBFQHwe7hoGSr0DAyQG7AR0cTigOIpBgCqJjRwAAEhNK6wKyJLwAAAAAElFTkSuQmCC>
|
||||
@@ -0,0 +1,97 @@
|
||||
# **RVW V2.0 融合实施作战计划:架构与功能的统一**
|
||||
|
||||
**核心策略:** 以“数据侦探”功能为矛,刺穿技术壁垒;以“Skills 架构”为盾,构建系统底座。
|
||||
|
||||
**执行原则:** 垂直切片 (Vertical Slice) —— 做深不做宽。
|
||||
|
||||
## **1\. 优先级决策 (Decision Matrix)**
|
||||
|
||||
我们不采用“先搭好所有架子再填肉”的瀑布模式,而是采用\*\*“以战养战”\*\*模式。
|
||||
|
||||
|
|
||||
|
||||
| **步骤** | **任务名称** | **涉及层面** | **目标** | **优先级** |
|
||||
|
||||
| **Step 1** | **Python 核弹头开发** | **Python Service** | 实现 Word 表格提取 \+ 算术/P值验证算法。这是**技术可行性验证**。 | **P0 (立刻开始)** |
|
||||
|
||||
| **Step 2** | **Skill 接口定义** | **Node.js Backend** | 定义 interface Skill,建立 SkillRegistry。这是**架构地基**。 | **P0 (并行)** |
|
||||
|
||||
| **Step 3** | **封装 DataForensicsSkill** | **Node.js Backend** | 将 Step 1 的能力装入 Step 2 的壳子。这是**架构落地**。 | **P0** |
|
||||
|
||||
| **Step 4** | **SOP 引擎对接** | **Node.js Backend** | 让 Review Service 调用新 Skill 而非旧逻辑。 | **P1** |
|
||||
|
||||
| **Step 5** | **前端可视化** | **Frontend V2** | 在报告页展示结构化的数据错误。 | **P1** |
|
||||
|
||||
## **2\. 详细执行路线图 (Execution Roadmap)**
|
||||
|
||||
### **Week 1: 攻克核心算力 (Python & Word)**
|
||||
|
||||
**目标**:输入一个 .docx 文件,Python API 能返回“第几张表第几行算错了”。
|
||||
|
||||
* **Day 1: 环境与转换**
|
||||
* 在 python-extraction 镜像中集成 LibreOffice (用于 doc 转 docx)。
|
||||
* 引入 python-docx, pandas, scipy。
|
||||
* **Day 2: 提取器开发 (Extractor)**
|
||||
* 编写 DocxTableExtractor。
|
||||
* 重点攻克:**合并单元格的 Forward Fill** (确保 "Group A" 能覆盖下面所有列)。
|
||||
* 输出:干净的 Pandas DataFrame List。
|
||||
* **Day 3: 验证器开发 (Validator)**
|
||||
* 编写 ArithmeticValidator (算术检查:Sum, Percentage)。
|
||||
* 编写 StatValidator (统计检查:T-test 逆运算)。
|
||||
* **Day 4: API 封装**
|
||||
* 开放 /api/v1/forensics/analyze\_docx 接口。
|
||||
* 联调测试:用 5 个真实的 Word 稿件进行测试,看提取准确率。
|
||||
|
||||
### **Week 2: 架构升级与封装 (Node.js & Skills)**
|
||||
|
||||
**目标**:后端不再写死业务逻辑,而是通过加载 Skill 来执行。
|
||||
|
||||
* **Day 5: 定义 Skill 标准**
|
||||
* 创建 backend/src/modules/rvw/skills/core/types.ts。
|
||||
* 定义 run(context): SkillResult 接口。
|
||||
* **Day 6: 封装 DataForensicsSkill**
|
||||
* 在 Node.js 中实现这个 Skill。
|
||||
* 逻辑:Node.js 负责调用 Python 接口 \-\> 拿到 JSON \-\> 这是一个“原子能力”。
|
||||
* **Day 7: 改造 ReviewService**
|
||||
* 引入 SkillExecutor。
|
||||
* 修改 createTask 流程:不再直接调用 editorialService,而是从 Profile 中加载 \['DataForensicsSkill', 'EditorialSkill'\] 并依次执行。
|
||||
* **Day 8: 数据库迁移**
|
||||
* 执行 prisma migrate,支持存储结构化的 Skill 执行结果 (contextData)。
|
||||
|
||||
### **Week 3: 前端呈现与交付 (UI & Delivery)**
|
||||
|
||||
**目标**:用户看到专业的“数据体检报告”。
|
||||
|
||||
* **Day 9: 报告页重构**
|
||||
* 在 TaskDetail 页面增加 "Data Verification" Tab。
|
||||
* **Day 10: 错误渲染**
|
||||
* 开发“表格定位组件”:当显示“Table 1 算术错误”时,能把后端返回的 Table 数据渲染出来,并高亮错误的单元格。
|
||||
* **Day 11: 综合联调**
|
||||
* 全流程测试:上传 \-\> Python 计算 \-\> Skill 封装 \-\> 前端展示。
|
||||
|
||||
## **3\. MVP 定义 (本次交付范围)**
|
||||
|
||||
为了确保 3 周内能上线,我们需要划定清晰的红线:
|
||||
|
||||
| **功能** | **MVP (本次交付)** | **V2.1 (后续迭代)** |
|
||||
|
||||
| **文件格式** | **Word (.docx/.doc)** | PDF, 图片 |
|
||||
|
||||
| **表格类型** | **三线表 (Standard)** | 极其复杂的嵌套表、跨页断裂表 |
|
||||
|
||||
| **验证深度** | **L1 (算术) \+ L2 (基础 P 值)** | L3 (回归逻辑), L4 (跨表一致性) |
|
||||
|
||||
| **Skill 数量** | **1 个 (DataForensics)** | 政治审查、竞品对标、方法学检查 |
|
||||
|
||||
| **用户界面** | **静态报告展示** | 交互式 Chat 修改 |
|
||||
|
||||
## **4\. 立即执行的下一步 (Next Action)**
|
||||
|
||||
**请按照以下指令启动 Python 端的开发(这是最硬的骨头):**
|
||||
|
||||
1. **确认 Python 库**:请让您的 Python 开发人员确认 python-docx 和 scipy 是否已在依赖列表中。
|
||||
2. **提供测试数据**:请准备 3-5 份典型的中文核心期刊 Word 稿件(脱敏后),放到 backend/test/fixtures 目录下,用于 Day 2 的提取测试。
|
||||
|
||||
**您觉得这个“先攻核心,顺带架构”的节奏是否合适?**
|
||||
|
||||
如果合适,我们可以先不讨论架构代码,而是直接开始写 Python 的 **表格提取器 (Extractor)** 代码。
|
||||
Reference in New Issue
Block a user