feat(iit): QC deep fix + V3.1 architecture plan + project member management

QC System Deep Fix:
- HardRuleEngine: add null tolerance + field availability pre-check (skipped status)
- SkillRunner: baseline data merge for follow-up events + field availability check
- QcReportService: record-level pass rate calculation + accurate LLM XML report
- iitBatchController: legacy log cleanup (eventId=null) + upsert RecordSummary
- seed-iit-qc-rules: null/empty string tolerance + applicableEvents config

V3.1 Architecture Design (docs only, no code changes):
- QC engine V3.1 plan: 5-level data structure (CDISC ODM) + D1-D7 dimensions
- Three-batch implementation strategy (A: foundation, B: bubbling, C: new engines)
- Architecture team review: 4 whitepapers reviewed + feedback doc + 4 critical suggestions
- CRA Agent strategy roadmap + CRA 4-tool explanation doc for clinical experts

Project Member Management:
- Cross-tenant member search and assignment (remove tenant restriction)
- IIT project detail page enhancement with tabbed layout (KB + members)
- IitProjectContext for business-side project selection
- System-KB route access control adjustment for project operators

Frontend:
- AdminLayout sidebar menu restructure
- IitLayout with project context provider
- IitMemberManagePage new component
- Business-side pages adapt to project context

Prisma:
- 2 new migrations (user-project RBAC + is_demo flag)
- Schema updates for project member management

Made-with: Cursor
This commit is contained in:
2026-03-01 15:27:05 +08:00
parent c3f7d54fdf
commit 0b29fe88b5
61 changed files with 6877 additions and 524 deletions

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,106 @@
# **CRA 质控报告自动化生成与 LLM 友好型设计规范**
**文档版本**V2.1 (5 层架构剪枝与 LLM 实战版)
**设计目标**利用“五层数据坐标剪枝”与“语义组装”形成对大模型LLM极度友好、绝不产生幻觉的 Payload。
## **核心设计原则LLM 友好性 (LLM Readiness)**
要让 LLM 稳定输出,必须遵循“三不”原则:
1. **不喂全量数据**:依托 5 层架构执行 JSON 树剪枝,只提取 status \= FAIL 的切片。
2. **不喂物理字段**:所有的 lb\_alt\_v 必须经过 AutoMapper 映射为 谷丙转氨酶(ALT)。
3. **不让 LLM 算数**:日期差、缺失率由 Node.js 算好,直接把“结论标签”喂给 LLM。
## **报告生成链路与 LLM 模拟实战 (基于 5 层坐标)**
### **场景一:数据质疑管理 (eQuery Log) \- D3 规则**
**【业务场景】** D3 逻辑发现异常,生成一条像资深 CRA 写的质疑描述。
**【剪枝后的 5层 LLM 友好输入片段 ✅】**
{
"system\_instruction": "你是一个严谨的临床数据经理。请根据下方异常数据生成一条专业的电子质疑eQuery。指出矛盾点并给建议100字以内。",
"clinical\_context": {
"受试者ID": "P005",
"访视阶段": "随访2 (Week 4)",
"触发表单": "实验室检查",
"数据实例": "Instance 1"
},
"anomaly\_data": {
"异常指标": "谷丙转氨酶 (ALT)",
"当前录入值": "150 U/L",
"HardRuleEngine\_计算结论": "超出正常上限 (50 U/L) 的 3 倍",
"跨表核查结果": "查询《不良事件(AE)表》所有 Instance当前记录数为 0"
}
}
**【LLM 输出示例】**
“检测到该受试者在「随访2」的「实验室检查」中谷丙转氨酶(ALT)为 150 U/L已超出正常上限 3 倍。经跨表核查,未发现对应的《不良事件(AE)》记录。请核实检验结果是否录入无误;若无误,请评估是否需要补充填报 AE。”
### **场景二:不良事件风险评估 (AE Log) \- D5 规则**
**【业务场景】** 提取录入的 AE结合患者的其他重复表单如多次服药提示风险。
**【应对重复表单 (Repeating Forms) 的完美 JSON 结构 ✅】**
系统精确拉取 AE\_Log 和 ConMed\_Log 下的不同 InstanceID
{
"system\_instruction": "作为临床安全评估助手,请分析患者新发的 AE结合既往病史和用药提示潜在风险关联。你无权下定论仅供 PI 参考。",
"patient\_context": {
"受试者": "P012",
"合并用药表 (ConMed\_Log)": \[
{"instance\_id": 1, "药物名称": "阿司匹林"},
{"instance\_id": 2, "药物名称": "布洛芬"}
\]
},
"不良事件表 (AE\_Log)": \[
{"instance\_id": 3, "事件名称": "消化道出血", "严重程度": "CTCAE 3级"}
\],
"rag\_knowledge\_retrieval": "方案规定非甾体抗炎药NSAIDs如布洛芬、阿司匹林联用会显著增加消化道出血风险。"
}
**【LLM 输出示例】**
“该受试者新发 3 级「消化道出血」(Instance 3)。系统监测到患者正在同时服用「阿司匹林」(Instance 1)与「布洛芬」(Instance 2)。结合方案提示,非甾体抗炎药联用是高危出血因素。建议 PI 重点关注该 AE 是否与合并用药具有因果关系。”
### **场景三:方案偏离记录 (PD Log) \- D6 规则**
**【喂给 LLM 的切片 ✅】**
{
"system\_instruction": "请根据硬逻辑引擎计算出的偏差事实,撰写连贯的方案偏离描述,并提出纠正预防措施(CAPA)。",
"deviation\_facts": {
"坐标": "Record:P002 \-\> Event:随访3 \-\> Form:访视表 \-\> Instance:1",
"偏离类型": "访视超窗",
"HardRuleEngine\_计算依据": {
"方案允许窗口": "2026-02-15 ±3天",
"实际发生日期": "2026-02-25",
"计算结果": "延误 10 天"
}
}
}
### **场景四:数据缺失率总结 (Missing Rate Log) \- D2 规则**
**【特殊说明:此报告尽量不用 LLM】**
数据缺失率表严禁使用 LLM 计算百分比!完全由 Node.js CompletenessEngine 根据 Instance 和分支逻辑动态计算完成。LLM 仅根据最终聚合数值生成执行摘要。
**【喂给 LLM 的切片 ✅】**
{
"report\_type": "数据完整性摘要",
"total\_missing\_rate": "5.0%",
"top\_missing\_forms": \[
{"form": "SF-36 生活质量问卷", "missing\_rate": "40%"}
\],
"task": "基于以上统计数据,写两句话的执行摘要。"
}
**技术收益总结**
五层架构(特别是 InstanceID 实例层)的引入,让发给 LLM 的 JSON 数据结构具备了完美的数组映射能力,彻底消灭了多行数据相互覆盖的 Bug并最大程度防范了 AI 幻觉!

