docs(iit): Add CRA Agent V3.0 development plan and update module status guide

V3.0 Plan:
- Finalize CRA Agent V3.0 development plan (replace CRA positioning)
- Add unified CRA QC platform PRD
- Add HTML UI prototype (dashboard, AI stream, eQuery, reports)
- Architecture: report-driven + LLM Tool Use + 4 semantic tools

Module Status Update:
- Update architecture from dual-brain V2.9.1 to V3.0 Tool Use
- Update DB schema inventory (5 tables -> 18 tables)
- Update code stats (577 lines -> 15,000+ lines / 61 files)
- Update next steps to V3.0 P0 roadmap
- Archive old phase plans (ReAct engine, IntentService)
- Add V3.0 document references (plan, PRD, prototype)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-25 22:04:00 +08:00
parent f0736dbca1
commit 31b0433195
5 changed files with 1689 additions and 251 deletions

View File

@@ -1,18 +1,21 @@
# IIT Manager Agent模块 - 当前状态与开发指南
> **文档版本:** v2.4
> **文档版本:** v3.0
> **创建日期:** 2026-01-01
> **维护者:** IIT Manager开发团队
> **最后更新:** 2026-02-08 🎉 **事件级质控架构 V3.1 开发完成!**
> **最后更新:** 2026-02-25 **CRA Agent V3.0 开发计划定稿**
> **重大里程碑:**
> - 2026-02-08**事件级质控架构 V3.1 完成**record+event 独立质控 + 规则动态过滤 + 报告去重 + AI对话增强
> - ✅ 2026-02-08**质控驾驶舱 UI 开发完成**PromptBuilder XML 格式 + 驾驶舱页面 + 热力图 + 详情抽屉
> - ✅ 2026-02-08**质控系统优化计划制定**XML 临床切片格式 + 质控驾驶舱设计 + 方案 A 确认
> - ✅ 2026-02-07**实时质控系统开发完成**pg-boss防抖 + 质控日志 + 录入汇总 + 管理端批量操作)
> - ✅ 2026-02-05**V2.9.1 完整开发计划发布**(双脑架构 + 三层记忆 + 主动性增强 + 隐私合规
> - ✅ 2026-02-02**REDCap 生产环境部署完成**ECS + RDS + HTTPS
> - **2026-02-25CRA Agent V3.0 开发计划定稿**(替代 CRA 定位 + 报告驱动架构 + 4 语义化工具 + 统一驾驶舱
> - ✅ 2026-02-08事件级质控架构 V3.1 完成record+event 独立质控 + 规则动态过滤 + 报告去重
> - ✅ 2026-02-08质控驾驶舱 UI 开发完成(驾驶舱页面 + 热力图 + 详情抽屉
> - ✅ 2026-02-07实时质控系统开发完成pg-boss防抖 + 质控日志 + 录入汇总 + 管理端批量操作)
> - ✅ 2026-02-02REDCap 生产环境部署完成ECS + RDS + HTTPS
> - ✅ 2026-01-04混合检索架构实现REDCap实时数据 + Dify文档知识库
> **文档目的:** 反映模块真实状态,记录开发历程
> **文档目的:** 反映模块真实状态,记录开发历程
> **V3.0 核心文档:**
> - [CRA Agent V3.0 开发计划](./04-开发计划/V3.0全新开发计划/V3.0全新开发计划.md)
> - [统一数字 CRA 质控平台 PRD](./04-开发计划/V3.0全新开发计划/统一数字%20CRA%20质控平台产品需求文档(PRD).md)
> - [UI 原型](./04-开发计划/V3.0全新开发计划/Final%20CRA质控平台V3.html)
---
@@ -30,27 +33,32 @@
## 🎯 模块概述
### 核心功能
IIT Manager Agent研究者发起试验管理助手是一个基于企业微信的主动式AI Agent产品为IIT研究者发起试验提供智能化管理能力
### 核心定位V3.0 更新)
CRA Agent 是一个**替代 CRA 岗位的自主 AI Agent**,而非辅助 CRA 的工具。目标是用 AI 替代临床监查员 70-80% 的工作量,让 IIT 项目在无专职 CRA 的情况下也能达到合规的质控水平。主要用户为 PI主要研究者/ 研究团队
### 架构设计
- **核心理念****双脑架构V2.9.1** - SOP 状态机 + ReAct 引擎 + 三层记忆 + 隐私合规
- **双脑路由**
- **左脑SOP 引擎)**:结构化任务执行,写操作必经
- **右脑ReAct 引擎)**:模糊查询,只读不写
### 架构设计V3.0
- **核心理念**报告驱动 + LLM Tool Use + 统一驾驶舱
- **两层架构**
- **自驱动层**:定时质控 → 生成报告 → 派发 eQuery → 推送告警Agent 自主"上班"
- **对话层**ChatOrchestrator + LLM 原生 Function Calling + 4 个语义化工具
- **4 语义化工具**`look_up_data` / `check_quality` / `read_report` / `search_knowledge`
- **已废弃V2.9.1**:双脑架构、三层记忆系统、手写 ReAct 引擎、关键词意图路由
- **技术栈**
- 后端Node.js (Fastify) + PostgreSQL (Prisma) + pg-boss
- 前端:企业微信 + 微信小程序 (Taro 4.x)
- 前端:管理端React + Ant Design + 企业微信推送
- 数据源REDCap (EDC系统)
- 通知:企业微信
- AI能力DeepSeek/Qwen + 自研 RAG
- AI能力DeepSeek/Qwen + 自研 RAGpgvector+ LLM Tool Use
### 当前状态
- **开发阶段**🎉 **事件级质控架构 V3.1 开发完成!基本测试通过**
- **整体完成度**
- **基础设施**95%REDCap + 企业微信 + AI 对话 + 实时质控 + 驾驶舱 UI + 事件级质控)
- **架构设计**100%V2.9.1 完整开发计划发布)
- **代码实现**60%(实时质控系统 + 驾驶舱 UI + 事件级质控 V3.1 已实现)
- **开发阶段****V3.0 开发计划已定稿,准备进入 P0 开发**
- **已完成的基础设施**(可复用)
- HardRuleEngine (478行) + SoftRuleEngine (488行) + SkillRunner (756行)
- RedcapAdapter (1363行) + QcReportService (980行) + ToolsService (731行)
- 实时质控 Webhook + 质控驾驶舱 UI + 18 张数据库表
- 企业微信推送 + REDCap 生产环境
- **待重构**ChatService (1442行关键词路由) → ChatOrchestrator + 4 Tool Use
- **代码规模**:后端 ~15,000+ 行 / 61 个文件 / 18 张表iit_schema
#### ✅ 已完成功能(基础设施)
- ✅ 数据库Schema创建iit_schema9个表 = 原5个 + 新增4个质控表
@@ -99,27 +107,26 @@ IIT Manager Agent研究者发起试验管理助手是一个基于企业微
-**AI 意图识别增强**(支持"严重违规有几项"等自然语言查询)
-**Bug 修复**formatPatientData 500 错误 + 记录数统计 + 报告限制移除)
#### ⏳ 待实施功能(按 Phase 规划
| Phase | 内容 | 优先级 | 状态 |
|-------|------|--------|------|
| **Phase 1** | 基础工具层ToolsService + HardRuleEngine + AutoMapper | P0 | ✅ 部分完成HardRuleEngine 已实现) |
| **Phase 1.5** | 隐私安全AnonymizerService + PII 脱敏) | **P0 合规必需** | 待开始 |
| **Phase 2** | 实时质控系统QC Worker + QcService + 批量操作) | P0 | ✅ **已完成** |
| **Phase 2.5** | 质控 UI 与 LLM 格式优化(驾驶舱 + XML 临床切片) | P0 | 📋 **计划已制定** |
| **Phase 3** | ReAct 引擎 + 流水账ReActEngine + 反馈循环) | P0 | 待开始 |
| **Phase 4** | 调度系统SchedulerService + Cron Skill + ProfilerService | P1 | 待开始 |
| **Phase 5** | 智能路由IntentService + 多意图处理) | P1 | 待开始 |
| **Phase 6** | 视觉能力VisionService | 延后 | 待开始 |
#### ⏳ V3.0 开发计划2026-02-25 定稿
#### 📋 新增开发计划2026-02-08
- **[质控系统 UI 与 LLM 格式优化计划](./04-开发计划/07-质控系统UI与LLM格式优化计划.md)**
- 阶段 1LLM 格式优化PromptBuilder + XML 临床切片)~5.5h
- 阶段 2管理端 UI 增强(质控驾驶舱 + 统计卡片 + 热力图)~9.5h
- 阶段 3变量标签系统按语义标签切片数据~5h
> 详见:[CRA Agent V3.0 开发计划](./04-开发计划/V3.0全新开发计划/V3.0全新开发计划.md)
| 阶段 | 内容 | 预估 | 状态 |
|------|------|------|------|
| **P0-1** | ChatOrchestrator + ToolsService 重构4 语义化工具 + LLM Tool Use | 2 天 | 待开始 |
| **P0-2** | report 工具补全read_report + search_knowledge 实现) | 1.5 天 | 待开始 |
| **P0-3** | 定时质控 + 报告生成 + eQuery 闭环pg-boss cron + 全量/增量报告 + eQuery 状态机) | 3.5 天 | 待开始 |
| **P0-4** | 统一质控驾驶舱(概览 + AI Stream + eQuery 管理 + 报告归档 + 重大事件库) | 2.5 天 | 待开始 |
| **P1-1** | 企业微信主动推送(日报/告警/eQuery 通知) | 2 天 | 待开始 |
| **P1-2** | 管理端配置增强(规则模板 + 多项目切换) | 2 天 | 待开始 |
| **P2** | 长期可选PII 脱敏 / SDV 视觉核对 / AutoMapper / 数据响应质量评级) | - | 待开始 |
**P0 合计:约 9.5 天 / P0+P1 合计:约 13.5 天1 人)**
- **部署状态**:✅ REDCap 生产环境运行中https://redcap.xunzhengyixue.com/
- **已知问题**
- **开发计划文档**[V2.9.1 综合开发计划](./04-开发计划/IIT%20Manager%20Agent%20V2.6%20综合开发计划.md)
- **已知问题**ChatService (1442行) 为"上帝类",关键词路由需重构为 LLM Tool Use
- **开发计划文档**[CRA Agent V3.0 开发计划](./04-开发计划/V3.0全新开发计划/V3.0全新开发计划.md)
- **历史计划文档**[V2.9.1 综合开发计划](./04-开发计划/IIT%20Manager%20Agent%20V2.6%20综合开发计划.md)(已归档)
---
@@ -176,17 +183,16 @@ IIT Manager Agent研究者发起试验管理助手是一个基于企业微
- ✅ 端到端测试通过(<2秒延迟100%成功率)
-**🎯 MVP闭环完全打通**REDCap → Node.js → 企业微信)
**下一步任务**
- ⏳ Phase 1.5AI质控能力Dify RAG + 规则引擎
- ⏳ Phase 2多项目支持`notification_config` 字段)
- ⏳ Phase 2定时轮询实现兜底机制
**下一步任务V3.0**
- ⏳ P0-1ChatOrchestrator + ToolsService 重构LLM Tool Use + 4 语义化工具
- ⏳ P0-2read_report + search_knowledge 工具实现
- ⏳ P0-3定时质控 + 报告生成 + eQuery 闭环
- ⏳ P0-4统一质控驾驶舱AI Stream + eQuery 管理)
**待完成任务**
- ⏳ 数据质量Agent开发AI质控
- ⏳ 企业微信对话功能(用户消息处理)
- ⏳ 影子状态管理
- ⏳ 微信小程序前端
- ⏳ REDCap双向回写
**已废弃的旧计划任务**
- ~~Phase 3ReAct 引擎~~ → 改用 LLM 原生 Tool Use
- ~~Phase 5IntentService~~ → LLM 自行选择工具
- ~~微信小程序前端~~ → 管理端 Web 前端 + 企微推送
---
@@ -197,18 +203,31 @@ IIT Manager Agent研究者发起试验管理助手是一个基于企业微
- **Schema名称**`iit_schema`
- **数据库**`ai_clinical_research`RDS PostgreSQL 15
- **创建时间**2025-12-31
- **表数量**5个
- **表数量**18 个(原始 5 个 + 质控 4 个 + 规则/技能 4 个 + 知识库/会话/字段元数据 5 个)
- **验证状态**:✅ 已创建并验证
### 2.2 表结构
### 2.2 核心表结构
| 表名 | 用途 | 主要字段 | 索引 |
|------|------|---------|------|
| **IitProject** | 项目配置 | id, redcapApiUrl, redcapApiToken, difyAgentUrl | redcapProjectId |
| **IitPendingAction** | 影子状态(待审核动作) | id, projectId, actionType, status | projectId, status |
| **IitTaskRun** | 任务运行记录 | id, projectId, taskType, status | projectId, status |
| **IitUserMapping** | 跨系统用户映射 | id, projectId, redcapUsername, wechatUserId | redcapUsername, wechatUserId |
| **IitAuditLog** | 审计日志 | id, projectId, actionType, operator | projectId, createdAt |
| 表名 | 用途 | 类别 |
|------|------|------|
| **IitProject** | 项目配置REDCap 连接 + 规则 + 知识库) | 基础 |
| **IitPendingAction** | 影子状态(待审核动作) | 基础 |
| **IitTaskRun** | 任务运行记录 | 基础 |
| **IitUserMapping** | 跨系统用户映射 | 基础 |
| **IitAuditLog** | 审计日志 | 基础 |
| **iit_qc_logs** | 质控日志(单条质控问题记录) | 质控 |
| **iit_record_summary** | 患者录入汇总 | 质控 |
| **iit_qc_project_stats** | 项目级质控统计 | 质控 |
| **iit_field_metadata** | REDCap 字段元数据缓存 | 质控 |
| **iit_qc_rules** | 质控规则定义 | 规则 |
| **iit_qc_skills** | 质控技能定义 | 规则 |
| **iit_qc_rule_skill** | 规则-技能关联 | 规则 |
| **iit_qc_skill_triggers** | 技能触发器 | 规则 |
| **iit_chat_sessions** | 对话会话 | 会话 |
| **iit_chat_messages** | 对话消息 | 会话 |
| **iit_knowledge_bases** | 知识库 | 知识 |
| **iit_knowledge_documents** | 知识库文档 | 知识 |
| **iit_qc_reports**V3.0 新增) | 质控报告归档 | 报告 |
### 2.3 Prisma Schema位置
@@ -216,8 +235,8 @@ IIT Manager Agent研究者发起试验管理助手是一个基于企业微
AIclinicalresearch/backend/prisma/schema.prisma
```
**IIT Manager Schema定义**位于文件末尾
- 完整的5个表模型定义
**IIT Manager Schema定义**~350 行类型定义
- 18 个表模型定义
- 外键关系配置
- 索引优化
- JSON字段支持
@@ -233,20 +252,29 @@ AIclinicalresearch/backend/prisma/schema.prisma
- **Web框架**Fastify
- **ORM**Prisma 6.17.0多Schema支持
- **任务队列**pg-bossPostgres-Only架构
- **AI能力**Dify RAGRESTful API
- **AI能力**LLM Tool Use (DeepSeek/Qwen) + 自研 RAG (pgvector)
**模块结构**
**模块结构**61 个文件,~15,000+ 行)
```
backend/src/modules/iit-manager/
├── index.ts ✅ 主入口(模块注册)
├── types/
│ └── index.ts ✅ 类型定义223行
├── routes/
│ └── index.ts ✅ 路由骨架
├── controllers/ ⏳ 待开发
├── services/ ⏳ 待开发
├── agents/ ⏳ 待开发
└── adapters/ ⏳ 待开发
├── index.ts ✅ 主入口
├── types/index.ts ✅ 类型定义
├── routes/ ✅ 路由5+ 个路由文件
├── controllers/ ✅ 控制器Webhook/QcCockpit/Admin
├── services/
│ ├── ChatService.ts ✅ 1442行V3.0 将重构为 ChatOrchestrator
│ ├── ToolsService.ts ✅ 731行V3.0 重构为 4 语义化工具)
│ ├── HardRuleEngine.ts ✅ 478行JSON-logic 硬规则)
│ ├── SoftRuleEngine.ts ✅ 488行LLM 软规则)
│ ├── SkillRunner.ts ✅ 756行质控技能编排
│ ├── QcReportService.ts ✅ 980行报告生成
│ ├── QcService.ts ✅ 质控查询服务
│ ├── RedcapCacheService.ts ✅ REDCap 缓存
│ ├── KnowledgeBaseService.ts ✅ 知识库服务
│ └── ...
├── adapters/
│ └── RedcapAdapter.ts ✅ 1363行REDCap API 适配器)
└── workers/ ✅ pg-boss Worker质控/同步)
```
### 3.2 前端技术栈
@@ -404,20 +432,24 @@ backend/prisma/schema.prisma
- 包含外键关系和索引
```
**模块代码**
**模块代码**(主要文件)
```
backend/src/modules/iit-manager/
├── index.ts ✅ 82行模块注册
├── types/index.ts ✅ 223行类型定义
├── routes/index.ts ✅ 23行路由骨架
├── test-iit-database.ts ✅ 111行数据库测试
── test-wechat-push.ts ✅ 138行企微测试
├── services/ChatService.ts 1442行对话服务V3.0 待重构
├── adapters/RedcapAdapter.ts 1363行REDCap API 适配器
├── services/QcReportService.ts 980行质控报告生成
├── services/SkillRunner.ts 756行技能编排器
── services/ToolsService.ts 731行工具服务V3.0 待重构
├── services/SoftRuleEngine.ts 488行LLM 软规则)
├── services/HardRuleEngine.ts 478行JSON-logic 硬规则)
├── controllers/WebhookController.ts 500+行REDCap/企微回调)
└── ... (61 files total)
```
**代码统计**
- **已完成代码**577行
- **测试脚本**249行
- **总计**826行
- **后端代码**~15,000+ 行 / 61 个文件
- **数据库表**18 张iit_schema
- **Prisma Schema**~350 行类型定义
### 5.2 前端代码
@@ -538,173 +570,41 @@ npx ts-node src/modules/iit-manager/test-wechat-push.ts
---
## 🎯 八、下一步工作(Day 2
## 🎯 八、下一步工作(V3.0 开发
### 8.1 Day 2总体目标
### 8.1 V3.0 首要目标
**核心目标**实现REDCap数据的实时拉取能力
**核心目标**将 ChatService 关键词路由重构为 LLM 原生 Tool Use 架构
**交付物**
- ✅ REDCap API Adapter`RedcapAdapter.ts`
- ✅ Webhook接收器`WebhookController.ts`
- ✅ 数据同步管理(`SyncManager.ts`
- ✅ 完整测试(单元测试 + 集成测试)
**即将开始**P0-1 ChatOrchestrator + ToolsService 重构2 天)
**预计工作量**6-8小时完整工作日
**核心交付物**
- ChatOrchestrator替代 ChatService~300 行LLM Tool Use 循环)
- ToolsService 重构6 个细粒度工具 → 4 个语义化工具)
- System Prompt嵌入工具选择策略
- 端到端测试(对话 → LLM 选工具 → 执行 → 返回结果)
---
**详细计划**[CRA Agent V3.0 开发计划](./04-开发计划/V3.0全新开发计划/V3.0全新开发计划.md)
### 8.2 阶段1环境准备30分钟
### 8.2 V3.0 产品三原则
**REDCap配置**
- [ ] 在Control Center启用DET功能
- [ ] 在test0102项目生成API Token
- [ ] 配置环境变量:
```env
REDCAP_BASE_URL=http://localhost:8080
REDCAP_API_TOKEN_TEST=YOUR_TOKEN_HERE
```
- [ ] 使用curl测试API是否可用
1. **AI 替代**Agent 自驱执行质控全流程,用户仅做确认
2. **AI 白盒化**AI Stream 时间线透明展示推理与操作过程
3. **统一视角**:去角色化,单一平台所有用户可下钻查看
**测试工具准备**
- [ ] 安装ngrok用于DET测试
- [ ] 准备Postman CollectionAPI调试
- [ ] 准备测试数据在REDCap中录入几条记录
### 8.3 关键注意事项
---
### 8.3 阶段2RedcapAdapter开发1.5小时)
**文件位置**`backend/src/modules/iit-manager/adapters/RedcapAdapter.ts`
**任务清单**
- [ ] 创建RedcapAdapter类
- [ ] 实现 `exportRecords()` 方法(支持增量同步)
- [ ] 实现 `exportMetadata()` 方法(获取字段定义)
- [ ] 实现 `importRecords()` 方法Phase 2使用
- [ ] 实现 `formatRedcapDate()` 工具方法
- [ ] 配置axios超时和重试
- [ ] 编写单元测试:`RedcapAdapter.test.ts`
**验收标准**
- ✅ 可以拉取test0102的所有记录
- ✅ 可以拉取指定record_id的记录
- ✅ 可以使用dateRangeBegin增量拉取
- ✅ 可以获取元数据(字段定义)
- ✅ 单元测试全部通过
---
### 8.4 阶段3WebhookController开发2小时
**文件位置**`backend/src/modules/iit-manager/controllers/webhookController.ts`
**任务清单**
- [ ] 创建WebhookController类
- [ ] 实现 `handleRedcapWebhook()` 方法(响应时间<100ms
- [ ] 实现 `processWebhook()` 异步处理方法
- [ ] 实现 `checkDuplicate()` 幂等性检查
- [ ] 配置路由:`POST /api/v1/iit/webhooks/redcap`
- [ ] 记录审计日志
- [ ] 推送到质控队列(`iit:quality-check`
**验收标准**
- ✅ Webhook可以接收POST请求
- ✅ 立即返回200 OK<100ms
- ✅ 异步处理不阻塞响应
- ✅ 5分钟内相同记录不重复处理
- ✅ 成功调用RedcapAdapter拉取数据
- ✅ 数据推送到pg-boss队列
---
### 8.5 阶段4SyncManager开发1.5小时)
**文件位置**`backend/src/modules/iit-manager/services/SyncManager.ts`
**任务清单**
- [ ] 创建SyncManager类
- [ ] 实现 `initializeSync()` 方法(注册定时任务)
- [ ] 实现 `handlePoll()` 方法(轮询逻辑)
- [ ] 实现 `stopSync()` 方法(停止同步)
- [ ] 注册pg-boss Worker`iit:redcap:poll`
- [ ] 增量拉取逻辑使用lastSyncAt
- [ ] 更新项目lastSyncAt字段
**验收标准**
- ✅ 可以手动触发一次轮询
- ✅ 定时任务可以自动执行每30分钟
- ✅ 增量拉取正确(只拉取新数据)
- ✅ lastSyncAt正确更新
- ✅ 数据推送到质控队列
---
### 8.6 阶段5集成测试1小时
**测试内容**
1. **DET配置验证**
- [ ] 在REDCap中配置DET URL
- [ ] 使用ngrok测试Webhook
- [ ] 验证Payload格式
2. **API测试**
- [ ] 运行 `test-redcap-api.ts`
- [ ] 验证exportRecords正常
- [ ] 验证exportMetadata正常
3. **端到端测试**
- [ ] 在REDCap保存一条记录
- [ ] 验证Webhook被触发
- [ ] 验证数据被拉取
- [ ] 验证数据推送到队列
- [ ] 验证审计日志记录
4. **轮询测试**
- [ ] 手动触发轮询
- [ ] 验证增量拉取
- [ ] 验证lastSyncAt更新
**验收标准**
- ✅ DET实时触发正常
- ✅ API拉取数据正常
- ✅ 轮询补充机制正常
- ✅ 端到端流程畅通
- ✅ 所有测试通过
---
### 8.7 阶段6文档更新30分钟
**更新内容**
- [ ] 更新MVP开发任务清单Day 2标记为完成
- [ ] 记录API Token和配置信息
- [ ] 更新模块当前状态文档
- [ ] 更新架构图
- [ ] 提交Git遵循Git提交规范
---
### 8.8 关键注意事项
**性能要求**
- ⚠️ Webhook响应时间必须<100ms
- ⚠️ 使用`setImmediate()`异步处理,不阻塞响应
**安全要求**
- ⚠️ API Token存储在环境变量
- ⚠️ 不要在日志中打印完整Token
- ⚠️ 不要提交Token到Git
**可靠性要求**
- ⚠️ 实现幂等性检查(防止重复处理)
- ⚠️ 实现轮询补充防止DET遗漏
- ⚠️ 记录详细日志(便于排查问题)
**架构决策**
- ✅ 报告优先工具兜底read_report 为主入口80% 问答通过报告回答)
- ✅ LLM 原生 Tool Use不手写 ReAct 循环
- ✅ 4 个粗粒度语义化工具look_up_data / check_quality / read_report / search_knowledge
- ✅ pg-boss cron 定时触发(替代自建 SchedulerService
**技术参考**
- 📖 [CRA Agent V3.0 开发计划](./04-开发计划/V3.0全新开发计划/V3.0全新开发计划.md)
- 📖 [统一数字 CRA 质控平台 PRD](./04-开发计划/V3.0全新开发计划/统一数字%20CRA%20质控平台产品需求文档(PRD).md)
- 📖 [UI 原型](./04-开发计划/V3.0全新开发计划/Final%20CRA质控平台V3.html)
- 📖 [REDCap对接技术方案与实施指南](./04-开发计划/REDCap对接技术方案与实施指南.md)
- 📖 [REDCap二次开发深度指南](../../Redcap/03-API对接与开发/33-REDCap二次开发深度指南.md)
- 📖 [REDCap Docker部署操作手册](../../Redcap/01-部署与配置/10-REDCap_Docker部署操作手册.md)
---
@@ -719,9 +619,13 @@ npx ts-node src/modules/iit-manager/test-wechat-push.ts
### 9.2 开发计划文档
- [MVP开发任务清单](./04-开发计划/MVP开发任务清单.md) - 详细任务清单
- ⭐⭐⭐ [CRA Agent V3.0 开发计划](./04-开发计划/V3.0全新开发计划/V3.0全新开发计划.md) - **当前核心开发计划**
- ⭐⭐ [统一数字 CRA 质控平台 PRD](./04-开发计划/V3.0全新开发计划/统一数字%20CRA%20质控平台产品需求文档(PRD).md) - 产品需求文档
- ⭐ [UI 原型](./04-开发计划/V3.0全新开发计划/Final%20CRA质控平台V3.html) - HTML 原型(浏览器打开预览)
- [MVP开发任务清单](./04-开发计划/MVP开发任务清单.md) - 初期任务清单(已归档)
- [V2.9.1 综合开发计划](./04-开发计划/IIT%20Manager%20Agent%20V2.6%20综合开发计划.md) - 旧版计划(已归档)
- [企业微信注册指南](./04-开发计划/企业微信注册指南.md) - 企业微信配置
- ⭐ [REDCap对接技术方案与实施指南](./04-开发计划/REDCap对接技术方案与实施指南.md) - REDCap集成完整方案Day 2核心参考
- [REDCap对接技术方案与实施指南](./04-开发计划/REDCap对接技术方案与实施指南.md) - REDCap集成完整方案
### 9.3 REDCap相关文档
@@ -936,11 +840,13 @@ npx ts-node src/modules/iit-manager/test-wechat-push.ts
---
> **提示**本文档反映IIT Manager Agent模块的最新真实状态每个里程碑完成后必须更新
> **最后更新**2026-02-08 22:00
> **当前进度**事件级质控 V3.1 完成60%| 下一步Phase 3 ReAct 引擎 + 流水账
> **重要文档**
> - [事件级质控开发记录](./06-开发记录/2026-02-08-事件级质控与报告优化开发记录.md) ⭐⭐⭐⭐⭐
> - [实时质控系统开发记录](./06-开发记录/2026-02-07-实时质控系统开发记录.md) ⭐⭐⭐⭐⭐
> - [REDCap对接技术方案与实施指南](./04-开发计划/REDCap对接技术方案与实施指南.md) ⭐⭐⭐⭐
> **最后更新**2026-02-25
> **当前进度**V3.0 开发计划已定稿 | 下一步P0-1 ChatOrchestrator + ToolsService 重构
> **核心文档**
> - [CRA Agent V3.0 开发计划](./04-开发计划/V3.0全新开发计划/V3.0全新开发计划.md) ⭐⭐⭐⭐⭐
> - [统一数字 CRA 质控平台 PRD](./04-开发计划/V3.0全新开发计划/统一数字%20CRA%20质控平台产品需求文档(PRD).md) ⭐⭐⭐⭐⭐
> - [UI 原型](./04-开发计划/V3.0全新开发计划/Final%20CRA质控平台V3.html) ⭐⭐⭐⭐
> - [事件级质控开发记录](./06-开发记录/2026-02-08-事件级质控与报告优化开发记录.md)
> - [实时质控系统开发记录](./06-开发记录/2026-02-07-实时质控系统开发记录.md)

View File

@@ -0,0 +1,743 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>统一数字 CRA 质控平台 - 终极版</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/@phosphor-icons/web"></script>
<style>
.no-scrollbar::-webkit-scrollbar { display: none; }
.no-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }
.dash-border { background-image: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%2394A3B8FF' stroke-width='2' stroke-dasharray='8%2c 8' stroke-dashoffset='0' stroke-linecap='square'/%3e%3c/svg%3e"); border-radius: 8px; }
.dash-border:hover { background-image: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='8' ry='8' stroke='%233B82F6FF' stroke-width='2' stroke-dasharray='8%2c 8' stroke-dashoffset='0' stroke-linecap='square'/%3e%3c/svg%3e"); }
/* Timeline line styling */
.timeline-line::before {
content: ''; position: absolute; top: 24px; bottom: -24px; left: 15px; width: 2px; background-color: #e2e8f0; z-index: 0;
}
.timeline-item:last-child .timeline-line::before { display: none; }
</style>
</head>
<body class="flex h-screen w-full bg-slate-50 text-slate-800 font-sans overflow-hidden">
<!-- 1. 统一左侧导航栏 -->
<aside class="w-64 bg-slate-900 text-slate-300 flex flex-col transition-all duration-300 shrink-0">
<div class="h-16 flex items-center px-6 border-b border-slate-800 bg-slate-950">
<i class="ph-fill ph-robot text-2xl text-blue-500 mr-2"></i>
<span class="font-bold text-lg text-white tracking-wide">AI 监查系统</span>
</div>
<div class="p-4">
<p class="text-[10px] font-bold text-slate-500 uppercase tracking-widest mb-2">当前监控项目</p>
<div class="bg-slate-800 rounded-lg p-3 border border-slate-700 shadow-inner">
<h3 class="text-sm font-bold text-white mb-1 leading-tight">IIT-2026-001</h3>
<p class="text-xs text-slate-400 leading-tight">非小细胞肺癌真实世界研究</p>
</div>
</div>
<!-- 统一视角的导航菜单 -->
<nav class="flex-1 px-3 py-4 space-y-1 overflow-y-auto">
<p class="text-[10px] font-bold text-slate-500 uppercase tracking-widest px-3 mb-2">全局与宏观概览</p>
<a href="#" onclick="switchView('dashboard')" id="nav-dashboard" class="flex items-center px-3 py-2.5 rounded-md group transition-colors bg-blue-600/20 text-blue-400">
<i class="ph ph-presentation-chart text-xl mr-3 opacity-70 group-hover:opacity-100"></i>
<span class="font-medium text-sm">项目健康度大盘</span>
</a>
<a href="#" onclick="switchView('reports')" id="nav-reports" class="flex items-center px-3 py-2.5 rounded-md text-slate-400 group hover:bg-slate-800 hover:text-white transition-colors">
<i class="ph ph-files text-xl mr-3 opacity-70 group-hover:opacity-100"></i>
<span class="font-medium text-sm">定期报告与关键事件</span>
</a>
<p class="text-[10px] font-bold text-slate-500 uppercase tracking-widest px-3 mb-2 mt-6">AI 监查过程与细节</p>
<a href="#" onclick="switchView('ai-stream')" id="nav-ai-stream" class="flex items-center px-3 py-2.5 rounded-md text-slate-400 group hover:bg-slate-800 hover:text-white transition-colors">
<i class="ph ph-activity text-xl mr-3 opacity-70 group-hover:opacity-100"></i>
<span class="font-medium text-sm">AI 实时工作流水</span>
<span class="ml-auto flex h-2 w-2 relative">
<span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75"></span>
<span class="relative inline-flex rounded-full h-2 w-2 bg-emerald-500"></span>
</span>
</a>
<p class="text-[10px] font-bold text-slate-500 uppercase tracking-widest px-3 mb-2 mt-6">人工介入与协作</p>
<a href="#" onclick="switchView('equery')" id="nav-equery" class="flex items-center px-3 py-2.5 rounded-md text-slate-400 group hover:bg-slate-800 hover:text-white transition-colors">
<i class="ph ph-list-checks text-xl mr-3 opacity-70 group-hover:opacity-100"></i>
<span class="font-medium text-sm">待处理电子质疑 (eQuery)</span>
<span class="ml-auto bg-red-500 text-white py-0.5 px-2 rounded-full text-[10px] font-bold shadow-sm">3</span>
</a>
</nav>
<div class="p-4 border-t border-slate-800 text-xs text-slate-500 flex items-center">
<i class="ph-fill ph-check-circle text-emerald-500 mr-2"></i> 系统统一视图,全员可见
</div>
</aside>
<!-- 2. 主内容区域 -->
<main class="flex-1 flex flex-col min-w-0 overflow-hidden relative">
<!-- 顶部 Header -->
<header class="h-16 bg-white border-b border-slate-200 flex items-center justify-between px-6 shrink-0 z-10">
<div class="flex items-center">
<button id="btn-back" onclick="switchView('equery')" class="hidden mr-4 p-1.5 rounded-md hover:bg-slate-100 text-slate-500 transition-colors">
<i class="ph ph-arrow-left text-xl"></i>
</button>
<h1 id="header-title" class="text-xl font-bold text-slate-800">项目健康度大盘</h1>
</div>
<div class="flex items-center space-x-4">
<div class="flex items-center px-3 py-1.5 bg-slate-50 border border-slate-200 rounded-full">
<i class="ph-fill ph-plugs-connected text-emerald-500 mr-2"></i>
<span class="text-xs font-medium text-slate-600">EDC 实时直连中</span>
</div>
<button onclick="toggleCopilot()" id="btn-copilot-toggle" class="p-2 rounded-md transition-colors bg-blue-50 text-blue-600 hover:bg-blue-100" title="呼叫 AI 助理">
<i class="ph-fill ph-sparkle text-xl"></i>
</button>
</div>
</header>
<!-- ================= 视图 A全局大盘 (Dashboard) ================= -->
<div id="view-dashboard" class="flex-1 overflow-y-auto p-6 bg-slate-50/50 block">
<div class="mb-6 flex justify-between items-end">
<div>
<h2 class="text-2xl font-bold text-slate-800">全局监查态势</h2>
<p class="text-sm text-slate-500 mt-1">从宏观趋势到底层患者明细,掌握项目全维度数据质量</p>
</div>
</div>
<!-- 1. 宏观数据卡片 -->
<div class="grid grid-cols-4 gap-4 mb-8">
<div class="bg-white rounded-xl border border-slate-200 p-5 shadow-sm relative overflow-hidden">
<div class="absolute top-0 right-0 w-24 h-24 bg-emerald-100 rounded-full -mr-8 -mt-8 opacity-50"></div>
<div class="flex items-center text-slate-500 mb-2 relative z-10">
<span class="text-sm font-bold">整体数据合规率</span>
</div>
<div class="text-3xl font-black text-emerald-600 relative z-10">96.8%</div>
<div class="text-xs text-emerald-600 mt-2 font-medium">↑ 较上周提升 1.2%</div>
</div>
<div class="bg-white rounded-xl border border-slate-200 p-5 shadow-sm cursor-pointer hover:border-blue-400 transition-colors" onclick="switchView('equery')">
<div class="flex items-center text-slate-500 mb-2">
<span class="text-sm font-bold">待处理违规 (eQuery)</span>
<i class="ph-bold ph-arrow-up-right ml-auto text-blue-500"></i>
</div>
<div class="text-3xl font-black text-red-600">3</div>
<div class="text-xs text-red-500 mt-2 font-medium">包含 1 项重大时序冲突</div>
</div>
<div class="bg-white rounded-xl border border-slate-200 p-5 shadow-sm cursor-pointer hover:border-blue-400 transition-colors" onclick="switchView('ai-stream')">
<div class="flex items-center text-slate-500 mb-2">
<span class="text-sm font-bold">AI 今日审查表单数</span>
<i class="ph-bold ph-arrow-up-right ml-auto text-blue-500"></i>
</div>
<div class="text-3xl font-black text-slate-800">142</div>
<div class="text-xs text-slate-500 mt-2">100% 自动化,无需人工参与</div>
</div>
<div class="bg-gradient-to-br from-slate-800 to-slate-900 rounded-xl border border-slate-700 p-5 shadow-sm text-white cursor-pointer hover:from-slate-700 hover:to-slate-800 transition-colors" onclick="switchView('reports')">
<div class="flex items-center text-slate-300 mb-2">
<span class="text-sm font-bold">累计关键事件 (AE/PD)</span>
<i class="ph-bold ph-arrow-up-right ml-auto text-blue-300"></i>
</div>
<div class="text-3xl font-black text-white">12 <span class="text-sm text-slate-400 font-normal"></span></div>
<div class="text-xs text-blue-300 mt-2">已沉淀至定期质控报告</div>
</div>
</div>
<!-- 2. 微观状态底座:项目风险热力图 (引入患者维度真实质控情况) -->
<div class="bg-white rounded-xl border border-slate-200 shadow-sm mb-8 relative overflow-hidden">
<div class="px-6 py-4 border-b border-slate-200 flex justify-between items-center bg-slate-50/50">
<h2 class="text-base font-bold text-slate-800 flex items-center">
<i class="ph-fill ph-squares-four text-blue-500 mr-2 text-lg"></i>
当前入组患者最新质控状态 (受试者 × 表单矩阵)
</h2>
<div class="flex items-center text-xs text-slate-500 space-x-4">
<span class="flex items-center"><div class="w-3 h-3 rounded-sm bg-red-500 border border-red-600 mr-1"></div>异常/质疑中</span>
<span class="flex items-center"><div class="w-3 h-3 rounded-sm bg-yellow-400 border border-yellow-500 mr-1"></div>逻辑存疑</span>
<span class="flex items-center"><div class="w-3 h-3 rounded-sm bg-emerald-50 border border-emerald-200 mr-1"></div>AI 质控通过</span>
</div>
</div>
<div class="p-6 overflow-x-auto">
<table class="w-full text-sm text-left">
<thead>
<tr>
<th class="pb-3 pr-4 font-bold text-slate-500 w-32 border-b border-slate-200">受试者编号</th>
<th class="pb-3 px-2 font-bold text-slate-500 text-center border-b border-slate-200">知情同意</th>
<th class="pb-3 px-2 font-bold text-slate-500 text-center border-b border-slate-200">入选标准</th>
<th class="pb-3 px-2 font-bold text-slate-500 text-center border-b border-slate-200">实验室检查</th>
<th class="pb-3 px-2 font-bold text-slate-500 text-center border-b border-slate-200">不良事件 (AE)</th>
<th class="pb-3 px-2 font-bold text-slate-500 text-center border-b border-slate-200">随访记录</th>
</tr>
</thead>
<tbody id="heatmap-body">
<!-- JS 动态渲染热力图 -->
</tbody>
</table>
</div>
<div class="px-6 py-3 border-t border-slate-100 bg-slate-50 text-xs text-slate-500 flex justify-between items-center">
<span>* 矩阵实时反映 REDCap 最新录入与 AI 验证结果。点击红色高亮色块可直接进入 eQuery 处理中心。</span>
<button class="text-blue-600 font-bold hover:underline">查看全部 45 名患者</button>
</div>
</div>
<!-- 3. 近期概览 (事件预警 & 质量评级) -->
<div class="grid grid-cols-2 gap-6">
<!-- 近期高亮事件 -->
<div class="bg-white rounded-xl border border-slate-200 shadow-sm">
<div class="px-6 py-4 border-b border-slate-200 flex justify-between items-center">
<h2 class="text-base font-bold text-slate-800 flex items-center">
<i class="ph-fill ph-warning-circle text-yellow-500 mr-2 text-lg"></i>
近期关键事件预警 (AE/PD)
</h2>
</div>
<div class="p-0">
<div class="divide-y divide-slate-100">
<div class="p-4 px-6 hover:bg-slate-50">
<div class="flex items-center justify-between mb-1">
<span class="text-xs font-bold px-2 py-0.5 rounded bg-red-100 text-red-700">严重不良事件 (SAE)</span>
<span class="text-xs text-slate-400">昨天 14:30</span>
</div>
<p class="text-sm font-bold text-slate-800">P005 - 谷丙转氨酶(ALT)达到 150U/L</p>
<p class="text-xs text-slate-500 mt-1">由 AI 从实验室检查表抓取,已触发强制 SDV。</p>
</div>
<div class="p-4 px-6 hover:bg-slate-50">
<div class="flex items-center justify-between mb-1">
<span class="text-xs font-bold px-2 py-0.5 rounded bg-orange-100 text-orange-700">方案偏离 (PD)</span>
<span class="text-xs text-slate-400">3天前</span>
</div>
<p class="text-sm font-bold text-slate-800">P002 - 随访 2 严重超窗</p>
<p class="text-xs text-slate-500 mt-1">实际随访日期偏离方案要求窗口期超过 7 天。</p>
</div>
</div>
</div>
</div>
<!-- 质量评级 -->
<div class="bg-white rounded-xl border border-slate-200 shadow-sm">
<div class="px-6 py-4 border-b border-slate-200">
<h2 class="text-base font-bold text-slate-800 flex items-center">
<i class="ph-fill ph-users-three text-slate-400 mr-2 text-lg"></i>
数据响应质量一览
</h2>
</div>
<div class="p-6">
<p class="text-sm text-slate-600 mb-4">通过 AI 发起质疑的响应速度,评估各中心的数据录入质量与配合度。</p>
<div class="space-y-4">
<div>
<div class="flex justify-between text-sm mb-1">
<span class="font-medium text-slate-800">北京协和中心 (李明)</span>
<span class="text-emerald-600 font-bold">平均响应 4.5h</span>
</div>
<div class="w-full bg-slate-100 h-2 rounded-full overflow-hidden">
<div class="bg-emerald-500 h-full w-[90%] rounded-full"></div>
</div>
</div>
<div>
<div class="flex justify-between text-sm mb-1">
<span class="font-medium text-slate-800">上海中山中心 (赵小丽)</span>
<span class="text-yellow-600 font-bold">平均响应 12.2h</span>
</div>
<div class="w-full bg-slate-100 h-2 rounded-full overflow-hidden">
<div class="bg-yellow-400 h-full w-[60%] rounded-full"></div>
</div>
</div>
<div>
<div class="flex justify-between text-sm mb-1">
<span class="font-medium text-slate-800">广州南方中心 (王强)</span>
<span class="text-red-500 font-bold">平均响应 48.2h</span>
</div>
<div class="w-full bg-slate-100 h-2 rounded-full overflow-hidden">
<div class="bg-red-500 h-full w-[25%] rounded-full"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ================= 视图 BAI 工作流水 (AI Stream) ================= -->
<div id="view-ai-stream" class="flex-1 overflow-y-auto p-6 bg-slate-50/50 hidden">
<div class="max-w-4xl mx-auto">
<div class="mb-8">
<h2 class="text-2xl font-bold text-slate-800 flex items-center">
AI 实时工作流水
<span class="ml-4 flex items-center text-xs font-normal px-2.5 py-1 rounded-full bg-emerald-100 text-emerald-700">
<i class="ph-fill ph-radio mr-1"></i> Webhook 实时监听中
</span>
</h2>
<p class="text-sm text-slate-500 mt-1">完全透明展示 AI 的每一次审查、推理和结果,建立 100% 的信任。</p>
</div>
<div class="bg-white rounded-xl border border-slate-200 shadow-sm p-6 relative">
<div class="absolute top-6 left-12 bottom-6 w-px bg-slate-200"></div> <!-- 贯穿的垂直线 -->
<div class="space-y-6">
<!-- 流水记录 1 -->
<div class="relative flex items-start gap-4">
<div class="w-16 shrink-0 text-right pt-1">
<span class="text-xs font-bold text-blue-600">刚才</span>
</div>
<div class="w-8 h-8 rounded-full bg-blue-100 border-2 border-white flex items-center justify-center relative z-10 shrink-0 shadow-sm">
<i class="ph-bold ph-eye text-blue-600"></i>
</div>
<div class="flex-1 bg-slate-50 rounded-lg p-4 border border-slate-100">
<p class="text-sm font-bold text-slate-800">监听 EDC 保存事件,扫描 <span class="text-blue-600">P008 随访记录表</span></p>
<p class="text-xs text-slate-500 mt-1">调用 12 条硬逻辑规则,比对完成。耗时 0.2 秒。</p>
<div class="mt-2 inline-flex items-center text-xs font-bold text-emerald-600 bg-emerald-50 px-2 py-1 rounded">
<i class="ph-fill ph-check-circle mr-1"></i> 未发现异常,放行。
</div>
</div>
</div>
<!-- 流水记录 2 (发现问题并派发) -->
<div class="relative flex items-start gap-4">
<div class="w-16 shrink-0 text-right pt-1">
<span class="text-xs font-medium text-slate-400">10:24</span>
</div>
<div class="w-8 h-8 rounded-full bg-red-100 border-2 border-white flex items-center justify-center relative z-10 shrink-0 shadow-sm">
<i class="ph-bold ph-warning text-red-600"></i>
</div>
<div class="flex-1 bg-red-50/50 rounded-lg p-4 border border-red-100">
<p class="text-sm font-bold text-slate-800">扫描 <span class="text-blue-600">P005 实验室检查表</span> 时拦截异常</p>
<p class="text-xs text-slate-600 mt-1 leading-relaxed">
<strong class="text-slate-800">AI 推理链路:</strong>提取到 ALT=150U/L -> 检索方案知识库发现超 SAE 阈值 -> 交叉查询患者不良事件表 -> <span class="text-red-600 font-bold">发现记录缺失。</span>
</p>
<div class="mt-3 bg-white border border-red-200 rounded p-3 text-sm flex justify-between items-center">
<div>
<span class="font-mono text-xs text-red-500 font-bold block mb-1">执行动作:</span>
已自动生成电子质疑 <strong>eQuery-1029</strong>,并推送到 CRC 任务列表。
</div>
<button onclick="switchView('equery')" class="px-3 py-1.5 bg-red-100 text-red-700 text-xs font-bold rounded hover:bg-red-200 transition-colors">
查看该质疑
</button>
</div>
</div>
</div>
<!-- 流水记录 3 (自动复核闭环) -->
<div class="relative flex items-start gap-4">
<div class="w-16 shrink-0 text-right pt-1">
<span class="text-xs font-medium text-slate-400">09:15</span>
</div>
<div class="w-8 h-8 rounded-full bg-purple-100 border-2 border-white flex items-center justify-center relative z-10 shrink-0 shadow-sm">
<i class="ph-bold ph-arrows-clockwise text-purple-600"></i>
</div>
<div class="flex-1 bg-slate-50 rounded-lg p-4 border border-slate-100">
<p class="text-sm font-bold text-slate-800">执行二次自动复核 (P003 体格检查表)</p>
<p class="text-xs text-slate-500 mt-1">接收到 CRC 数据修正信号。重新验证身高体重计算的 BMI 逻辑关系。</p>
<div class="mt-2 inline-flex items-center text-xs font-bold text-purple-600 bg-purple-50 px-2 py-1 rounded">
<i class="ph-fill ph-check-circle mr-1"></i> 数据一致性验证通过,已自动关闭 eQuery-1015。
</div>
</div>
</div>
<!-- 凌晨跑批 -->
<div class="relative flex items-start gap-4">
<div class="w-16 shrink-0 text-right pt-1">
<span class="text-xs font-medium text-slate-400">02:00</span>
</div>
<div class="w-8 h-8 rounded-full bg-slate-200 border-2 border-white flex items-center justify-center relative z-10 shrink-0 shadow-sm">
<i class="ph-bold ph-moon-stars text-slate-600"></i>
</div>
<div class="flex-1 bg-slate-50 rounded-lg p-4 border border-slate-100">
<p class="text-sm font-bold text-slate-800">执行每日凌晨全量交叉核对跑批 (Cron Job)</p>
<p class="text-xs text-slate-500 mt-1">扫描全库 1204 份表单,进行跨表单逻辑验证。耗时 4.2 秒。未发现全局性新问题。</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ================= 视图 C待处理质疑 (eQuery) ================= -->
<div id="view-equery" class="flex-1 overflow-y-auto p-6 bg-slate-50/50 hidden">
<div class="max-w-5xl mx-auto">
<div class="mb-6 flex justify-between items-end">
<div>
<h2 class="text-2xl font-bold text-slate-800">待处理质疑 (eQuery) 列表</h2>
<p class="text-sm text-slate-500 mt-1">AI 发现的数据缺陷,需人工 (CRC) 响应修复或上传 SDV 凭证。</p>
</div>
</div>
<div class="bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden mb-6">
<div class="divide-y divide-slate-100">
<!-- 质疑项 1 -->
<div class="p-6 hover:bg-slate-50 transition-colors flex gap-6">
<div class="mt-1">
<i class="ph-fill ph-warning text-3xl text-red-500"></i>
</div>
<div class="flex-1">
<div class="flex justify-between items-start mb-2">
<div class="flex items-center gap-3">
<span class="px-2.5 py-1 rounded bg-slate-100 text-sm font-bold text-slate-700">P005</span>
<span class="text-base font-bold text-slate-800">实验室检查异常:漏报 AE</span>
<span class="text-xs font-bold px-2 py-0.5 bg-red-100 text-red-700 rounded border border-red-200">强制 SDV</span>
</div>
<span class="text-xs font-bold text-slate-500 font-mono bg-slate-100 px-2 py-1 rounded">eQuery-1029</span>
</div>
<p class="text-sm text-slate-700 leading-relaxed mb-4 p-3 bg-red-50/50 rounded border border-red-100">
<strong>AI 监查意见:</strong>检测到 ALT 异常升高 (150U/L),已达到方案规定的 SAE 标准。但该患者无对应的 AE 记录。为了排除数据录入错误,此项已触发强制 SDV。请上传该次访视的原始化验单照片供 AI 核对。
</p>
<div class="flex items-center justify-between mt-2 pt-4 border-t border-slate-100">
<div class="text-xs text-slate-500">
<i class="ph-fill ph-clock mr-1"></i> AI 派发时间: 今天 10:24
</div>
<button onclick="switchView('sdv-response')" class="px-6 py-2 text-sm font-bold text-white bg-blue-600 rounded-lg shadow-sm hover:bg-blue-700 transition-colors flex items-center">
去响应并上传凭证 <i class="ph-bold ph-arrow-right ml-2"></i>
</button>
</div>
</div>
</div>
<!-- 质疑项 2 -->
<div class="p-6 hover:bg-slate-50 transition-colors flex gap-6">
<div class="mt-1">
<i class="ph-fill ph-info text-3xl text-yellow-500"></i>
</div>
<div class="flex-1">
<div class="flex justify-between items-start mb-2">
<div class="flex items-center gap-3">
<span class="px-2.5 py-1 rounded bg-slate-100 text-sm font-bold text-slate-700">P002</span>
<span class="text-base font-bold text-slate-800">知情同意书:逻辑时序冲突</span>
</div>
<span class="text-xs font-bold text-slate-500 font-mono bg-slate-100 px-2 py-1 rounded">eQuery-1028</span>
</div>
<p class="text-sm text-slate-700 leading-relaxed mb-4 p-3 bg-yellow-50/50 rounded border border-yellow-100">
<strong>AI 监查意见:</strong>签署知情同意书的日期 (2026-02-25) 晚于心电图检查日期 (2026-02-24),涉嫌违规操作。请核实 REDCap 录入日期是否错误。
</p>
<div class="flex items-center justify-end gap-3 mt-2 pt-4 border-t border-slate-100">
<button class="px-4 py-2 bg-white border border-slate-300 hover:bg-slate-50 text-slate-700 text-sm font-medium rounded-lg transition-colors">
声明此为真实数据 (填写理由)
</button>
<button class="px-4 py-2 bg-slate-800 hover:bg-slate-900 text-white text-sm font-medium rounded-lg transition-colors flex items-center">
<i class="ph-bold ph-arrows-clockwise mr-2"></i> 我已在 EDC 修正,通知 AI 重查
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ================= 视图 D定期报告与事件沉淀 (Reports) ================= -->
<div id="view-reports" class="flex-1 overflow-y-auto p-6 bg-slate-50/50 hidden">
<div class="max-w-5xl mx-auto">
<div class="mb-8">
<h2 class="text-2xl font-bold text-slate-800">定期报告与关键事件库</h2>
<p class="text-sm text-slate-500 mt-1">临床研究的长期资产。AI 自动生成的阶段性报告与全生命周期重大事件追踪。</p>
</div>
<div class="grid grid-cols-3 gap-6">
<!-- 左侧:定期质控报告 -->
<div class="col-span-2">
<h3 class="text-base font-bold text-slate-800 mb-4 flex items-center">
<i class="ph-fill ph-files text-blue-500 mr-2"></i> AI 自动生成定期报告
</h3>
<div class="grid grid-cols-2 gap-4">
<!-- Report Card -->
<div class="bg-white rounded-xl border border-slate-200 p-5 shadow-sm hover:border-blue-400 cursor-pointer transition-colors group">
<div class="flex justify-between items-start mb-3">
<div class="w-10 h-10 rounded bg-blue-50 flex items-center justify-center text-blue-600">
<i class="ph-bold ph-file-pdf text-xl"></i>
</div>
<span class="text-xs font-bold text-slate-400">本周</span>
</div>
<h4 class="font-bold text-slate-800 group-hover:text-blue-600 transition-colors">2026年2月第3周 质控周报</h4>
<p class="text-xs text-slate-500 mt-2 mb-4 leading-relaxed">共审查 842 份表单,拦截并闭环 12 项逻辑错误,项目合规率提升 0.5%。</p>
<div class="text-xs font-medium text-blue-600 flex items-center border-t border-slate-100 pt-3">
点击预览详细报告 <i class="ph-bold ph-arrow-right ml-1"></i>
</div>
</div>
<!-- Report Card -->
<div class="bg-white rounded-xl border border-slate-200 p-5 shadow-sm hover:border-blue-400 cursor-pointer transition-colors group">
<div class="flex justify-between items-start mb-3">
<div class="w-10 h-10 rounded bg-slate-100 flex items-center justify-center text-slate-500">
<i class="ph-bold ph-file-pdf text-xl"></i>
</div>
<span class="text-xs font-bold text-slate-400">上周</span>
</div>
<h4 class="font-bold text-slate-800 group-hover:text-blue-600 transition-colors">2026年2月第2周 质控周报</h4>
<p class="text-xs text-slate-500 mt-2 mb-4 leading-relaxed">共审查 750 份表单,包含 1 项 PD (方案偏离) 专题汇总分析。</p>
<div class="text-xs font-medium text-slate-500 flex items-center border-t border-slate-100 pt-3">
点击预览详细报告 <i class="ph-bold ph-arrow-right ml-1"></i>
</div>
</div>
</div>
</div>
<!-- 右侧:重大事件记录库 -->
<div class="col-span-1">
<h3 class="text-base font-bold text-slate-800 mb-4 flex items-center">
<i class="ph-fill ph-archive text-slate-500 mr-2"></i> 重大事件沉淀库
</h3>
<div class="bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden">
<div class="divide-y divide-slate-100">
<div class="p-4 hover:bg-slate-50 cursor-pointer">
<div class="flex items-center justify-between mb-1">
<span class="text-xs font-bold text-red-600">严重不良事件 (SAE) 归档</span>
</div>
<p class="text-sm font-bold text-slate-800">P012 肺炎住院</p>
<p class="text-xs text-slate-500 mt-1">2026-01-15 发生,已完成与申办方的上报流程并闭环。</p>
</div>
<div class="p-4 hover:bg-slate-50 cursor-pointer">
<div class="flex items-center justify-between mb-1">
<span class="text-xs font-bold text-orange-600">方案偏离 (PD) 归档</span>
</div>
<p class="text-sm font-bold text-slate-800">P003 服药依从性极低</p>
<p class="text-xs text-slate-500 mt-1">记录于 2026-01-10AI 评估为重大偏离,剔除分析集。</p>
</div>
<div class="p-3 text-center bg-slate-50 border-t border-slate-100">
<button class="text-xs font-bold text-blue-600 hover:underline">查看全部 12 项历史事件</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ================= 视图 ESDV 响应界面 ================= -->
<div id="view-sdv" class="flex-1 flex flex-col h-full bg-slate-100 p-6 overflow-hidden hidden">
<div class="flex flex-col h-full bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden">
<div class="px-6 py-4 border-b border-slate-200 bg-slate-50 flex justify-between items-center shrink-0">
<div>
<h2 class="text-lg font-bold text-slate-800">响应 eQuery-1029上传 SDV 原始凭证</h2>
<p class="text-xs text-slate-500 mt-1">受试者 P005 / 实验室检查 / ALT 异常漏报</p>
</div>
<span class="px-3 py-1 bg-red-100 text-red-700 font-bold text-xs rounded-full flex items-center">
<i class="ph-bold ph-warning-circle mr-1"></i> AI 强制核查项
</span>
</div>
<div class="flex-1 flex overflow-hidden">
<div class="w-1/3 bg-slate-50 border-r border-slate-200 p-6 overflow-y-auto">
<div class="flex items-center text-blue-600 font-bold mb-4">
<i class="ph-fill ph-robot text-xl mr-2"></i> AI 监查员判定依据
</div>
<div class="space-y-6">
<div>
<h4 class="text-xs font-bold text-slate-400 uppercase mb-2">当前 REDCap 数据</h4>
<div class="bg-white border border-slate-200 rounded p-3 text-sm">
<span class="text-slate-500">lab_alt:</span> <span class="font-bold text-slate-800 ml-2">150 U/L</span>
</div>
</div>
<div>
<h4 class="text-xs font-bold text-slate-400 uppercase mb-2">AI 要求指令</h4>
<div class="bg-red-50 border border-red-100 rounded p-3 text-sm text-red-800">
在 REDCap 的《不良事件表》中未查找到对应记录。请在右侧上传该检验报告的原件照片AI 将重新提取化验单数值以确认是否为您的键盘录入错误。
</div>
</div>
</div>
</div>
<div class="flex-1 p-8 flex flex-col justify-center items-center bg-white relative">
<div id="drop-zone" class="w-full max-w-lg p-10 dash-border bg-slate-50 text-center hover:bg-blue-50 transition-colors cursor-pointer group">
<div class="w-16 h-16 rounded-full bg-blue-100 text-blue-600 flex items-center justify-center mx-auto mb-4 group-hover:scale-110 transition-transform">
<i class="ph-fill ph-cloud-arrow-up text-3xl"></i>
</div>
<h3 class="text-lg font-bold text-slate-800 mb-2">点击或将凭证照片拖拽至此处</h3>
<p class="text-sm text-slate-500 mb-6">支持 JPG, PNG, PDF 格式。请确保图片清晰,包含患者脱敏 ID。</p>
<button class="px-6 py-2.5 bg-white border border-slate-300 shadow-sm text-slate-700 font-medium rounded-lg hover:bg-slate-50 transition-colors">
浏览本地文件
</button>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- 3. 全局统一 AI Copilot -->
<aside id="sidebar-copilot" class="w-80 bg-white border-l border-slate-200 flex flex-col transition-all duration-300 ease-in-out shrink-0 z-20 shadow-xl">
<div class="h-16 border-b border-slate-100 flex items-center justify-between px-4 shrink-0 bg-blue-50/50">
<div class="flex items-center">
<div class="w-6 h-6 rounded bg-gradient-to-br from-blue-500 to-indigo-600 flex items-center justify-center mr-2 shadow-sm">
<i class="ph-fill ph-sparkle text-white text-xs"></i>
</div>
<span class="font-bold text-slate-800 text-sm">项目大模型助理</span>
</div>
<button onclick="toggleCopilot()" class="text-slate-400 hover:text-slate-600">
<i class="ph-fill ph-x-circle text-xl"></i>
</button>
</div>
<div id="chat-container" class="flex-1 overflow-y-auto p-4 space-y-4">
<div class="flex justify-start">
<div class="max-w-[85%] rounded-2xl px-4 py-3 text-sm leading-relaxed bg-slate-100 text-slate-800 rounded-bl-sm border border-slate-200">
<span class="font-bold block mb-1">您好!</span>
我是本项目的统一数字监查大脑。无论您是研究者还是协调员,都可以随时向我提问关于项目进度、数据质量或具体违规记录的细节。
</div>
</div>
</div>
<div class="p-3 border-t border-slate-100 bg-white shrink-0">
<form id="chat-form" class="relative">
<input
type="text"
id="chat-input"
placeholder="例如: 总结本周重大事件..."
class="w-full bg-slate-50 border border-slate-200 rounded-full pl-4 pr-10 py-2.5 text-sm focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500"
autocomplete="off"
/>
<button type="submit" class="absolute right-2 top-1/2 -translate-y-1/2 p-1.5 bg-blue-600 text-white rounded-full hover:bg-blue-700 transition-colors flex items-center justify-center">
<i class="ph-bold ph-paper-plane-right text-sm"></i>
</button>
</form>
<div class="mt-2 flex gap-2 overflow-x-auto pb-1 no-scrollbar">
<span onclick="sendPrompt('总结本周最容易犯的错误')" class="whitespace-nowrap bg-slate-50 border border-slate-200 text-slate-500 text-[10px] px-2 py-1 rounded-full cursor-pointer hover:bg-slate-100">总结本周错误趋势</span>
<span onclick="sendPrompt('解释为什么 P005 需要SDV')" class="whitespace-nowrap bg-slate-50 border border-slate-200 text-slate-500 text-[10px] px-2 py-1 rounded-full cursor-pointer hover:bg-slate-100">解释 P005 问题</span>
</div>
</div>
</aside>
<script>
// === Heatmap 渲染逻辑整合 ===
const MOCK_HEATMAP = [
{ id: 'P001', forms: ['green', 'green', 'green', 'green', 'yellow'] },
{ id: 'P002', forms: ['green', 'red', 'green', 'green', 'green'] },
{ id: 'P003', forms: ['green', 'green', 'yellow', 'green', 'green'] },
{ id: 'P004', forms: ['green', 'green', 'green', 'green', 'green'] },
{ id: 'P005', forms: ['green', 'green', 'red', 'red', 'yellow'] },
];
function renderHeatmap() {
const tbody = document.getElementById('heatmap-body');
if(!tbody) return;
let html = '';
MOCK_HEATMAP.forEach(row => {
let rowHtml = `<tr class="border-t border-slate-100 hover:bg-slate-50 transition-colors"><td class="py-3 pr-4 font-bold text-slate-700">${row.id}</td>`;
row.forms.forEach(status => {
let colorClass = status === 'red' ? 'bg-red-500 border-red-600 text-white shadow-sm hover:opacity-80' :
status === 'yellow' ? 'bg-yellow-400 border-yellow-500 text-yellow-900 shadow-sm hover:opacity-80' :
'bg-emerald-50 border-emerald-100 opacity-60 hover:opacity-100';
let iconHtml = status === 'red' ? `<i class="ph-bold ph-warning"></i>` : '';
let action = (status === 'red' || status === 'yellow') ? `onclick="switchView('equery')"` : '';
rowHtml += `<td class="p-1">
<div ${action} class="h-10 rounded flex items-center justify-center border transition-all cursor-pointer ${colorClass}">
${iconHtml}
</div>
</td>`;
});
rowHtml += '</tr>';
html += rowHtml;
});
tbody.innerHTML = html;
}
// === 视图路由映射表 ===
const views = {
'dashboard': { el: 'view-dashboard', title: '项目健康度大盘', nav: 'nav-dashboard', showBack: false },
'reports': { el: 'view-reports', title: '定期报告与关键事件', nav: 'nav-reports', showBack: false },
'ai-stream': { el: 'view-ai-stream', title: 'AI 工作流水', nav: 'nav-ai-stream', showBack: false },
'equery': { el: 'view-equery', title: '待处理质疑 (eQuery)', nav: 'nav-equery', showBack: false },
'sdv-response': { el: 'view-sdv', title: 'SDV 凭证上传与验证', nav: 'nav-equery', showBack: true }
};
function switchView(targetViewId) {
// 隐藏所有视图
Object.values(views).forEach(v => {
document.getElementById(v.el).classList.add('hidden');
document.getElementById(v.el).classList.remove('block', 'flex');
});
// 重置所有导航高亮
['nav-dashboard', 'nav-reports', 'nav-ai-stream', 'nav-equery'].forEach(id => {
const el = document.getElementById(id);
el.classList.remove('bg-blue-600/20', 'text-blue-400');
el.classList.add('text-slate-400');
});
// 显示目标视图
const target = views[targetViewId];
const el = document.getElementById(target.el);
// 某些视图需要 flex (如 sdv),其他用 block
if(targetViewId === 'sdv-response') {
el.classList.remove('hidden'); el.classList.add('flex');
} else {
el.classList.remove('hidden'); el.classList.add('block');
}
// 更新 Header 与返回按钮
document.getElementById('header-title').innerText = target.title;
const btnBack = document.getElementById('btn-back');
if(target.showBack) {
btnBack.classList.remove('hidden');
} else {
btnBack.classList.add('hidden');
}
// 更新导航高亮
const navEl = document.getElementById(target.nav);
navEl.classList.add('bg-blue-600/20', 'text-blue-400');
navEl.classList.remove('text-slate-400');
}
// Copilot 逻辑
let copilotOpen = true;
function toggleCopilot() {
const sidebar = document.getElementById('sidebar-copilot');
const btnToggle = document.getElementById('btn-copilot-toggle');
copilotOpen = !copilotOpen;
if (copilotOpen) {
sidebar.classList.remove('w-0', 'border-none');
sidebar.classList.add('w-80');
btnToggle.classList.replace('text-slate-400', 'text-blue-600');
btnToggle.classList.replace('hover:bg-slate-100', 'bg-blue-50');
} else {
sidebar.classList.remove('w-80');
sidebar.classList.add('w-0', 'border-none');
btnToggle.classList.replace('text-blue-600', 'text-slate-400');
btnToggle.classList.replace('bg-blue-50', 'hover:bg-slate-100');
}
}
let chatMessages = [
{ role: 'system', content: '您好!我是本项目的统一数字监查大脑。无论您是研究者还是协调员,都可以随时向我提问关于项目进度、数据质量或具体违规记录的细节。' }
];
function renderChat() {
const container = document.getElementById('chat-container');
let html = '';
chatMessages.forEach(msg => {
let alignment = msg.role === 'user' ? 'justify-end' : 'justify-start';
let styling = msg.role === 'user' ? 'bg-blue-600 text-white rounded-br-sm' :
msg.role === 'system' ? 'bg-slate-100 text-slate-500 text-xs text-center w-full rounded-lg' :
'bg-slate-100 text-slate-800 rounded-bl-sm border border-slate-200';
html += `
<div class="flex ${alignment}">
<div class="max-w-[85%] rounded-2xl px-4 py-2.5 text-sm leading-relaxed ${styling}">
${msg.content}
</div>
</div>`;
});
container.innerHTML = html;
container.scrollTop = container.scrollHeight;
}
function sendPrompt(text) {
document.getElementById('chat-input').value = text;
document.getElementById('chat-form').dispatchEvent(new Event('submit'));
}
document.getElementById('chat-form').addEventListener('submit', function(e) {
e.preventDefault();
const input = document.getElementById('chat-input');
const text = input.value.trim();
if (!text) return;
chatMessages.push({ role: 'user', content: text });
input.value = '';
renderChat();
setTimeout(() => {
chatMessages.push({ role: 'ai', content: '收到您的指令。我已将底层数据检索报告推送到您的界面,请查看左侧的模块视图。' });
renderChat();
}, 800);
});
// 初始化
window.onload = function() {
renderHeatmap(); // 渲染热力图
switchView('dashboard'); // 默认进入大盘视图
};
</script>
</body>
</html>

View File

@@ -0,0 +1,664 @@
# IIT CRA Agent V3.0 — 最终开发计划
> **版本:** V3.0-Final
> **日期:** 2026-02-25
> **核心定位:** 替代 CRA 岗位的自主 AI Agent而非辅助 CRA 的工具
> **主要用户:** PI主要研究者/ 研究团队
> **预估周期:** P0 约 9.5 天P0+P1 约 13.5 天1 人)
> **关联文档:**
> - 产品需求文档:[统一数字 CRA 质控平台 PRD](./统一数字%20CRA%20质控平台产品需求文档(PRD).md)
> - UI 原型:[Final CRA 质控平台 V3 原型](./Final%20CRA质控平台V3.html)HTML浏览器打开即可预览
---
## 1. 产品定位
### 1.1 CRA Agent 不是给 CRA 用的——是来替代 CRA 的
传统 IIT 项目中CRA临床监查员负责数据质控、方案偏离识别、AE 监测、Query 管理和监查报告撰写。CRA Agent 的目标是用 AI 替代这个岗位的 70-80% 工作量,让 IIT 项目在无专职 CRA 的情况下也能达到合规的质控水平。
| 维度 | 传统模式 | CRA Agent 模式 |
|------|---------|---------------|
| 谁干活 | 人类 CRA | AI Agent 自主执行 |
| 工作方式 | 周期性现场监查,抽查 20% | 7×24 全量自动质控 |
| 输出物 | 监查报告、Query 单 | 质控报告、Query 清单、风险预警 |
| 响应速度 | 下次访视时发现问题 | 数据录入后秒级发现 |
| 用户界面 | CRA 自己看 Excel | PI / 研究团队看驾驶舱 + 对话 |
| 成本 | 人力费用高IIT 常省略 | 接近零边际成本 |
### 1.2 能替代与不能替代
**可替代的工作70-80%**
| CRA 工作 | 替代程度 | 实现方式 |
|----------|---------|---------|
| 数据质量监控(逐字段核查) | 100% | HardRuleEngine + SoftRuleEngine全量检查 |
| 入排标准核查 | 95% | 规则编码LLM 辅助生成 |
| 方案偏离识别 | 90% | 访视窗口、用药剂量等规则 |
| AE/SAE 监测 | 85% | 时限规则 + 因果关系初判 |
| Query 生成与跟踪 | 90% | AI 生成标准化 Query |
| 监查报告撰写 | 95% | QcReportService 自动生成 |
| 入组趋势分析 | 100% | 纯数据统计 |
**暂不替代的工作20-30%**
| CRA 工作 | 原因 | 未来可能 |
|----------|------|---------|
| 原始数据核查SDV | 需对比医院病历,无 EMR 接口 | 接入 EMR 后可部分替代 |
| 实地设施检查 | 需人到现场 | 不可替代 |
| 复杂医学判断 | 需临床经验 | LLM 辅助PI 确认 |
| 人际沟通协调 | 催促中心、培训等 | 部分可用消息推送替代 |
> **关键洞察**:大部分 IIT 项目因预算限制根本没有 CRA 在做监查。AI 做到 70% 是从 0 到 70%,而非从 100% 降到 70%。
### 1.3 产品三原则
1. **AI 替代,不是辅助**Agent 自主巡查、出报告、发 Query无需人驱动。
2. **AI 白盒化Trust Building**AI 的每一步推理和操作对全员透明——实时工作流水AI Stream让人看到 Agent 在做什么、为什么这么做,建立对 AI 的信任。
3. **统一视角,去角色化**:废除传统的 PI 视角 / CRC 视角隔离。全员登录同一平台,按数据粒度(概览 → 过程 → 细节)自由穿透,实现"单一真相Single Source of Truth"。
### 1.4 两层架构
```mermaid
graph TB
subgraph autonomous [自驱动层: Agent 的日常工作]
Cron[定时调度 pg-boss cron] --> QC[全量质控 SkillRunner]
Webhook[REDCap DET 实时触发] --> QC
QC --> Report[生成质控报告 QcReportService]
QC --> Trace[写入 Agent Trace 日志]
Report --> Push[企微推送摘要 + Query 清单]
Report --> Dashboard[驾驶舱数据更新]
Report --> eQuery[eQuery 派发]
end
subgraph dashboard [统一驾驶舱: 四级穿透]
L1["概览: 项目健康度大盘"]
L2["过程: AI 工作流水 Timeline"]
L3["细节: 问题列表 + Query 管理"]
L4["资产: 报告归档 + 重大事件库"]
L1 --> L2 --> L3 --> L4
end
subgraph dialogue [对话层: 全局 AI Copilot]
User[任意用户提问] --> Orchestrator[ChatOrchestrator]
Orchestrator --> LLM["LLM + 4 Tools"]
LLM --> Answer[结构化回答]
end
Report -.->|read_report| LLM
Trace -.-> L2
Dashboard -.-> L1
eQuery -.-> L3
```
**自驱动层是核心**——Agent 不等人问,它自己干活。统一驾驶舱是全员查看 Agent 工作成果的窗口。对话层AI Copilot悬浮于所有页面之上任何人随时可问。
---
## 2. 现状盘点(代码实测)
| 组件 | 状态 | 行数 | 说明 |
|------|------|------|------|
| 管理端项目配置页面 | 有 | - | 项目列表 + 详情 + REDCap 连接 + 知识库关联 |
| 质控规则管理 UI | 有 | - | CRUD 规则,在项目详情内 |
| HardRuleEngine | 有 | 478 | JSON 硬规则执行,成熟 |
| SoftRuleEngine | 有 | 488 | LLM 软规则质控,可用 |
| SkillRunner | 有 | 756 | 按 record+event 编排质控 |
| RedcapAdapter | 有 | 1363 | 数据拉取/元数据/事件,功能完整 |
| QcReportService | 有 | 980 | 报告生成基础,需增强定时触发和推送 |
| ToolsService | 有 | 731 | 6 个细粒度工具,**需重构为 4 个语义化工具** |
| 实时质控Webhook | 有 | - | REDCap DET → pg-boss → 质控 Worker |
| 质控驾驶舱 UI | 有 | - | 统计卡片 + 热力图 + 详情抽屉 |
| WechatService | 有 | - | 企微推送,运行正常 |
| 18 张数据库表 | 有 | - | iit_schema结构合理 |
| **定时质控** | **缺** | - | 无 cron 调度,只有手动触发和实时 Webhook |
| **完整报告推送** | **缺** | - | QcReportService 有但无定时触发和企微推送 |
| **Query 清单生成** | **缺** | - | 无自动生成 Query 并推送的能力 |
| **REDCap 变量清单可视化** | **半成品** | - | RedcapAdapter.exportMetadata() 存在但未串通到 UI |
| **AI 辅助规则生成** | **缺** | - | 规则需手动配置,无 LLM 建议 |
| **eQuery 闭环** | **缺** | - | Query 清单已有雏形,但无状态机(派发→回复→复核→关闭) |
| **AI 工作流水AI Stream** | **半成品** | - | `iit_agent_trace` + `iit_qc_logs` 表已有,但无前端 Timeline 展示 |
| **重大事件归档** | **缺** | - | SAE/PD 无永久归档和审计轨迹 |
| **ChatService对话** | **需重构** | 1442 | 上帝类,关键词路由,需用 ChatOrchestrator 替代 |
| **对话历史持久化** | **缺** | - | 只有内存 SessionMemory |
---
## 3. 工具语义化设计4 工具方案)
### 3.1 设计原则
- **LLM 做粗分类**(选工具),**代码做细路由**(执行逻辑)
- 工具数量控制在 4 个语义正交LLM 不会选错
- 每个工具内部通过参数区分子场景,对 LLM 透明
### 3.2 工具定义
#### Tool 1: `look_up_data`
```json
{
"type": "function",
"function": {
"name": "look_up_data",
"description": "查询临床研究数据。可查单个患者详情、患者列表、入组统计、项目基本信息。所有关于'数据是什么'的问题用此工具。",
"parameters": {
"type": "object",
"properties": {
"query_type": {
"type": "string",
"enum": ["patient_detail", "patient_list", "enrollment_stats", "project_info"],
"description": "查询类型patient_detail=单个患者详情, patient_list=患者列表, enrollment_stats=入组统计, project_info=项目信息"
},
"record_id": {
"type": "string",
"description": "患者记录ID仅 patient_detail 需要)"
},
"fields": {
"type": "array",
"items": { "type": "string" },
"description": "需要查询的字段列表(可选,不填返回全部)"
}
},
"required": ["query_type"]
}
}
}
```
**内部路由**
- `patient_detail``RedcapAdapter.exportRecords({ records: [record_id] })`
- `patient_list``RedcapAdapter.exportRecords()` + 格式化
- `enrollment_stats` → 查 `iit_record_summary` 汇总表
- `project_info` → 查 `iit_projects`
**合并原工具**`read_clinical_data` + `count_records` + `get_project_info`
---
#### Tool 2: `check_quality`
```json
{
"type": "function",
"function": {
"name": "check_quality",
"description": "对临床数据执行质控检查。可对单个患者、全部患者、或指定规则类型执行质控。所有关于'帮我检查/质控一下'的请求用此工具。",
"parameters": {
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": ["single", "all"],
"description": "质控范围single=单个患者, all=全部患者"
},
"record_id": {
"type": "string",
"description": "患者记录ID仅 scope=single 时需要)"
},
"rule_types": {
"type": "array",
"items": { "type": "string", "enum": ["variable", "inclusion_exclusion", "protocol_deviation", "adverse_event"] },
"description": "限定规则类型(可选,不填执行全部规则)"
}
},
"required": ["scope"]
}
}
}
```
**内部路由**
- `scope=single``SkillRunner.runByTrigger('manual', { recordId })`
- `scope=all``SkillRunner.runByTrigger('manual')` 全量执行
- `rule_types` 过滤 → 传给 `filterApplicableRules()`
**合并原工具**`run_quality_check` + `batch_quality_check`
---
#### Tool 3: `read_report`
```json
{
"type": "function",
"function": {
"name": "read_report",
"description": "读取质控报告。可查看最新报告概览、问题列表、趋势对比、指定患者的问题详情。80%的质控相关问题都应该先用此工具。",
"parameters": {
"type": "object",
"properties": {
"view": {
"type": "string",
"enum": ["summary", "issues", "trend", "patient_issues"],
"description": "视图类型summary=报告概览, issues=问题列表, trend=趋势对比, patient_issues=指定患者的问题"
},
"severity": {
"type": "string",
"enum": ["critical", "warning", "all"],
"description": "按严重程度过滤(可选,默认 all"
},
"record_id": {
"type": "string",
"description": "患者记录ID仅 patient_issues 时需要)"
},
"limit": {
"type": "integer",
"description": "返回条数限制(可选,默认 10"
}
},
"required": ["view"]
}
}
}
```
**内部路由**
- `summary``QcReportService.getLatestReport()` 返回概览
- `issues``QcReportService.getIssueList({ severity, limit })` 按严重度排序
- `trend``QcReportService.getTrendComparison()` 对比近两次报告
- `patient_issues``QcReportService.getPatientIssues(record_id)`
**新增工具**:基于已有的 `QcReportService`980 行)封装
---
#### Tool 4: `search_knowledge`
```json
{
"type": "function",
"function": {
"name": "search_knowledge",
"description": "在项目知识库中搜索信息包括研究方案、CRF表、知情同意书等文档。所有关于'方案怎么规定的/CRF里有什么'的问题用此工具。",
"parameters": {
"type": "object",
"properties": {
"question": {
"type": "string",
"description": "要搜索的问题,用自然语言描述"
},
"doc_type": {
"type": "string",
"enum": ["protocol", "crf", "icf", "all"],
"description": "限定文档类型(可选,默认 all"
}
},
"required": ["question"]
}
}
}
```
**内部路由**
- 调用平台 RAG 引擎pgvector 语义检索)
- `doc_type` 过滤 → 在 RAG 查询时加 metadata filter
**对应原工具**`search_protocol`(扩展为覆盖全部知识库文档)
### 3.3 对照映射表
| 新工具 | 对应现有工具 | 变化 |
|-------|------------|------|
| `look_up_data` | `read_clinical_data` + `count_records` + `get_project_info` | 3 合 1query_type 参数内部路由 |
| `check_quality` | `run_quality_check` + `batch_quality_check` | 2 合 1scope 参数内部路由 |
| `read_report` | 新增 | 基于 QcReportService 封装,核心工具 |
| `search_knowledge` | `search_protocol` | 扩展为全知识库 |
---
## 4. P0自驱动质控流水线9.5 天)
> P0 的目标:**让 Agent 能独立"上班"** ——定时巡查所有数据、发现问题、生成报告、派发 eQuery、推送告警无需任何人操作。全员通过统一驾驶舱查看 Agent 的工作成果。
### P0-1REDCap 变量清单导入 + 可视化1.5 天)
**目标**:管理端一键拉取 REDCap 的变量清单Data Dictionary展示变量名、类型、逻辑关系作为规则配置的基础。
**后端**
- 新增 API`POST /api/v1/admin/iit-projects/:id/sync-metadata`
- 调用 `RedcapAdapter.exportMetadata()` 拉取 Data Dictionary
- 调用 `RedcapAdapter.getFormEventMapping()` 拉取表单-事件映射
- 写入 `iit_field_metadata` 表(已存在)
**前端**
- 在项目详情页新增"变量清单"Tab
- 表格展示:变量名 | 标签 | 类型 | 所属表单 | 验证规则 | 分支逻辑
- 支持搜索和按表单筛选
**验收**:点击"同步变量"按钮,表格展示全部 REDCap 变量及其逻辑关系。
---
### P0-2规则配置增强2 天)
**目标**:基于变量清单,配置 4 类质控规则(变量级 / 入排标准 / 方案偏离 / AE 事件)。
#### P0-2a规则配置 UI 改造1 天)
当前规则管理 UI 存在,需增强:
- **变量级规则**:选择变量 → 配置范围/必填/格式(下拉选变量,自动带出类型)
- **入排标准**:标记为入排规则类型,选择关联变量
- **方案偏离**:配置访视窗口、时间约束等规则
- **AE 事件**:配置 AE 识别触发条件
每类规则的 JSON Schema 已被 HardRuleEngine 支持,重点是让 UI **对接变量清单**(从 `iit_field_metadata` 读取),而不是手敲变量名。
#### P0-2bAI 辅助规则建议1 天)
上传研究方案 PDF → LLM 提取关键规则 → 生成规则 JSON 建议 → 人工确认后保存。
实现方式:
- 前端:规则配置页新增"AI 生成建议"按钮
- 后端读取项目知识库中的方案文档RAG 引擎) + 读取变量清单 → 组合 Prompt → LLM → 返回结构化规则 JSON
- 前端:展示 LLM 建议的规则列表,用户逐条确认/编辑/删除后批量保存
- **人在回路**AI 建议,人来确认,确认后才写入 `iit_skills`
**验收**:点击"AI 生成建议"LLM 基于方案和变量清单生成 5-10 条规则建议,用户确认后保存。
---
### P0-3定时质控 + 报告生成 + eQuery 闭环3.5 天)
**目标**Agent 的核心"日常工作"——定时全量质控、生成完整报告、派发 eQuery、推送摘要。这是 Agent "替代 CRA"最关键的一步。
#### P0-3a定时质控调度0.5 天)
- 使用 pg-boss cron 注册定时任务(如每天 8:00 执行全量质控)
- 在项目配置中新增"定时质控"开关 + cron 表达式
- 复用已有的 `SkillRunner.runByTrigger('cron')` 执行
#### P0-3b质控报告生成增强1.5 天)
当前 `QcReportService`980 行)有基础,需增强为 Agent 的完整"监查报告"
```
SkillRunner 执行全量质控
|
v
汇总结果写入 iit_qc_reports 表
|
v
报告内容:
- 项目概览(入组数 / 完成率 / 质控通过率)
- 按受试者的问题分布
- 按规则类型统计(入排 / 偏离 / AE / 变量)
- 严重问题列表TOP 10
- 与上次报告的对比(新增 / 已解决)
- eQuery 清单(需跟进的问题,含建议 Query 文本)
- 重大事件摘要(本期新增 SAE / PD 事件)
|
v
存储为结构化 JSON + 可读 Markdown 双格式
```
eQuery 清单:对每个严重/警告级别的问题LLM 生成一条标准化 Query 文本(字段 + 问题描述 + 期望操作),汇总为 eQuery 清单。
重大事件归档:被 AI 识别为 SAE 或重大方案偏离的事件,自动写入 `iit_critical_events` 归档表,记录发现时间、处理状态、上报轨迹,作为长期临床资产备查(审计追踪)。
#### P0-3ceQuery 闭环状态机1 天)
eQuery 不是一次性的清单,而是有完整生命周期的闭环:
```
AI 发现问题
|
v
自动派发 eQuery状态: pending
|
v
推送通知到 CRC 企微(含问题描述 + 期望操作)
|
v
CRC 通过驾驶舱链接回复(修正数据 / 上传说明)
|
v
AI 自动二次复核(状态: reviewing
|
v
复核通过 → 自动关闭status: closed
复核不通过 → 重新打开status: reopened
```
**后端实现**
- 新增 `iit_equery` 表(或扩展 `iit_qc_logs` 增加 eQuery 状态字段)
- eQuery 状态机:`pending``responded``reviewing``closed` / `reopened`
- CRC 回复后触发 AI 二次质控(复用 SkillRunner 单条质控)
- 自动关闭逻辑:二次质控通过则自动关闭
**前端实现**:在驾驶舱的 eQuery 管理面板中展示(见 P0-4
#### P0-3d报告推送0.5 天)
- 定时质控完成后 → 自动推送摘要到企业微信
- 推送格式Markdown 卡片(严重问题数 + 通过率 + 待处理 eQuery 数 + "查看详情"链接)
- 如有严重问题或新增 SAE → 单独推送告警消息
- 链接指向统一驾驶舱页面
**验收**:配置每天 8:00 定时质控Agent 自动执行全量质控,生成含 eQuery 清单的报告推送摘要到企微。CRC 收到 eQuery 通知后可回复AI 自动复核并关闭。
---
### P0-4统一质控驾驶舱2.5 天)
**目标**驾驶舱是全员PI / DM / CRC查看 Agent 工作成果的统一平台。去角色化设计,按数据深度四级穿透。
当前驾驶舱已有统计卡片 + 热力图 + 详情抽屉,需重构为四级穿透架构:
#### 第一级 — 概览:项目健康度大盘(已有基础,增强)
- **健康度评分**:首屏一个综合分数(基于通过率 + 待处理 eQuery + 重大事件),一眼看出项目状况
- **核心数据卡片**:整体合规率 | 待处理 eQuery 数 | AI 已审查表单数 | 累计重大事件数
- **高亮事件预警**:近期 SAE / 重大方案偏离,支持直接下钻
- **趋势图**:质控通过率随时间的变化折线图
#### 第二级 — 过程AI 工作流水 Timeline0.5 天,新增)
这是 AI 白盒化的核心展示——让全员看到 Agent 在做什么。
- **实时 Timeline**:动态滚动的瀑布流,展示 Agent 每次质控的完整动作链
- 示例:"10:24 监听 EDC 保存 → 扫描 P005 实验室表 → 执行 12 条硬规则 (0.2s) → 发现 ALT 异常 → 关联不良事件表 → 派发 eQuery-1029"
- **数据来源**`iit_agent_trace` 表(已存在) + `iit_qc_logs` 表(已存在),前端渲染为 Timeline 组件
- **自动闭环展示**CRC 修正数据后 Agent 二次复核并自动关闭 eQuery 的全过程
#### 第三级 — 细节:问题列表 + eQuery 管理(已有基础,增强)
- **问题跟踪**:问题状态(新发现 / 已确认 / 已解决),可标记
- **eQuery 管理面板**
- 展示全部 eQuery按状态分组pending / responded / closed
- 每条 eQuery 含问题描述、AI 监查意见、关联规则溯源、CRC 回复内容
- PI 可确认/修改 eQuery 文本后发送
- CRC 可在此回复 eQuery修正数据 / 上传说明)
- **受试者级问题穿透**:点击任意受试者可查看其全部问题 + eQuery 历史
#### 第四级 — 资产:报告归档 + 重大事件库0.5 天,新增)
- **报告历史列表**:展示历次质控报告(日期 + 摘要),可点击查看详情
- **重大事件归档库**:所有 SAE / 重大 PD 的永久归档,含处理和上报全生命周期轨迹
- **报告导出**:一键导出 Word/PDF 质控报告(复用平台 Pandoc 能力)
**统一视角设计要点**
- 全员看同一个界面,不做角色隔离
- 按数据粒度逐层穿透(概览 → 过程 → 细节 → 资产),而非按角色分页
- 红色数字高亮严重问题
- 简化专业 CRA 术语,用研究团队能理解的语言
**验收**:任意用户打开驾驶舱,一眼看到健康度评分;切到 AI Stream 看到 Agent 实时工作记录;切到问题列表管理 eQuery切到资产库查看历史报告和重大事件归档。
---
## 5. P1对话层 Tool Use 改造4 天)
> **前置条件**P0 完成后再做。P0 产出的质控报告是对话层 `read_report` 工具的数据源。
### P1-1ChatOrchestrator + 4 工具重构2 天)
**核心改造**:用 LLM 原生 Tool Use 替代 1442 行关键词路由。
**新建 `ChatOrchestrator`**~250 行),职责:
1.`ConversationStore` 加载对话历史(最近 N 轮)
2. 组装 System Prompt角色设定 + 项目上下文 + 安全约束)
3. 组装 4 个工具定义(从重构后的 ToolsService 获取)
4. 调 LLM带 Function Calling
5. 如果 LLM 返回 tool_calls → 执行工具 → 结果喂回 LLM → 最终回答
6. 保存对话历史到数据库
**重构 `ToolsService`**
- 删除现有 6 个工具注册
- 注册 4 个语义化工具(`look_up_data` / `check_quality` / `read_report` / `search_knowledge`
- 每个工具的 `execute` 方法内部实现路由逻辑
**新建 `ConversationStore`**~120 行):
- 对话历史持久化到 `iit_conversation_history` 表(已存在)
- 按 userId + projectId 隔离
- 支持最近 N 轮裁剪
**废弃 `ChatService.ts`**:不再使用关键词路由。
**System Prompt 核心内容**
```
你是一个 AI 临床研究监查员CRA Agent负责监控 IIT 研究项目的数据质量。
你的用户是 PI主要研究者和研究团队。
你有 4 个工具可用:
1. read_report — 查看质控报告优先使用80% 的问题用这个工具回答)
2. look_up_data — 查询临床数据
3. check_quality — 执行质控检查
4. search_knowledge — 查询研究方案/CRF 等文档
回答规则:
- 所有数据必须来自工具返回,不要编造
- 如果报告中已有答案,直接引用报告数据
- 如果用户问的内容超出你的能力范围,诚实说明
- 回答简洁,突出关键数字和结论
```
**验收**:用户自然语言提问(如"003 有什么问题""严重违规有几项""入排标准是什么"LLM 自动选择正确工具回答。
### P1-2对话体验优化 + 测试2 天)
- System Prompt 精调(追问机制、长度控制、防幻觉指令)
- 企微消息格式优化Markdown 卡片,含关键数字和快捷操作)
- 安全护栏(单次对话 5 轮上限、Token 预算、工具调用次数上限、异常兜底)
- 8 个场景端到端测试:
| 场景 | 示例问题 | 预期工具 | 验收标准 |
|------|---------|---------|---------|
| 报告概览 | "最新质控报告怎么样" | read_report(summary) | 返回概览数据 |
| 问题查询 | "有几条严重违规" | read_report(issues, critical) | 返回精确数字 |
| 患者详情 | "003 的数据" | look_up_data(patient_detail) | 返回患者数据 |
| 趋势分析 | "通过率比上周好了吗" | read_report(trend) | 返回趋势对比 |
| 手动质控 | "帮我查一下 005 的质量" | check_quality(single) | 执行质控返回结果 |
| 方案查询 | "入排标准是什么" | search_knowledge | 返回方案内容 |
| 模糊查询 | "项目整体情况怎么样" | read_report(summary) | 返回综合信息 |
| 越界拒绝 | "帮我修改 003 的数据" | 无(拒绝) | 礼貌拒绝并说明 |
---
## 6. P2可选不排期
| 功能 | 说明 | 何时做 |
|------|------|--------|
| SDV 凭证上传 + AI 视觉核对 | CRC 上传原始医疗凭证化验单等VisionService 多模态比对 EDC 数据,阅后即焚保隐私 | 待 VisionService 就绪 |
| 原始数据匹配SDV via EMR | AI 对比 EMR 病历 vs EDC 数据,需先定义数据源 | 待 EMR 接口 |
| 微信小程序前端 | PI 移动端操作界面 | 核心流程跑通后 |
| PII 隐私脱敏 | 调第三方 LLM 前脱敏患者信息 | 上线前必做 |
| 周报自动生成 | 每周一自动汇总推送 | 定时质控跑通后 |
| REDCap 回写 | 质控结果、eQuery 状态写回 REDCap | 根据需求决定 |
| REDCap 嵌入伴随端 | 浏览器插件在 REDCap 录入界面植入 AI Inline 报错气泡 | 核心流程跑通后 |
| AutoMapperService | REDCap 乱码变量自动映射为中文医学语义 | 锦上添花 |
| 数据响应质量评级 | 以"平均响应时长"衡量 CRC 配合质量 | eQuery 闭环跑通后 |
| eQuery 自动发送 | Agent 生成的 eQuery 自动发给 CRC无需 PI 确认) | PI 确认流程跑通后 |
---
## 7. 时间线
```
P0自驱动质控流水线9.5 天) P1对话层4 天)
┌──────────┬──────────┬───────────────┬───────────┐ ┌──────────┬──────────┐
│ P0-1 │ P0-2 │ P0-3 │ P0-4 │ │ P1-1 │ P1-2 │
│ 变量导入 │ 规则配置 │ 定时质控+报告 │ 统一驾驶舱 │ │Orchestr- │ 体验优化 │
│ │ │ +eQuery闭环 │ +AI Stream │ │ator 2天 │ 2天 │
│ 1.5天 │ 2天 │ 3.5天 │ 2.5天 │ │ │ │
└──────────┴──────────┴───────────────┴───────────┘ └──────────┴──────────┘
Day 1-2 Day 3-4 Day 5-8 Day 9-11 Day 12-13 Day 14
```
P0 完成后 Agent 已能独立运行(自动质控 + 报告 + eQuery 闭环 + 推送 + 透明驾驶舱P1 补上对话交互能力。
---
## 8. 保留什么(不动的部分)
| 组件 | 行数 | 理由 |
|------|------|------|
| HardRuleEngine | 478 | 核心质控引擎,成熟 |
| SoftRuleEngine | 488 | LLM 质控,有价值 |
| SkillRunner | 756 | 事件级质控编排,运行正常 |
| RedcapAdapter | 1363 | 数据源核心,功能完整 |
| QcReportService | 980 | 报告生成基础P0 在此基础上增强 |
| WebhookController | - | 实时触发,运行正常 |
| WechatService | - | 企微推送,运行正常 |
| 管理端 3 页面 + 驾驶舱 | - | 在此基础上增强 |
| 18 张数据库表 | - | Schema 合理,按需新增字段 |
---
## 9. 不做什么
| 砍掉 | 理由 |
|------|------|
| 双脑架构SOP + ReAct 分离) | LLM Tool Use 已是更优方案 |
| 三层记忆系统(流水账/热记忆/历史书) | 简化为:对话历史 DB + 项目级报告 |
| 手写 ReAct 引擎 | LLM 原生 Function Calling 包含此能力 |
| IntentService 关键词意图路由 | LLM 自己就是最好的路由器 |
| 自建 SchedulerService 类 | pg-boss cron 直接实现 |
| 微信小程序 | P0/P1 之后考虑 |
| VisionService | 明确延后 |
---
## 10. 关键决策记录
| 决策 | 选择 | 理由 |
|------|------|------|
| 产品定位 | 替代 CRA 岗位(非辅助工具) | IIT 场景 AI 可替代 70-80% CRA 工作 |
| 主要用户 | 全员PI / DM / CRC去角色化 | 统一视角比角色隔离更透明高效 |
| 驾驶舱设计 | 统一四级穿透(概览→过程→细节→资产) | 废除角色隔离,单一真相 |
| AI 白盒化 | AI Stream 实时工作流水 | 向全员展示 AI 工作过程,建立信任 |
| eQuery 模式 | 闭环状态机(派发→回复→复核→关闭) | 替代人工 CRA 的 Query 管理流程 |
| 对话层架构 | LLM Tool Use + 4 语义化工具 | 比关键词路由准确,比 10+ 细粒度工具好选 |
| 工具粒度 | 4 个粗粒度语义工具 | LLM 选择准确率高,上下文消耗低 |
| 核心工具 | `read_report` | 80% 的 Q&A 通过读报告回答 |
| 定时调度 | pg-boss cron | 复用平台能力,零额外代码 |
| 规则配置 | UI 对接变量清单 + AI 建议 + 人工确认 | 效率和安全的平衡 |
| 质控报告 | 结构化 JSON + Markdown 双格式 | JSON 供 LLM 读Markdown 供人读 |
| 报告推送 | 企微 Markdown 卡片 | 当前最快的用户触达渠道 |
| 重大事件 | 永久归档 + 审计轨迹 | 合规刚需,临床长期数字资产 |
---
## 11. 成功标准
| 指标 | P0 目标 | P1 目标 |
|------|---------|---------|
| Agent 自主运行 | 每天自动执行全量质控,无需人工触发 | - |
| 质控报告 | 包含概览/分布/TOP10/趋势/eQuery 清单/重大事件 | - |
| eQuery 闭环 | 自动派发 → CRC 回复 → AI 复核 → 自动关闭 | - |
| AI 白盒化 | AI Stream Timeline 展示 Agent 每次质控动作链 | - |
| 变量导入 | 一键同步 REDCap 变量清单 | - |
| 规则配置 | UI 可视化配置 4 类规则 | - |
| AI 建议 | LLM 生成 5-10 条规则建议,人确认后保存 | - |
| 报告推送 | 定时推送摘要到企微 + 严重问题告警 | - |
| 统一驾驶舱 | 四级穿透(概览→过程→细节→资产)全员可用 | - |
| 对话准确率 | - | 工具选择准确率 > 90% |
| 对话响应 | - | < 5 秒 |
| 幻觉率 | - | 趋近 0数据来自工具 |
| 用户满意度 | 全员能看到项目质控全貌 + AI 工作透明 | 能自然语言问任何质控问题 |
---
> **一句话总结**CRA Agent 不是给 CRA 用的工具——它就是 CRA。P0 让它能自主"上班"(质控 + 报告 + eQuery 闭环 + 透明驾驶舱P1 让全员能跟它"对话"Tool Use + 4 语义化工具)。先让 Agent 干活,再让人能问它。

