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:
@@ -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>ョ。
|
||||
@@ -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>?| 敺桐縑霈a<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>T<EFBFBD>萘<EFBFBD>閫<EFBFBD>芋<EFBFBD>硋㦤<E7A18B>荔<EFBFBD>隡删<E99AA1><E588A0><EFBFBD><EFBFBD>靝<EFBFBD><E99D9D>V<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>a爸韐函<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>銝餃𢆡霈a<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>W<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>a▲<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>Z圾<EFBCBA>喃<EFBFBD> 47 摰嗅龫<E59785>Y<EFBFBD>撖寞𦻖<E5AF9E>曄<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>朞<EFBFBD>撠讐<E692A0>摨讐<E691A8>頞喃<E9A09E> PI <20>W<EFBFBD><EFBCB7>?
|
||||
**<2A><>𧋦**嚗间3.1 (閫<>芋<EFBFBD>碶耨甇<E880A8><E79487>) | **<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*嚗?025-12-30
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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>枃妗h<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>灦鏋勭被鍨?
|
||||
|
||||
- **架构模式**: 简化版ReAct(Reason + 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>锛堝惈"姝e湪鏌ヨ<E98F8C>..."鍗虫椂鍙嶉<E98D99>锛? 鈹?
|
||||
鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹<EFBFBD>攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹?
|
||||
鈻?
|
||||
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹? 鎺ュ叆灞傦紙Gateway Layer锛? 鈹?
|
||||
鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?
|
||||
鈹? WechatCallbackController 鈹?
|
||||
鈹? - URL楠岃瘉锛堢<EFBFBD>鍚嶆牎楠岋級 鈹?
|
||||
鈹? - 娑堟伅鍔犲瘑/瑙e瘑锛圓ES锛? 鈹?
|
||||
鈹? - 寮傛<EFBFBD>娑堟伅澶勭悊锛?绉掑唴杩斿洖200锛? 鈹?
|
||||
鈹? - 鍗虫椂鍙嶉<EFBFBD>锛?馃<> 姝e湪鏌ヨ<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鐭ヨ瘑搴? 鈹?
|
||||
鈹? - 鎮h€呰<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>灏戜綅鎮h€呭叆缁勶紵" |
|
||||
| `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>缁撴瀯鍖栫殑鎮h€呮暟鎹?
|
||||
|
||||
**宸ュ叿鍒楄〃**:
|
||||
|
||||
| 宸ュ叿鍚嶇О | 鍔熻兘 | 杈撳叆 | 杈撳嚭 | 鍝嶅簲鏃堕棿 |
|
||||
|---------|------|------|------|----------|
|
||||
| `queryRedcapRecord` | 查询单条患者记录 | recordId | 患者详细信息 | ~1.2秒 |
|
||||
| `countRedcapRecords` | 统计患者总数 | 无 | 总数+记录ID列表 | ~1.3秒 |
|
||||
| `getProjectInfo` | 获取项目信息 | 无 | 项目基本信息 | ~50ms |
|
||||
| `queryRedcapRecord` | 鏌ヨ<EFBFBD>鍗曟潯鎮h€呰<EFBFBD>褰?| recordId | 鎮h€呰<EFBFBD>缁嗕俊鎭?| ~1.2绉?|
|
||||
| `countRedcapRecords` | 缁熻<EFBFBD>鎮h€呮€绘暟 | 鏃?| 鎬绘暟+璁板綍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 | 鎮h€呰<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. RAG(Retrieval 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>鎮h€呰<E282AC>褰曡<E8A4B0>鎯?
|
||||
鉁?缁熻<E7BC81>鍏ョ粍浜烘暟
|
||||
鉁?鎻愪緵椤圭洰淇℃伅
|
||||
鉁?瑙g瓟鐮旂┒鏂规<E98F82>鐩稿叧闂<E58FA7><E99782>锛堝熀浜庣煡璇嗗簱鏂囨。锛?
|
||||
|
||||
【回复原则】
|
||||
1. **基于事实**:只使用系统提供的数据和文档,不编造
|
||||
2. **简洁专业**:控制在150字以内
|
||||
3. **友好礼貌**:使用"您"称呼PI
|
||||
銆愬洖澶嶅師鍒欍€?
|
||||
1. **鍩轰簬浜嬪疄**锛氬彧浣跨敤绯荤粺鎻愪緵鐨勬暟鎹<E69A9F>拰鏂囨。锛屼笉缂栭€?
|
||||
2. **绠€娲佷笓涓?*锛氭帶鍒跺湪150瀛椾互鍐?
|
||||
3. **鍙嬪ソ绀艰矊**锛氫娇鐢?鎮?绉板懠PI
|
||||
4. **寮曞<E5AFAE>琛屽姩**锛氬<E9949B>闇€鏇村<E98F87>璇︾粏淇℃伅锛屽缓璁<E7BC93>煡鐪嬪畬鏁存枃妗f垨鐧诲綍REDCap绯荤粺
|
||||
`;
|
||||
|
||||
@@ -369,19 +369,19 @@ if (difyKnowledge) {
|
||||
}
|
||||
```
|
||||
|
||||
#### 防幻觉效果验证
|
||||
#### 闃插够瑙夋晥鏋滈獙璇?
|
||||
|
||||
测试结果显示:
|
||||
- ✅ 所有回答都明确引用数据来源
|
||||
- ✅ AI不再编造不存在的信息
|
||||
- ✅ 当文档不完整时,AI诚实告知
|
||||
- ✅ 准确率:100%(5次测试)
|
||||
娴嬭瘯缁撴灉鏄剧ず锛?
|
||||
- 鉁?鎵€鏈夊洖绛旈兘鏄庣‘寮曠敤鏁版嵁鏉ユ簮
|
||||
- 鉁?AI涓嶅啀缂栭€犱笉瀛樺湪鐨勪俊鎭?
|
||||
- 鉁?褰撴枃妗d笉瀹屾暣鏃讹紝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> 姝e湪鏌ヨ<E98F8C>锛岃<E9949B>绋嶅€?.."
|
||||
4. **涓诲姩鎺ㄩ€?*: 閫氳繃浼佷笟寰<E7AC9F>俊API鍙戦€佸洖澶?
|
||||
|
||||
#### 技术实现
|
||||
#### 鎶€鏈<EFBFBD>疄鐜?
|
||||
|
||||
```typescript
|
||||
// backend/src/modules/iit-manager/controllers/WechatCallbackController.ts
|
||||
async handlePost(request: FastifyRequest, reply: FastifyReply) {
|
||||
// 1. 立即返回200(5秒内)
|
||||
// 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> 姝e湪鏌ヨ<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 API(SQL查询)
|
||||
└→ 返回患者记录
|
||||
↓
|
||||
3. 上下文组装
|
||||
鈹斺啋 REDCap API锛圫QL鏌ヨ<EFBFBD>锛?
|
||||
鈹斺啋 杩斿洖鎮h€呰<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本地部署 | 自建向量库、云服务 | 数据安全,响应快,成本低,易维护 |
|
||||
| **向量数据库** | Qdrant(Dify内置) | 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浼氳嚜鍔ㄤ粠鐭ヨ瘑搴撲腑妫€绱㈡枃妗o紱褰撹<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) {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,84 +1,76 @@
|
||||
# **IIT Manager Agent 智能问答与混合检索解决方案 (ReAct 业务闭环版)**
|
||||
# **IIT Manager Agent <EFBFBD>箄<EFBFBD><EFBFBD>桃<EFBFBD>銝擧毽<EFBFBD><EFBFBD><EFBFBD>蝝Z圾<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>蝝U<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 (璉<>蝝W<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>蝝X𧒄嚗淾gent <20>舀覔<E88880>桅䔮憸条掩<E69DA1>页<EFBFBD><E9A1B5>格䲮獢<E4B2AE><E78DA2><EFBFBD>舫䔮<E888AB>冽𥁒嚗厰<E59A97>朞<EFBFBD> Metadata 蝻拙<E89DBB>璉<EFBFBD>蝝Z<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>𤑳鍂鈭擧䰻霂a<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>Y<EFBFBD><EFBCB9>笔<EFBFBD>嚗麨<E59A97>?\-\> 霂瑟䰻 \`doc\_category='report'\`<EFBFBD>?
|
||||
2\. \*\*<2A>單<EFBFBD>嚗𡁏䰻霂W<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 璉<>蝝V<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
|
||||
@@ -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。
|
||||
|
||||
### **流程 B:AI 增强录入 (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>的设定ã€
|
||||
@@ -1,92 +1,80 @@
|
||||
# **文档 B:EDC 适配器 (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>蝥Z𠧧<EFBCBA>?
|
||||
## **5\. 摰匧<E691B0>銝舘恕霂<E68195>挽霈?(Security)**
|
||||
|
||||
## **5\. 安全与认证设计 (Security)**
|
||||
|
||||
* **双重 Token 校验**:
|
||||
* **系统级**:EM 访问 Node.js 时,Headers 携带 X-Signature(HMAC-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>
|
||||
Reference in New Issue
Block a user