View File

@@ -0,0 +1,99 @@
# **Skill 化配置架构与业务流转技术设计文档**
**文档版本**V2.1 (5层架构与语义解耦全景版)
**核心理念**:规则必须脱离底层代码;质控逻辑必须基于“医学语义”而非“物理字段”进行配置,以适应不同的 IIT 项目。
## **第一章 架构总览从“硬编码”到“Skill 驱动”**
我们将数据、规则与报告的生成链路设计为高度解耦的三段式架构:
\[阶段一:基建与抽象\] \[阶段二Skill 编排配置\] \[阶段三:执行与映射\]
(项目前置准备) (DM 规则配置) (引擎自动计算)
1\. REDCap 字典同步 1\. 选择 Skill 模板 1\. 监听数据变化 (Webhook)
2\. 知识库向量化 (RAG) \-\> 2\. 绑定语义标签 \-\> 2\. 提取 5 层级联坐标
3\. LLM 语义映射对齐 3\. 设定阈值与报警级别 3\. 引擎执行逻辑 (硬/软)
(AutoMapper) (赋能 D1-D7 维度) 4\. 结果落入 5层数据底座
5\. 自动组装 5大 GCP 报告
## **第二章 配置前置准备 (Project Initialization)**
在配置具体的质控 Skill 前,系统必须完成项目的“数字孪生”构建:
### **2.1 结构化数据基建REDCap 元数据同步**
* **动作**:调用 exportMetadata 获取字典包含分支逻辑Branching Logic。这为 D2 (缺失率) 计算打下基石。
### **2.2 非结构化知识基建:建立专属 RAG 大脑**
* **动作**:上传方案 Protocol、ICF进行向量化。为 D5/D6 的 SoftRule 模糊推理提供依据。
### **2.3 核心解耦AutoMapper 语义映射 (重中之重)**
* **动作**:利用 LLM将 REDCap 毫无规律的物理变量名(如 ie\_01, ae\_term映射为**系统内置标准医学语义标签**(如 \[入选标准\_年龄\], \[不良事件\_名称\])。
* **价值**DM 面向通用语义配置规则,无需关心物理表名,实现通用 Skill 的跨项目复用。
## **第三章 Skill 核心数据模型设计 (The Skill Schema)**
### **3.1 数据库表结构 (iit\_skills)**
model IitSkill {
id String @id @default(cuid())
projectId String // 绑定到具体项目
name String // e.g., "ALT 重度异常监测"
category String // 关键!挂载到 7 大维度: D1, D2, D3, D5, D6
// 质控深度,全面升级支持 5 层架构
targetLevel String // RECORD, EVENT, FORM, INSTANCE, FIELD
engineType String // HARD\_RULE (JSON Logic) 或 SOFT\_RULE (LLM)
triggerType String // WEBHOOK (实时) 或 CRON (定时)
configuration Json // JSON 配置体
isActive Boolean @default(true)
}
### **3.2 Configuration 字段设计 (配置解析)**
**A. HardRule (硬规则 \- 适用于 D1, D3, D7)**
采用 JSON Logic 语法,实现毫秒级绝对判定。
{
"semantic\_tags": \["实验室\_谷丙转氨酶"\],
"logic": {
"\>": \[{"var": "实验室\_谷丙转氨酶"}, 150\]
},
"on\_fail\_message": "谷丙转氨酶(ALT)达到重度异常标准,触发安全预警。",
"severity": "CRITICAL"
}
**B. SoftRule (软规则 \- 适用于 D5, D6)**
采用 Prompt 模板,供 LLM 结合 RAG 在各个 Instance 间进行推理。
{
"semantic\_tags": \["不良事件\_症状描述", "合并用药\_药物名称"\],
"prompt\_template": "患者主诉发生了 {不良事件\_症状描述},请检索知识库禁忌药目录,评估这是否与患者填报的第 {InstanceID} 行用药 {合并用药\_药物名称} 存在禁忌冲突?",
"rag\_enabled": true,
"severity": "WARNING"
}
## **第四章 配置工作流与执行链路 (How it works in action)**
### **4.1 DM 配置工作流 (UI 交互层)**
1. **选择维度**DM 选择配置【D1 入排标准】。
2. **选择模板**:选择“数值范围检验”。
3. **绑定语义**:下拉选择 \[入选标准\_年龄\]。
4. **设置条件**\>= 18 且 \<= 75。保存发布。
### **4.2 引擎自动化执行链路 (Execution Pipeline)**
1. **触发与拦截**REDCap Webhook 抵达。
2. **提取五层坐标**:解析出 Record:P005 \-\> Event:V2 \-\> Form:AE\_Log \-\> Instance:2 \-\> Field:ae\_term。
3. **加载 Skills**:查询匹配的 active Skills。
4. **装填数据**:按 AutoMapper 映射装填数值。
5. **引擎计算**:调起 HardRuleEngine 或 SoftRuleEngine。
6. **状态回写**:若失败,将原因写入 qc\_field\_status携带 Category (如 D5),红灯沿五层坐标向上一路冒泡至 Record 级。

View File

@@ -0,0 +1,99 @@
# 五层数据架构方案评审反馈
> **评审对象**:架构团队提交的 4 份技术文档
> 1. 核心数据架构与业务落地白皮书
> 2. 核心转换机制白皮书:数据·规则·报告链路设计
> 3. Skill 化配置架构技术设计
> 4. CRA 质控报告自动化生成与 LLM 友好型设计规范
>
> **评审日期**2026-03-01
> **评审结论**:方向认可,分层落地
---
## 一、总体评价
方案方向正确、视野开阔5 层数据架构和 7 维度报告体系在理论上完整且符合 CDISC 标准。但它是一份**理想态蓝图**,与系统实际现状有较大距离,需要区分"方向性采纳"和"现阶段过度设计"。
---
## 二、值得借鉴的建议(采纳)
| # | 建议 | 采纳理由 | 系统现状差距 |
|---|------|---------|-------------|
| 1 | **InstanceID 实例层(第 4 层)** | AE、合并用药等重复表单必须精确到"第几条"才能定位问题,这是架构方案中**最有价值的贡献** | `IitQcLog``IitEquery` 均缺少 `instanceId` 字段 |
| 2 | **规则按 D1-D7 维度分类** | 多维报告的前提,也是上轮内部讨论的共识 | 当前 `QCRule.category` 仅 4 种值,未对齐 D1-D7 |
| 3 | **状态冒泡机制** | Field → Instance → Form → Event → Record 的级联逻辑清晰,便于前端热力图展示和报告聚合 | 仅有记录级 `IitRecordSummary`,无独立的事件级/变量级状态表 |
| 4 | **LLM 三不原则** | "不喂全量、不喂物理字段、不让 LLM 算数"与我们已有实践高度一致,值得正式化为设计规范 | 已有剪枝和预计算,但字段语义化尚未实现 |
| 5 | **AutoMapper 语义映射** | REDCap 字段名(如 `ie_01``ae_term`)对 LLM 不友好,反向语义化是必要的 | `IitFieldMapping` 表已有 alias→actual 映射,缺 actual→semantic 方向 |
| 6 | **优先级调整D2 提至 P0** | IIT 中数据缺失率是最普遍的问题D2 重要性应高于 D6/D7 | 我们原规划将 D2 放在阶段二,可考虑提前 |
---
## 三、暂不采纳的建议
| # | 建议 | 暂不采纳的理由 |
|---|------|---------------|
| 1 | **D8 核心数据 SDVAI 多模态视觉比对)** | 这是一个独立产品功能(前端上传 + OCR + 比对),不是质控引擎的架构问题。技术难度极高,且 IIT 场景 SDV 比率不高,应单独立项 |
| 2 | **AutoMapper 全自动 LLM 映射** | 用 LLM 自动将物理变量名映射为医学语义标签,准确率不可控。建议改为**半自动**:系统基于 Data Dictionary 的 `field_label` 提供建议DM 人工确认 |
| 3 | **5 张 GCP 报表同时规划** | 系统连 D2缺失率都还未实现一次性规划 5 张完整 GCP 报表脱离现实。数据底座做好后,报告生成是顺水推舟的事 |
| 4 | **Branching Logic 解析器(阶段一)** | REDCap 分支逻辑语法是非标准格式,解析器开发成本高。阶段一先用简单统计替代,分支逻辑解析推迟到 D2 专项实现时 |
---
## 四、落地策略:分 3 个批次
**不建议一次性修复。** 原因:改动范围涉及 schema + 引擎 + 报告服务 + 前端回归测试压力大D5/D6/D7 的规则尚无临床专家输入,空设架构无意义。
### 批次 A数据底座加固1-2 周)
让现有功能的数据粒度正确。
- `IitQcLog` + `IitEquery` 增加 `instanceId` 字段
- `QCRule.category` 扩展为 D1-D7 维度枚举
- `IitFieldMapping` 增加 `semanticLabel`(反向语义化)
- 新建 `qc_field_status`5 层坐标 + category + status
- `HardRuleEngine` 执行结果写入 `qc_field_status`
- `QcReportService` 基于 `qc_field_status` 生成语义化报告
**验收标准**:一键全量质控后 `qc_field_status` 有正确的 5 层坐标数据LLM 报告中字段名为中文语义。
### 批次 B聚合层与冒泡机制1-2 周)
完成五级聚合,支撑多维报告和前端热力图。
- 新建 `qc_event_status` 表(由 `field_status` 聚合)
- 改造 `IitRecordSummary`(由 `event_status` 聚合)
- 实现状态冒泡逻辑field → instance → form → event → record
- 多维报告框架(按 D1-D7 分章节)
- 前端:受试者×表单热力图原型
**验收标准**:字段 FAIL 后对应 event 和 record 自动变红;报告按维度分章节。
### 批次 C新维度引擎按需
扩展质控覆盖面,**依赖临床专家确认规则可行性**。
- D2 CompletenessEngine先简单统计后续加分支逻辑解析
- D6 方案偏离引擎(访视超窗检测)
- D5 SoftRule + RAG 联动AE 漏报侦测)
- 项目健康度评分模型
**前提条件**:临床专家已确认各维度规则;有真实 IIT 项目数据验证;批次 A+B 已稳定运行。
---
## 五、架构团队二次评审补充建议4 条,全部采纳)
| # | 建议 | 采纳结论 | 落地位置 |
|---|------|---------|---------|
| 1 | **跨表单"上下文断层"**Webhook 只带单表单数据跨表规则D5 AE 漏报)无法执行 | 完全采纳。`QcExecutor.executeSingle()` 一律拉取该患者全量数据Record-Level Context | 开发计划 3.7 节 |
| 2 | **eQuery 自动闭环缺失**Field 从 FAIL 变 PASS 时无人关闭关联 eQuery | 完全采纳。新增 State Transition Hook`auto_closed` 状态区分人工关闭 | 开发计划 3.8 节 |
| 3 | **D2 缺失率"未来时空"陷阱**:新入组患者未来访视的必填字段被算作缺失 | 完全采纳。增加 Event-Aware 时序过滤,只统计已到达事件的必填字段 | 开发计划 6.3 节 |
| 4 | **聚合防抖锁粒度**:项目级聚合在多 CRC 并发录入时有行锁竞争 | 部分采纳。实时触发用受试者级防抖,项目级统计独立低频刷新 | 开发计划 3.3 节 |
---
## 六、一句话总结
> 5 层数据架构方向正确,**InstanceID** 和 **rule_category** 是我们最缺的两块拼图,必须尽快补上。表结构可以一次设计到位,但填充内容要一层一层来——先底座(批次 A再聚合批次 B最后扩维度批次 C

View File

@@ -0,0 +1,111 @@
# **纯数字 CRA 平台:五层数据底座与核心引擎技术白皮书**
**文档版本**V2.1 (CDISC ODM 国际标准 5 层全景版)
**核心理念**:以 CDISC ODM 国际标准为底座,彻底解决重复表单问题,打造对人类透明、符合 GCP 规范、对 LLM 友好的临床质控体系。
## **第一章 核心数据架构:五层状态级联树 (The 5-Layer Hierarchy)**
为了支撑前端的“受试者 × 表单”热力图并彻底解决重复表单Repeating Forms如多次发生的 AE、多次服药记录的数据覆盖与追踪问题我们严格对齐 CDISC ODM 标准,采用 **5 层状态级联架构**作为系统的影子质控底座。
### **1.1 数据实体定义与 GPS 坐标**
系统中的任何一个质控状态、任何一条 eQuery都必须唯一且绝对精确地绑定在这个五维坐标上
1. **RecordID (受试者级)**:例如 P005。反映该患者的整体健康度。
2. **EventID (访视/事件级)**:例如 Visit\_2随访2。反映特定时间点的数据质量。
3. **FormID (表单级)**:例如 AE\_Log不良事件表。**(前端风险热力图的 X 轴核心来源)**
4. **InstanceID (实例/行号级)**:例如 1, 2, 3。**(核心突破!用于区分同一患者填写的第 1 个 AE、第 2 个 AE。非重复表单默认值为 1**
5. **FieldID (字段/变量级)**:例如 ae\_name不良事件名称。最底层的原子数据。
### **1.2 状态级联与冒泡机制 (State Bubbling)**
当后台的 HardRuleEngine 或 SoftRuleEngine 发现数据异常时:
1. **精准打标**:系统首先在最底层的 qc\_field\_status 表中,将坐标 P005 \-\> Visit\_2 \-\> AE\_Log \-\> Instance\_2 \-\> ae\_name 标记为 FAIL并生成一条 eQuery。
2. **状态冒泡 (自动向上传递)**
* 包含该字段的实例 Instance\_2 (第2条不良事件) 状态变为 FAIL。
* 包含该实例的表单 AE\_Log 的状态自动变为 FAIL热力图该格子变红
* 包含该表单的访视 Visit\_2 自动变为 FAIL。
* 受试者 P005 的全局状态自动变为 FAIL。
3. **闭环消警**:当 CRC 在 REDCap 修改了该实例 Instance\_2 的值,引擎复核通过,底层 Field 变绿,绿灯逐级向上点亮,直至受试者恢复健康状态。
## **第二章 CRA 质控工作优先级策略**
面对庞杂的临床规则,我们应遵循\*\*“高频易错、AI 擅长、IIT 痛点”\*\*的原则排定工作优先级:
### **📌 优先级一P0 级(系统上线必须具备的核心基石)**
这些是 IIT 试验中最容易崩盘,且传统 CRC 最头疼的硬逻辑工作。AI 处理这些具有 100% 的准确性和碾压级效率。
1. **D2 数据完整性 (Completeness)**:扫描 Form、Instance 和 Field 级数据,基于 REDCap 的分支逻辑Branching Logic计算真实的缺失率。
2. **D3 逻辑准确性 (Accuracy \- Edit Checks)**:时序校验(知情同意 \< 筛选 \< 首次用药)、数值极值校验、跨表单关联必填项校验。
3. **D1 入排合规性 (Eligibility)**:对入选/排除标准表单进行强逻辑逆向校验。
### **📌 优先级二P1 级(建立系统护城河的亮点功能)**
1. **D8 核心数据 SDV 强制核对 (AI Vision)**:针对主要研究终点(如肿瘤大小、关键生化指标),强制要求 CRC 在前端上传原始影像/化验单。AI 通过多模态视觉比对。
2. **D5 安全性事件漏报侦测 (Safety)**跨表单与跨实例关联。AI 发现化验单达到 3 级毒性,但 AE\_Log 表中没有任何一个 Instance 记录该事件,立刻触发告警。
### **📌 优先级三P2 级(锦上添花的拓展功能)**
* **D6 方案偏离 (超窗检测)** 与 **D7 试验药物依从性管理**。由于 IIT 很多是非药物研究且随访不严,可作为可选模块后期加入。
## **第三章 以终为始:多维 CRA 质控报告体系设计**
结合系统化的 SaaS 管理看板与极其严谨的 GCP 规范要求,我们将最终输出的质控报告划分为两大层级:**“宏观管理驾驶舱层”与“核心业务报表层”**。
### **3.1 宏观管理层 (Executive Dashboard)**
用于系统前台实时展示,提供全局项目健康度:
* **项目综合健康度评分**(基于 D1\~D6 加权计算)。
* **受试者风险热力图**(直观展示哪位受试者的哪个表单异常)。
* **CRC 数据录入绩效**eQuery 平均关闭时间、录入时效)。
### **3.2 核心业务报表层 (GCP 规范自动化日志)**
这是数字 CRA 真正替代人工的交付物。系统基于“五层数据底座”结合 AI 判定,**自动生成以下 5 张标准化的临床记录表**
#### **表 1筛选与入选登记表 (对应 D1)**
* **涵盖字段**:筛选编号、性别/年龄、诊断、纳入/排除标准是否符合AI 判定)、筛选结果(入组/失败、失败原因AI 自动抓取不符条款)、电子签名。
#### **表 2数据录入率 & 缺失率记录表 (对应 D2)**
* **涵盖字段**:表格名称、应录入总字段数(基于 Branching Logic 动态计算)、实际已录入字段数、**数据录入率 & 缺失率 %**、缺失变量与原因、审核时间戳。
#### **表 3数据质疑管理跟踪表 (eQuery Log) (对应 D3/D4)**
* **涵盖字段**质疑编号、5层精确坐标定位、AI 质疑描述(客观描述矛盾点)、发现日期/发现人(AI)、CRC 解释与回复、二次复核状态、关闭日期。
#### **表 4AE 不良事件记录与监查表 (对应 D5 \- 核心合规文件)**
* **涵盖字段**受试者信息、AE 名称/症状、起止日期、严重程度、**与干预的因果关系AI 提示禁忌PI 最终定性)**、处理措施与转归、SAE 时效监控、**⚠️ AI 挖掘出的疑似漏报事件高亮**。
#### **表 5方案偏离记录表 (PD Log) (对应 D6)**
* **涵盖字段**:偏离编号、发生日期、**偏离类型AI 自动分类:超窗/禁忌用药/未采集等)**、偏离描述、对安全性影响评估AI 初判,人工复核)、纠正预防措施(CAPA)。
## **第四章 架构的 LLM 友好性设计与优化 (LLM Readiness)**
我们的 5 层级联树状架构,天生就是为了喂给 LLM 而设计的最佳结构。采用四大 LLM 优化策略:
### **优化 1语义化映射网关 (AutoMapper) —— 解决 LLM 看不懂**
* **痛点**REDCap 导出的变量名叫 lb\_dt, ae\_yn。
* **优化**:通过 iit\_field\_mapping 表,将其转换为具有临床语义的键:{"采样日期": "2026-02-25", "是否发生不良事件": "否"}。
### **优化 2基于实例的剪枝 (Instance-Level Pruning) —— 解决 Token 溢出**
* **痛点**:写报告时没必要把 95% 正确的数据喂给模型。
* **优化**:执行 JSON 树剪枝。只 query 出 qc\_field\_status \= 'FAIL' 的那一小块实例分支:
{"受试者\_P005": {"不良事件表": \[{"Instance\_2": {"事件": "发烧", "质控": "未填严重程度"}}\]}}。
### **优化 3XML 提示词封装 —— 解决上下文幻觉**
* 利用 \<record\>, \<event\>, \<form\>, \<instance\> 严格包裹数据,先进的大模型对 XML 层级的理解极佳,能完美规避张冠李戴。
### **优化 4计算下放 (CPU over GPU) —— 解决算术薄弱**
* LLM 绝对不做日期和数值计算(如算缺失率百分比、算超窗天数)。所有硬核计算由 Node.js HardRuleEngine 算好,直接把“结论标签”传给 LLM 组装文字。