View File

@@ -0,0 +1,129 @@
# 统一数字 CRA 质控平台 产品需求文档 (PRD)
**文档版本**V3.0(统一视角与白盒化平台版)
**关联开发计划**[CRA Agent V3.0 最终开发计划](./V3.0全新开发计划.md)
**目标受众**:研发团队、架构师、项目决策委员会
**核心系统角色**AI 监查大脑主导者、全员协作方PI、DM、CRC
---
## 一、产品哲学与核心定位
### 1.1 产品背景与痛点重构
传统临床研究不仅受困于 CRA 人力成本高昂,更受困于**"信息孤岛与黑盒效应"**——PI 看不到具体过程CRC 被动防御质疑CRA 疲于人工核查。本产品致力于彻底变革临床质控模式:不仅要**用 AI 替代传统 CRA 的重体力审核工作**,更要打破系统的角色壁垒,建立一个**"全员可见、完全透明、单一真相Single Source of Truth"**的统一数字平台。
> **关键定位**CRA Agent 不是给 CRA 用的助手——它就是 CRA。目标是替代 70-80% 的 CRA 岗位工作(详见 [V3.0 开发计划 §1.2](./V3.0全新开发计划.md))。
### 1.2 核心产品目标
1. **去中心化的统一视角**:废除传统系统中森严的"PI 视角"与"CRC 视角"。全员登录同一平台,按数据粒度(概览 → 过程 → 细节 → 资产)自由穿透。
2. **AI 白盒化Trust Building**:将 AI 的工作从"黑盒后台"移至前台。通过"实时工作流水AI Stream"展示 AI 的每一次推理和调用,建立人类对 AI 的绝对信任。
3. **长期临床资产沉淀**不只做实时纠错更要对整个临床试验的生命周期负责。自动生成阶段性质控报告建立重大事件SAE/PD的永久档案库。
4. **全自动 eQuery 闭环**AI 独立发现异常、派发质疑、接收 CRC 修正信号、执行二次复核并自动关闭,实现"无人化"质控闭环。
5. **AI 视觉 SDV远期**AI 审核 CRC 上传的原始凭证(多模态视觉核对)并自动闭环。
---
## 二、统一平台架构与入口定义(核心功能层)
系统取消角色隔离,采用**"逻辑深度递进"**的统一四级架构。
### 2.1 第一级 — 全局概览(项目健康度大盘 Dashboard
- **定位**:团队宏观把控的首选视图。
- **功能模块**
- **健康度评分**:基于通过率、待处理 eQuery、重大事件的综合评分
- **全局核心数据卡片**:整体数据合规率、待处理 eQuery 数、AI 已自动审查表单数、累计重大事件数
- **高亮事件预警**:瀑布流展示近期 SAE 与重大 PD支持直接下钻
- **趋势图**:质控通过率随时间的变化折线图
### 2.2 第二级 — AI 监查过程(工作流水 AI Stream
- **定位**:向全员展示的"AI 劳动透明账本",白盒化的核心实现。
- **功能模块**
- **实时 Timeline**:动态滚动的瀑布流,精确记录 Agent 的完整动作链。示例:"*10:24 监听 EDC 保存事件 → 扫描 P005 实验室表 → 调用 12 条硬逻辑耗时 0.2 秒 → 提取 ALT 异常并关联不良事件表 → 发现记录缺失 → 派发 eQuery-1029*"
- **自动闭环展示**:清晰记录 AI 接收到 CRC 修正信号后,执行二次复核并自动关闭质疑的动作
- **数据来源**`iit_agent_trace` 表 + `iit_qc_logs`
### 2.3 第三级 — 细节与协作eQuery 管理 + 问题列表)
- **定位**:唯一需要人类(主要为 CRC介入协作的工作台。
- **功能模块**
- **eQuery 任务列表**AI 派发的质疑含优先级、AI 监查意见、关联规则溯源
- **eQuery 闭环状态机**`pending``responded``reviewing``closed` / `reopened`
- **CRC 响应区**CRC 点击响应后可修正数据或上传说明,触发 AI 二次复核
- **SDV 凭证验证(远期)**CRC 上传原始医疗凭证化验单、出院小结VisionService 进行自动比对核销,"阅后即焚"确保隐私合规
- **受试者级穿透**:点击任意受试者查看其全部问题 + eQuery 历史
### 2.4 第四级 — 长期资产(定期报告与归档库 Reports & Archives
- **定位**:临床研究的长期数字资产中心。
- **功能模块**
- **AI 定期质控报告**pg-boss cron 自动跑批,按日/周/月生成含图表分析和趋势总结的报告,存储为结构化 JSON + Markdown 双格式
- **重大事件归档库**:所有被 AI 确认为 SAE、PD 的事件永久锁定存档,记录处理和上报的全生命周期轨迹,备查(审计追踪)
- **报告导出**:一键导出 Word/PDF 质控报告
### 2.5 全局基础设施:统一 AI Copilot
- **定位**:悬浮于所有页面之上的超级大脑助理。
- **技术实现**`ChatOrchestrator` + LLM Tool Use + 4 个语义化工具(`read_report` / `look_up_data` / `check_quality` / `search_knowledge`
- **功能模块**:支持自然语言多轮对话。任何人均可随时询问:"总结本周最容易犯的错误趋势"、"解释为什么要求 P005 进行强制 SDV"AI 基于项目全局上下文实时解答。
- **工具设计原则**4 个粗粒度语义工具LLM 做粗分类选工具,代码做细路由执行(详见 [V3.0 开发计划 §3](./V3.0全新开发计划.md))。
---
## 三、智能引擎底座与规则工程The Brains
统一平台的底层由以下核心引擎驱动:
| 引擎模块 | 职责与能力 | 技术实现组件 |
| :---- | :---- | :---- |
| **方案与 EDC 认知基座** | 向量化临床方案;一键同步 REDCap 字典;语义检索项目知识库 | RAG 引擎pgvector/ RedcapAdapter |
| **规则硬逻辑执行器** | 毫秒级绝对逻辑校验(年龄计算、时间窗、必填联动),零幻觉 | HardRuleEngineJSON Logic |
| **推理软逻辑研判器** | 结合 RAG 知识库对文本主诉进行模糊推理AE 研判等) | SoftRuleEngineLLM |
| **事件级质控编排** | 按 record+event 编排质控,规则动态过滤,报告去重 | SkillRunner |
| **异步任务调度** | 防抖处理 REDCap 密集推送定时全量质控eQuery 状态流转 | WebhookController / pg-boss cron |
| **LLM 对话编排** | 4 语义工具 Tool Use替代关键词路由 | ChatOrchestrator / ToolsService |
| **报告生成引擎** | 结构化 JSON + Markdown 双格式,含 eQuery 清单和重大事件 | QcReportService |
---
## 四、延伸终端定义:全时态触达
除 PC 主工作台外,保留对外部生态的延伸能力:
1. **企业微信移动端**
- **通知中枢**重大事件SAE / 高风险 eQuery实时推送到相关人员企微
- **早报订阅**:定时自动将质控报告摘要以 Markdown 卡片形式推送
- **eQuery 通知**CRC 收到 eQuery 派发通知,含问题描述和快捷操作链接
2. **REDCap 嵌入伴随端(远期可选)**
- 通过浏览器插件,在 REDCap 录入界面直接植入"AI Inline 气泡报错",在最源头拦截低级错误
---
## 五、开发实施优先级与里程碑Milestones
> 详细任务拆解和工作量估算见 [V3.0 开发计划](./V3.0全新开发计划.md)。
- **P0 — 自驱动质控流水线(约 9.5 天)**
- P0-1REDCap 变量清单导入 + 可视化
- P0-2规则配置增强 + AI 辅助建议
- P0-3定时质控 + 报告生成 + eQuery 闭环
- P0-4统一驾驶舱四级穿透 + AI Stream
- **P1 — 对话层 Tool Use 改造(约 4 天)**
- P1-1ChatOrchestrator + 4 语义化工具重构
- P1-2对话体验优化 + 端到端测试
- **P2 — 远期扩展(不排期)**
- SDV 凭证上传 + AI 视觉核对VisionService
- AutoMapperServiceREDCap 变量中文映射)
- 数据响应质量评级
- REDCap 嵌入伴随端
- 全局 AI Copilot 侧边栏助手
---
> **一句话总结**:一个用 AI 替代 CRA 的统一数字平台——Agent 自主巡查、全员透明可见、eQuery 自动闭环、知识永久沉淀。

View File

@@ -951,9 +951,7 @@
/* ============================================ */
.message-bubble .markdown-content {
white-space: normal;
}
.message-bubble .markdown-content p {
}.message-bubble .markdown-content p {
margin: 0 0 8px 0;
}
@@ -1001,9 +999,7 @@
display: list-item;
}.message-bubble .markdown-content li::marker {
color: #4F6EF2;
}
.message-bubble .markdown-content strong {
}.message-bubble .markdown-content strong {
font-weight: 700;
color: #1F2937;
}.message-bubble .markdown-content em {