feat(iit): Implement event-level QC architecture V3.1 with dynamic rule filtering, report deduplication and AI intent enhancement

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-08 21:22:11 +08:00
parent 45c7b32dbb
commit 7a299e8562
51 changed files with 10638 additions and 184 deletions

View File

@@ -338,18 +338,33 @@ WHERE field_name = 'informed_consent';
## 六、验收标准
### 6.1 阶段 1 验收
### 6.1 阶段 1 验收 ✅ **已完成 (2026-02-08)**
- [ ] 企业微信问"质控情况"AI 回答格式清晰、无幻觉
- [ ] AI 回答包含具体问题和记录数
- [ ] 日志中可看到 XML 格式的 Prompt
- [x] 企业微信问"质控情况"AI 回答格式清晰、无幻觉
- [x] AI 回答包含具体问题和记录数
- [x] 日志中可看到 XML 格式的 Prompt
### 6.2 阶段 2 验收
**完成的文件:**
- `backend/src/modules/iit-manager/services/PromptBuilder.ts` - XML 临床切片格式构建器
- `backend/src/modules/iit-manager/services/ChatService.ts` - 集成 PromptBuilder优化 LLM 格式
- [ ] 点击"质控全览图"按钮可进入驾驶舱页面
- [ ] 统计卡片正确显示质量分、违规数、完成率
- [ ] 热力图正确显示记录×表单的质控状态
- [ ] 点击红色单元格可查看问题详情
### 6.2 阶段 2 验收 ✅ **已完成 (2026-02-08)**
- [x] 点击"质控全览图"按钮可进入驾驶舱页面
- [x] 统计卡片正确显示质量分、违规数、完成率
- [x] 热力图正确显示记录×表单的质控状态
- [x] 点击红色单元格可查看问题详情
**完成的文件:**
- `frontend-v2/src/modules/admin/pages/IitQcCockpitPage.tsx` - 驾驶舱主页面
- `frontend-v2/src/modules/admin/pages/IitQcCockpitPage.css` - 驾驶舱样式
- `frontend-v2/src/modules/admin/components/qc-cockpit/QcStatCards.tsx` - 统计卡片组件
- `frontend-v2/src/modules/admin/components/qc-cockpit/RiskHeatmap.tsx` - 风险热力图组件
- `frontend-v2/src/modules/admin/components/qc-cockpit/QcDetailDrawer.tsx` - 详情抽屉组件
- `frontend-v2/src/modules/admin/types/qcCockpit.ts` - 类型定义
- `backend/src/modules/admin/iit-projects/iitQcCockpitService.ts` - 驾驶舱数据服务
- `backend/src/modules/admin/iit-projects/iitQcCockpitController.ts` - 驾驶舱 API 控制器
- `backend/src/modules/admin/iit-projects/iitQcCockpitRoutes.ts` - 驾驶舱路由
### 6.3 阶段 3 验收

View File