View File

@@ -0,0 +1,72 @@
# **核心转换机制白皮书:从五层数据底座到多维质控报告的生成逻辑**
**文档定位**:系统设计核心枢纽,连接底层数据库、规则引擎与前台业务报表。
**阅读对象**后端架构师、规则配置工程师DM、产品经理
## **核心理念:质控的本质是“坐标映射与计算”**
在我们的系统中,没有任何一份报告是凭空“写”出来的。所有的报告,其本质都是:
1. 取出特定 **五层坐标 (Record \-\> Event \-\> Form \-\> Instance \-\> Field)** 上的数据。
2. 放入特定的 **规则引擎 (D1\~D7)** 进行计算。
3. 将计算结果PASS/FAIL/数值)**组装并投影**到 5 张标准化 GCP 报告的单元格中。
## **逐表拆解5大核心报告的生成机制与数据链路**
### **报告一:筛选与入选登记表 (对应 D1 规则)**
**业务目的**:证明患者入组是完全合规的,没有放错人进来。
| 报告显示的列 (微小内容) | 依赖的 5 层数据坐标 (查什么) | 调用的质控规则与逻辑 (算什么) | 执行引擎 |
| :---- | :---- | :---- | :---- |
| **筛选日期** | Event=筛选期 \-\> Form=知情同意表 \-\> Instance=1 \-\> Field=签署日期 | 提取知情书的签署日期。 | 基础查询 |
| **纳入/排除是否符合** | Event=基线 \-\> Form=入排标准表 \-\> Instance=1 \-\> Field=所有入排项 | **\[D1 逻辑\]** 验证纳入标准是否全为“是”,排除标准是否全为“否”。 | HardRuleEngine |
| **时序合规校验** | Form=知情表 vs Form=基线表 | **\[D1 逻辑\]** 校验 知情签署日期 \<= 筛选检查发生日期。违规即阻断。 | HardRuleEngine |
| **失败原因** | qc\_field\_status \= 'FAIL' 的具体 Field | 提取亮红灯的 FieldID 对应的字典标签排除标准3不符。 | AutoMapper |
### **报告二:数据录入率 & 缺失率记录表 (对应 D2 规则)**
**业务目的**:证明数据的完整性。最考验系统工程能力的一张表。
| 报告显示的列 | 依赖的 5 层数据坐标 (查什么) | 调用的质控规则与逻辑 (算什么) | 执行引擎 |
| :---- | :---- | :---- | :---- |
| **应录入总字段数** | REDCap 字典 & Branching Logic | **\[D2 逻辑 \- 极度核心\]** 代入患者其他字段值,解析分支逻辑。例如:如果 性别=男,则该患者所有 妊娠检查 相关的 Instance 应录入数 \= 0。 | CompletenessEngine |
| **实际已录入字段数** | 遍历当前 Form 下所有 Instance 的所有 Field | 计算非空 (value \!= null) 的字段总数。 | 基础查询 |
| **数据缺失率 (%)** | 上述两个计算结果 | 公式:(应录入 \- 实录入) / 应录入 \* 100%。 | CPU 计算 |
### **报告三:数据质疑管理跟踪表 (eQuery Log) (对应 D3/D4 规则)**
**业务目的**:记录逻辑矛盾和笔误的闭环过程。
| 报告显示的列 | 依赖的 5 层数据坐标 (查什么) | 调用的质控规则与逻辑 (算什么) | 执行引擎 |
| :---- | :---- | :---- | :---- |
| **质疑编号 & 定位** | 取 status \= 'FAIL' 的 5 层全路径 | 拼接坐标:\[Record\]-\[Event\]-\[Form\]-\[Instance\]-\[Field\]。 | 基础查询 |
| **问题描述 (AI 生成)** | 提取异常 Field 的 actual\_value预期规则 | **\[D3 逻辑\]** 极值/关联校验。 **LLM组装**:将硬规则警报抛给 LLM翻译成严谨的人类句子。 | HardRule \+ SoftRule |
| **当前状态 & 解决时间** | pending\_actions 表流转状态 | **\[D4 逻辑\]** 监听该 Instance 的数据变更。复核通过,状态从 OPEN 变 CLOSED。 | 状态机 |
### **报告四AE 不良事件记录表 (对应 D5 规则 \- 核心亮点)**
**业务目的**:展现 AI 作为“数字 CRA”挖掘隐患的强大能力。
| 报告显示的列 | 依赖的 5 层数据坐标 (查什么) | 调用的质控规则与逻辑 (算什么) | 执行引擎 |
| :---- | :---- | :---- | :---- |
| **显性 AE 记录** | Form=不良事件表 的所有 Instance | 遍历每个独立 Instance第 1 次 AE, 第 2 次 AE提取名称、开始/结束日期。 | 基础查询 |
| **⚠️ 疑似漏报 AE 挖掘** | 遍历 Form=实验室检查 等表单的 Field | **\[D5 逻辑\]** 发现化验数值达到 2 级及以上异常,跨表检索 AE表 所有 Instance若无匹配记录触发告警。 | HardRule |
| **与干预的因果关系** | Form=不良事件表 \+ Form=合并用药表(所有Instance) | 提取患者服用的所有药物。**LLM知识库比对**,若属禁忌,提示 PI 关注。 | SoftRule (RAG) |
### **报告五:方案偏离记录表 (PD Log) (对应 D6 规则)**
**业务目的**:抓取不按方案日历和标准操作的违规行为。
| 报告显示的列 | 依赖的 5 层数据坐标 (查什么) | 调用的质控规则与逻辑 (算什么) | 执行引擎 |
| :---- | :---- | :---- | :---- |
| **偏离类型:访视超窗** | Event=本次随访 实际日期 vs Event=基线 日期 | **\[D6 逻辑\]** 依据方案 SoA计算天数差。若超窗则判定为偏离。 | HardRule |
| **偏离类型:禁忌药** | Form=合并用药表 \-\> 所有 Instance \-\> 药物名称 | **\[D6 逻辑\]** 将各 Instance 录入药物名与方案知识库比对。 | SoftRule (RAG) |
| **偏离描述与分级建议** | 综合上述计算结果 | LLM 将“超窗 5 天”总结为连贯描述,并根据规则库预判 Major/Minor 偏离。 | SoftRule (LLM) |
## **终极总结:这三者是如何协同工作的?(The Orchestration)**
1. **底层地基 (数据坐标)**CDISC 5层架构提供了极其精确的 GPS 定位,彻底搞定了重复表单数据覆盖问题。
2. **流水线加工 (规则引擎)**:当 Webhook 带着 InstanceID 涌入时,系统调取 D1\~D7 规则。算缺失率用 D2 解析分支;查超窗用 D6 算日期;查漏报 AE 用 D5 跨 Instance 匹配。
3. **顶层组装 (质控报告与 LLM)**:引擎产生带标签的坐标点(如 P005-V2-AE\_Log-Instance\_3: 严重程度未填)。系统将这些剪枝后的碎片喂给 LLMLLM “翻译”并填入 5 张标准的 GCP 报表。