feat(aia): Complete AIA V2.0 with universal streaming capabilities

Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
This commit is contained in:
2026-01-14 19:15:01 +08:00
parent 3d35e9c58b
commit 1b53ab9d52
386 changed files with 52096 additions and 65238 deletions

View File

@@ -1,85 +1,76 @@
# **IIT Manager Agent 多端交互流程与权限设计 (V1.0)**
# **IIT Manager Agent 螟夂ォッ莠、莠呈オ∫ィ倶ク取揀髯占ョセ隶?(V1.0)**
## **1\. 核心角色定义与终端矩阵**
系统通过“基础角色 \+ 扩展权限”模式,支持单中心与多中心项目的灵活配置。
## **1\. 譬ク蠢<EFBFBD>ァ定牡螳壻ケ我ク守サ育ォッ遏ゥ髦?*
邉サ扈滄€夊ソ<EFBFBD>€懷渕遑€隗定牡 \+ 謇ゥ螻墓揀髯絶€晄ィ。蠑擾シ梧髪謖∝黒荳ュ蠢<EFBDAD>ク主、壻クュ蠢<EFBDAD>。ケ逶ョ逧<EFBDAE><E980A7>豢サ驟咲スョ縲?
| 隗定牡莉」遐<EFBDA3> | 隗定牡蜷咲ァー | 譬ク蠢<EFBDB8>雍」 | 荳サ隕∫サ育ォッ | 譬ク蠢<EFBDB8>揀髯<E68F80> |
| :---- | :---- | :---- | :---- | :---- |
| **SYS\_ADMIN** | 系统管理员 | 平台初始化、多租户管理、Dify 知识库维护 | PC (Admin Portal) | 全局配置、资源分配 |
| **PROJECT\_PI** | 项目负责人 (PI) | 项目进度监控、重大偏离决策、智能报表查看 | 微信端 (企微通知+小程序) | 影子状态最终审批、导出报表 |
| **CRC\_OPERATOR** | 协调员 (CRC) | 数据录入、AI 建议复核、患者随访执行 | REDCap (录入) \+ PC Workbench | 质疑处理、数据采集、患者互动 |
| **SUBJECT\_PATIENT** | 患者 (受试者) | 接收提醒、咨询答疑、AE/随访上报 | 个人微信 (H5/小程序) | 任务反馈、问答咨询 |
| **SUB\_I / CO\_PI** | 子中心负责人 | 分中心数据查看、本中心流程审批 | 微信端 | 仅限本中心的数据权限 |
| **SYS\_ADMIN** | 邉サ扈溽ョ。逅<EFBFBD><EFBFBD>?| 蟷ウ蜿ー蛻晏ァ句喧縲∝、夂ァ滓姐邂。逅<EFBDA1>€ify 遏・隸<EFBDA5>コ鍋サエ謚?| PC 遶?(Admin Portal) | 蜈ィ螻€驟咲スョ縲∬オ<EFBFBD>コ仙<EFBFBD>驟?|
| **PROJECT\_PI** | 鬘ケ逶ョ雍溯エ」莠?(PI) | 鬘ケ逶ョ霑帛コヲ逶第而縲<E8808C>㍾螟ァ蛛冗ヲサ蜀ウ遲悶€∵匱閭ス謚・陦ィ譟・逵?| 蠕ョ菫。遶?(莨∝セョ騾夂衍+蟆冗ィ句コ? | 蠖ア蟄千憾諤∵怙扈亥ョ。謇ケ縲∝ッシ蜃コ謚・陦?|
| **CRC\_OPERATOR** | 蜊剰ー<EFBFBD><EFBFBD>?(CRC) | 謨ー謐ョ蠖募<EFBFBD>縲、I 蟒コ隶ョ螟肴<E89E9F>ク縲∵ぅ閠<E38185>囂隶ソ謇ァ陦?| REDCap (蠖募<EFBFBD>) \+ PC Workbench | 雍ィ逍大、<EFBFBD>炊縲∵焚謐ョ驥<EFBFBD>寔縲∵ぅ閠<EFBFBD>コ貞<EFBFBD>?|
| **SUBJECT\_PATIENT** | 謔」閠?(蜿苓ッ戊€? | 謗・謾カ謠宣<E8ACA0>縲∝暢隸「遲皮桝縲、E/髫剰ョソ荳頑冠 | 荳ェ莠コ蠕ョ菫。 (H5/蟆冗ィ句コ? | 莉サ蜉。蜿埼ヲ医€<E58CBB>琉遲泌暢隸?|
| **SUB\_I / CO\_PI** | 蟄蝉クュ蠢<EFBFBD>エ溯エ」莠コ | 蛻<>クュ蠢<EFBDAD>焚謐ョ譟・逵九€∵悽荳ュ蠢<EFBDAD>オ∫ィ句ョ。謇ケ | 蠕ョ菫。遶?| 莉<>剞譛ャ荳ュ蠢<EFBDAD>噪謨ー謐ョ譚<EFBDAE> |
## **2\. 跨终端核心交互流程 (User Journeys)**
## **2\. 霍ィ扈育ォッ譬ク蠢<EFBFBD>コ、莠呈オ∫ィ?(User Journeys)**
### **2.1 譎コ閭ス雍ィ謗ァ荳主スア蟄仙<E89F84>遲匁オ<E58C81> (譬ク蠢<EFBDB8>溜邇ッ)**
该流程体现了“REDCap 录入 \-\> AI 发现 \-\> Workbench 复核 \-\> 回写 REDCap”的逻辑。
1. **数据产生**CRC 在 **REDCap 原生界面**提交受试者 V1 访视数据。
2. **监听与推理**Node.js 接收 Webhook驱动 **QC Agent** 调用 Dify RAG 检索 Protocol发现逻辑矛盾。
3. **影子生成**:系统在 **Postgres (iit\_schema)** 中生成一条状态为 PROPOSED 的影子记录。
4. **即时提醒**
* **PC 端**CRC 的 Workbench 任务卡片实时更新。
* **微信端**:若为严重违背,自动给 PI/CRC 推送企微通知。
5. **复核决策**CRC 登录 **PC Workbench**,查看证据链对比。
6. **正式执行**CRC 点击“确认并更新”,系统调用 REDCap API 将修正值或质疑状态写回 **REDCap**,影子记录状态转为 EXECUTED。
隸・豬∫ィ倶ス鍋鴫莠<EFBFBD>€EDCap 蠖募<EFBFBD> \-\> AI 蜿醍鴫 \-\> Workbench 螟肴<EFBFBD> \-\> 蝗槫<EFBFBD> REDCap窶晉噪騾サ霎代€?
1. **謨ー謐ョ莠ァ逕<EFBDA7>**<EFBFBD>咾RC 蝨?**REDCap 蜴溽函逡碁擇**謠蝉コ、蜿苓ッ戊€?V1 隶ソ隗<EFBDBF>焚謐ョ縲?
2. **逶大成荳取耳逅?*<2A>哢ode.js 謗・謾カ Webhook<6F>碁ゥア蜉?**QC Agent**<>畑 Dify RAG 譽€邏?Protocol<6F>悟書邇ー騾サ霎醍泝逶セ縲?
3. **蠖ア蟄千函謌<EFBFBD>**<EFBFBD>夂ウサ扈溷惠 **Postgres (iit\_schema)** 荳ュ逕滓<E98095>€譚。迥カ諤∽クコ PROPOSED 逧<>スア蟄占ョー蠖輔€?
4. **蜊ウ譌カ謠宣<EFBFBD>**<EFBFBD>?
* **PC 遶?*<2A>咾RC 逧?Workbench 莉サ蜉。蜊。迚<EFBDA1>ョ樊慮譖エ譁ー縲?
* **蠕ョ菫。遶?*<2A>夊凶荳コ荳・驥崎ソ晁レ<E69981><EFBFBD>蜉ィ扈?PI/CRC 謗ィ騾∽シ∝セョ騾夂衍縲?
5. **螟肴<EFBFBD>ク蜀ウ遲<EFBFBD>**<EFBFBD>咾RC 逋サ蠖<EFBDBB> **PC Workbench**<EFBFBD>梧衍逵玖ッ∵紺體セ蟇ケ豈斐€?
6. **豁」蠑乗鴬陦<EFBFBD>**<EFBFBD>咾RC 轤ケ蜃サ窶懃。ョ隶、蟷カ譖エ譁ー窶晢シ檎ウサ扈溯ー<E6BAAF>畑 REDCap API 蟆<>ソョ豁」蛟シ謌冶エィ逍醍憾諤∝<E8ABA4>蝗?**REDCap**<2A>悟スア蟄占ョー蠖慕憾諤∬スャ荳?EXECUTED縲?
### **2.2 莉サ蜉。鬩ア蜉ィ荳取ぅ閠<E38185>コ貞勘豬<E58B98>**
该流程体现了“任务引擎 \-\> 企微触达 \-\> AI 知识库回复”的逻辑。
1. **任务触发**:任务引擎检测到患者 P001 明日需回访,状态变为 DUE\_SOON。
2. **消息推送**:系统通过**企业微信 API**,以 CRC 身份向患者微信发送提醒。
3. **患者追问**:患者在微信回复:“我今天需要停药吗?”。
4. **AI 处理****Counseling Agent** 基于 Dify 知识库生成回答草稿。
5. **人工介入**
* 若为简单科普Agent 直接回复。
* 若涉及用药指导,提醒 CRC 在企微侧边栏确认该草稿后再发送。
### **2.3 PI 宏观管理流**
1. **周期汇报****Reporting Agent** 每周生成统计报表。
2. **品牌化展示**PI 收到企微通知,点击跳转至**小程序**。
3. **多租户适配**:小程序根据项目 ID 自动加载 \[北医三院\] 等品牌元素和 Logo。
4. **移动决策**PI 在小程序内对 CRC 提交的疑难问题进行远程批示。
隸・豬∫ィ倶ス鍋鴫莠<EFBFBD>€應ササ蜉。蠑墓<EFBFBD>?\-\> 莨∝セョ隗ヲ霎セ \-\> AI 遏・隸<EFBDA5>コ灘屓螟坂€晉噪騾サ霎代€?
1. **莉サ蜉。隗ヲ蜿<EFBDA6>**<EFBFBD>壻ササ蜉。蠑墓梼譽€豬句芦謔」閠?P001 譏取律髴€蝗櫁ョソ<EFBDAE>檎憾諤∝序荳?DUE\_SOON縲?
2. **豸域<EFBFBD>謗ィ騾?*<2A>夂ウサ扈滄€夊ソ<E5A48A>**莨∽ク壼セョ菫。 API**<EFBFBD>御サ・ CRC 霄ォ莉ス蜷第ぅ閠<E38185>セョ菫。蜿鷹€∵署驢偵€?
3. **謔」閠<EFBFBD>ソス髣?*<2A>壽ぅ閠<E38185>惠蠕ョ菫。蝗槫、搾シ壺€<C280>莉雁、ゥ髴€隕∝●闕ッ蜷暦シ溪€€?
4. **AI 螟<>**<EFBFBD>?*Counseling Agent** 蝓コ莠<EFBDBA> Dify 遏・隸<EFBDA5>コ鍋函謌仙屓遲碑拷遞ソ縲?
5. **莠コ蟾・莉句<EFBFBD>**<EFBFBD>?
* 闍・荳コ邂€蜊慕ァ第勸<E7ACAC>窟gent 逶エ謗・蝗槫、阪€?
* 闍・豸牙所逕ィ闕ッ謖<EFBFBD>ッシ<EFBFBD>梧署驢<EFBFBD> CRC 蝨ィ莨∝セョ萓ァ霎ケ譬冗。ョ隶、隸・闕臥ィソ蜷主<E89CB7>蜿鷹€€?
### **2.3 PI 螳剰ァらョ。逅<EFBDA1>オ?*
1. **蜻ィ譛滓ア<E6BB93>**<EFBFBD>?*Reporting Agent** 豈丞捉逕滓<E98095>扈溯ョ。謚・陦ィ縲?
2. **蜩∫煙蛹門ア慕、?*<2A>啀I 謾カ蛻ー莨∝セョ騾夂衍<E5A482>檎せ蜃サ霍ウ霓ャ閾ウ**蟆冗ィ句コ?*縲?
3. **螟夂ァ滓姐騾る<E9A8BE>**<EFBFBD>壼ー冗ィ句コ乗<EFBFBD>ケ謐ョ鬘ケ逶ョ ID 閾ェ蜉ィ蜉<EFBDA8>霓ス \[蛹怜現荳蛾劼\] 遲牙刀迚悟<E8BF9A><EFBFBD><EFBFBD> Logo縲?
4. **遘サ蜉ィ蜀ウ遲<EFBDB3>**<EFBFBD>啀I 蝨ィ蟆冗ィ句コ丞<EFBDBA>蟇ケ CRC 謠蝉コ、逧<EFBDA4>桝髫セ髣ョ鬚倩ソ幄。瑚ソ懃ィ区音遉コ縲?
## **3\. 扈育ォッ蜉溯<E89C89>霎ケ逡悟<E980A1><EFBFBD> (Function Boundary)**
| 功能模块 | PC 管理员门户 | PC Agent Workbench | 微信小程序/H5 | 企业微信通知 |
| 蜉溯<EFBFBD>讓。蝮<EFBFBD> | PC 邂。逅<EFBDA1>遭髣ィ謌?| PC Agent Workbench | 蠕ョ菫。蟆冗ィ句コ?H5 | 莨∽ク壼セョ菫。騾夂衍 |
| :---- | :---- | :---- | :---- | :---- |
| **项目初始化** | 100% (上传方案) | 0% | 0% | 0% |
| **鬘ケ逶ョ蛻晏ァ句<EFBFBD>?* | 100% (荳贋シ<EFBFBD>譁ケ譯<EFBFBD>) | 0% | 0% | 0% |
| **蟄玲ョオ譏<EFBDB5><EFBFBD><E89F86>鄂ョ** | 100% | 0% | 0% | 0% |
| **数据质控审核** | 0% | 100% (深度比对) | 20% (紧急确认) | 0% (仅入口) |
| **謨ー謐ョ雍ィ謗ァ螳。譬ク** | 0% | 100% (豺ア蠎ヲ豈泌ッケ) | 20% (邏ァ諤・遑ョ隶? | 0% (<EFBFBD><EFBFBD>蜿? |
| **譎コ閭ス驥<EFBDBD>寔(OCR)** | 0% | 100% | 0% | 0% |
| **进度/风险报表** | 20% | 50% | 100% (精美可视化) | 10% (卡片摘要) |
| **患者沟通记录** | 0% | 100% (归档) | 0% | 100% (实时交互) |
| **霑帛コヲ/鬟朱勦謚・陦ィ** | 20% | 50% | 100% (邊セ鄒主庄隗<EFBFBD><EFBFBD>? | 10% (蜊。迚<EFBFBD>遭隕<EFBFBD>) |
| **謔」閠<EFBFBD>イ滄€夊ョー蠖?* | 0% | 100% (蠖呈。」) | 0% | 100% (螳樊慮莠、莠<EFBFBD>) |
## **4\. 权限与安全模型 (Access Control)**
## **4\. <EFBFBD>剞荳主ョ牙<EFBFBD>讓。蝙?(Access Control)**
### **4.1 RBAC 譚<>剞隶セ隶。**
系统采用“功能权限 \+ 数据范围”双重校验:
* **功能权限 (Permission)**:决定能否点击“确认回写”、“导出报表”。
* **数据范围 (Scope)**
* GLOBAL可看所有中心数据项目 PI
* SITE\_ONLY仅限本中心子中心 PI/CRC
* PATIENT\_ONLY仅限本人受试者
邉サ扈滄㊦逕ィ窶懷粥閭ス譚<EFBFBD><EFBFBD>?\+ 謨ー謐ョ闌<EFBDAE>峩窶晏曙驥肴<E9A9A5>。鬪鯉シ<E9AF89>
* **蜉溯<E89C89><EFBFBD>剞 (Permission)**<2A><EFBFBD>螳夊<E89EB3>蜷ヲ轤ケ蜃サ窶懃。ョ隶、蝗槫<E89D97>窶昴€€懷ッシ蜃コ謚・陦ィ窶昴€?
* **謨ー謐ョ闌<EFBDAE>峩 (Scope)**<2A>?
* GLOBAL<41>壼庄逵区園譛我クュ蠢<EFBDAD>焚謐ョ<E8AC90>磯。ケ逶ョ PI<50>€?
* SITE\_ONLY<4C>壻サ<E5A3BB>剞譛ャ荳ュ蠢<EFBDAD>シ亥ュ蝉クュ蠢<EFBDAD> PI/CRC<52>€?
* PATIENT\_ONLY<4C>壻サ<E5A3BB>剞譛ャ莠コ<E88EA0>亥女隸戊€<E6888A>シ峨€?
### **4.2 蠑よ桷邉サ扈溯コォ莉ス譏<EFBDBD><EFBFBD> (Auth Bridge)**
* **REDCap Token 托管**:每个 CRC/PI 的账户下加密存储其 REDCap API Token
* **企微 OpenID 绑定**:在 iit\_schema.user\_mapping 中建立 SystemUserID \<-\> WeComID 的映射,确保消息精准推送。
* **REDCap Token 謇倡ョ。**<2A>壽ッ丈ク?CRC/PI 逧<>エヲ謌キ荳句刈蟇<E58888>ュ伜お蜈?REDCap API Token縲?
* **莨∝セョ OpenID 扈大ョ<EFBFBD>**<2A>壼惠 iit\_schema.user\_mapping 荳ュ蟒コ遶?SystemUserID \<-\> WeComID <EFBFBD>丐蟆<EFBFBD>シ檎。ョ菫晄カ域<EFBFBD>邊セ蜃<EFBFBD>耳騾√€?
## **5\. 謇ゥ螻墓€ァ隶セ隶?(Future Roles)**
## **5\. 扩展性设计 (Future Roles)**
蟇ケ莠<EFBFBD> **Co-PI** 謌?**Sub-I** 遲芽ァ定牡<E5AE9A>檎ウサ扈滓髪謖∝<E8AC96>?iit\_projects.roles 陦ィ荳ュ蜉ィ諤∵キサ蜉<EFBDBB><EFBFBD>剞譬<E5899E>ュセ<EFBDAD><EFBDBE>
对于 **Co-PI****Sub-I** 等角色,系统支持在 iit\_projects.roles 表中动态添加权限标签:
* can\_approve\_shadow\_state: 赋予审批权。
* can\_view\_audit\_trail: 赋予审计查看权。
* can\_manage\_patients: 赋予患者管理权。
**版本说明**V1.0 基础版 | **状态**:待评审
* can\_approve\_shadow\_state: 襍倶コ亥ョ。謇ケ譚<EFBDB9>€?
* can\_view\_audit\_trail: 襍倶コ亥ョ。隶。譟・逵区揀縲?
* can\_manage\_patients: 襍倶コ域ぅ閠<E38185>ョ。逅<EFBDA1>揀縲?
**迚域悽隸エ譏<EFBDB4>**<2A>啖1.0 蝓コ遑€迚?| **迥カ諤?*<2A>壼セ<E5A3BC><EFBFBD>ョ。

View File

@@ -1,64 +1,57 @@
# **IIT Manager Agent 多端角色与微信端开发指南**
# **IIT Manager Agent 憭𡁶垢閫坿𠧧銝𤾸凝靽∠垢撘<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*
## **1\. 微信端选型分析:为什么必须是企业微信?**
## **1\. 敺桐縑蝡舫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗帋蛹隞<EFBFBD><EFBFBD><EFBFBD>憿餅糓隡<EFBFBD><EFBFBD>敺桐縑嚗?*
在临床研究的长周期中,消息触达的可靠性是第一位的。
| 特性 | 微信订阅号 | 微信服务号 | 企业微信 (WeCom) |
<EFBFBD>其葩摨羓<EFBFBD>蝛嗥<EFBFBD><EFBFBD>踹𪂹<EFBFBD>煺葉嚗峕<EFBFBD><EFBFBD>航圻颲曄<EFBFBD><EFBFBD><EFBFBD><EFBFBD>扳糓蝚砌<EFBFBD>雿滨<EFBFBD><EFBFBD>?
| <20><EFBFBD>?| 敺桐縑霈<E99C88><EFBD81>?| 敺桐縑<E6A190>滚𦛚<E6BB9A>?| 隡<><E99AA1>敺桐縑 (WeCom) |
| :---- | :---- | :---- | :---- |
| **消息主动性** | 极弱(折叠在文件夹) | 中(模板消息有次数限制) | ****(可直接发给外部联系人/群) |
| **48小时限制** | 有 | 有(用户不互动则无法发信) | **无**(只要是外部联系人,随时触达) |
| **身份属性** | 媒体/信息流 | 机构/品牌展示 | **专业/职业属性**(实名认证医生) |
| **PI 适用性** | 不推荐 | 一般(仅用于简单日报) | **推荐**(用于决策确认与紧急通知) |
| **患者适用性** | 不推荐 | 不推荐(无法长效随访) | **推荐**CRC通过企微加患者微信 |
| **<EFBFBD><EFBFBD>銝餃𢆡<EFBFBD>?* | <20><>摹嚗<E691B9><E59A97><EFBFBD>惩銁<E683A9><E98A81>辣憭對<E686AD> | 銝哨<E98A9D>璅⊥踎瘨<E8B88E><E798A8><EFBFBD>㗇活<E39787><EFBFBD><E59C88><EFBFBD> | **撘?*嚗<><EFBFBD>湔𦻖<E6B994>𤑳<EFBFBD>憭㚚<E686AD><E39A9A>𠉛頂鈭?蝢歹<E89DA2> |
| **48撠𤩺𧒄<EFBFBD>𣂼<EFBFBD>** | <EFBFBD>?| <20><EFBFBD><E39A81><EFBFBD>銝滢<E98A9D><E6BBA2><EFBFBD><E585B8><EFBFBD><E4ADBE>睲縑嚗?| **<EFBFBD>?*嚗<>蘨閬<E898A8>糓憭㚚<E686AD><E39A9A>𠉛頂鈭綽<E988AD><E7B6BD>𤩺𧒄閫西噢嚗?|
| **頨思遢撅墧<EFBFBD>?* | 慦雴<E685A6>/靽⊥<E99DBD>瘚?| <20><EFBFBD>/<2F><><EFBFBD>撅閧內 | **銝㮖<EFBFBD>/<2F><EFBFBD>撅墧<E69285>?*嚗<><E59A97><EFBFBD>滩恕霂<E68195><EFBFBD><E9BEAB><EFBFBD> |
| **PI <EFBFBD><EFBFBD><EFBFBD>?* | 銝齿綫<E9BDBF>?| 銝<><E98A9D>穿<EFBFBD><EFBFBD>鍂鈭𡒊<E988AD><F0A1928A>閙𠯫<E99699><EFBFBD> | **<EFBFBD><EFBFBD>**嚗<>鍂鈭𤾸<E988AD>蝑𣇉霈支<E99C88>蝝扳<E89D9D>仿<EFBFBD>𡁶䰻嚗?|
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?* | 銝齿綫<E9BDBF>?| 銝齿綫<E9BDBF><EFBFBD><E7909C><EFBFBD><E4ADBE><EFBFBD><E8B8B5>讛挪嚗?| **<EFBFBD><EFBFBD>**嚗㇃RC<52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4ADBE><EFBFBD>凝靽∴<E99DBD> |
## **2\. 规模化部署下的品牌与归属感方案**
针对“100 个项目、47 家医院”的规模化场景,传统的“一院一授权”不可行。建议采用 **“中央应用 \+ 动态品牌”** 的架构。
## **2\. <EFBFBD><EFBFBD><EFBFBD>蝵脖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>敶鍦<EFBFBD><EFBFBD><EFBFBD>䲮獢?*
<EFBFBD><EFBFBD><EFBFBD>?00 銝芷★<E88AB7><EFBFBD>?7 摰嗅龫<E59785><EFBFBD><EFBFBD><EFBFBD><EFBFBD>硋㦤<E7A18B><EFBFBD>隡删<E99AA1><E588A0><EFBFBD><EFBFBD><EFBFBD><E99D9D><EFBFBD><EFBCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E88BB7><EFBFBD><E888AA><EFBFBD>遣霈桅<E99C88><E6A185>?**<2A>靝葉憭桀<E686AD><E6A180>?\+ <20><EFBFBD><E586BD><EFBFBD><EFBFBD>𢞖<EFBFBD>?* <20><><EFBFBD><E6B2B2><EFBFBD>?
### **2.1 <20><><EFBFBD>撅閧內蝑𣇉裦 (Branding Strategy)**
1. **企业简称优化**:申请企业微信认证时,将简称设置为“壹证循临床研究”或“临床研究服务中心”(需配合相关商标或软件著作权证明)。
2. **多应用隔离**:针对不同项目创建不同的“自建应用”。
* 应用 A名为“北医三院骨质疏松项目”
* 应用 B名为“北大肿瘤肺癌研究组”
3. **消息发送者自定义**:通过企业微信 API在给 PI 推送消息时可以将卡片的摘要Title动态修改为具体项目组名称。
1. **<EFBFBD><EFBFBD><EFBFBD>蝘唬<EFBFBD><EFBFBD>?*嚗𡁶𤚗霂瑚<E99C82>銝𡁜凝靽∟恕霂<E68195>𧒄嚗<F0A79284><E59A97><EFBFBD>蝘啗挽蝵桐蛹<E6A190>𨅯ㄨ霂<E384A8>儐銝游<E98A9D><E6B8B8>𠉛弦<F0A0899B><EFBFBD><E884B2>靝葩摨羓<E691A8>蝛嗆<E89D9B><E59786>∩葉敹<E89189><E695B9><EFBFBD><E59885><EFBFBD><EFBFBD><EFBFBD><E6BB9A><EFBFBD><E8A9A8><EFBFBD><EFBFBD><EFBFBD>𤥁蔓隞嗉<E99A9E>雿𨀣<E99BBF><EFBFBD><E99C82>嚗剹<E59A97>?
2. **憭𡁜<EFBFBD><EFBFBD><EFBFBD>蝳?*嚗𡁻<E59A97>撖嫣<E69296><E5ABA3>屸★<E5B1B8><EFBFBD>撱箔<E692B1><E7AE94>𣬚<EFBFBD><F0A3AC9A>𡏭䌊撱箏<E692B1><E7AE8F><EFBFBD><EFBFBD>?
* 摨𠉛鍂 A嚗𡁜<E59A97>銝算<E98A9D>𨅯<EFBFBD><F0A885AF><EFBFBD><E9A2B1>爸韐函<E99F90><E587BD>暸★<E69AB8><EFBFBD>?
* 摨𠉛鍂 B嚗𡁜<E59A97>銝算<E98A9D>𨅯<EFBFBD>憭扯<E686AD><E689AF><EFBFBD><E696B9>𣬚<EFBFBD>蝛嗥<E89D9B><E597A5>?
3. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䌊摰帋<EFBFBD>**嚗𡁻<E59A97><EFBFBD><EFBFBD><E99AA1>敺桐縑 API嚗<49>銁蝏?PI <20><EFBFBD><E588B8><EFBFBD><EFBFBD>舀𧒄嚗<F0A79284>虾隞亙<E99A9E><E4BA99><EFBFBD><E288A0><EFBFBD><EFBFBD><EFBFBD><E996AC>Title嚗匧𢆡<E58CA7><F0A286A1><EFBFBD>嫣蛹<E5ABA3><EFBFBD>憿寧𤌍蝏<F0A48C8D><E89D8F>蝘啜<E89D98>?
### **2.2 撠讐<E692A0>摨?vs 隡<><E99AA1>敺桐縑嚗𡁏楛摨血笆瘥?*
### **2.2 小程序 vs 企业微信:深度对比**
| 维度 | 微信小程序 | 企业微信应用 |
| 蝏游漲 | 敺桐縑撠讐<E692A0>摨?| 隡<><E99AA1>敺桐縑摨𠉛鍂 |
| :---- | :---- | :---- |
| **品牌突出度** | **极高**完全独立命名、Logo | ****(受限于企业主体的后缀) |
| **通知时效性** | **低**(需用户主动订阅,有次数限制) | **极高**(消息直达聊天列表) |
| **交互深度** | ****(复杂的表单、可视化图表) | ****(多为简单的卡片和 H5 链接) |
| **患者依从性** | 依赖用户主动打开习惯 | 依赖 CRC 的私域互动(更强) |
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>枂摨?* | **<EFBFBD><EFBFBD><EFBFBD>**嚗<><E59A97><EFBFBD>函𡠺蝡见𦶢<E8A781><EFBFBD><E6BABB>ogo嚗?| **銝?*嚗<><E59A97><EFBFBD>𣂷<EFBFBD><EFBFBD><E99AA1>銝颱<E98A9D><E9A2B1><EFBFBD><EFBFBD><EFBFBD>嚗?|
| **<EFBFBD>𡁶䰻<EFBFBD><EFBFBD><EFBFBD>?* | **雿?*嚗<><E59A97><EFBFBD><EFBFBD>銝餃𢆡霈<E99C88>嚗峕<E59A97>甈⊥㺭<E28AA5>𣂼<EFBFBD>嚗?| **<EFBFBD><EFBFBD><EFBFBD>**嚗<><E59A97><EFBFBD>舐凒颲曇<E9A2B2>憭拙<E686AD>銵剁<E98AB5> |
| **鈭支<EFBFBD>瘛勗漲** | **撘?*嚗<><E59A97><EFBFBD><EFBFBD><EFBFBD>銵典<E98AB5><E585B8><EFBFBD>虾閫<E899BE><E996AB><EFBFBD>曇”嚗?| **銝?*嚗<><E59A97>銝箇<E98A9D><E7AE87><EFBFBD><E996A7><EFBFBD><E288A0>?H5 <20>暹𦻖嚗?|
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞擧<EFBFBD>?* | 靘肽<E99D98><E882BD><EFBFBD>銝餃𢆡<E9A483><EFBFBD>銋䭾<E98A8B> | 靘肽<E99D98> CRC <20><><EFBFBD><EFBFBD><EFBFBD><E785BA><EFBFBD><E58981>游撩嚗?|
## **3\. 推荐架构:“通知-落地”双轨模式**
## **3\. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗尠<EFBFBD>𣈯<EFBFBD>𡁶䰻-<2D>賢𧑐<E8B3A2><EFBFBD>頧冽芋撘?*
为了平衡“通知及时性”与“医院品牌感”,推荐以下混合方案:
1. **统一通知中枢 (WeCom)**
* 使用壹证循统一的企业微信主体。
* 负责所有项目的:访视提醒、质控警报、日报推送。
* 用户感官:收到一条来自“临床研究助理”的消息。
2. **多租户品牌落地 (Mini-Program / H5)**
* PI 或 CRC 点击企微消息,跳转到对应项目的**微信小程序**。
* 小程序界面顶部显著展示:\[北京大学肿瘤医院\] 及其 Logo。
* 业务逻辑:小程序通过 project\_id 自动渲染对应的品牌元素。
## **4\. 微信端开发准备清单 (针对 100+ 项目规模)**
1. **资质准备**
* \[ \] **企业微信代开发模式**:如果希望未来更灵活,可以申请成为“企业微信服务商”。
* \[ \] **多域名备案**:准备 1-2 个通用的学术性域名(如 research-support.com
2. **数据隔离技术**
* \[ \] **WeCom-ID 映射表**:在 iit\_schema 中记录 user\_id 在不同项目应用中的 OpenID。
* \[ \] **消息模板引擎**:支持根据不同项目动态生成卡片文案。
銝箔<EFBFBD>撟唾﹛<EFBFBD>𣈯<EFBFBD>𡁶䰻<EFBFBD>𦠜𧒄<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𨅯龫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞乩<EFBFBD>瘛瑕<EFBFBD><EFBFBD><EFBFBD>嚗?
1. **蝏煺<E89D8F><E785BA>𡁶䰻銝剜攟 (WeCom)**嚗?
* 雿輻鍂憯寡<E686AF>敺芰<E695BA><EFBFBD><E98A9D><EFBFBD><EFBFBD>銝𡁜凝靽∩蜓雿瓐<E99BBF>?
* 韐蠘提<EFBFBD><EFBFBD><EFBFBD>厰★<EFBFBD><EFBFBD>嚗朞挪閫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>扯郎<EFBFBD><EFBFBD><EFBFBD>𠯫<EFBFBD>交綫<EFBFBD><EFBFBD><EFBFBD>?
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𡁏𤣰<EFBFBD><EFBFBD><EFBFBD>⊥䔉<EFBFBD><EFBFBD>靝葩摨羓<EFBFBD>蝛嗅𨭌<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
2. **憭𡁶<E686AD><F0A181B6><EFBFBD><E79195>諹氜<E8ABB9>?(Mini-Program / H5)**嚗?
* PI <20>?CRC <20>孵稬隡<E7A8AC>凝瘨<E5879D><E798A8>嚗諹歲頧砍<E9A0A7>撖孵<E69296>憿寧𤌍<E5AFA7>?*敺桐縑撠讐<E692A0>摨?*<2A>?
* 撠讐<EFBFBD>摨讐<EFBFBD><EFBFBD><EFBFBD>冽遬<EFBFBD><EFBFBD>蝷綽<EFBFBD>\[<5B>𦯀漪憭批郎<E689B9>輻𠈔<E8BCBB>駁堺\] <20>𠰴<EFBFBD> Logo<67>?
* 銝𡁜𦛚<EFBFBD><EFBFBD>嚗𡁜<EFBFBD>蝔见<EFBFBD><EFBFBD><EFBFBD> project\_id <20>芸𢆡皜脫<E79A9C>撖孵<E69296><E5ADB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝝𨬭<E89D9D>?
## **4\. 敺桐縑蝡臬<E89DA1><E887AC><EFBFBD><EFBFBD><E686AD><EFBFBD>?(<28><>笆 100+ 憿寧𤌍閫<F0A48C8D>芋)**
1. **韏<><EFBFBD><E68DB6><EFBFBD>**嚗?
* \[ \] **隡<><E99AA1>敺桐縑隞<E7B891><E99A9E><EFBFBD>烐芋撘?*嚗𡁜<E59A97><F0A1819C>𨅯<EFBFBD><F0A885AF>𥟇𧊋<F0A59F87>交凒<E4BAA4>菜暑嚗<E69A91>虾隞亦𤚗霂瑟<E99C82>銝算<E98A9D><EFBFBD>銝𡁜凝靽⊥<E99DBD><E28AA5><EFBFBD><E288AA><EFBFBD>?
* \[ \] **憭𡁜<E686AD><F0A1819C><EFBFBD>獢?*嚗𡁜<E59A97>憭?1-2 銝芷<E98A9D>𡁶鍂<F0A181B6><E98D82><EFBFBD><EFBFBD><EFBFBD><E689B9><EFBFBD>憒?research-support.com嚗剹<E59A97>?
2. **<EFBFBD>唳旿<EFBFBD>𠉛氖<EFBFBD><EFBFBD><EFBFBD>?*嚗?
* \[ \] **WeCom-ID <20><EFBFBD>銵?*嚗𡁜銁 iit\_schema 銝剛扇敶?user\_id <20><EFBFBD><E585B6>屸★<E5B1B8><EFBFBD><E6A180>其葉<E585B6>?OpenID<49>?
* \[ \] **瘨<><E798A8>璅⊥踎撘閙<E69298>**嚗𡁏𣈲<F0A1818F><F0A388B2><EFBFBD><EFBFBD><E6A190>屸★<E5B1B8>桀𢆡<E6A180><F0A286A1><EFBFBD><EFBFBD>𣂼㨃<F0A382BC><E3A883><EFBFBD><EFBFBD><E78DA2>?
## **5\. 蝏栞捏**
* **关于更名**:腾讯不允许无资质的泛指词更名。建议以“公司名+服务中心”作为主体,以“项目组”作为应用名。
* **关于小程序**:小程序不适合作为“第一提醒入口”,但非常适合作为“第一展示窗口”。
* **最终建议****用企业微信推消息,用小程序看报表和填表。** 这样既解决了 47 家医院的对接难点,又通过小程序给足了 PI 面子。
**版本**V3.1 (规模化修正版) | **最后更新**2025-12-30
* **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗朞<E59A97>霈臭<E99C88><E887AD><EFBFBD><EFBFBD><EFBFBD>韐函<E99F90>瘜𥟇<E7989C>霂齿凒<E9BDBF><EFBFBD><E6BABB>遣霈桐誑<E6A190>𨅯<EFBFBD><F0A885AF><EFBFBD>+<2B>滚𦛚銝剖<E98A9D><E58996><EFBFBD>銝箔蜓雿橒<E99BBF>隞乒<E99A9E>𣈯★<F0A388AF><EFBFBD><E6A183><EFBFBD>銝箏<E98A9D><E7AE8F><EFBFBD><E585B8>?
* **<EFBFBD><EFBFBD>撠讐<EFBFBD>摨?*嚗𡁜<E59A97>蝔见<E89D94>銝漤<E98A9D><E6BCA4><EFBFBD>雿靝蛹<E99D9D>𦦵洵銝<E6B4B5><E98A9D><EFBFBD><E99EBE>亙藁<E4BA99><EFBFBD><EFBFBD><E99BBF>撣賊<E692A3><E8B38A><EFBFBD>雿靝蛹<E99D9D>𦦵洵銝<E6B4B5>撅閧內蝒堒藁<E5A092><EFBFBD>?
* **<EFBFBD><EFBFBD><EFBFBD>遣霈?*嚗?*<2A><EFBFBD>銝𡁜凝靽⊥綫瘨<E7B6AB><E798A8>嚗𣬚鍂撠讐<E692A0>摨讐<E691A8><E8AE90>亥”<E4BAA5><E2809D>銵具<E98AB5>?* 餈蹱甅<E8B9B1><EFBCBA><EFBFBD> 47 摰嗅龫<E59785><EFBFBD>撖寞𦻖<E5AF9E><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>撠讐<E692A0>摨讐<E691A8>頞喃<E9A09E> PI <20><EFBFBD><EFBCB7>?
**<2A><>𧋦**嚗间3.1 (閫<><EFBFBD>碶耨甇<E880A8><E79487>) | **<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*嚗?025-12-30

View File

@@ -1,139 +1,139 @@
# IIT Manager Agent 鎶€鏈<E282AC>矾寰勪笌鏋舵瀯璁捐<E79281>
**鏂囨。鐗堟湰**: v1.0
**最后更新**: 2026-01-04
**状态**: ✅ Phase 1.5 完成并验证
**鏈€鍚庢洿鏂?*: 2026-01-04
**鐘舵€?*: 鉁?Phase 1.5 瀹屾垚骞堕獙璇?
---
## 馃搵 鏂囨。姒傝堪
本文档详细描述了IIT Manager Agent的技术路径、核心架构和实现方案。系统采用**"意图识别 → 工具调用 → 混合检索 → LLM生成"**的技术路径实现了零幻觉、高准确率的AI对话能力。
<EFBFBD>枃妗<EFBFBD>缁嗘弿杩颁簡IIT Manager Agent鐨勬妧鏈<EFBFBD>矾寰勩€佹牳蹇冩灦鏋勫拰瀹炵幇鏂规<EFBFBD>銆傜郴缁熼噰鐢?*"鎰忓浘璇嗗埆 鈫?宸ュ叿璋冪敤 鈫?娣峰悎妫€绱?鈫?LLM鐢熸垚"**鐨勬妧鏈<E5A6A7>矾寰勶紝瀹炵幇浜嗛浂骞昏<E9AA9E>銆侀珮鍑嗙鐜囩殑AI瀵硅瘽鑳藉姏銆?
---
## 馃幆 鎶€鏈<E282AC>矾寰勬€荤粨
### 核心技术路径
### 鏍稿績鎶€鏈<EFBFBD>矾寰?
```
鐢ㄦ埛鎻愰棶
→ 意图识别Intent Detection
→ 工具调用Tool Calling
→ 混合检索(Hybrid Retrieval
LLM生成LLM Generation
→ 回答用户
鈫?鎰忓浘璇嗗埆锛圛ntent Detection锛?
鈫?宸ュ叿璋冪敤锛圱ool Calling锛?
鈫?娣峰悎妫€绱<E282AC>Hybrid Retrieval锛?
鈫?LLM鐢熸垚锛圠LM Generation锛?
鈫?鍥炵瓟鐢ㄦ埛
```
这是一个**简化版ReAct架构**Reason + Act也可以称为**"意图驱动的混合RAG系统"**
杩欐槸涓€涓?*绠€鍖栫増ReAct鏋舵瀯**锛圧eason + Act锛夛紝涔熷彲浠ョО涓?*"鎰忓浘椹卞姩鐨勬贩鍚圧AG绯荤粺"**銆?
### 技术架构类型
### 鎶€鏈<EFBFBD>灦鏋勭被鍨?
- **架构模式**: 简化版ReActReason + Act
- **检索模式**: 混合RAG结构化数据 + 非结构化文档)
- **意图识别**: 关键词匹配MVP阶段
- **上下文管理**: SessionMemory(内存缓存)
- **防幻觉机制**: RAG数据注入 + 严格System Prompt
- **鏋舵瀯妯″紡**: 绠€鍖栫増ReAct锛圧eason + Act锛?
- **妫€绱㈡ā寮?*: 娣峰悎RAG锛堢粨鏋勫寲鏁版嵁 + 闈炵粨鏋勫寲鏂囨。锛?
- **鎰忓浘璇嗗埆**: 鍏抽敭璇嶅尮閰嶏紙MVP闃舵<E99783>锛?
- **涓婁笅鏂囩<EFBFBD>鐞?*: SessionMemory锛堝唴瀛樼紦瀛橈級
- **闃插够瑙夋満鍒?*: RAG鏁版嵁娉ㄥ叆 + 涓ユ牸System Prompt
---
## 馃搻 瀹屾暣鎶€鏈<E282AC>灦鏋勫浘
```
┌─────────────────────────────────────────────────────────────────┐
用户层(User Layer
├─────────────────────────────────────────────────────────────────┤
│ 企业微信WeChat
- PI通过企业微信发送消息
- 接收AI回复含"正在查询..."即时反馈)
└────────────────────────┬────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
接入层(Gateway Layer
├─────────────────────────────────────────────────────────────────┤
WechatCallbackController
- URL验证(签名校验)
- 消息加密/解密AES
- 异步消息处理5秒内返回200
- 即时反馈:"🫡 正在查询,请稍候..."
└────────────────────────┬────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
对话服务层(Chat Service
├─────────────────────────────────────────────────────────────────┤
ChatService(核心大脑)
│ 步骤1: 意图识别Intent Detection
│ ├─ 关键词匹配MVP简化方案
│ ├─ query_record: "患者"、"ID"、"记录"
│ ├─ count_records: "多少"、"几个"、"统计"
│ ├─ query_protocol: "纳入排除"、"CRF"、"研究方案"
│ └─ general_chat: 其他
│ 步骤2: 工具调用Tool Calling
│ ├─ REDCap数据查询(结构化数据)
│ │ ├─ queryRedcapRecord(recordId)
│ │ ├─ countRedcapRecords()
│ │ └─ getProjectInfo()
│ │
│ └─ Dify知识库检索非结构化文档
└─ queryDifyKnowledge(query)
└─ 语义检索Top 5相关片段
│ 步骤3: 上下文管理(Context Management
│ └─ SessionMemory内存缓存保留最近3轮
│ 步骤4: LLM生成LLM Generation
│ └─ DeepSeek-V3(通过LLMFactory调用)
├─ System Prompt(强调基于真实数据)
├─ REDCap查询结果(如果有)
├─ Dify检索结果(如果有)
├─ 对话上下文(SessionMemory
└─ 用户问题
└────────────────────────┬────────────────────────────────────────┘
┌───────────────┴───────────────┐
┌──────────────────────┐ ┌──────────────────────┐
│ 数据源层Data │ 知识源层Knowledge)│
├──────────────────────┤ ├──────────────────────┤
REDCap数据库 Dify知识库
- 患者记录(结构化) │ │ - 研究方案PDF
- RedcapAdapter - CRF表格Docx
- REST API │ - 伦理资料
- 实时查询 - 向量检索(Qdrant
└──────────────────────┘ └──────────────────────┘
└───────────────┬───────────────┘
PostgreSQL数据库
- 项目配置dify_dataset_id
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? 鐢ㄦ埛灞傦紙User Layer锛? 鈹?
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? 浼佷笟寰<E7AC9F>俊锛圵eChat锛? 鈹?
鈹? - PI閫氳繃浼佷笟寰<EFBFBD>俊鍙戦€佹秷鎭? 鈹?
鈹? - 鎺ユ敹AI鍥炲<EFBFBD>锛堝惈"姝湪鏌ヨ<E98F8C>..."鍗虫椂鍙嶉<E98D99>锛? 鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?
鈻?
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? 鎺ュ叆灞傦紙Gateway Layer锛? 鈹?
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? WechatCallbackController 鈹?
鈹? - URL楠岃瘉锛堢<EFBFBD>鍚嶆牎楠岋級 鈹?
鈹? - 娑堟伅鍔犲瘑/瑙瘑锛圓ES锛? 鈹?
鈹? - 寮傛<EFBFBD>娑堟伅澶勭悊锛?绉掑唴杩斿洖200锛? 鈹?
鈹? - 鍗虫椂鍙嶉<EFBFBD>锛?馃<>湪鏌ヨ<E98F8C>锛岃<E9949B>绋嶅€?.." 鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?
鈻?
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? 瀵硅瘽鏈嶅姟灞傦紙Chat Service锛? 鈹?
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? ChatService锛堟牳蹇冨ぇ鑴戯級 鈹?
鈹? 鈹?
鈹? 姝ラ<E5A79D>1: 鎰忓浘璇嗗埆锛圛ntent Detection锛? 鈹?
鈹? 鈹溾攢 鍏抽敭璇嶅尮閰嶏紙MVP绠€鍖栨柟妗堬級 鈹?
鈹? 鈹溾攢 query_record: "鎮h€?銆?ID"銆?璁板綍" 鈹?
鈹? 鈹溾攢 count_records: "澶氬皯"銆?鍑犱釜"銆?缁熻<E7BC81>" 鈹?
鈹? 鈹溾攢 query_protocol: "绾冲叆鎺掗櫎"銆?CRF"銆?鐮旂┒鏂规<E98F82>" 鈹?
鈹? 鈹斺攢 general_chat: 鍏朵粬 鈹?
鈹? 鈹?
鈹? 姝ラ<E5A79D>2: 宸ュ叿璋冪敤锛圱ool Calling锛? 鈹?
鈹? 鈹溾攢 REDCap鏁版嵁鏌ヨ<EFBFBD>锛堢粨鏋勫寲鏁版嵁锛? 鈹?
鈹? 鈹? 鈹溾攢 queryRedcapRecord(recordId) 鈹?
鈹? 鈹? 鈹溾攢 countRedcapRecords() 鈹?
鈹? 鈹? 鈹斺攢 getProjectInfo() 鈹?
鈹? 鈹? 鈹?
鈹? 鈹斺攢 Dify鐭ヨ瘑搴撴<E690B4><EFBFBD>紙闈炵粨鏋勫寲鏂囨。锛? 鈹?
鈹? 鈹斺攢 queryDifyKnowledge(query) 鈹?
鈹? 鈹斺攢 璇<>箟妫€绱<E282AC>op 5鐩稿叧鐗囨<E99097> 鈹?
鈹? 鈹?
鈹? 姝ラ<E5A79D>3: 涓婁笅鏂囩<E98F82>鐞嗭紙Context Management锛? 鈹?
鈹? 鈹斺攢 SessionMemory锛堝唴瀛樼紦瀛橈紝淇濈暀鏈€杩?杞<> 鈹?
鈹? 鈹?
鈹? 姝ラ<E5A79D>4: LLM鐢熸垚锛圠LM Generation锛? 鈹?
鈹? 鈹斺攢 DeepSeek-V3锛堥€氳繃LLMFactory璋冪敤锛? 鈹?
鈹? 鈹溾攢 System Prompt锛堝己璋冨熀浜庣湡瀹炴暟鎹<EFBFBD> 鈹?
鈹? 鈹溾攢 REDCap鏌ヨ<EFBFBD>缁撴灉锛堝<EFBFBD>鏋滄湁锛? 鈹?
鈹? 鈹溾攢 Dify妫€绱㈢粨鏋滐紙濡傛灉鏈夛級 鈹?
鈹? 鈹溾攢 瀵硅瘽涓婁笅鏂囷紙SessionMemory锛? 鈹?
鈹? 鈹斺攢 鐢ㄦ埛闂<E59F9B><E99782> 鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹?
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈻? 鈻?
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? 鏁版嵁婧愬眰锛圖ata锛? 鈹? 鈹? 鐭ヨ瘑婧愬眰锛圞nowledge锛夆攤
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? REDCap鏁版嵁搴? 鈹? 鈹? Dify鐭ヨ瘑搴? 鈹?
鈹? - €呰<EFBFBD>褰曪紙缁撴瀯鍖栵級 鈹? 鈹? - 鐮旂┒鏂规<E98F82>PDF 鈹?
鈹? - RedcapAdapter 鈹? 鈹? - CRF琛ㄦ牸Docx 鈹?
鈹? - REST API 鈹? 鈹? - 浼︾悊璧勬枡 鈹?
鈹? - 瀹炴椂鏌ヨ<EFBFBD> 鈹? 鈹? - 鍚戦噺妫€绱<EFBFBD>Qdrant锛?鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈹? 鈹?
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
鈻?
PostgreSQL鏁版嵁搴?
- 椤圭洰閰嶇疆锛坉ify_dataset_id锛?
- 瀹¤<E780B9>鏃ュ織
- 鐢ㄦ埛鏄犲皠
```
---
## 🔑 核心技术组件
## 馃攽 鏍稿績鎶€鏈<E282AC>粍浠?
### 1. 意图识别Intent Detection
### 1. 鎰忓浘璇嗗埆锛圛ntent Detection锛?
#### 瀹炵幇鏂瑰紡
- **褰撳墠鏂规<E98F82>**: 鍏抽敭璇嶅尮閰嶏紙绠€鍗曢珮鏁堬級
- **识别准确率**: 100%5次测试全部正确
- **璇嗗埆鍑嗙‘鐜?*: 100%锛?娆℃祴璇曞叏閮ㄦ<E996AE><EFBFBD>
- **鍝嶅簲閫熷害**: <10ms
#### 鎰忓浘绫诲瀷
| 意图类型 | 关键词 | 触发工具 | 示例 |
| 鎰忓浘绫诲瀷 | 鍏抽敭璇?| 瑙﹀彂宸ュ叿 | 绀轰緥 |
|---------|--------|----------|------|
| `query_record` | "患者"、"ID"、"记录"、"受试者" | REDCap单条查询 | "查询ID 7的患者情况" |
| `count_records` | "多少"、"几个"、"统计"、"总共" | REDCap统计查询 | "目前有多少位患者入组?" |
| `query_protocol` | "纳入排除"、"CRF"、"研究方案"、"伦理" | Dify知识库检索 | "这个研究的排除标准是什么?" |
| `project_info` | "项目"、"研究"、"信息" | 数据库查询 | "这是什么项目?" |
| `general_chat` | 其他 | 无工具调用 | "你好" |
| `query_record` | "鎮h€?銆?ID"銆?璁板綍"銆?鍙楄瘯鑰? | REDCap鍗曟潯鏌ヨ<EFBFBD> | "鏌ヨ<EFBFBD>ID 7鐨勬偅鑰呮儏鍐? |
| `count_records` | "澶氬皯"銆?鍑犱釜"銆?缁熻<E7BC81>"銆?鎬诲叡" | REDCap缁熻<E7BC81>鏌ヨ<E98F8C> | "鐩<>墠鏈夊<E98F88>灏戜綅鎮€呭叆缁勶紵" |
| `query_protocol` | "绾冲叆鎺掗櫎"銆?CRF"銆?鐮旂┒鏂规<E98F82>"銆?浼︾悊" | Dify鐭ヨ瘑搴撴<E690B4>绱?| "杩欎釜鐮旂┒鐨勬帓闄ゆ爣鍑嗘槸浠€涔堬紵" |
| `project_info` | "椤圭洰"銆?鐮旂┒"銆?淇℃伅" | 鏁版嵁搴撴煡璇?| "杩欐槸浠€涔堥」鐩<E3808D>" |
| `general_chat` | 鍏朵粬 | 鏃犲伐鍏疯皟鐢?| "浣犲ソ" |
#### 浠g爜瀹炵幇
@@ -148,8 +148,8 @@ private detectIntent(message: string): {
return { intent: 'query_protocol' };
}
// 2. 识别记录查询包含ID号码
const recordIdMatch = message.match(/(?:ID|记录|患者|受试者).*?(\d+)|(\d+).*?(?:入组|数据|信息)/i);
// 2. 璇嗗埆璁板綍鏌ヨ<EFBFBD>锛堝寘鍚獻D鍙风爜锛?
const recordIdMatch = message.match(/(?:ID|璁板綍|鎮h€厊鍙楄瘯鑰?.*?(\d+)|(\d+).*?(?:鍏ョ粍|鏁版嵁|淇℃伅)/i);
if (recordIdMatch) {
return {
intent: 'query_record',
@@ -158,7 +158,7 @@ private detectIntent(message: string): {
}
// 3. 璇嗗埆缁熻<E7BC81>鏌ヨ<E98F8C>
if (/(多少|几个|几条|总共|统计).*?(记录|患者|受试者|人)/.test(message)) {
if (/(澶氬皯|鍑犱釜|鍑犳潯|鎬诲叡|缁熻<E7BC81>).*?(璁板綍|鎮h€厊鍙楄瘯鑰厊浜?/.test(message)) {
return { intent: 'count_records' };
}
@@ -167,28 +167,28 @@ private detectIntent(message: string): {
return { intent: 'project_info' };
}
// 5. 默认:普通对话
// 5. 榛樿<EFBFBD>锛氭櫘閫氬<EFBFBD>璇?
return { intent: 'general_chat' };
}
```
---
### 2. 工具调用Tool Calling
### 2. 宸ュ叿璋冪敤锛圱ool Calling锛?
#### 2.1 REDCap宸ュ叿
**功能**: 查询结构化的患者数据
**鍔熻兘**: 鏌ヨ<EFBFBD>缁撴瀯鍖栫殑鎮€呮暟鎹?
**宸ュ叿鍒楄〃**:
| 宸ュ叿鍚嶇О | 鍔熻兘 | 杈撳叆 | 杈撳嚭 | 鍝嶅簲鏃堕棿 |
|---------|------|------|------|----------|
| `queryRedcapRecord` | 查询单条患者记录 | recordId | 患者详细信息 | ~1.2|
| `countRedcapRecords` | 统计患者总数 | 无 | 总数+记录ID列表 | ~1.3|
| `getProjectInfo` | 获取项目信息 | 无 | 项目基本信息 | ~50ms |
| `queryRedcapRecord` | 鏌ヨ<EFBFBD>鍗曟潯鎮€呰<EFBFBD>褰?| recordId | €呰<EFBFBD>缁嗕俊鎭?| ~1.2绉?|
| `countRedcapRecords` | 缁熻<EFBFBD>€呮€绘暟 | 鏃?| 鎬绘暟+璁板綍ID鍒楄〃 | ~1.3绉?|
| `getProjectInfo` | 鑾峰彇椤圭洰淇℃伅 | 鏃?| 椤圭洰鍩烘湰淇℃伅 | ~50ms |
**技术实现**:
**鎶€鏈<EFBFBD>疄鐜?*:
```typescript
// backend/src/modules/iit-manager/adapters/RedcapAdapter.ts
@@ -220,15 +220,15 @@ export class RedcapAdapter {
**鍔熻兘**: 妫€绱㈤潪缁撴瀯鍖栫殑鐮旂┒鏂囨。
**检索配置**:
**妫€绱㈤厤缃?*:
| 参数 | 值 | 说明 |
| 鍙傛暟 | 鍊?| 璇存槑 |
|------|-----|------|
| `search_method` | semantic_search | 璇<>箟妫€绱<E282AC>紙鍚戦噺鐩镐技搴︼級 |
| `top_k` | 5 | 杩斿洖Top 5鐩稿叧鐗囨<E99097> |
| `chunk_size` | 1500 tokens | 每个片段大小Dify配置 |
| `chunk_size` | 1500 tokens | 姣忎釜鐗囨<EFBFBD>у皬锛圖ify閰嶇疆锛?|
**技术实现**:
**鎶€鏈<EFBFBD>疄鐜?*:
```typescript
// backend/src/modules/iit-manager/services/ChatService.ts
@@ -253,11 +253,11 @@ private async queryDifyKnowledge(query: string): Promise<string> {
}
);
// 3. 格式化检索结果
// 3. 鏍煎紡鍖栨<EFBFBD>绱㈢粨鏋?
let formattedKnowledge = '';
result.records.forEach((record, index) => {
const score = (record.score * 100).toFixed(1);
formattedKnowledge += `\n[文档${index + 1}] ${record.document_name} (相关度: ${score}%)\n`;
formattedKnowledge += `\n[鏂囨。${index + 1}] ${record.document_name} (鐩稿叧搴? ${score}%)\n`;
formattedKnowledge += `${record.content}\n---\n`;
});
@@ -267,25 +267,25 @@ private async queryDifyKnowledge(query: string): Promise<string> {
---
### 3. 混合检索(Hybrid Retrieval
### 3. 娣峰悎妫€绱<EFBFBD>Hybrid Retrieval锛?
**核心创新点**: 结合结构化数据和非结构化文档
**鏍稿績鍒涙柊鐐?*: 缁撳悎缁撴瀯鍖栨暟鎹<E69A9F>拰闈炵粨鏋勫寲鏂囨。
#### 检索策略对比
#### 妫€绱㈢瓥鐣ュ<EFBFBD>姣?
| 检索类型 | 数据源 | 适用场景 | 检索方式 | 示例查询 |
| 妫€绱㈢被鍨?| 鏁版嵁婧?| 閫傜敤鍦烘櫙 | 妫€绱㈡柟寮?| 绀轰緥鏌ヨ<E98F8C> |
|---------|--------|---------|---------|----------|
| **结构化数据检索** | REDCap | 患者记录、统计数据、入组信息 | SQL查询精确匹配 | "查询ID 7的患者" |
| **非结构化文档检索** | Dify知识库 | 研究方案、CRF表格、伦理资料 | 向量检索(语义相似) | "研究的纳入排除标准" |
| **缁撴瀯鍖栨暟鎹<EFBFBD><EFBFBD>绱?* | REDCap | 鎮€呰<E282AC>褰曘€佺粺璁℃暟鎹<E69A9F>€佸叆缁勪俊鎭?| SQL鏌ヨ<E98F8C>锛堢簿纭<E7B0BF>尮閰嶏級 | "鏌ヨ<EFBFBD>ID 7鐨勬偅鑰? |
| **闈炵粨鏋勫寲鏂囨。妫€绱?* | Dify鐭ヨ瘑搴?| 鐮旂┒鏂规<E98F82>銆丆RF琛ㄦ牸銆佷鸡鐞嗚祫鏂?| 鍚戦噺妫€绱<E282AC>紙璇<E7B499>箟鐩镐技锛?| "鐮旂┒鐨勭撼鍏ユ帓闄ゆ爣鍑? |
#### 浼樺娍
**互补性**: 两种数据源覆盖PI的所有需求
**自动化**: 根据意图自动选择数据源
**高效性**: 响应速度快平均4.8秒)
**准确性**: 100%基于真实数据
鉁?**浜掕ˉ鎬?*: 涓ょ<E6B693>鏁版嵁婧愯<E5A9A7>鐩朠I鐨勬墍鏈夐渶姹?
鉁?**鑷<>姩鍖?*: 鏍规嵁鎰忓浘鑷<E6B598>姩閫夋嫨鏁版嵁婧?
鉁?**楂樻晥鎬?*: 鍝嶅簲閫熷害蹇<E5AEB3>紙骞冲潎4.8绉掞級
鉁?**鍑嗙‘鎬?*: 100%鍩轰簬鐪熷疄鏁版嵁
#### 技术流程
#### 鎶€鏈<EFBFBD>祦绋?
```typescript
async handleMessage(userId: string, userMessage: string): Promise<string> {
@@ -303,12 +303,12 @@ async handleMessage(userId: string, userMessage: string): Promise<string> {
toolResult = await this.countRedcapRecords();
}
// Dify知识库检索
// Dify鐭ヨ瘑搴撴<EFBFBD>绱?
if (intent === 'query_protocol') {
difyKnowledge = await this.queryDifyKnowledge(userMessage);
}
// 3. 组装上下文
// 3. 缁勮<EFBFBD>涓婁笅鏂?
const messages = this.buildMessagesWithData(
userMessage,
context,
@@ -325,31 +325,31 @@ async handleMessage(userId: string, userMessage: string): Promise<string> {
---
### 4. RAGRetrieval Augmented Generation
### 4. RAG锛圧etrieval Augmented Generation锛?
**核心作用**: 防止AI幻觉确保回答基于真实数据
**鏍稿績浣滅敤**: 闃叉<EFBFBD>AI骞昏<EFBFBD>锛岀淇濆洖绛斿熀浜庣湡瀹炴暟鎹?
#### RAG瀹炵幇鏈哄埗
```typescript
// System Prompt锛堝己璋冨熀浜庣湡瀹炴暟鎹<E69A9F>
const systemPrompt = `你是IIT Manager智能助手。
const systemPrompt = `浣犳槸IIT Manager鏅鸿兘鍔╂墜銆?
【重要原则】
⚠️ 你**必须基于系统提供的数据和文档**回答问题,**绝对不能编造信息**。
⚠️ 如果系统提供了查询结果或文档内容,请使用这些真实信息;如果没有提供,明确告知用户。
銆愰噸瑕佸師鍒欍€?
鈿狅笍 浣?*蹇呴』鍩轰簬绯荤粺鎻愪緵鐨勬暟鎹<E69A9F>拰鏂囨。**鍥炵瓟闂<E7939F><E99782>锛?*缁濆<E7BC81>涓嶈兘缂栭€犱俊鎭?*銆?
鈿狅笍 濡傛灉绯荤粺鎻愪緵浜嗘煡璇㈢粨鏋滄垨鏂囨。鍐呭<E98D90>锛岃<E9949B>浣跨敤杩欎簺鐪熷疄淇℃伅锛涘<E9949B>鏋滄病鏈夋彁渚涳紝鏄庣鍛婄煡鐢ㄦ埛銆?
【你的能力】
✅ 回答研究进展问题基于REDCap实时数据
✅ 查询患者记录详情
✅ 统计入组人数
✅ 提供项目信息
✅ 解答研究方案相关问题(基于知识库文档)
銆愪綘鐨勮兘鍔涖€?
鉁?鍥炵瓟鐮旂┒杩涘睍闂<E79D8D><E99782>锛堝熀浜嶳EDCap瀹炴椂鏁版嵁锛?
鉁?鏌ヨ<E98F8C>€呰<E282AC>褰曡<E8A4B0>鎯?
鉁?缁熻<E7BC81>鍏ョ粍浜烘暟
鉁?鎻愪緵椤圭洰淇℃伅
鉁?瑙瓟鐮旂┒鏂规<E98F82>鐩稿叧闂<E58FA7><E99782>锛堝熀浜庣煡璇嗗簱鏂囨。锛?
【回复原则】
1. **基于事实**:只使用系统提供的数据和文档,不编造
2. **简洁专业**控制在150字以内
3. **友好礼貌**:使用"您"称呼PI
銆愬洖澶嶅師鍒欍€?
1. **鍩轰簬浜嬪疄**锛氬彧浣跨敤绯荤粺鎻愪緵鐨勬暟鎹<E69A9F>拰鏂囨。锛屼笉缂栭€?
2. **绠€娲佷笓涓?*锛氭帶鍒跺湪150瀛椾互鍐?
3. **鍙嬪ソ绀艰矊**锛氫娇鐢?鎮?绉板懠PI
4. **寮曞<E5AFAE>琛屽姩**锛氬<E9949B>闇€鏇村<E98F87>璇︾粏淇℃伅锛屽缓璁<E7BC93>煡鐪嬪畬鏁存枃妗垨鐧诲綍REDCap绯荤粺
`;
@@ -369,19 +369,19 @@ if (difyKnowledge) {
}
```
#### 防幻觉效果验证
#### 闃插够瑙夋晥鏋滈獙璇?
测试结果显示:
- ✅ 所有回答都明确引用数据来源
- ✅ AI不再编造不存在的信息
- ✅ 当文档不完整时AI诚实告知
- ✅ 准确率100%5次测试
娴嬭瘯缁撴灉鏄剧ず锛?
- 鉁?鎵€鏈夊洖绛旈兘鏄庣‘寮曠敤鏁版嵁鏉ユ簮
- 鉁?AI涓嶅啀缂栭€犱笉瀛樺湪鐨勪俊鎭?
- 鉁?褰撴枃妗笉瀹屾暣鏃讹紝AI璇氬疄鍛婄煡
- 鉁?鍑嗙鐜囷細100%锛?娆℃祴璇曪級
---
### 5. 上下文管理(Context Management
### 5. 涓婁笅鏂囩<EFBFBD>鐞嗭紙Context Management锛?
**功能**: SessionMemory - 保留最近3轮对话
**鍔熻兘**: SessionMemory - 淇濈暀鏈€杩?杞<><E69D9E>璇?
#### 瀹炵幇鏂规<E98F82>
@@ -389,7 +389,7 @@ if (difyKnowledge) {
// backend/src/modules/iit-manager/agents/SessionMemory.ts
export class SessionMemory {
private sessions: Map<string, ConversationHistory> = new Map();
private readonly MAX_HISTORY = 3; // 只保留最近3轮
private readonly MAX_HISTORY = 3; // <EFBFBD>繚鐣欐渶杩?杞?
addMessage(userId: string, role: 'user' | 'assistant', content: string): void {
let session = this.sessions.get(userId);
@@ -401,7 +401,7 @@ export class SessionMemory {
session.messages.push({ role, content, timestamp: Date.now() });
session.lastAccessTime = Date.now();
// 保持最近3轮对话6条消息
// 淇濇寔鏈€杩?杞<><E69D9E>璇濓紙6鏉℃秷鎭<E7A7B7>
if (session.messages.length > this.MAX_HISTORY * 2) {
session.messages = session.messages.slice(-this.MAX_HISTORY * 2);
}
@@ -421,22 +421,22 @@ export class SessionMemory {
#### 璁捐<E79281>鑰冭檻
- **鍐呭瓨缂撳瓨**: Node.js Map锛堥€熷害蹇<E5AEB3>紝婊¤冻MVP闇€姹傦級
- **自动清理**: 30分钟无活动自动清理
- **容量限制**: 最近3轮对话6条消息
- **多用户支持**: 以userId为key隔离
- **<EFBFBD>姩娓呯悊**: 30鍒嗛挓鏃犳椿鍔ㄨ嚜鍔ㄦ竻鐞?
- **瀹归噺闄愬埗**: 鏈€杩?杞<><E69D9E>璇濓紙6鏉℃秷鎭<E7A7B7>
- **澶氱敤鎴锋敮鎸?*: <EFBFBD>serId涓簁ey闅旂<EFBFBD>
---
### 6. LLM生成LLM Generation
### 6. LLM鐢熸垚锛圠LM Generation锛?
#### 妯″瀷閫夋嫨
| 鎸囨爣 | DeepSeek-V3 | 璇存槑 |
|------|-------------|------|
| **鎴愭湰** | 楼1/鐧句竾tokens | 鏋佷綆鎴愭湰 |
| **上下文** | 64K tokens | 满足需求 |
| **涓婁笅鏂?* | 64K tokens | 婊¤冻闇€姹?|
| **鏁堟灉** | 浼樼<E6B5BC> | 涓嶨PT-4鐩稿綋 |
| **响应速度** | ~3秒 | 满足企业微信要求 |
| **鍝嶅簲閫熷害** | ~3绉?| 婊¤冻浼佷笟寰<E7AC9F>俊瑕佹眰 |
#### 璋冪敤鏂瑰紡
@@ -451,35 +451,35 @@ const response = await llm.chat(messages, {
});
```
#### Token消耗统计
#### Token娑堣€楃粺璁?
| 鍦烘櫙 | 杈撳叆Tokens | 杈撳嚭Tokens | 鎬籘okens | 鎴愭湰 |
|------|-----------|-----------|----------|------|
| 鎺掗櫎鏍囧噯鏌ヨ<E98F8C> | 340 | 79 | 419 | 楼0.00042 |
| CRF鎸囨爣鏌ヨ<E98F8C> | 434 | 75 | 509 | 楼0.00051 |
| ID 7患者查询 | 627 | 88 | 715 | ¥0.00072 |
| ID 7鎮h€呮煡璇?| 627 | 88 | 715 | 0.00072 |
| 鐮旂┒鐩<E29492>殑鏌ヨ<E98F8C> | 522 | 57 | 579 | 楼0.00058 |
| 患者统计查询 | 505 | 42 | 547 | ¥0.00055 |
| 鎮h€呯粺璁℃煡璇?| 505 | 42 | 547 | 0.00055 |
**平均成本**: ¥0.00056/次对话(极低)
**骞冲潎鎴愭湰**: 0.00056/娆″<EFBFBD>璇濓紙鏋佷綆锛?
---
### 7. 企业微信集成WeChat Integration
### 7. 浼佷笟寰<EFBFBD>俊闆嗘垚锛圵eChat Integration锛?
#### 鏍稿績鍔熻兘
1. **消息加解密**: AES + SHA1签名验证
2. **异步处理**: 5秒内返回200后台处理消息
3. **即时反馈**: "🫡 正在查询,请稍候..."
4. **主动推送**: 通过企业微信API发送回复
1. **娑堟伅鍔犺В瀵?*: AES + SHA1绛惧悕楠岃瘉
2. **寮傛<EFBFBD>澶勭悊**: 5绉掑唴杩斿洖200锛屽悗鍙板<EFBFBD>鐞嗘秷鎭?
3. **鍗虫椂鍙嶉<EFBFBD>**: "<EFBFBD>湪鏌ヨ<E98F8C>锛岃<E9949B>绋嶅€?.."
4. **涓诲姩鎺ㄩ€?*: 閫氳繃浼佷笟寰<E7AC9F>俊API鍙戦€佸洖澶?
#### 技术实现
#### 鎶€鏈<EFBFBD>疄鐜?
```typescript
// backend/src/modules/iit-manager/controllers/WechatCallbackController.ts
async handlePost(request: FastifyRequest, reply: FastifyReply) {
// 1. 立即返回2005秒内
// 1. 绔嬪嵆杩斿洖200锛?绉掑唴锛?
reply.send('success');
// 2. 寮傛<E5AFAE>澶勭悊娑堟伅
@@ -491,13 +491,13 @@ async handlePost(request: FastifyRequest, reply: FastifyReply) {
private async processMessageAsync(xmlData: any) {
const { FromUserName, Content } = this.extractMessage(xmlData);
// 3. 发送即时反馈
await this.sendTextMessage(FromUserName, '🫡 正在查询,请稍候...');
// 3. 鍙戦€佸嵆鏃跺弽棣?
await this.sendTextMessage(FromUserName, '<EFBFBD>湪鏌ヨ<E98F8C>锛岃<E9949B>绋嶅€?..');
// 4. 璋冪敤ChatService澶勭悊
const answer = await this.chatService.handleMessage(FromUserName, Content);
// 5. 发送最终回复
// 5. 鍙戦€佹渶缁堝洖澶?
await this.sendTextMessage(FromUserName, answer);
}
```
@@ -508,60 +508,60 @@ private async processMessageAsync(xmlData: any) {
```
鐢ㄦ埛鎻愰棶
鈫?
浼佷笟寰<EFBFBD>俊娑堟伅
鈫?
[WechatCallbackController]
├→ 立即返回200<5秒
鈹溾啋 绔嬪嵆杩斿洖200锛?5绉掞級
鈹斺啋 寮傛<E5AFAE>澶勭悊
鈫?
[ChatService.handleMessage()]
1. 意图识别(关键词匹配)
├→ query_protocol
├→ query_record
└→ count_records
2. 工具调用(并行或单一)
鈫?
1. 鎰忓浘璇嗗埆锛堝叧閿<EFBFBD>瘝鍖归厤锛?
鈹溾啋 query_protocol锛?
鈹溾啋 query_record锛?
鈹斺啋 count_records锛?
鈫?
2. 宸ュ叿璋冪敤锛堝苟琛屾垨鍗曚竴锛?
鈹溾啋 queryDifyKnowledge()
│ └→ Dify API(语义检索)
└→ 返回Top 5文档片段
鈹? 鈹斺啋 Dify API锛堣<EFBFBD>涔夋<EFBFBD><EFBFBD>
鈹? 鈹斺啋 杩斿洖Top 5鏂囨。鐗囨<E99097>
鈹?
鈹斺啋 queryRedcapRecord()
└→ REDCap APISQL查询
└→ 返回患者记录
3. 上下文组装
鈹斺啋 REDCap API锛圫QL鏌ヨ<EFBFBD>锛?
鈹斺啋 杩斿洖鎮€呰<E282AC>褰?
鈫?
3. 涓婁笅鏂囩粍瑁?
鈹溾啋 System Prompt锛堝熀浜庣湡瀹炴暟鎹<E69A9F>師鍒欙級
├→ REDCap查询结果(如果有)
鈹溾啋 REDCap鏌ヨ<EFBFBD>缁撴灉锛堝<EFBFBD>鏋滄湁锛?
鈹溾啋 Dify妫€绱㈢粨鏋滐紙濡傛灉鏈夛級
├→ SessionMemory上下文
鈹溾啋 SessionMemory涓婁笅鏂?
鈹斺啋 鐢ㄦ埛闂<E59F9B><E99782>
4. LLM生成DeepSeek-V3
└→ 生成回答(基于注入的数据)
鈫?
4. LLM鐢熸垚锛圖eepSeek-V3锛?
鈹斺啋 鐢熸垚鍥炵瓟锛堝熀浜庢敞鍏ョ殑鏁版嵁锛?
鈫?
5. 淇濆瓨鍒癝essionMemory
鈫?
6. 鎺ㄩ€佸埌浼佷笟寰<E7AC9F>
鈫?
鐢ㄦ埛鏀跺埌鍥炲<EFBFBD>
```
---
## 🎯 关键技术决策
## 馃幆 鍏抽敭鎶€鏈<E282AC>喅绛?
| 决策点 | 选择方案 | 替代方案 | 选择原因 |
| 鍐崇瓥鐐?| 閫夋嫨鏂规<E98F82> | 鏇夸唬鏂规<E98F82> | 閫夋嫨鍘熷洜 |
|-------|---------|---------|---------|
| **意图识别** | 关键词匹配 | LLM判断、BERT分类 | MVP阶段简单高效准确率高100% |
| **鎰忓浘璇嗗埆** | 鍏抽敭璇嶅尮閰?| LLM鍒ゆ柇銆丅ERT鍒嗙被 | MVP闃舵<E99783>锛岀畝鍗曢珮鏁堬紝鍑嗙鐜囬珮锛?00%锛?|
| **宸ュ叿璋冪敤** | 鍚屾<E98D9A>涓茶<E6B693> | 骞惰<E9AA9E>璋冪敤 | 鍝嶅簲蹇<E7B0B2>紙<5绉掞級锛岄€昏緫娓呮櫚锛屾槗璋冭瘯 |
| **知识库** | Dify本地部署 | 自建向量库、云服务 | 数据安全,响应快,成本低,易维护 |
| **向量数据库** | QdrantDify内置) | Milvus、Pinecone | 高性能,无需额外部署 |
| **LLM** | DeepSeek-V3 | GPT-4、Claude | 成本低¥1/百万tokens效果好 |
| **上下文存储** | 内存缓存Map | Redis、数据库 | 速度快满足MVP需求易实现 |
| **鐭ヨ瘑搴?* | Dify鏈<79>湴閮ㄧ讲 | 鑷<>缓鍚戦噺搴撱€佷簯鏈嶅姟 | 鏁版嵁瀹夊叏锛屽搷搴斿揩锛屾垚鏈<E59E9A>綆锛屾槗缁存姢 |
| **鍚戦噺鏁版嵁搴?* | Qdrant锛圖ify鍐呯疆锛?| Milvus銆丳inecone | 楂樻€ц兘锛屾棤闇€棰濆<EFBFBD>閮ㄧ讲 |
| **LLM** | DeepSeek-V3 | GPT-4銆丆laude | 鎴愭湰浣庯紙楼1/鐧句竾tokens锛夛紝鏁堟灉濂?|
| **涓婁笅鏂囧瓨鍌?* | 鍐呭瓨缂撳瓨锛圡ap锛?| Redis銆佹暟鎹<E69A9F>簱 | 閫熷害蹇<E5AEB3>紝婊¤冻MVP闇€姹傦紝鏄撳疄鐜?|
| **鏁版嵁娉ㄥ叆** | System Prompt | Function Calling | 绠€鍗曠洿鎺ワ紝闃叉<E99783>骞昏<E9AA9E>锛屾晥鏋滃ソ |
| **异步处理** | Node.js异步 | 消息队列pg-boss | 简单满足企业微信5秒限制 |
| **寮傛<EFBFBD>澶勭悊** | Node.js寮傛<EFBFBD> | 娑堟伅闃熷垪锛坧g-boss锛?| 绠€鍗曪紝婊¤冻浼佷笟寰<E7AC9F>俊5绉掗檺鍒?|
---
@@ -571,62 +571,62 @@ private async processMessageAsync(xmlData: any) {
| 闃舵<E99783> | 鑰楁椂 | 鍗犳瘮 | 浼樺寲绌洪棿 |
|------|------|------|----------|
| 意图识别 | <10ms | <1% | ✅ 已最优 |
| REDCap查询 | 1.2-1.3| 25% | 🔵 可优化(加缓存) |
| Dify检索 | 1.5-1.7| 30% | 🔵 可优化(调整top_k |
| LLM生成 | 3.0-3.5| 65% | ⚠️ 受限于模型速度 |
| **总计** | **4.8** | **100%** | ✅ 满足<5秒要求 |
| 鎰忓浘璇嗗埆 | <10ms | <1% | 鉁?宸叉渶浼?|
| REDCap鏌ヨ<EFBFBD> | 1.2-1.3绉?| 25% | 馃數 鍙<>紭鍖栵紙鍔犵紦瀛橈級 |
| Dify妫€绱?| 1.5-1.7绉?| 30% | 馃數 鍙<>紭鍖栵紙璋冩暣top_k锛?|
| LLM鐢熸垚 | 3.0-3.5绉?| 65% | 鈿狅笍 鍙楅檺浜庢ā鍨嬮€熷害 |
| **鎬昏<EFBFBD>** | **4.8绉?* | **100%** | 鉁?婊¤冻<5绉掕<E7BB89>姹?|
### Token消耗分析
### Token娑堣€楀垎鏋?
| 指标 | 数值 |
| 鎸囨爣 | 鏁板€?|
|------|------|
| 平均输入Tokens | 486 tokens/|
| 平均输出Tokens | 68 tokens/|
| 平均总Tokens | 554 tokens/|
| 平均成本 | ¥0.00055/次对话 |
| 骞冲潎杈撳叆Tokens | 486 tokens/娆?|
| 骞冲潎杈撳嚭Tokens | 68 tokens/娆?|
| 骞冲潎鎬籘okens | 554 tokens/娆?|
| 骞冲潎鎴愭湰 | 0.00055/娆″<EFBFBD>璇?|
### 准确率指标
### 鍑嗙‘鐜囨寚鏍?
| 指标 | 数值 | 说明 |
| 鎸囨爣 | 鏁板€?| 璇存槑 |
|------|------|------|
| 意图识别准确率 | 100% | 5次测试全部正确 |
| 数据检索成功率 | 100% | 无失败案例 |
| 回答准确率 | 100% | 所有回答基于真实数据 |
| 幻觉率 | 0% | 无编造信息 |
| 鎰忓浘璇嗗埆鍑嗙‘鐜?| 100% | 5娆℃祴璇曞叏閮ㄦ<E996AE>纭?|
| 鏁版嵁妫€绱㈡垚鍔熺巼 | 100% | 鏃犲け璐ユ<EFBFBD>渚?|
| 鍥炵瓟鍑嗙‘鐜?| 100% | 鎵€鏈夊洖绛斿熀浜庣湡瀹炴暟鎹?|
| 骞昏<EFBFBD>鐜?| 0% | 鏃犵紪閫犱俊鎭?|
---
## 🚀 Phase 1.5 技术成果
## 馃殌 Phase 1.5 鎶€鏈<EFBFBD>垚鏋?
### 鏍稿績绐佺牬
1. **零幻觉**: 所有回答都基于真实数据/文档
2. **混合检索**: 结构化数据REDCap+ 非结构化文档Dify
3. **快速响应**: 平均4.8秒(满足企业微信<5秒要求
4. **高准确率**: 意图识别100%数据检索100%
5. **低成本**: ¥0.00055/次对话
1. 鉁?**闆跺够瑙?*: 鎵€鏈夊洖绛旈兘鍩轰簬鐪熷疄鏁版嵁/鏂囨。
2. 鉁?**娣峰悎妫€绱?*: 缁撴瀯鍖栨暟鎹<E69A9F>紙REDCap锛? 闈炵粨鏋勫寲鏂囨。锛圖ify锛?
3. 鉁?**蹇<>€熷搷搴?*: 骞冲潎4.8绉掞紙婊¤冻浼佷笟寰<EFBFBD>俊<5绉掕<E7BB89>姹傦級
4. 鉁?**楂樺噯纭<E599AF>**: 鎰忓浘璇嗗埆100%锛屾暟鎹<E69A9F><E98EB9>绱?00%
5. 鉁?**浣庢垚鏈?*: 0.00055/娆″<EFBFBD>璇?
### 娴嬭瘯楠岃瘉缁撴灉
**娴嬭瘯鏃ユ湡**: 2026-01-04
**测试场景**: 5个典型对话场景
**测试结果**: 全部通过✅
**娴嬭瘯鍦烘櫙**: 5<EFBFBD>吀鍨嬪<EFBFBD>璇濆満鏅?
**娴嬭瘯缁撴灉**: 鍏ㄩ儴閫氳繃鉁?
| 测试场景 | 意图 | 数据源 | 响应时间 | 结果 |
| 娴嬭瘯鍦烘櫙 | 鎰忓浘 | 鏁版嵁婧?| 鍝嶅簲鏃堕棿 | 缁撴灉 |
|---------|------|--------|----------|------|
| 排除标准查询 | query_protocol | Dify | 5.4秒 | ✅ 准确 |
| CRF指标查询 | query_protocol | Dify | 4.9秒 | ✅ 准确 |
| ID 7患者查询 | query_record | REDCap | 5.3秒 | ✅ 准确 |
| 研究目的查询 | query_protocol | Dify | 4.5秒 | ✅ 准确 |
| 患者统计查询 | count_records | REDCap | 3.8秒 | ✅ 准确 |
| 鎺掗櫎鏍囧噯鏌ヨ<EFBFBD> | query_protocol | Dify | 5.4绉?| 鉁?鍑嗙‘ |
| CRF鎸囨爣鏌ヨ<EFBFBD> | query_protocol | Dify | 4.9绉?| 鉁?鍑嗙‘ |
| ID 7鎮h€呮煡璇?| query_record | REDCap | 5.3绉?| 鉁?鍑嗙‘ |
| 鐮旂┒鐩<EFBFBD>殑鏌ヨ<EFBFBD> | query_protocol | Dify | 4.5绉?| 鉁?鍑嗙‘ |
| 鎮h€呯粺璁℃煡璇?| count_records | REDCap | 3.8绉?| 鉁?鍑嗙‘ |
### 鐢ㄦ埛鍙嶉<E98D99>
- ✅ 响应速度满意(<5秒
- ✅ 回答准确专业
- ✅ 数据真实可靠
- ✅ 上下文记忆有效
- 鉁?鍝嶅簲閫熷害婊℃剰锛?5绉掞級
- 鉁?鍥炵瓟鍑嗙‘涓撲笟
- 鉁?鏁版嵁鐪熷疄鍙<E79684>
- 鉁?涓婁笅鏂囪<E98F82>蹇嗘湁鏁?
---
@@ -634,28 +634,28 @@ private async processMessageAsync(xmlData: any) {
### 瀵瑰<E780B5>浠嬬粛瑕佺偣
**简洁版100字**:
> "我们实现了一个**智能意图识别系统**当PI询问研究方案相关问题时AI会自动从知识库中检索文档当询问患者数据时AI会实时查询REDCap数据库。通过**混合检索技术**AI能够同时理解研究文档和患者数据给出准确、专业的回答。整个系统基于**RAG技术**检索增强生成确保AI的回答100%基于真实数据,不会编造信息。"
**绠€娲佺増锛?00瀛楋級**:
> "鎴戜滑瀹炵幇浜嗕竴涓?*鏅鸿兘鎰忓浘璇嗗埆绯荤粺**锛屽綋PI璇㈤棶鐮旂┒鏂规<E98F82>鐩稿叧闂<E58FA7><E99782>鏃讹紝AI浼氳嚜鍔ㄤ粠鐭ヨ瘑搴撲腑妫€绱㈡枃妗紱褰撹<E8A4B0><EFBFBD>偅鑰呮暟鎹<E69A9F>椂锛孉I浼氬疄鏃舵煡璇<E785A1>EDCap鏁版嵁搴撱€傞€氳繃**娣峰悎妫€绱㈡妧鏈?*锛孉I鑳藉<E991B3>鍚屾椂鐞嗚В鐮旂┒鏂囨。鍜屾偅鑰呮暟鎹<E69A9F>紝缁欏嚭鍑嗙銆佷笓涓氱殑鍥炵瓟銆傛暣涓<E69AA3>郴缁熷熀浜?*RAG鎶€鏈?*锛堟<E9949B>绱㈠<E7BBB1>寮虹敓鎴愶級锛岀淇滱I鐨勫洖绛?00%鍩轰簬鐪熷疄鏁版嵁锛屼笉浼氱紪閫犱俊鎭<E4BF8A>€?
**鎶€鏈<E282AC>寒鐐癸紙5鐐癸級**:
1. **意图识别**: 自动判断用户问题类型100%准确率)
2. **工具调用**: 根据意图调用不同的数据源REDCap/Dify
3. **混合检索**: 结合结构化数据和非结构化文档
4. **零幻觉**: 所有回答都有真实数据支撑RAG技术
5. **快速响应**: 平均5秒内回复满足企业微信要求
1. **鎰忓浘璇嗗埆**: <EFBFBD>姩鍒ゆ柇鐢ㄦ埛闂<EFBFBD><EFBFBD>绫诲瀷锛?00%鍑嗙‘鐜囷級
2. **宸ュ叿璋冪敤**: 鏍规嵁鎰忓浘璋冪敤涓嶅悓鐨勬暟鎹<EFBFBD>簮锛圧EDCap/Dify锛?
3. **娣峰悎妫€绱?*: 缁撳悎缁撴瀯鍖栨暟鎹<E69A9F>拰闈炵粨鏋勫寲鏂囨。
4. **闆跺够瑙?*: 鎵€鏈夊洖绛旈兘鏈夌湡瀹炴暟鎹<E69A9F>敮鎾戯紙RAG鎶€鏈<E282AC>
5. **<EFBFBD>€熷搷搴?*: 骞冲潎5绉掑唴鍥炲<E98DA5>锛堟弧瓒充紒涓氬井淇¤<E6B787>姹傦級
### 閫傜敤鍦烘櫙
**PI日常管理**:
- 查询研究方案、伦理资料
- 了解患者入组情况
鉁?**PI鏃ュ父绠$悊**:
- 鏌ヨ<EFBFBD>鐮旂┒鏂规<EFBFBD>銆佷鸡鐞嗚祫鏂?
- 浜嗚В鎮h€呭叆缁勬儏鍐?
- 缁熻<E7BC81>椤圭洰杩涘睍
**数据质控**:
- 检查患者记录
- 核对数据完整性
鉁?**鏁版嵁璐ㄦ帶**:
- 妫€鏌ユ偅鑰呰<EFBFBD>褰?
- 鏍稿<EFBFBD>鏁版嵁瀹屾暣鎬?
**知识查询**:
鉁?**鐭ヨ瘑鏌ヨ<E98F8C>**:
- CRF琛ㄦ牸鍐呭<E98D90>
- 绾冲叆鎺掗櫎鏍囧噯
- 鐮旂┒娴佺▼
@@ -664,15 +664,15 @@ private async processMessageAsync(xmlData: any) {
## 馃敆 鐩稿叧鏂囨。
- [IIT Manager Agent 开发记录](../06-开发记录/)
- [IIT Manager Agent 寮€鍙戣<EFBFBD>褰昡(../06-寮€鍙戣<E98D99>褰?)
- [IIT Manager Agent 鎶€鏈<E282AC>€哄姟娓呭崟](../07-鎶€鏈<E282AC>€哄姟/)
- [MVP开发任务清单](../04-开发计划/MVP开发任务清单.md)
- [Phase1.5-AI对话能力开发计划](../04-开发计划/Phase1.5-AI对话能力开发计划.md)
- [MVP寮€鍙戜换鍔℃竻鍗昡(../04-寮€鍙戣<E98D99>鍒?MVP寮€鍙戜换鍔℃竻鍗?md)
- [Phase1.5-AI瀵硅瘽鑳藉姏寮€鍙戣<EFBFBD>鍒抅(../04-寮€鍙戣<E98D99>鍒?Phase1.5-AI瀵硅瘽鑳藉姏寮€鍙戣<E98D99>鍒?md)
---
**文档维护**: 技术团队
**最后更新**: 2026-01-04
**鏂囨。缁存姢**: 鎶€鏈<EFBFBD>洟闃?
**鏈€鍚庢洿鏂?*: 2026-01-04
**鐗堟湰鍘嗗彶**:
- v1.0 (2026-01-04): 鍒濆<E98D92>鐗堟湰锛孭hase 1.5瀹屾垚
@@ -692,3 +692,4 @@ private async processMessageAsync(xmlData: any) {

View File

@@ -1,84 +1,76 @@
# **IIT Manager Agent 智能问答与混合检索解决方案 (ReAct 业务闭环版)**
# **IIT Manager Agent <EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝擧毽<EFBFBD><EFBFBD><EFBFBD><EFBFBD>單䲮獢?(ReAct 銝𡁜𦛚<F0A1819C>剔㴓<E58994>?**
## **1\. <20><EFBFBD><E8A9A8><EFBFBD><EFBFBD><E79899><EFBFBD><EFBFBD><E59786>踵艶**
### **1.1 业务需求闭环**
### **1.1 銝𡁜𦛚<EFBFBD><EFBFBD><EFBFBD>𡡒<EFBFBD>?*
本方案旨在解决 PI主要研究者在企业微信中与 AI Agent 进行高频交互的三大核心场景:
<EFBFBD>祆䲮獢<EFBFBD><EFBFBD>刻圾<EFBFBD>?PI嚗<49>蜓閬<E89C93><E996AC>蝛嗉<E89D9B><E59789><EFBFBD><EFBFBD><EFBFBD>銝𡁜凝靽∩葉銝?AI Agent 餈𥡝<E9A488>擃㗛<E69383>鈭支<E988AD><E694AF><EFBFBD><EFBFBD>憭扳瓲敹<E793B2><EFBFBD><EFBFBD>
1. **静态规范查询**询问研究方案、伦理资料、知情同意书、CRF表格等固定文档。
2. **过程历史回溯**:询问项目周报中记录的进展、问题汇总、历史数据快照。
3. **动态数据穿透**:询问 REDCap 中的实时录入情况、质控状态、特定患者不良反应。
### **1.2 核心架构:动静分离的“双脑模型”**
为了满足上述需求,系统采用 **ReAct (Reason \+ Act)** 架构,将信息源分为“静态知识”与“动态数据”两类,分别存储与检索。
1. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䰻霂?*嚗朞砭<E69C9E><EFBFBD>蝛嗆䲮獢<E4B2AE><E78DA2><EFBFBD><EFBFBD><E68690><EFBFBD><EFBFBD><EFBFBD><E8B8BA><EFBFBD><E4B0BB><EFBFBD><EFBFBD>譍髡<E8AD8D><E9ABA1>RF銵冽聢蝑匧𤐄摰𡁏<E691B0><EFBFBD><E78DA2>?
2. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>墧滲**嚗朞砭<E69C9E>桅★<E6A185>桀𪂹<E6A180>乩葉霈啣<E99C88><E595A3><EFBFBD><EFBFBD>撅𨰻<E69285><F0A8B0BB>䔮憸䀹<E686B8><E480B9><EFBFBD><E9A2AF><EFBFBD><EFBFBD>脫㺭<E884AB>桀翰<E6A180><EFBFBD>?
3. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>桃忽<EFBFBD>?*嚗朞砭<E69C9E>?REDCap 銝剔<E98A9D>摰墧𧒄敶訫<E695B6><E8A8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>抒𠶖<E68A92><F0A0B696><EFBFBD><EFBFBD>鸌摰𡁏<E691B0><F0A1818F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>摨𢛵<E691A8>?
### **1.2 <20><EFBFBD><E8A9A8><EFBFBD>嚗𡁜𢆡<F0A1819C><EFBFBD>蝳餌<E89DB3><E9A48C>𨅯<EFBFBD><F0A885AF>烐芋<E78390>𦥑<EFBFBD>?*
銝箔<EFBFBD>皛∟雲銝𡃏膩<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝟餌<EFBFBD><EFBFBD><EFBFBD>**ReAct (Reason \+ Act)** <20><EFBFBD><EFBFBD><E59A97>靽⊥<E99DBD>皞𣂼<E79A9E>銝算<E98A9D>𣈯<EFBFBD><F0A388AF><EFBFBD>䰻霂<E4B0BB><E99C82><EFBFBD><E88BB7>𨅯𢆡<F0A885AF><F0A286A1><EFBFBD><EFBFBD>苷舅蝐鳴<E89D90><E9B3B4><EFBFBD><EFBFBD>摮睃<E691AE>銝擧<E98A9D><E89D9D>?
graph TD
User\[PI (隡<><E99AA1>敺桐縑)\] \--\>|<7C>鞾䔮| NodeBackend\[Node.js ReAct 撘閙<E69298>\]
subgraph "ReAct <20><EFBFBD><E7AE84><EFBFBD><EFBFBD>敺芰㴓"
NodeBackend \--\>|1. 思考 (Thought)| LLM\[DeepSeek-V3\]
NodeBackend \--\>|1. <EFBFBD><EFBFBD>?(Thought)| LLM\[DeepSeek-V3\]
LLM \--\>|2. <20><EFBFBD> (Action)| ToolExec\[撌亙<E6928C><E4BA99><EFBFBD><E689AF>沔]
%% 静态路径
ToolExec \--\>|查方案/周报| DifyService\[工具A: 知识库检索\]
DifyService \--\>|向量匹配| VectorDB\[(Dify 知识库)\]
%% <EFBFBD><EFBFBD><EFBFBD>楝敺?
ToolExec \--\>|<EFBFBD>交䲮獢?<3F>冽𥁒| DifyService\[撌亙<EFBFBD>A: <20><EFBFBD>摨𤘪<E691A8>蝝兝]
DifyService \--\>|<EFBFBD><EFBFBD><EFBFBD><EFBFBD>| VectorDB\[(Dify <EFBFBD><EFBFBD>摨?\]
%% 动态路径
%% <EFBFBD><EFBFBD><EFBFBD>楝敺?
ToolExec \--\>|<7C><EFBFBD><E4BA99>嗆㺭<E59786>徑 RedcapAdapter\[撌亙<E6928C>B: 銝游<E98A9D><E6B8B8>唳旿<E594B3>亥砭\]
RedcapAdapter \--\>|API 调用| REDCap\[(REDCap 数据库)\]
RedcapAdapter \--\>|API <EFBFBD>| REDCap\[(REDCap <EFBFBD>唳旿摨?\]
%% <20><EFBFBD><E6BCA4>剔㴓
VectorDB \-.-\>|餈𥪜<E9A488><F0A5AA9C><EFBFBD><EFBFBD><EFB99D>挾| LLM
REDCap \-.-\>|餈𥪜<E9A488> JSON <20>唳旿| LLM
end
LLM \--\>|3. 最终回答 (Final Answer)| NodeBackend
LLM \--\>|3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑?(Final Answer)| NodeBackend
NodeBackend \--\>|<7C><EFBFBD><E588B8> User
## **2\. 详细数据存储与路由策略 (Storage & Routing)**
## **2\. 霂衣<EFBFBD><EFBFBD>唳旿摮睃<EFBFBD>銝舘楝<EFBFBD><EFBFBD><EFBFBD>?(Storage & Routing)**
AI 如何区分去哪里读取?取决于数据的**时效性**与**结构化程度**。
AI <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>餃𪑛<EFBFBD>諹粉<EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭擧㺭<EFBFBD><EFBFBD>**<2A><EFBFBD><E59786>?*銝?*蝏𤘪<E89D8F><F0A498AA>𣇉<EFBFBD>摨?*<2A>?
### **2.1 <20><EFBFBD>?<3F>𢠃<EFBFBD><F0A2A083><EFBFBD><EFBFBD><EFBFBD>?\-\> 摮睃<E691AE> Dify (<28><EFBFBD>摨?**
### **2.1 静态/半静态资料 \-\> 存入 Dify (知识库)**
这部分内容适合 **RAG (检索增强生成)**
| 资料类型 | 具体内容 | 存储位置 | Dify Metadata (元数据标签) |
餈䠷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰寥<EFBFBD><EFBFBD><EFBFBD> **RAG (璉<><E89D9D>撘箇<E69298><E7AE87>?**<EFBFBD>?
| 韏<><E99F8F>蝐餃<E89D90> | <20><EFBFBD><E7919A><EFBFBD>捆 | 摮睃<E691AE>雿滨蔭 | Dify Metadata (<28><><EFBFBD><EFBFBD>蝑? |
| :---- | :---- | :---- | :---- |
| **研究方案类** | Protocol, 伦理批件, 知情同意书(ICF), CRF模板 | **Dify Knowledge Base** | doc\_type: protocol |
| **项目进度类** | 系统每周生成的周报 (PDF/Text), 会议纪要 | **Dify Knowledge Base** | doc\_type: report, date: 2026-W01 |
| **<EFBFBD>𠉛弦<EFBFBD><EFBFBD>蝐?* | Protocol, 隡衣<E99AA1><E8A1A3>嫣辣, <20><EFBFBD><E4BAA4><EFBFBD>銋?ICF), CRF璅⊥踎 | **Dify Knowledge Base** | doc\_type: protocol |
| **憿寧𤌍餈𥕦漲蝐?* | 蝟餌<E89D9F>瘥誩𪂹<E8AAA9><F0AA82B9><EFBFBD><EFBFBD><EFBFBD>𪂹<EFBFBD>?(PDF/Text), 隡朞悅蝥芾<EFBFBD> | **Dify Knowledge Base** | doc\_type: report, date: 2026-W01 |
**关键技术点**
* **自动归档**每周生成周报后Node.js 需调用 Dify API 将周报文本自动上传至知识库,实现“过程记忆”。
* **元数据过滤**检索时Agent 可根据问题类型(问方案还是问周报)通过 Metadata 缩小检索范围。
### **2.2 动态实时数据 \-\> 存入 REDCap (数据源)**
这部分内容实时变化,适合 **API Tool Calling**
**<EFBFBD>喲睸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
* **<2A>芸𢆡敶埝﹝**嚗𡁏<E59A97><F0A1818F><EFBFBD><E587BD>𣂼𪂹<F0A382BC><EFBFBD>嚗𨨲ode.js <20><><EFBFBD>鍂 Dify API 撠<>𪂹<EFBFBD><EFBFBD><E4BAA4>祈䌊<E7A588><EFBFBD>隡㰘秐<E3B098><EFBFBD>摨橒<E691A8>摰䂿緵<E482BF>𡏭<EFBFBD>蝔贝扇敹<E68987><E695B9><EFBFBD>?
* **<2A><><EFBFBD><EFBFBD>皛?*嚗𡁏<E59A97>𧒄嚗淾gent <20>舀覔<E88880>桅䔮憸条掩<E69DA1><EFBFBD><E9A1B5>格䲮獢<E4B2AE><E78DA2><EFBFBD>舫䔮<E888AB>冽𥁒嚗厰<E59A97><EFBFBD> Metadata 蝻拙<E89DBB><EFBFBD><E89D9D><EFBCBA><EFBFBD>?
### **2.2 <20><EFBFBD><E586BD><EFBFBD><EFBFBD>嗆㺭<E59786>?\-\> 摮睃<E691AE> REDCap (<28>唳旿皞?**
餈䠷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰孵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> **API Tool Calling**<EFBFBD>?
| 韏<><E99F8F>蝐餃<E89D90> | <20><EFBFBD><E7919A><EFBFBD>捆 | <20><EFBFBD><E79195><EFBFBD> | 撌亙<E6928C><E4BA99>賣㺭摰帋<E691B0> |
| :---- | :---- | :---- | :---- |
| **真实数据类** | 患者录入详情, 质控质疑(Query), 不良反应(AE) | **REDCap API** | query\_clinical\_data |
| **<EFBFBD><EFBFBD><EFBFBD>唳旿蝐?* | <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>亥祕<E4BAA5>? 韐冽綉韐函<E99F90>(Query), 銝滩<EFBFBD><EFBFBD><EFBFBD>(AE) | **REDCap API** | query\_clinical\_data |
## **3\. Agent 定义与技术实现 (Implementation)**
## **3\. Agent 摰帋<EFBFBD>銝擧<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?(Implementation)**
### **Step 1: 定义 AI Agent 的“工具箱” (Tools)**
在 Node.js 代码中 (backend/src/modules/agent/tools.ts),我们将三类需求映射为两个核心工具:
### **Step 1: 摰帋<EFBFBD> AI Agent <EFBFBD><EFBFBD><EFBFBD>𨅯極<EFBFBD>瑞拳<EFBFBD>?(Tools)**
<EFBFBD>?Node.js 隞<><E99A9E>銝?(backend/src/modules/agent/tools.ts)嚗峕<E59A97>隞砍<E99A9E>銝厩掩<E58EA9><E68EA9><EFBFBD><E79899><EFBFBD>蛹銝支葵<E694AF><EFBFBD>撌亙<E6928C>嚗?
export const agentTools \= \[
{
type: "function",
function: {
name: "search\_knowledge\_base",
description: "【查文档】用于查询静态资料或历史记录。包括1. 研究方案、伦理、ICF、CRF等规范文件2. 过往的项目周报、进度总结。",
description: "<EFBFBD>鞉䰻<EFBFBD><EFBFBD><EFBFBD>𤑳鍂鈭擧䰻霂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蟮霈啣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>穿<EFBFBD>1. <20>𠉛弦<F0A0899B><EFBFBD><E5AF9E><EFBFBD><EFBFBD><E68690><EFBFBD><EFBFBD>CF<43><46>RF蝑㕑<E89D91><E39591><EFBFBD><EFBFBD>隞塚<E99A9E>2. 餈<><E9A488><EFBFBD><EFBFBD><EFBFBD>桀𪂹<E6A180><EFBFBD><E4B993><EFBFBD>摨行<E691A8><EFBFBD><E9A48C>?,
parameters: {
type: "object",
properties: {
query: { type: "string", description: "搜索关键词" },
query: { type: "string", description: "<EFBFBD>𦦵揣<EFBFBD>喲睸霂? },
doc\_category: {
type: "string",
enum: \["protocol", "report"\],
@@ -93,7 +85,7 @@ export const agentTools \= \[
type: "function",
function: {
name: "query\_clinical\_data",
description: "【查数据】用于查询 REDCap 中的实时状态。包括:入组人数、特定患者(受试者)的录入情况、不良反应(AE)、质控质疑状态。",
description: "<EFBFBD>鞉䰻<EFBFBD>唳旿<EFBFBD>𤑳鍂鈭擧䰻霂?REDCap 銝剔<E98A9D>摰墧𧒄<E5A2A7><EFBFBD><E59786><EFBFBD><EFBFBD><EFBFBD><EFBFBD>穿<EFBFBD><E7A9BF><EFBFBD>鈭箸㺭<E7AEB8><E3BAAD>鸌摰𡁏<E691B0><F0A1818F>?<3F>𡑒<EFBFBD><F0A19192>?<3F><><EFBFBD><EFBFBD><EFBFBD><E4BAA4><EFBFBD><E890B8><EFBFBD><EFBFBD><EFBFBD>摨?AE)<29><><EFBFBD>扯捶<E689AF>𤑳𠶖<F0A491B3><F0A0B696><EFBFBD>?,
parameters: {
type: "object",
properties: {
@@ -102,7 +94,7 @@ export const agentTools \= \[
enum: \["project\_stats", "patient\_detail", "qc\_status"\],
description: "<22>亥砭<E4BAA5>誩㦛嚗䮝roject\_stats=摰讛<E691B0>餈𥕦漲嚗俰atient\_detail=<3D><><EFBFBD><EFBFBD><EFBFBD><E7A595><EFBFBD>qc\_status=韐冽綉<E586BD><E7B689><EFBFBD>"
},
patient\_id: { type: "string", description: "受试者编号 (如 P001)" }
patient\_id: { type: "string", description: "<EFBFBD>𡑒<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?(憒?P001)" }
},
required: \["intent"\]
}
@@ -110,44 +102,37 @@ export const agentTools \= \[
}
\];
### **Step 2: 定义 AI Agent 的“人设” (System Prompt)**
这是 AI 能够**区分**去哪个文档读取的核心逻辑。
### **Step 2: 摰帋<EFBFBD> AI Agent <EFBFBD><EFBFBD><EFBFBD>靝犖霈撾<EFBFBD>?(System Prompt)**
餈蹱糓 AI <20><EFBFBD>**<2A><EFBFBD>**<2A>餃𪑛銝芣<E98A9D><EFBFBD><EFBFBD>𣇉<EFBFBD><F0A38789><EFBFBD><E8A9A8><EFBFBD><E9A489>?
\# Role
你是由壹证循科技开发的“临床研究项目经理 AI”。你服务于项目的 PI主要研究者
雿䭾糓<EFBFBD>勗ㄨ霂<EFBFBD>儐蝘烐<EFBFBD><EFBFBD><EFBFBD>𤑳<EFBFBD><EFBFBD>靝葩摨羓<EFBFBD>蝛園★<EFBFBD><EFBFBD><EFBFBD>?AI<41><EFBFBD><E88588><EFBFBD><EFBFBD>滚𦛚鈭𡡞★<F0A1A19E><EFBFBD> PI嚗<49>蜓閬<E89C93><E996AC>蝛嗉<E89D9B><E59789><EFBFBD><EFBFBD>?
\# Capabilities & Routing Logic (頝舐眏<E88890><EFBFBD>)
你拥有两只“手”,请根据用户问题的性质精准选择:
雿䭾𥅾<EFBFBD>劐舅<EFBFBD><EFBFBD>𨀣<EFBFBD><EFBFBD><EFBFBD>霂瑟覔<EFBFBD>桃鍂<EFBFBD>琿䔮憸条<EFBFBD><EFBFBD>扯捶蝎曉<EFBFBD><EFBFBD>㗇𥋘嚗?
1\. \*\*撌行<E6928C>嚗𡁏䰻<F0A1818F><E4B0BB><EFBFBD><EFBFBD><EFBFBD> (search\_knowledge\_base)\*\*
\- \*\*当用户问“规定”\*\*:如“方案里的入排标准是什么?”、“伦理批件有效期多久?” \-\> 请查 \`doc\_category='protocol'\`
\- \*\*当用户问“历史”\*\*:如“上周周报里提到的风险解决了没?”、“上个月入组慢的原因?” \-\> 请查 \`doc\_category='report'\`
2\. \*\*右手:查询实时数据 (query\_clinical\_data)\*\*
\- \*\*当用户问“现状”\*\*如“现在入组多少人了”、“P005 患者录完数据了吗?”、“有没有发生严重不良事件?” \-\> 请查 REDCap 实时数据。
\- \*\*敶梶鍂<EFBFBD>琿䔮<EFBFBD>𡏭<EFBFBD>摰尠<EFBFBD>𩄼*\*嚗𡁜<E59A97><F0A1819C>𨀣䲮獢<E4B2AE><E78DA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E59F9D><EFBFBD>糓隞<E7B393><EFBFBD><E98A8B><EFBFBD><EFBFBD><E88588><EFBFBD>靝憐<E99D9D><E68690>鸌隞嗆<E99A9E><E59786><EFBFBD><EFBFBD>憭帋<E686AD>嚗麨<E59A97>?\-\> 霂瑟䰻 \`doc\_category='protocol'\`<EFBFBD>?
\- \*\*敶梶鍂<EFBFBD>琿䔮<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>𩄼*\*嚗𡁜<E59A97><F0A1819C><EFBFBD><E99D9D>典𪂹<E585B8>仿<EFBFBD><E4BBBF>𣂼<EFBFBD><F0A382BC><EFBFBD><EFBFBD><EFBFBD>抵圾<E68AB5><EFBFBD>瘝∴<E7989D><E288B4><EFBFBD><E88588><EFBFBD><EFBFBD>銝芣<E98A9D><E88AA3><EFBFBD><E4BAA6><EFBFBD><EFBCB9><EFBFBD>嚗麨<E59A97>?\-\> 霂瑟䰻 \`doc\_category='report'\`<EFBFBD>?
2\. \*\*<2A><EFBFBD>嚗𡁏䰻霂<E99C82><EFBCB7>嗆㺭<E59786>?(query\_clinical\_data)\*\*
\- \*\*敶梶鍂<E6A2B6>琿䔮<E790BF>𦦵緵<F0A6A6B5><EFBFBD>𩄼*\*嚗𡁜<E59A97><F0A1819C>𦦵緵<F0A6A6B5><EFBFBD><EFBFBD><E89D8F>撠睲犖鈭<E78A96><E988AD><EFBFBD><EFBFBD><E88588><EFBFBD>憕005 <20><><EFBFBD><EFBFBD><EFBFBD>摰峕㺭<E5B395><EFBFBD><E6A190><EFBFBD><E6A2B9><EFBFBD><E88588><EFBFBD>𨀣<EFBFBD>瘝⊥<E7989D><E28AA5>𤑳<EFBFBD>銝仿<E98A9D>銝滩<E98A9D>鈭衤辣嚗麨<E59A97>?\-\> 霂瑟䰻 REDCap 摰墧𧒄<E5A2A7>唳旿<E594B3>?
3\. \*\*瘛瑕<E7989B><E79195><EFBFBD> (ReAct)\*\*
\- 如果问题涉及两者如“P001 的年龄(查数据)符合方案要求(查文档)吗?”),请分步调用两个工具,最后综合回答。
\- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘨匧<EFBFBD>銝方<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>憕001 <20><>僑樴<E58391><E6A8B4><EFBFBD>交㺭<E4BAA4><EFBFBD>蝚血<E89D9A><E8A180><EFBFBD><EFBFBD><E996AC><EFBFBD><EFBFBD><E4B0BB>﹝嚗匧<E59A97>嚗麨<E59A97><EFBFBD>嚗諹窈<E8ABB9><E7AA88>郊靚<E9838A>鍂銝支葵撌亙<E6928C>嚗峕<E59A97><E5B395>𡒊遞<F0A1928A><E9819E><EFBFBD>蝑𢛵<E89D91>?
\# Constraints
\- \*\*严禁编造\*\*:实时数据必须通过工具获取。
\- \*\*隐私保护\*\*:输出时隐去患者真实姓名,仅使用受试者编码。
\- \*\*专业性\*\*:回答简练,核心数据加粗显示。
\- \*\*銝亦<EFBFBD>蝻㚚<EFBFBD>癧*\*嚗𡁜<E59A97><F0A1819C>嗆㺭<E59786><EFBFBD>憿駁<E686BF><EFBFBD>撌亙<E6928C><E4BA99><EFBFBD><E79195>?
\- \*\*<EFBFBD><EFBFBD>靽脲擪\*\*嚗朞<E59A97><E69C9E>箸𧒄<E7AEB8>𣂼縧<F0A382BC><E7B8A7><EFBFBD><EFBFBD><EFBFBD>摰𧼮<E691B0><F0A7BCAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂閗<E99C82><E99697><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
\- \*\*銝㮖<EFBFBD><EFBFBD>吭*\*嚗𡁜<E59A97>蝑𠉛<E89D91><EFBFBD><E89D8F><EFBFBD><EFBFBD><E8A9A8>唳旿<E594B3><EFBFBD><E588A0>曄內<E69B84>?
### **Step 3: ReAct 撘閙<E69298><E99699><EFBFBD><E689AF><EFBFBD> (Node.js Kernel)**
backend/src/modules/agent/engine.ts 中实现循环调用:
<EFBFBD>?backend/src/modules/agent/engine.ts 銝剖<EFBFBD><EFBFBD>啣儐<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ... ReAct 循环伪代码 ...
// ... ReAct 敺芰㴓隡芯誨<EFBFBD>?...
while (turnCount \< MAX\_TURNS) {
// 1\. AI 思考
// 1\. AI <EFBFBD><EFBFBD>?
const response \= await llm.chat.completions.create({ tools: agentTools, ... });
// 2\. AI <20><EFBFBD><EFBFBD>𢆡
if (toolCall) {
if (toolCall.name \=== 'search\_knowledge\_base') {
// 调用 Dify API,根据 doc\_category 过滤
// <EFBFBD> Dify API嚗峕覔<EFBFBD>?doc\_category <EFBFBD>
result \= await dify.search(query, filter={ type: args.doc\_category });
}
else if (toolCall.name \=== 'query\_clinical\_data') {
@@ -161,69 +146,57 @@ while (turnCount \< MAX\_TURNS) {
## **4\. <20>箸艶<E7AEB8>剔㴓撉諹<E69289> (Scenario Walkthrough)**
### **场景一:问研究方案 (资料类)**
### **<EFBFBD>箸艶銝<EFBFBD>嚗𡁻䔮<EFBFBD>𠉛弦<EFBFBD><EFBFBD> (韏<><E99F8F>蝐?**
* **PI**: “知情同意书里关于退出的条款是怎么写的?”
* **AI 思考**: 关键词“知情同意书”、“条款” \-\> 属于静态规范 \-\> 调用 search\_knowledge\_base(query="退出条款", doc\_category="protocol")
* **执行**: Dify 检索 PDF
* **AI 回答**: “根据知情同意书第 5 节:受试者可随时撤回同意并退出研究,且不会受到任何不公正待遇...
* **PI**: <EFBFBD>𦦵䰻<EFBFBD><EFBFBD><EFBFBD><EFBFBD>譍髡<EFBFBD><EFBFBD><EFBFBD>鈭𡡞<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⊥狡<EFBFBD><EFBFBD>𦒘<EFBFBD><EFBFBD><EFBFBD>嚗麨<EFBFBD>?
* **AI <EFBFBD><EFBFBD>?*: <20>喲睸霂𨧀<E99C82>𦦵䰻<F0A6A6B5><E4B0BB><EFBFBD><EFBFBD>譍髡<E8AD8D><EFBFBD><E88588><EFBFBD>𨀣辺甈撾<E79488>?\-\> 撅硺<E69285><E7A1BA><EFBFBD><E8B9B1><EFBFBD><EFBFBD>?\-\> <EFBFBD> search\_knowledge\_base(query="<EFBFBD><EFBFBD><EFBFBD>箸辺甈?, doc\_category="protocol")<EFBFBD>?
* **<EFBFBD><EFBFBD>**: Dify <EFBFBD>蝝?PDF<EFBFBD>?
* **AI <EFBFBD><EFBFBD>**: <EFBFBD>𨀣覔<EFBFBD>桃䰻<EFBFBD><EFBFBD><EFBFBD><EFBFBD>譍髡蝚?5 <20><><EFBFBD><EFBFBD>𡑒<EFBFBD><F0A19192><EFBFBD><EFBFBD>𤩺𧒄<F0A4A9BA><EFBFBD><E69687><EFBFBD>撟園<E6929F><E59C92><EFBFBD><EFBFBD>蝛塚<E89D9B>銝𥪯<E98A9D>隡𡁜<E99AA1><F0A1819C>唬遙雿蓥<E99BBF><E893A5>祆迤敺<E8BFA4><E695BA>...<EFBFBD>?
### **<2A>箸艶鈭䕘<E988AD><E49598>桅★<E6A185><EFBFBD>摨?(<28><>蟮蝐?**
### **场景二:问项目进度 (历史类)**
* **PI**: “上周入组进度为什么滞后?”
* **AI 思考**: 关键词“上周”、“滞后原因” \-\> 属于过程记录(周报) \-\> 调用 search\_knowledge\_base(query="入组滞后原因", doc\_category="report")。
* **执行**: Dify 检索上周生成的周报文本。
* **AI 回答**: “根据第 12 周周报记录:滞后主要原因为‘核磁共振设备故障导致筛选失败 3 例’。”
### **场景三:问真实数据 (实时类)**
* **PI**: “帮我看看 P003 有没有不良反应?”
* **AI 思考**: 关键词“P003”、“不良反应” \-\> 属于特定患者实时状态 \-\> 调用 query\_clinical\_data(intent="patient\_detail", patient\_id="P003")。
* **执行**: Node.js 调用 REDCap API 导出 P003 的 AE 表单。
* **AI 回答**: “查询 REDCap 实时数据P003 目前**无**不良反应记录。”
* **PI**: <20><EFBFBD><E99D9D><EFBFBD><EFBFBD><E89D8F>摨虫蛹隞<E89BB9><EFBFBD><E98A8B><EFBFBD>𠬍<EFBFBD><F0A0AC8D>?
* **AI <20><EFBFBD>?*: <20>喲睸霂𨧀<E99C82><EFBFBD><E99D9D><EFBFBD><EFBFBD><E88588><EFBFBD>𨀣<EFBFBD><F0A880A3>𤾸<EFBFBD><F0A4BEB8><EFBFBD>?\-\> 撅硺<E69285><EFBFBD><E9A488>霈啣<E99C88><EFBFBD>𪂹<EFBFBD><EFBFBD> \-\> 靚<>鍂 search\_knowledge\_base(query="<22><EFBFBD>皛𧼮<E79A9B><F0A7BCAE><EFBFBD>", doc\_category="report")<29>?
* **<EFBFBD><EFBFBD>**: Dify 璉<><E89D9D><EFBCB6><EFBFBD><E587BD><EFBFBD><E99E9F>冽𥁒<E586BD><F0A58192>𧋦<EFBFBD>?
* **AI <EFBFBD><EFBFBD>**: <EFBFBD>𨀣覔<EFBFBD>桃洵 12 <20>典𪂹<E585B8>亥扇敶𤏪<E695B6>皛𧼮<E79A9B>銝餉<E98A9D><E9A489><EFBFBD>銝算<E98A9D>䀹瓲蝤<E793B2><E89DA4><EFBFBD>航挽憭<E68CBD><E686AD><EFBFBD>𨅯紡<F0A885AF><EFBFBD><E6B8A1>匧仃韐?3 靘𦥑<E99D98><EFBFBD><E8B8BA><EFBFBD>?
### **<2A>箸艶銝㚁<E98A9D><E39A81><EFBFBD>摰墧㺭<E5A2A7>?(摰墧𧒄蝐?**
* **PI**: <20>𨅯葬<F0A885AF>𤑳<EFBFBD><F0A491B3>?P003 <20>㗇瓷<E39787><EFBFBD><E58A90><EFBFBD>摨䈑<E691A8><E48891>?
* **AI <20><EFBFBD>?*: <20>喲睸霂𨧀<E99C82>憕003<30><EFBFBD><E88588><EFBFBD><EFBFBD><E99D9D><EFBFBD>摨婙<E691A8>?\-\> 撅硺<E69285><E7A1BA><EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗥𠶖<E597A5>?\-\> 靚<>鍂 query\_clinical\_data(intent="patient\_detail", patient\_id="P003")<29>?
* **<2A><EFBFBD>**: Node.js 靚<>鍂 REDCap API 撖澆枂 P003 <20>?AE 銵典<E98AB5><E585B8>?
* **AI <20><EFBFBD>**: <20>𨀣䰻霂?REDCap 摰墧𧒄<E5A2A7>唳旿嚗䥪003 <20><EFBFBD>**<2A>?*銝滩<E98A9D><E6BBA9><EFBFBD>霈啣<E99C88><E595A3><EFBFBD><EFBFBD>?
## **5\. 摰墧鴌<E5A2A7><EFBFBD>**
<EFBFBD><EFBFBD>餈坔<EFBFBD> **ReAct \+ <20><EFBFBD><E588B8><EFBFBD>** <20><>䲮獢<E4B2AE><E78DA2><EFBFBD>睲賑摰𣬚<E691B0><EFBFBD><E996AC><EFBFBD><E988AD><EFBFBD><EFBFBD><EFBFBD>憭折<E686AD><EFBFBD><E79899>
1. **方案/伦理** \-\> Dify Protocol 库。
2. **周报/进度** \-\> Dify Report 库 (系统自动归档)。
3. **真实数据** \-\> REDCap API 实时工具。
1. **<EFBFBD><EFBFBD>/隡衣<E99AA1>** \-\> Dify Protocol 摨瓐<EFBFBD>?
2. **<EFBFBD>冽𥁒/餈𥕦漲** \-\> Dify Report 摨?(蝟餌<E89D9F><E9A48C>芸𢆡敶埝﹝)<29>?
3. **<EFBFBD><EFBFBD><EFBFBD>唳旿** \-\> REDCap API 摰墧𧒄撌亙<EFBFBD><EFBFBD>?
## **6\. <20>鞉郊<E99E89><E9838A>郊撉文<E69289><E69687>穃遣霈?(Phased Development Recommendations)**
## **6\. 逐步分步骤开发建议 (Phased Development Recommendations)**
为了降低开发风险,建议将此 ReAct 架构拆解为三个“里程碑 (Milestones)”,逐步点亮 AI 的能力。
### **阶段一:数据直连 (MVP \- Day 3-4)**
**目标****先让 AI 拥有“眼睛”**。PI 问实时数据AI 必须能答上来。
* **开发内容**
* 仅实现 query\_clinical\_data 工具。
* 不接入 Dify任何关于文档的问题都回复“知识库正在构建中”。
* **System Prompt**:简化为“你是一个只能查数据的助手”。
* **价值**PI 可以在微信里查入组人数了,解决了最高频痛点。
銝箔<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撱箄悅撠<EFBFBD>迨 ReAct <20><EFBFBD><E59786><EFBFBD>圾銝箔<E98A9D>銝芬<E98A9D>𣈯<EFBFBD>蝔讠<E89D94> (Milestones)<29><EFBFBD><E59885>鞉郊<E99E89>嫣漁 AI <20><><EFBFBD><EFBFBD><EFBFBD>?
### **<2A>嗆挾銝<E68CBE>嚗𡁏㺭<F0A1818F>桃凒餈?(MVP \- Day 3-4)**
**<EFBFBD><EFBFBD>**嚗?*<2A><>悟 AI <20><EFBFBD><E4BAA4>𦦵尐<F0A6A6B5>𥕞<EFBFBD>?*<2A><>I <20><EFBFBD><E6A180>嗆㺭<E59786><EFBFBD>AI 敹<><EFBFBD><EFBFBD>銝𦠜䔉<F0A6A09C>?
* **撘<><E69298><EFBFBD>摰?*嚗?
*<><E99A9E><EFBFBD>?query\_clinical\_data 撌亙<E6928C><E4BA99>?
* 銝齿𦻖<E9BDBF>?Dify嚗䔶遙雿訫<E99BBF>鈭擧<E988AD><EFBFBD><E78DA2><EFBFBD><EFBFBD><E6A185><EFBFBD>憭𨧀<E686AD>𦦵䰻霂<E4B0BB><E99C82><EFBFBD><EFBFBD><E98A81>遣銝凌<E98A9D><EFBFBD>?
* **System Prompt**嚗𡁶<E59A97><F0A181B6>碶蛹<E7A2B6><EFBFBD><E99D9D><EFBFBD>銝芸蘨<E88AB8>賣䰻<E8B3A3>唳旿<E594B3><E697BF>𨭌<EFBFBD>𦥑<EFBFBD><EFBFBD>?
* **隞瑕<E99A9E>?*嚗䥪I <20>臭誑<E887AD>典凝靽⊿<E99DBD><E28ABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗諹圾<E8ABB9><EFBFBD><E59683><EFBFBD>擃㗛<E69383><E3979B>𤤿<EFBFBD><F0A4A4BF>?
### **<2A>嗆挾鈭䕘<E988AD><E49598><EFBFBD><E4BAA5><EFBFBD> (Phase 1.5 \- Day 7\)**
**目标****给 AI 装上“大脑”**。接入 Dify回答方案问题。
* **开发内容**
* 对接 Dify API实现 search\_knowledge\_base 工具。
* 手动上传 1 份 PDF 方案进行测试。
* 在 Node.js 中开启简单的 **Router (单步路由)**:问数据走工具,问文档走 Dify。
* **价值**PI 可以开始问“入排标准”了。
**<EFBFBD><EFBFBD>**嚗?*蝏?AI 鋆<><E98B86><EFBFBD>𨅯之<F0A885AF><EFBFBD>?*<2A><>𦻖<EFBFBD>?Dify嚗<79><E59A97>蝑娍䲮獢<E4B2AE>䔮憸塩<E686B8>?
* **撘<><E69298><EFBFBD>摰?*嚗?
* 撖寞𦻖 Dify API嚗<49><E59A97><EFBFBD>?search\_knowledge\_base 撌亙<E6928C><E4BA99>?
* <EFBFBD>见𢆡銝𠹺<EFBFBD> 1 隞?PDF <20><EFBFBD>餈𥡝<E9A488>瘚贝<E7989A><E8B49D>?
* <EFBFBD>?Node.js 銝剖<E98A9D><E58996><EFBFBD><E88890><EFBFBD> **Router (<28>閙郊頝舐眏)**嚗𡁻䔮<F0A181BB>唳旿韏啣極<E595A3><EFBFBD><E79880><EFBFBD><EFBFBD>粥 Dify<66>?
* **隞瑕<E99A9E>?*嚗䥪I <20>臭誑撘<E8AA91>憪钅䔮<E99285>𨅯<EFBFBD><F0A885AF><EFBFBD><E59F9D><EFBFBD><EFBFBD><EFBFBD><E88BB7>?
### **<2A>嗆挾銝㚁<E98A9D>瘛瑕<E7989B><E79195><EFBFBD> (Phase 2 \- Day 14+)**
**目标****打通“任督二脉”**。开启 ReAct 循环,处理复杂逻辑。
* **开发内容**
* 实现 while 循环推理引擎。
* 完善 System Prompt教 AI 如何拆解问题。
* 实现“周报自动归档”到 Dify 的流程。
* **价值**PI 可以问“张三为什么违规”这种需要结合数据和方案的高级问题。
**建议策略****严守 MVP 边界**。在 Day 4 演示时,只展示“阶段一”的数据查询能力即可,这已经足够震撼。不要试图一开始就调试复杂的 ReAct 循环。
**文档版本**V3.1 (分步落地版) | **适用阶段**Phase 2
**<EFBFBD><EFBFBD>**嚗?*<2A><EFBFBD><EFBFBD>靝遙<E99D9D><E98199><EFBFBD><EFBFBD><EFBFBD>?*<2A><><EFBFBD><EFBFBD>?ReAct 敺芰㴓嚗<E3B493><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A489>?
* **撘<><E69298><EFBFBD>摰?*嚗?
* 摰䂿緵 while 敺芰㴓<E88AB0><EFBFBD>撘閙<E69298><E99699>?
* <EFBFBD><EFBFBD> System Prompt嚗峕<E59A97> AI 憒<><E68692><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6A185>?
* 摰䂿緵<EFBFBD>𨅯𪂹<EFBFBD>亥䌊<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Dify <20><><EFBFBD>蝔卝<E89D94>?
* **隞瑕<E99A9E>?*嚗䥪I <20>臭誑<E887AD><EFBFBD>𨅯<EFBFBD>銝劐蛹隞<E89BB9><EFBFBD><E98A8B><EFBFBD><E996AB><EFBFBD>蝘漤<E89D98><EFBFBD><E996AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6A180><EFBFBD><E5AF9E><EFBFBD><EFBFBD>蝥折䔮憸塩<E686B8>?
**撱箄悅蝑𣇉裦**嚗?*銝亙<E98A9D> MVP 颲寧<E9A2B2>**<2A><>銁 Day 4 瞍𠉛內<F0A0899B><EFBFBD><E5A19A><EFBFBD>蝷算<E89DB7>𣈯𧫴畾萎<E795BE><E8908E><EFBFBD><E89098>唳旿<E594B3>亥砭<E4BAA5><EFBFBD><E8B3A2>喳虾嚗諹<E59A97>撌脩<E6928C>頞喳<E9A09E><E596B3><EFBFBD>𠗠<EFBFBD><F0A097A0><EFBFBD><EFBFBD><E996AC><EFBFBD><EFBFBD><EFBFBD>憪见停靚<E5819C><E99D9A>憭齿<E686AD><E9BDBF>?ReAct 敺芰㴓<E88AB0>?
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦**嚗间3.1 (<28><><EFBFBD>賢𧑐<E8B3A2>? | **<EFBFBD><EFBFBD><EFBFBD>嗆挾**嚗䥪hase 2

View File

@@ -1,47 +1,41 @@
# **REDCap 原生录入与 AI Workbench 操作边界划分**
# **REDCap 原生录入ä¸?AI Workbench æ“<C3A6>作边界åˆåˆ**
针对您的关键问题“CRC 到底在哪里录入数据?”,我们采取\*\*“双轨并行,场景区分”\*\*的原则。
## **1\. 核心策略:尊重“数据真理源”**
* **原则**:为了确保 GxP 合规性和维护用户的既有习惯,**REDCap 始终是主要的数据录入入口**。
* **逻辑**:我们不应该重新发明一个录入界面,而是要在录入时通过 AI 进行“实时监护”。
éˆå¯¹æ¨çš„关键问题:“CRC 到底在哪里录入数æ<C2B0>®ï¼Ÿâ€<C3A2>,æˆä»¬é‡‡å<E280A1>\*\*“å<C593>Œè½¨å¹¶è¡Œï¼Œåœºæ™¯åŒºåˆ†â€<C3A2>\*\*的原则ã€?
## **1\. 核心ç­ç•¥ï¼šå°Šé‡<C3A9>“数æ<C2B0>®çœŸç<C5B8>†æº<C3A6>â€?*
* **原则**:为了确ä¿?GxP å<>ˆè§„性åŒç»´æŠ¤ç”¨æˆ·çš„æ—¢æœ‰ä¹ æƒ¯ï¼Œ**REDCap å§ç»ˆæ˜¯ä¸»è¦<C3A8>的数æ<C2B0>®å½•入入å<C2A5>£**ã€?
* **逻辑**:æˆä»¬ä¸<C3A4>应该é‡<C3A9>æ°å<C2B0>明一个录入界é<C592>¢ï¼Œè€Œæ˜¯è¦<C3A8>在录入时通过 AI è¿è¡Œâ€œå®žæ—¶ç护â€<C3A2>ã€?
## **2\. 详细场景划分**
| 场景 | 操作位置 | AI 的角色 | 理由 |
| 场景 | æ“<C3A6>作ä½<C3A4>ç½® | AI 的角è‰?| ç<>†ç”± |
| :---- | :---- | :---- | :---- |
| **常规数据录入** | **REDCap 界面** | **实时监护** | 保持 CRC 习惯降低迁移成本。AI 通过 Webhook 实时质控。 |
| **大批量数据导入** | **AI Workbench** | **智能搬运** | 外部 Excel 或多张化验单。AI 清洗后CRC 确认一次,一键注入。 |
| **图像/PDF 提取录入** | **AI Workbench** | **OCR 提取** | REDCap 原生不支持复杂的 OCR 解析。在 Workbench 完成提取比对最顺手。 |
| **质疑(Query)处理** | **AI Workbench** | **冲突展示** | Workbench 可以同屏看“证据原文”和“建议值”,体验远好于 REDCap|
| **项目初始化配置** | **AI Workbench** | **架构定义** | 复杂的 RAG 知识库上传、映射表配置,属于 AI 平台的特有逻辑。 |
| **常规数æ<EFBFBD>®å½•å…¥** | **REDCap 界é<EFBFBD>¢** | **实时监护** | ä¿<C3A4>æŒ<C3A6> CRC 习惯,é™<C3A9>低è¿<C3A8>ç§»æˆ<C3A6>本ã€AI 通过 Webhook 实时质控ã€?|
| **大批é‡<EFBFBD>æ•°æ<EFBFBD>®å¯¼å…?* | **AI Workbench** | **智能æ<EFBFBD>¬è¿<EFBFBD>** | 外部 Excel æˆå¤šå¼ åŒéªŒå<EFBFBD>•ã€AI 清洗å<E28094>Žï¼ŒCRC 确认一次,一键注入ã€?|
| **å¾åƒ<EFBFBD>/PDF æ<><C3A6>å<EFBFBD>录入** | **AI Workbench** | **OCR æ<EFBFBD><EFBFBD>å<EFBFBD>** | REDCap 原生ä¸<EFBFBD>支æŒ<EFBFBD>å¤<EFBFBD>æ<EFBFBD>çš„ OCR è§£æž<C3A6>ã€åœ¨ Workbench 完æˆ<C3A6>æ<EFBFBD><C3A6>å<EFBFBD>比对最顺æ‰ã€?|
| **质疑(Query)处ç<EFBFBD>** | **AI Workbench** | **冲çª<EFBFBD>展示** | åœ?Workbench å<EFBFBD>¯ä»¥å<EFBFBD>Œå±<EFBFBD>çœâ€œè¯<EFBFBD>æ<EFBFBD>®åŽŸæ‡â€<EFBFBD>åŒâ€œå»ºè®®å€¼â€<EFBFBD>,体验远好äº?REDCapã€?|
| **项ç®åˆ<EFBFBD>å§åŒé…<EFBFBD>ç½?* | **AI Workbench** | **架构定义** | å¤<C3A5>æ<EFBFBD>çš?RAG 知识库上传ã€<C3A3>映射表é…<C3A9>置,属äº?AI å¹³å<C2B3>°çš„特有逻è¾ã€?|
## **3\. å…¸åžæµ<C3A6>ç¨å¯¹æ¯”**
### **流程 A常规录入 (CRC REDCap 操作)**
### **æµ<EFBFBD>ç¨ A:常规录å…?(CRC åœ?REDCap æ“<EFBFBD>作)**
1. CRC 登录 REDCap,打开患者表单。
2. 输入血红蛋白值8.0(单位录错)。
3. 点击保存 \-\> REDCap 写入 MySQL \-\> 触发 Webhook
4. 我们的后端感知后QC Agent 发现逻辑错误。
5. **反馈**
* **低延时提醒**:通过 EM 插件在 REDCap 页面上方显示“AI 提示:该值偏离历史均值,请确认单位”。
* **异步质疑**:在我们的 Workbench 生成一条 Pending Action
### **流程 BAI 增强录入 (CRC 在 Workbench 操作)**
1. CRC 收到一张化验单照片。
2. CRC 登录我们的 Workbench上传照片。
3. AI 提取出 10 个指标。
4. **预览比对**:界面左侧是照片,右侧是提取的表格,高亮显示不确定的值。
5. **一键注入**CRC 确认无误,点击“同步”。系统自动调用 REDCap API 将这 10 个值一次性填满 REDCap 表单。
1. CRC 登录 REDCap,打开æ£è€…表å<EFBFBD>•ã€?
2. 输入血红è白值:8.0(å<EFBFBD>•ä½<EFBFBD>录错)ã€?
3. ç¹å‡»ä¿<EFBFBD>å­˜ \-\> REDCap 写入 MySQL \-\> 触å<EFBFBD> Webhookã€?
4. æˆä»¬çš„å<EFBFBD>Žç«¯æ„ŸçŸ¥å<EFBFBD>Žï¼ŒQC Agent å<>现逻è¾é”™è¯¯ã€?
5. **å<EFBFBD><EFBFBD>馈**ï¼?
* **低延时æ<EFBFBD><EFBFBD>é†?*:通过 EM æ<>ä»¶åœ?REDCap 页é<C2B5>¢ä¸Šæ¹æ˜¾ç¤ºï¼šâ€œAI æ<><C3A6>示:该值å<C2BC><C3A5>离历å<E280A0>²å<C2B2>‡å€¼ï¼Œè¯·ç¡®è®¤å<C2A4>•ä½<C3A4>â€<C3A2>ã€?
* **异步质疑**:在我们çš?Workbench 生æˆ<C3A6>一æ<E282AC>?Pending Actionã€?
### **æµ<C3A6>ç¨ B:AI 增强录入 (CRC åœ?Workbench æ“<C3A6>作)**
1. CRC 收到一张åŒéªŒå<C592>•照片ã€?
2. CRC 登录我们�Workbench,上传照片�
3. AI æ<><C3A6>å<EFBFBD>å‡?10 个指标ã€?
4. **预览比对**:界é<C592>¢å·¦ä¾§æ˜¯ç…§ç‰‡ï¼Œå<C592>³ä¾§æ˜¯æ<C2AF><C3A6>å<EFBFBD>的表格,高亮显示ä¸<C3A4>确定的值ã€?
5. **一键注å…?*:CRC 确认无误,ç¹å‡»â€œå<C593>Œæ­¥â€<C3A2>ã€ç³»ç»Ÿè‡ªåŠ¨è°ƒç”?REDCap API 将这 10 个值一次性填æ»?REDCap 表å<C2A8>•ã€?
## **4\. 结论与æ€<C3A6>路总结**
* **REDCap 登录**:用于\*\*“手动、少量、常规”\*\*的临床记录。
* **AI Workbench 登录**:用于\*\*“大批量、文档提取、质控确认、方案解析”\*\*的高级任务。
这种设计的优势在于:**不强制改变用户习惯,但用 AI 让任务变得更轻松。** 我们不需要做一个完整的 EDC我们要做的是 EDC 的“智能加速器”。
**您认可这个“双轨制”吗?** 特别是关于“大批量和文档提取才去 Workbench”的设定。
* **REDCap 登录**:用于\*\*“æ‰åЍã€<C3A3>å°é‡<C3A9>ã€<C3A3>常规â€<C3A2>\*\*的临床记录ã€?
* **AI Workbench 登录**:用于\*\*“大批é‡<C3A9>ã€<C3A3>æ‡æ¡£æ<C2A3><C3A6>å<EFBFBD>ã€<C3A3>质控确认ã€<C3A3>æ¹æ¡ˆè§£æž<C3A6>â€<C3A2>\*\*的高级任务ã€?
è¿™ç§<EFBFBD>设计的优势在于:**ä¸<C3A4>强制改å<C2B9>˜ç”¨æˆ·ä¹ æƒ¯ï¼Œä½†ç”¨ AI 让任务å<C2A1>˜å¾—æ´è½»æ<C2BB>¾ã€?* æˆä»¬ä¸<C3A4>需è¦<C3A8>å<EFBFBD>šä¸€ä¸ªå®Œæ•´çš„ EDC,æˆä»¬è¦<C3A8>å<EFBFBD>šçš„æ˜?EDC 的“智能加速器â€<C3A2>ã€?
**æ¨è®¤å<C2A4>¯è¿™ä¸ªâ€œå<C593>Œè½¨åˆ¶â€<C3A2>å<EFBFBD>—ï¼?* 特别是关于“大批é‡<C3A9>åŒæ‡æ¡£æ<C2A3><C3A6>å<EFBFBD>æ‰<C3A6>åŽ?Workbenchâ€<C3A2>的设定ã€

View File

@@ -1,92 +1,80 @@
# **文档 BEDC 适配器 (REDCap) 技术详细设计 (V1.0)**
# **<EFBFBD><EFBFBD>﹝ B嚗鍃DC <20><><EFBFBD><EFBFBD>?(REDCap) <20><><EFBFBD>航祕蝏<E7A595>挽霈?(V1.0)**
## **1\. 需求映射:PRD V3 REDCap 能力的诉求**
基于 IIT Manager Agent V3 的功能定义,适配器必须支持以下 REDCap 核心能力。
## **1\. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PRD V3 撖?REDCap <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘙?*
<EFBFBD><EFBFBD> IIT Manager Agent V3 <20><><EFBFBD><EFBFBD><EFBFBD>銋㚁<E98A8B><E39A81><EFBFBD><EFBFBD><EFBFBD><EFBFBD>憿餅𣈲<E9A485><F0A388B2>誑銝?REDCap <20><EFBFBD><E8A9A8><EFBFBD><E8B3A2>?
### **1.1 <20>毺䰻<E6AFBA><EFBFBD> (Read & Monitor)**
* **实时监听 (Real-time Hook)**:对应“数据质控 Agent”。当 CRC 录入数据时REDCap 必须能主动“推”出事件。
* **数据全量/增量导出 (Data Export)**:对应“项目管理 Agent”。需要定期抓取所有记录进行入组率、完整率的统计分析。
* **元数据定义获取 (Metadata Export)**:对应“方案数字化”。需要获取项目的表单结构、变量名、字段类型(下拉框/文本框),用于 AI 自动生成映射。
* **摰墧𧒄<EFBFBD>穃𨯬 (Real-time Hook)**嚗𡁜笆摨婙<EFBFBD>𨀣㺭<EFBFBD>株捶<EFBFBD>?Agent<6E><EFBFBD><E88588><EFBFBD> CRC 敶訫<E695B6><E8A8AB>唳旿<E594B3><EFBFBD>REDCap 敹<><EFBFBD>賭蜓<E8B3AD><EFBFBD>𨀣綫<F0A880A3>嘥枂鈭衤辣<E8A1A4>?
* **<EFBFBD>唳旿<EFBFBD><EFBFBD>/憓鮋<E68693>撖澆枂 (Data Export)**嚗𡁜笆摨婙<EFBFBD>𣈯★<EFBFBD>桃恣<EFBFBD>?Agent<6E><EFBFBD><E88588><EFBFBD><EFBFBD><E996AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡝗<EFBFBD><F0A19D97>㕑扇敶𤏪<E695B6>餈𥡝<E9A488><F0A5A19D><EFBFBD><E4BAA6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B8A1><EFBFBD><EFBFBD><E99C88><E288AA><EFBFBD>?
* **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>銋㕑繮<EFBFBD>?(Metadata Export)**嚗𡁜笆摨婙<EFBFBD>𨀣䲮獢<EFBFBD>㺭摮堒<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㚚★<EFBFBD><EFBFBD>銵典<EFBFBD>蝏𤘪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>畾萇掩<EFBFBD><EFBFBD>銝𧢲<EFBFBD>獢?<3F><>𧋦獢<F0A78BA6><E78DA2>嚗𣬚鍂鈭?AI <20>芸𢆡<E88AB8><F0A286A1><EFBFBD><EFBFBD><EFBFBD><E683A9>?
### **1.2 <20><EFBFBD><E689AF><EFBFBD> (Write & Query)**
* **记录注入与更新 (Record Import)**:对应“数据智能采集 Agent”。AI 识别出的结构化数据需写入指定字段。
* **质疑管理 (Query/Data Resolution)**:对应“质控 Agent”。AI 发现问题后,需通过接口在 REDCap 中创建“质疑 (Query)”。
* **用户认证映射 (Auth API)**:确保 Agent 操作时具备合法的 User Token 审计。
* **霈啣<EFBFBD>瘜典<EFBFBD>銝擧凒<EFBFBD>?(Record Import)**嚗𡁜笆摨婙<EFBFBD>𨀣㺭<EFBFBD>格惣<EFBFBD><EFBFBD><EFBFBD>?Agent<6E><EFBFBD><E88588>I 霂<><E99C82><EFBFBD><EFBFBD>蝏𤘪<E89D8F><F0A498AA>𡝗㺭<F0A19D97><EFBFBD><E6A185><EFBFBD><E59D94><EFBFBD><EFBFBD>摮埈挾<E59F88>?
* **韐函<EFBFBD>蝞∠<EFBFBD> (Query/Data Resolution)**嚗𡁜笆摨婙<EFBFBD>𡏭捶<EFBFBD>?Agent<6E><EFBFBD><E88588>I <20>𤑳緵<F0A491B3><EFBFBD><E6A185>𠬍<EFBFBD><F0A0AC8D><EFBFBD><EFBFBD><EFBFBD><E69C9E>亙藁<E4BA99>?REDCap 銝剖<E98A9D>撱算<E692B1>𡏭捶<F0A18FAD>?(Query)<EFBFBD><EFBFBD>?
* **<EFBFBD><EFBFBD>霈方<EFBFBD><EFBFBD><EFBFBD> (Auth API)**嚗𡁶&靽?Agent <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘜閧<EFBFBD> User Token 摰∟恣<EFBFBD>?
## **2\. <20><><EFBFBD><EFBFBD><E887AC><EFBFBD>External Module (EM) 銝?REST API 瘛瑕<E7989B><E79195><EFBFBD>**
## **2\. 技术实现External Module (EM) 与 REST API 混合架构**
銝箔<EFBFBD>摰䂿緵瘛勗漲<EFBFBD><EFBFBD>銝𥪯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗峕<EFBFBD>隞祇<EFBFBD><EFBFBD>?**<2A>諪M 靘扳<E99D98><E689B3>雴辣 \+ Node.js <20><><EFBFBD><EFBFBD><EFBFBD>?* <20><><EFBFBD><E6AFBD>䲮獢<E4B2AE><E78DA2>?
### **2.1 External Module (EM) <20><EFBFBD><E8A9A8>諹提嚗帋蜓<E5B88B>券偬摮?*
为了实现深度融合且保持高性能,我们采用 **“EM 侧挂插件 \+ Node.js 适配器”** 的混合方案。
<EFBFBD><EFBFBD><EFBFBD>睲賑<EFBFBD><EFBFBD> REDCap 皞鞟<E79A9E>嚗峕<E59A97>隞砍<E99A9E><EFBFBD><E69298><EFBFBD>銝芸<E98A9D>銝?ai\_research\_assistant <20>?EM<45>?
* **<2A>唳旿靽嘥<E99DBD><E598A5><EFBFBD> (redcap\_save\_record)**嚗?
* **<2A><EFBFBD>**嚗𡁏<E59A97>敶栞扇敶蓥<E695B6>摮矋<E691AE>EM <20>閗繮敶枏<E695B6> project\_id <20>?record\_id<69>?
* **<2A><EFBFBD>**嚗𡁻<E59A97><EFBFBD> HTTP POST <20><EFBFBD>?Webhook 蝏?Node.js <20>𡒊垢<F0A1928A>?
* **隞瑕<E99A9E>?*嚗𡁜<E59A97><F0A1819C><EFBFBD>𡏭捶<F0A18FAD>?Agent<6E><EFBFBD>鈭𡁶<E988AD>蝥批<E89DA5>摨𢛵<E691A8>?
* **憿菟𢒰瘜典<E7989C><E585B8><EFBFBD> (redcap\_every\_page\_top)**嚗?
* **<2A><EFBFBD>**嚗𡁜銁<F0A1819C>唳旿敶訫<E695B6>憿菟𢒰瘜典<E7989C><E585B8><EFBFBD>銋?JS (ai\_assistant.js)<29>?
* **<2A><EFBFBD>**嚗𡁜銁敶訫<E695B6><EFBFBD><E78DA2><EFBFBD>曄內 AI 颲<>𨭌<EFBFBD>厰僼<E58EB0><EFBFBD>鈭株<E988AD><E6A0AA><EFBFBD><E6A0BC><EFBFBD>?
* **隞瑕<E99A9E>?*嚗𡁜<E59A97><F0A1819C><EFBFBD><E595A3>仿𧫴畾萇<E795BE><E89087>𨀣㺭摮堒𨭌<E5A092>𦥑<EFBFBD><EFBFBD><E598A5><EFBFBD><EFBFBD>?
### **2.2 Node.js EDC Adapter <20><EFBFBD><E8A9A8>諹提嚗朞◤<E69C9E>刻挪<E588BB>?*
### **2.1 External Module (EM) 核心职责:主动钩子**
<EFBFBD><EFBFBD>蝡臬<EFBFBD>鋆?RedcapAdapter 蝐鳴<E89D90><EFBFBD><E686AD><EFBFBD><EFBFBD><EFBFBD>劐蜓<E58A90><EFBFBD><E586BD>碶遙<E7A2B6><EFBFBD>?
* **API 靚<>鍂撠<E98D82><E692A0>**嚗?
* exportRecords: <20><EFBFBD>銝游<E98A9D><E6B8B8>唳旿<E594B3>?
* importRecords: <20>𧼮<EFBFBD>敶勗<E695B6><E58B97><EFBFBD><E59786>霈文<E99C88><E69687><EFBFBD><EFBFBD><EFBFBD>?
* exportMetadata: <20><EFBFBD>銵典<E98AB5><E585B8><EFBFBD><EFBFBD><E79A9C><EFBFBD>?
* importQueries: (<28><EFBFBD> EM <20><>䌊摰帋<E691B0>憿菟𢒰) 摰䂿緵 AI <20>芸𢆡<E88AB8>𥕦遣韐函<E99F90><E587BD>?
## **3\. <20>喲睸<E596B2>亙藁皜<E89781><E79A9C>銝𤾸<E98A9D><F0A4BEB8><EFBFBD><E59581>?*
由于我们拥有 REDCap 源码,我们将开发一个名为 ai\_research\_assistant 的 EM。
### **3.1 <20><EFBFBD>撖寞𦻖<E5AF9E>亙藁銵?*
* **数据保存钩子 (redcap\_save\_record)**
* **逻辑**每当记录保存EM 捕获当前 project\_id 和 record\_id。
* **动作**:通过 HTTP POST 发送 Webhook 给 Node.js 后端。
* **价值**:实现“质控 Agent”的亚秒级响应。
* **页面注入钩子 (redcap\_every\_page\_top)**
* **逻辑**:在数据录入页面注入自定义 JS (ai\_assistant.js)。
* **动作**:在录入框旁显示 AI 辅助按钮或高亮证据提醒。
* **价值**:实现录入阶段的“数字助手”入口。
### **2.2 Node.js EDC Adapter 核心职责:被动访问**
在后端封装 RedcapAdapter 类,处理所有主动抓取任务。
* **API 调用封装**
* exportRecords: 抓取临床数据。
* importRecords: 回写影子状态确认后的数据。
* exportMetadata: 获取表单变量清单。
* importQueries: (基于 EM 的自定义页面) 实现 AI 自动创建质疑。
## **3\. 关键接口清单与实现细节**
### **3.1 核心对接接口表**
| 对接功能 | REDCap 原生 API / EM Hook | 对应的 Agent 动作 |
| 撖寞𦻖<E5AF9E><EFBFBD> | REDCap <20><EFBFBD> API / EM Hook | 撖孵<E69296><E5ADB5>?Agent <20><EFBFBD> |
| :---- | :---- | :---- |
| **实时入组通知** | redcap\_save\_record (Hook) | 触发质控检查、更新日报 |
| **全量数据同步** | exportRecords (API) | 生成周报趋势图、脱落分析 |
| **AI 自动录入** | importRecords (API) | 采集 Agent 写入数据(影子确认后) |
| **数据异常预警** | importQueries (自定义) | 质控 Agent 创建质疑条目 |
| **摰墧𧒄<EFBFBD><EFBFBD><EFBFBD>𡁶䰻** | redcap\_save\_record (Hook) | 閫血<EFBFBD>韐冽綉璉<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>唳𠯫<EFBFBD>?|
| **<EFBFBD><EFBFBD><EFBFBD>唳旿<EFBFBD>峕郊** | exportRecords (API) | <EFBFBD><EFBFBD><EFBFBD><EFBFBD>冽𥁒頞见飵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?|
| **AI <EFBFBD>芸𢆡敶訫<EFBFBD>** | importRecords (API) | <EFBFBD><EFBFBD><EFBFBD> Agent <EFBFBD><EFBFBD><EFBFBD>唳旿嚗<EFBFBD>蔣摮鞟霈文<EFBFBD>嚗?|
| **<EFBFBD>唳旿撘<EFBFBD>虜憸<EFBFBD>** | importQueries (<EFBFBD><EFBFBD>銋? | 韐冽綉 Agent <20>𥕦遣韐函<E99F90><E587BD>∠𤌍 |
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>** | exportMetadata (API) | <20><EFBFBD><E79195><EFBFBD><EFBFBD><E79A9C>餈𥡝<E9A488> AI 霂凋<E99C82><E5878B><EFBFBD> |
### **3.2 影子状态 (Shadow State) 的回写链路**
### **3.2 敶勗<EFBFBD><EFBFBD><EFBFBD>?(Shadow State) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>䠷曎頝?*
餈蹱糓<EFBFBD>賜铜銋衣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>啗楝敺<EFBFBD><EFBFBD>銝页<EFBFBD>
1. **建议生成**Agent 结果存入我们的 pending\_actions 表。
2. **人类审核**CRC Workbench 点击“确认”。
3. **适配器调用**Node.js 提取该条目的 edc\_api\_token,组装标准的 REDCap importRecords JSON 报文。
4. **回写执行**
// REDCap 接受的数据格式示例
1. **撱箄悅<EFBFBD><EFBFBD><EFBFBD>**嚗鋫gent 蝏𤘪<E89D8F>摮睃<E691AE><E79D83>睲賑<E79DB2>?pending\_actions 銵具<EFBFBD>?
2. **鈭箇掩摰⊥瓲**嚗鋴RC <EFBFBD>?Workbench <EFBFBD>孵稬<EFBFBD>𦦵霈手<EFBFBD><EFBFBD>?
3. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*嚗鐭ode.js <20>𣂼<EFBFBD>霂交辺<E4BAA4><EFBFBD> edc\_api\_token嚗𣬚<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> REDCap importRecords JSON <EFBFBD><EFBFBD><EFBFBD>?
4. **<EFBFBD>𧼮<EFBFBD><EFBFBD><EFBFBD>**嚗?
// REDCap <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>格聢撘讐內靘?
\[
{"record\_id": "P001", "redcap\_repeat\_instance": 1, "field\_name": "ai\_qc\_status", "value": "2"}
\]
5. **审计闭环**:回写成功后,更新 pending\_actions.status \= 'EXECUTED'
5. **摰∟恣<EFBFBD>剔㴓**嚗𡁜<E59A97><F0A1819C><EFBFBD><E8B9B1><EFBFBD>嚗峕凒<E5B395>?pending\_actions.status \= 'EXECUTED'<EFBFBD>?
## **4\. <20>祉鸌<E7A589><E9B88C><EFBFBD>臭漁<E887AD><EFBFBD>External Module 撖孵<E69296><E5ADB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
利用 REDCap EM 机制,我们可以实现比普通 API 更深入的整合:
1. 自定义菜单链接 (links)
在 REDCap 左侧导航栏直接嵌入 “壹证循 AI 控制中心” 的 H5 链接,让用户不出 EDC 就能使用我们的功能。
2. 定时任务管理 (crons)
在 REDCap 侧利用 Cron 触发定期的数据健康检查,减轻我们主系统的轮询压力。
<EFBFBD>拍鍂 REDCap <EFBFBD>?EM <EFBFBD><EFBFBD>嚗峕<EFBFBD>隞砍虾隞亙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?API <20>湔楛<E6B994><EFBFBD><E4BAA6><EFBFBD>嚗?
1. <20><EFBFBD>銋㕑<E98A8B><E39591>閖曎<E99696>?(links)嚗?
<20>?REDCap 撌虫儒撖潸⏛<E6BDB8>讐凒<E8AE90><EFBFBD><E4BA99>?<3F>𨅯ㄨ霂<E384A8>儐 AI <20><EFBFBD>銝剖<E98A9D><E58996>?<3F>?H5 <20>暹𦻖嚗諹悟<E8ABB9><EFBFBD>銝滚枂 EDC 撠梯<E692A0>雿輻鍂<E8BCBB>睲賑<E79DB2><E8B391><EFBFBD><EFBFBD><EFBFBD>?
2. 摰𡁏𧒄隞餃𦛚蝞∠<E89D9E> (crons)嚗?
<20>?REDCap 靘批⏚<E689B9>?Cron 閫血<E996AB>摰𡁏<E691B0><F0A1818F><EFBFBD><EFBFBD><EFBFBD>摨瑟<E691A8><E7919F><EFBFBD><E4BC90>讛蝠<E8AE9B>睲賑銝餌頂蝏毺<E89D8F>頧株砭<E6A0AA><EFBFBD><E8A781>?
3. 摮埈挾蝥折<E89DA5><E68A98><EFBFBD>鈭殷<E988AD>
通过 EM 修改录入页面的 DOM将 Agent 发现有问题的字段标记为黄色或红色。
<EFBFBD><EFBFBD> EM 靽格㺿敶訫<EFBFBD>憿菟𢒰<EFBFBD>?DOM嚗<4D><E59A97> Agent <20>𤑳緵<F0A491B3>厰䔮憸条<E686B8>摮埈挾<E59F88><E68CBE>扇銝粹<E98A9D><E7B2B9><EFBFBD>𠧧<EFBCBA>?
## **5\. 摰匧<E691B0>銝舘恕霂<E68195>挽霈?(Security)**
## **5\. 安全与认证设计 (Security)**
* **双重 Token 校验**
* **系统级**EM 访问 Node.js 时Headers 携带 X-SignatureHMAC-SHA256 加密)。
* **用户级**Node.js 访问 REDCap 时,使用加密存储的 Personal API Token。
* API 限流 (Rate Limiting)
针对大中心项目,适配器自动对 API 请求进行分片和限流,防止 REDCap 服务器因高频 AI 质控而崩溃。
**维护者**:架构组 & REDCap 专家 | **状态**:详细设计完成
* **<2A><EFBFBD> Token <20><EFBFBD>**嚗?
* **蝟餌<E89D9F>蝥?*嚗鍃M 霈輸䔮 Node.js <20><EFBFBD>Headers <20>箏蒂 X-Signature嚗𠃍MAC-SHA256 <20><EFBFBD>嚗剹<E59A97>?
* **<EFBFBD><EFBFBD>蝥?*嚗鐭ode.js 霈輸䔮 REDCap <20><EFBFBD>雿輻鍂<E8BCBB><EFBFBD>摮睃<E691AE><E79D83>?Personal API Token<65>?
* API <20><EFBFBD> (Rate Limiting)嚗?
<EFBFBD><EFBFBD>笆憭找葉敹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>刻䌊<EFBFBD>典笆 API 霂瑟<E99C82>餈𥡝<E9A488><F0A5A19D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7989A><EFBFBD>脫迫 REDCap <20>滚𦛚<E6BB9A><EFBFBD>擃㗛<E69383> AI 韐冽綉<EFBFBD><EFBFBD>援皞<EFBFBD><EFBFBD>?
**蝏湔擪<E6B994>?*嚗𡁏沲<F0A1818F><E6B2B2><EFBFBD> & REDCap 銝枏振 | **<EFBFBD><EFBFBD>?*嚗朞祕蝏<E7A595>挽霈<E99C88><E288AA>