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,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
|
||||
Reference in New Issue
Block a user