@@ -0,0 +1,583 @@
# CRA 智能质控引擎开发计划
> **版本:** V1.0
> **日期:** 2026-02-08
> **基于:** V2.6 综合开发计划、CRA Agent 业务逻辑与执行架构书、Skills 配置实施指南
> **核心目标:** 实现基于规则的智能质控引擎 + 报告驱动的 LLM 问答
---
## 📋 目录
1. [背景与目标](#1-背景与目标)
2. [架构设计](#2-架构设计)
3. [五大规则体系](#3-五大规则体系)
4. [当前代码现状](#4-当前代码现状)
5. [开发任务清单](#5-开发任务清单)
6. [数据库设计补充](#6-数据库设计补充)
7. [验收标准](#7-验收标准)
---
## 1. 背景与目标
### 1.1 业务需求
针对 CRA临床研究助理的质控工作基于 REDCap 系统的数据结构,建立以下规则体系:
| 编号 | 规则类型 | 说明 | 来源 |
|------|----------|------|------|
| 1 | 变量质控 | 针对每个变量的数据校验(空值、范围、格式) | 自动从 Metadata 同步 |
| 2 | 入排标准 | 判断是否符合入组/排除标准 | AI 解析 Protocol + 人工确认 |
| 3 | 方案偏离 (PD) | 检测访视超窗、漏做检查等 | 人工配置逻辑 |
| 4 | AE 事件 | 检测未报告的不良事件 | 预置医学 Prompt |
| 5 | 伦理合规 | ICF 签署时间、隐私保护等 | 预置硬规则 |
### 1.2 核心目标
```
┌─────────────────────────────────────────────────────────────────┐
│ 🎯 目标:报告驱动的智能质控 │
│ │
│ 后台预计算 → 生成结构化报告 → LLM 阅读报告 → 回答用户问题 │
│ │
│ ✅ 快速(报告已预生成) │
│ ✅ 全面(后台执行所有规则) │
│ ✅ 省钱LLM 只做阅读理解) │
└─────────────────────────────────────────────────────────────────┘
```
### 1.3 与 V2.6 计划的关系
本计划是 V2.6 综合开发计划的**专项实施细化**,聚焦于:
- Phase 1 的 `HardRuleEngine` 深化
- Phase 2 的 `SoftRuleEngine` 实现
- Phase 4 的 `SchedulerService``ReportService` 实现
---
## 2. 架构设计
### 2.1 整体架构
```
┌─────────────────────────────────────────────────────────────────┐
│ 触发层 (Trigger) │
├──────────────────┬──────────────────┬───────────────────────────┤
│ 🟢 Webhook │ 🔵 Cron │ 🟠 Manual │
│ REDCap DET │ 每日凌晨 │ 一键全量质控 │
│ 单记录实时 │ 全量扫描 │ 按需执行 │
└──────────────────┴──────────────────┴───────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 🎯 SkillRunner (调度器) │
│ │
│ 1. 加载启用的 Skills │
│ 2. 根据 triggerType 过滤 │
│ 3. 路由到对应 Engine │
│ 4. 聚合结果 │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ HardRuleEngine │ │ SoftRuleEngine │ │ HybridEngine │
│ (已实现 ✅) │ │ (待实现 ❌) │ │ (待实现 ❌) │
│ │ │ │ │ │
│ - 变量质控 │ │ - 入排标准 │ │ - 方案偏离 │
│ - 伦理合规 │ │ - AE 检测 │ │ - Hard + Soft │
│ │ │ │ │ │
│ JSON Logic │ │ LLM 推理 │ │ 条件分支 │
└──────────────────┘ └──────────────────┘ └──────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 📊 结果存储 & 报告生成 │
├─────────────────────────────────────────────────────────────────┤
│ iit_qc_logs → 详细质控日志 │
│ iit_qc_project_stats → 项目统计摘要 │
│ iit_qc_report (新) → LLM 友好的结构化报告 │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 💬 用户问答 (实时) │
│ │
│ 用户提问 → ContextBuilder 加载报告 → LLM 阅读 → 回答 │
└─────────────────────────────────────────────────────────────────┘
```
### 2.2 漏斗式执行策略
为每个受试者执行以下管道,**分级检查,逐层深入**
```
┌─────────────────────────────────────────────────────────────────┐
│ Level 1: 阻断性检查 (Blocking) │
│ - 伦理合规 (ICF 日期) │
│ - 关键字段缺失 │
│ 如果 FAIL → 直接标记 Critical跳过后续 AI 检查(省钱) │
├─────────────────────────────────────────────────────────────────┤
│ Level 2: 基础清洗 (Hard Rules) │
│ - 所有变量质控规则 │
│ - 生成基础错误日志 │
├─────────────────────────────────────────────────────────────────┤
│ Level 3: AI 深度监查 (Soft Rules) │
│ - 入排标准判断 │
│ - 方案偏离检测 │
│ - AE 事件核查 │
│ - 输出证据链 │
└─────────────────────────────────────────────────────────────────┘
```
---
## 3. 五大规则体系
### 3.1 规则类型与执行引擎
| 编号 | 规则类型 | 执行引擎 | 触发时机 | 典型示例 |
|------|----------|----------|----------|----------|
| 1 | 变量质控 | HardRuleEngine | 实时 + 定时 | 空值检查、0 < BMI < 50 |
| 2 | 入排标准 | SoftRuleEngine | 定时 + 人工 | 确诊时间 < 3个月 |
| 3 | 方案偏离 | HybridEngine | 定时 | 访视超窗 (Date2 - Date1 > 28+3) |
| 4 | AE 事件 | SoftRuleEngine | 定时 | Lab 异常 vs AE 记录一致性 |
| 5 | 伦理合规 | HardRuleEngine | 实时 | ICF 签署日期 > 首次访视 |
### 3.2 Skill 配置示例
#### 3.2.1 变量质控 Skill (HARD_RULE)
```json
{
"skillType": "VARIABLE_QC",
"name": "变量质控",
"type": "HARD_RULE",
"triggerType": "webhook",
"config": {
"engine": "HardRuleEngine",
"rules": [
{
"id": "VQ-001",
"name": "年龄范围检查",
"field": "age",
"formName": "demographics",
"logic": { "and": [{ ">=": [{ "var": "age" }, 18] }, { "<=": [{ "var": "age" }, 80] }] },
"message": "年龄必须在 18-80 岁之间",
"severity": "error",
"category": "lab_values"
},
{
"id": "VQ-002",
"name": "BMI 范围检查",
"field": "bmi",
"formName": "demographics",
"logic": { "and": [{ ">": [{ "var": "bmi" }, 0] }, { "<": [{ "var": "bmi" }, 50] }] },
"message": "BMI 值异常",
"severity": "warning",
"category": "lab_values"
}
]
}
}
```
#### 3.2.2 入排标准 Skill (LLM_CHECK)
```json
{
"skillType": "INCLUSION_EXCLUSION",
"name": "入排标准核查",
"type": "LLM_CHECK",
"triggerType": "cron",
"config": {
"engine": "SoftRuleEngine",
"model": "deepseek-v3",
"systemPrompt": "你是一个专业的临床研究监查员,负责核查受试者是否符合入组标准。",
"checks": [
{
"id": "IE-001",
"name": "确诊时间核查",
"promptTemplate": "基于以下数据,判断受试者的确诊时间是否在 3 个月内:\n{{#demographics}}\n{{#medical_history}}\n\n请给出判断结果 (PASS/FAIL) 和理由。",
"requiredTags": ["#demographics", "#medical_history"]
}
]
},
"requiredTags": ["#demographics", "#medical_history", "#lab"]
}
```
#### 3.2.3 伦理合规 Skill (HARD_RULE)
```json
{
"skillType": "ETHICS_COMPLIANCE",
"name": "伦理合规检查",
"type": "HARD_RULE",
"triggerType": "webhook",
"config": {
"engine": "HardRuleEngine",
"level": "blocking",
"rules": [
{
"id": "EC-001",
"name": "知情同意书签署时间",
"field": ["icf_date", "first_visit_date"],
"logic": { "<=": [{ "var": "icf_date" }, { "var": "first_visit_date" }] },
"message": "知情同意书签署日期必须早于或等于首次访视日期",
"severity": "error",
"category": "ethics"
}
]
}
}
```
---
## 4. 当前代码现状
### 4.1 已实现组件 ✅
| 组件 | 路径 | 说明 |
|------|------|------|
| `IitSkill` 表 | `prisma/schema.prisma` | 已定义,支持 triggerType |
| `IitFieldMapping` 表 | `prisma/schema.prisma` | 字段映射表 |
| `HardRuleEngine` | `engines/HardRuleEngine.ts` | 基于 JSON Logic支持 formName 过滤 |
| `QcService` | `services/QcService.ts` | 基础查询服务 |
| `PromptBuilder` | `services/PromptBuilder.ts` | XML Clinical Slice 格式 |
| `RedcapAdapter` | `adapters/RedcapAdapter.ts` | REDCap API 适配 |
| QC Cockpit UI | `frontend-v2/.../IitQcCockpitPage.tsx` | 热力图 + 详情抽屉 |
| 字段元数据同步 | `iitProjectService.syncMetadata` | 含 Form Labels |
### 4.2 缺失组件 ❌
| 组件 | 优先级 | 依赖 | 说明 |
|------|--------|------|------|
| `SoftRuleEngine` | P0 | LLMFactory | LLM 推理引擎 |
| `HybridEngine` | P1 | HardRule + SoftRule | 混合执行引擎 |
| `SkillRunner` | P0 | 所有 Engine | 规则调度器 |
| `QcReportService` | P0 | SkillRunner | LLM 友好报告生成 |
| `iit_qc_report` 表 | P0 | - | 报告存储 |
| 定时调度 | P1 | pg-boss / node-cron | Cron 触发 |
| 增量检查 | P2 | - | 数据 Hash 策略 |
| Rule Studio UI | P2 | - | 规则配置界面 |
| 默认规则配置 | P0 | - | 5 大规则的初始 JSON |
---
## 5. 开发任务清单
### Phase 1: 核心引擎 (Week 1)
| 任务 | 优先级 | 预估 | 产出 |
|------|--------|------|------|
| 1.1 实现 `SoftRuleEngine` | P0 | 2天 | LLM 推理引擎 |
| 1.2 实现 `SkillRunner` | P0 | 1天 | 规则调度器 |
| 1.3 扩展 `IitSkill` Schema | P0 | 0.5天 | 添加 `requiredTags` 字段 |
| 1.4 创建默认规则配置 | P0 | 1天 | 5 大规则的 Seed 数据 |
#### 1.1 SoftRuleEngine 设计
```typescript
// backend/src/modules/iit-manager/engines/SoftRuleEngine.ts
export interface SoftRuleCheck {
id: string;
name: string;
promptTemplate: string;
requiredTags: string[];
}
export interface SoftRuleResult {
checkId: string;
status: 'PASS' | 'FAIL' | 'UNCERTAIN';
reason: string;
evidence: Record<string, any>;
confidence: number;
}
export class SoftRuleEngine {
private projectId: string;
private llmClient: LLMClient;
async execute(
recordId: string,
data: Record<string, any>,
checks: SoftRuleCheck[]
): Promise<SoftRuleResult[]>;
}
```
#### 1.2 SkillRunner 设计
```typescript
// backend/src/modules/iit-manager/engines/SkillRunner.ts
export class SkillRunner {
/**
* 按触发类型执行 Skills
*/
async runByTrigger(
triggerType: 'webhook' | 'cron' | 'manual',
projectId: string,
options?: {
recordId?: string; // webhook 时必传
formName?: string; // webhook 时过滤相关规则
}
): Promise<SkillRunResult>;
/**
* 执行单个 Skill
*/
private async executeSkill(
skill: IitSkill,
recordId: string,
data: Record<string, any>
): Promise<SkillResult>;
}
```
### Phase 2: 报告系统 (Week 2)
| 任务 | 优先级 | 预估 | 产出 |
|------|--------|------|------|
| 2.1 设计 `iit_qc_report` 表 | P0 | 0.5天 | 报告存储 Schema |
| 2.2 实现 `QcReportService` | P0 | 2天 | 报告生成服务 |
| 2.3 集成到 Cockpit UI | P1 | 1天 | 报告查看入口 |
| 2.4 实现 LLM 问答集成 | P1 | 1天 | 基于报告回答 |
#### 2.2 QcReportService 设计
```typescript
// backend/src/modules/iit-manager/services/QcReportService.ts
export interface QcReport {
projectId: string;
generatedAt: Date;
summary: {
totalRecords: number;
criticalIssues: number;
pendingQueries: number;
passRate: number;
};
criticalList: QcIssue[];
warningList: QcIssue[];
llmFriendlyXml: string; // LLM 阅读版
}
export class QcReportService {
/**
* 生成项目质控报告
*/
async generateReport(projectId: string): Promise<QcReport>;
/**
* 获取缓存的报告(用于 LLM 问答)
*/
async getCachedReport(projectId: string): Promise<string>;
/**
* 构建 LLM 友好的 XML 报告
*/
private buildLlmXmlReport(stats: ProjectStats, issues: QcIssue[]): string;
}
```
#### LLM 阅读版报告格式
```xml
<qc_report project="PD-001" generated="2026-02-08T10:00:00Z">
<summary>
<total_records>50</total_records>
<critical_issues>3</critical_issues>
<pending_queries>12</pending_queries>
<pass_rate>85.2%</pass_rate>
</summary>
<critical_list>
<issue record="P001" rule="EC-001" severity="RED">
<description>知情同意书签署日期(2026-01-15)晚于首次访视(2026-01-10)</description>
<evidence>
<field name="icf_date">2026-01-15</field>
<field name="first_visit_date">2026-01-10</field>
</evidence>
</issue>
<issue record="P003" rule="IE-001" severity="RED">
<description>受试者确诊时间超过入组标准确诊日期距入组已超过3个月</description>
<evidence>
<field name="diagnosis_date">2025-10-01</field>
<field name="enrollment_date">2026-02-01</field>
</evidence>
</issue>
</critical_list>
<warning_list>
<issue record="P007" rule="VQ-002" severity="YELLOW">
<description>BMI 值偏高(42.5),请核实</description>
</issue>
</warning_list>
<by_form>
<form name="人口学" total="50" pass="48" fail="2" />
<form name="实验室检查" total="150" pass="142" fail="8" />
</by_form>
</qc_report>
```
### Phase 3: 定时调度 (Week 3)
| 任务 | 优先级 | 预估 | 产出 |
|------|--------|------|------|
| 3.1 集成 node-cron | P1 | 0.5天 | 定时任务框架 |
| 3.2 实现 Cron 触发逻辑 | P1 | 1天 | 定时全量质控 |
| 3.3 实现增量检查 | P2 | 1天 | 数据 Hash 跳过 |
| 3.4 实现 Webhook 触发 | P2 | 1天 | REDCap DET 集成 |
### Phase 4: 规则配置 UI (Week 4)
| 任务 | 优先级 | 预估 | 产出 |
|------|--------|------|------|
| 4.1 Rule Studio 页面框架 | P2 | 1天 | 规则列表 + 详情 |
| 4.2 规则编辑器 | P2 | 2天 | JSON 可视化编辑 |
| 4.3 规则测试功能 | P2 | 1天 | 单条规则验证 |
---
## 6. 数据库设计补充
### 6.1 扩展 IitSkill 表
```prisma
model IitSkill {
id String @id @default(uuid())
projectId String @map("project_id")
skillType String @map("skill_type")
name String
description String?
// 规则类型
ruleType String @default("HARD_RULE") @map("rule_type") // 'HARD_RULE' | 'LLM_CHECK' | 'HYBRID'
// 执行级别
level String @default("normal") // 'blocking' | 'normal'
// 核心配置
config Json @db.JsonB
// 数据依赖(智能路由用)
requiredTags String[] @map("required_tags") // 新增e.g., ['#lab', '#demographics']
// 触发配置
triggerType String @default("webhook") @map("trigger_type")
cronSchedule String? @map("cron_schedule")
isActive Boolean @default(true) @map("is_active")
priority Int @default(100) // 新增:执行优先级
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@unique([projectId, skillType], map: "unique_iit_skill_project_type")
@@index([projectId], map: "idx_iit_skill_project")
@@index([isActive, triggerType], map: "idx_iit_skill_active_trigger")
@@map("skills")
@@schema("iit_schema")
}
```
### 6.2 新增 IitQcReport 表
```prisma
/// 质控报告存储表 - 存储预生成的 LLM 友好报告
model IitQcReport {
id String @id @default(uuid())
projectId String @map("project_id")
// 报告类型
reportType String @default("daily") @map("report_type") // 'daily' | 'weekly' | 'on_demand'
// 统计摘要
summary Json @db.JsonB // { totalRecords, criticalIssues, pendingQueries, passRate }
// 详细问题列表
issues Json @db.JsonB // [{ record, rule, severity, description, evidence }]
// LLM 友好的 XML 报告
llmReport String @map("llm_report") @db.Text
// 报告生成时间
generatedAt DateTime @default(now()) @map("generated_at")
// 报告有效期
expiresAt DateTime? @map("expires_at")
@@index([projectId, reportType], map: "idx_qc_report_project_type")
@@index([generatedAt], map: "idx_qc_report_generated")
@@map("qc_reports")
@@schema("iit_schema")
}
```
---
## 7. 验收标准
### 7.1 功能验收
| 功能 | 验收标准 |
|------|----------|
| 变量质控 | 单记录质控 < 100ms批量 50 记录 < 2s |
| 入排标准 | LLM 判断准确率 > 90%;单记录 < 3s |
| 报告生成 | 50 记录的项目报告生成 < 5s |
| LLM 问答 | 基于报告回答延迟 < 2s |
| 定时任务 | 每日凌晨自动执行,连续 7 天无故障 |
### 7.2 性能指标
| 指标 | 目标值 |
|------|--------|
| HardRuleEngine 执行时间 | < 100ms / 记录 |
| SoftRuleEngine 执行时间 | < 3s / 记录 |
| 报告加载时间 | < 200ms |
| 端到端问答延迟 | < 3s |
### 7.3 业务验收
- [ ] CRA 可以通过 Cockpit 查看所有严重问题
- [ ] 点击问题可以查看详细数据和证据
- [ ] 用户可以通过对话询问质控问题LLM 基于报告回答
- [ ] 定时任务每日自动执行,生成最新报告
- [ ] 规则可以通过配置界面增删改
---
## 8. 风险与应对
| 风险 | 影响 | 应对措施 |
|------|------|----------|
| LLM 判断不准确 | 入排/AE 检测误报 | 三态管理Pending → 人工确认) |
| 规则配置复杂 | 用户上手困难 | 提供预置规则模板 |
| 数据量大时性能下降 | 质控变慢 | 增量检查 + 分批执行 |
| REDCap Webhook 不稳定 | 实时质控失效 | 定时任务兜底 |
---
## 9. 参考文档
- [CRA Agent 业务逻辑与执行架构书](../02-技术设计/CRA%20Agent%20业务逻辑与执行架构书%20(1).md)
- [基于 Skills 的 CRA 规则配置实施指南](../02-技术设计/docs_03-业务模块_IIT%20Manager%20Agent_02-技术设计_11-基于Skills的CRA规则配置实施指南.md)
- [V2.6 综合开发计划](./IIT%20Manager%20Agent%20V2.6%20综合开发计划.md)
- [02-核心引擎实现指南](./02-核心引擎实现指南.md)
---
**文档维护人**AI Agent
**最后更新**2026-02-08
### 更新日志
| 版本 | 日期 | 更新内容 |
|------|------|----------|
| V1.0 | 2026-02-08 | 初始版本,基于方案审查和代码分析 |