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:
2026-02-17 22:15:27 +08:00
parent 7a299e8562
commit e785969e54
31 changed files with 5925 additions and 15 deletions

View 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 视为重大错误Error0.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": \[ ...二维数组... \]
}
\]
}