Files
AIclinicalresearch/docs/03-业务模块/IIT Manager Agent/00-系统设计/IIT Manager Agent V2.4:架构模式选型与 SOP 状态机推荐.md
HaHafeng 0c590854b5 docs(iit): Add IIT Manager Agent V2.9 development plan with multi-agent architecture
Features:
- Add V2.9 enhancements: Cron Skill, User Profiling, Feedback Loop, Multi-Intent Handling
- Create modular development plan documents (database, engines, services, memory, tasks)
- Add V2.5/V2.6/V2.8/V2.9 design documents for architecture evolution
- Add system design white papers and implementation guides

Architecture:
- Dual-Brain Architecture (SOP + ReAct engines)
- Three-layer memory system (Flow Log, Hot Memory, History Book)
- ProfilerService for personalized responses
- SchedulerService with Cron Skill support

Also includes:
- Frontend nginx config updates
- Backend test scripts for WeChat signature
- Database backup files

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-05 22:33:26 +08:00

191 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# **IIT Manager Agent V2.4:架构模式选型与 SOP 状态机推荐**
**核心议题:** ReAct vs Planner vs State Machine —— 谁更适合医疗质控?
**结论前置:** 弃用纯 Planner限制使用 ReAct全面拥抱 **SOP 状态机**
## **1\. 深度解析ReAct 与 Planner 适合我们吗?**
### **1.1 ReAct (Reasoning \+ Acting)**
* **原理**Agent 像人一样“自言自语”。
* *Thought*: "我需要查患者年龄。" \-\> *Action*: read\_data \-\> *Observation*: "16岁" \-\> *Thought*: "太小了,报错。"
* **在 IIT 中的地位****它就是你的 Engine B**。
* 你现有的 runAgentLoop 代码本质上就是一个 ReAct 循环。
* **优点**:灵活,能处理突发情况(比如发现数据缺了,它知道先去查)。
* **缺点**:容易陷入死循环(反复查同一个数据),或者在思考步骤中消耗大量 Token。
* **结论****保留使用**,但必须加“紧箍咒”(最大步数限制)。
### **1.2 Planner (Query-Planner-Execute-Reflect)**
* **原理**:先写大纲,再干活。
* *Plan*: 1\. 查总人数; 2\. 算脱落率; 3\. 写周报; 4\. 反思哪里写得不好。
* **在 IIT 中的地位****仅适合“项目管理 Agent” (周报/统计)**。
* 对于“数据质控”这种秒级响应的任务Planner 太慢了(光生成计划就要 5-10 秒)。
* **缺点**:对于 2 人团队,实现一个稳定的 Planner 很难(需要维护计划状态、断点恢复)。
* **结论****质控场景禁用,报表场景可选**。
## **2\. 终极推荐SOP 状态机 (SOP-Driven State Machine)**
为什么医疗行业GCP最看重 Protocol方案因为临床研究本质上就是一个**巨大的流程图**。
我们应该让 Agent **“照着流程图走”**,而不是让它“只有个模糊目标自己瞎想”。
### **2.1 什么是 SOP 状态机架构?**
把你的 Skills JSON 进化成一个**有向图 (DAG)** 或 **流程图**
* **节点 (Node)**:一个具体的检查步骤(可以是硬规则,也可以是软指令)。
* **边 (Edge)**:下一步走哪里(通过了走 A没通过走 B
### **2.2 为什么它既稳又活?**
* **稳 (Stability)**流程是写死的先查年龄再查病史最后查合并用药。Agent 不会乱跳步骤,不会漏查。
* **活 (Flexibility)**:每个节点内部可以用 AIEngine B来灵活判断。
## **3\. 落地实施:如何改造 Skills JSON**
我们将 V2.1 的扁平配置升级为**流程配置**。
### **3.1 新的 Skill 结构 (qc\_process.json)**
{
"name": "肺癌入排质控流程",
"start\_node": "check\_age", // 入口
"nodes": {
// 节点 1: 硬规则 (CPU 执行)
"check\_age": {
"type": "hard\_rule",
"logic": { "\>=": \[{ "var": "age" }, 18\] },
"on\_pass": "check\_history", // 通过了,去查病史
"on\_fail": "end\_with\_error" // 没通过,直接结束
},
// 节点 2: 软指令 (AI 执行 \- ReAct 模式)
"check\_history": {
"type": "soft\_instruction",
"instruction": "检查病史描述,排除'间质性肺炎'。",
"tools": \["read\_clinical\_data"\],
"on\_pass": "check\_meds",
"on\_fail": "review\_required" // AI 觉得有问题,转人工复核
},
// 节点 3: 复杂逻辑 (AI 执行)
"check\_meds": {
"type": "soft\_instruction",
"instruction": "检查合并用药,排除靶向药。",
"on\_pass": "end\_success",
"on\_fail": "review\_required"
}
}
}
## **4\. 代码实现:极简状态机引擎**
不要引入 XState 这种复杂库2 人团队自己写个 while 循环就够了。
// backend/src/modules/iit-manager/services/SopEngine.ts
class SopEngine {
async run(skillConfig: any, data: any) {
let currentNodeId \= skillConfig.start\_node;
let context \= { ...data }; // 共享上下文
while (currentNodeId && currentNodeId \!== 'end') {
const node \= skillConfig.nodes\[currentNodeId\];
console.log(\`\[SOP\] Executing node: ${currentNodeId}\`);
let result;
if (node.type \=== 'hard\_rule') {
// 调用 Engine A (V2.1 的逻辑)
result \= this.runHardRule(node, context);
} else if (node.type \=== 'soft\_instruction') {
// 调用 Engine B (ReAct 模式)
result \= await this.runSoftAgent(node, context);
}
// 状态流转
if (result.passed) {
currentNodeId \= node.on\_pass;
} else {
if (node.on\_fail \=== 'end\_with\_error') {
await this.saveShadowQuery(result.message);
return;
}
currentNodeId \= node.on\_fail;
}
}
}
}
## **5\. 架构对比总结表**
| 架构模式 | 稳定性 | 灵活性 | 复杂度 | 适用场景 | 推荐指数 |
| :---- | :---- | :---- | :---- | :---- | :---- |
| **ReAct (V2.1 Engine B)** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 中 | 单点模糊判断 (如: 这段话是不是病史) | ✅ **局部使用** |
| **Planner** | ⭐⭐ | ⭐⭐⭐⭐ | 高 | 复杂任务规划 (如: 生成全项目总结) | ❌ **质控不用** |
| **SOP 状态机 (V2.4)** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 低 | **临床试验全流程控制** (SOP 落地) | 👑 **核心架构** |
## **6\. 深度释疑SOP 会导致僵化吗?(Flexibility Check)**
针对你担心的“每个字段都要配流程”和“浪费 LLM 能力”的问题,我们需要纠正一个认知误区。
### **6.1 误区SOP \= 细粒度代码逻辑**
* **错误做法**:把 400 个变量写成 400 个节点。节点1: 查年龄 \-\> 节点2: 查性别 \-\> 节点3: 查身高...
* **后果**:配置地狱,灵活性为零。
### **6.2 正解SOP \= 粗粒度业务阶段 (Phases)**
我们通过 **“粗颗粒度节点”** 来充分释放 LLM 的能力。一个 SOP 可能只有 3 个节点,但涵盖了无数逻辑。
* **节点 A (基线硬扫描)**
* **类型**硬规则Hard Rule
* **内容**:一次性加载 50 条 JSON Logic 规则。
* **执行**CPU 毫秒级跑完所有数值校验(年龄、身高、体重、化验值范围)。
* **配置**:这是一个列表,不是流程图,配置很简单。
* **节点 B (AI 综合研判)**
* **类型**软指令Soft Instruction / ReAct
* **Prompt**:“请作为医学专家,阅读患者的‘现病史’、‘既往史’和‘手术史’。请综合判断是否存在:严重心血管疾病、未控制的高血压或活动性感染。如果有,请引用原文说明。”
* **LLM 的灵活性**
* 在这个节点**内部**LLM 是完全自由的。
* 它可以自己决定先看现病史还是既往史。
* 它可以自己判断“高血压二级”算不算“未控制”。
* **它依然在用 ReAct 调用工具**,只是我们把它限制在了“检查病史”这个大阶段里,不让它跑去“检查知情同意书”。
### **6.3 实战推演:如何拆解一个 400 变量的项目?**
假设你的项目有 10 个表400 个变量。
| 数据类型 | 变量数量 | 举例 | 处理策略 | 节点归属 |
| :---- | :---- | :---- | :---- | :---- |
| **人口学/基线** | 20 个 | 年龄、性别、身高、体重 | **Hard Rule** | **节点 A (基线检查)** |
| **实验室检查** | 300 个 | 血常规、生化、尿常规 | **Hard Rule** | **节点 A (基线检查)** |
| **体格检查** | 50 个 | 心率、血压、体温 | **Hard Rule** | **节点 A (基线检查)** |
| **既往病史** | 5 个 | 自由文本描述 | **Soft Instruction** | **节点 B (病史研判)** |
| **合并用药** | 5 个 | 自由文本药名 | **Soft Instruction** | **节点 C (用药研判)** |
| **不良事件** | 20 个 | 严重程度、转归情况 | **Soft Instruction** | **节点 D (安全监控)** |
**结论**
* 尽管有 400 个变量,**SOP 流程图里其实只有 4 个节点**。
* 你只需要写 **3 条** AI 指令(针对节点 B, C, D
* 剩下的 370 个变量,全部用简单的 JSON 规则批量处理。
**这不仅没有浪费 LLM 的能力,反而让它更专注(只处理那 30 个最难的变量),并帮你省下了巨额的 Token 费用。**
## **7\. 给 2 人团队的行动指南**
1. **宏观上用 SOP**
* 临床研究最讲究 SOP。用 JSON 定义好“先查A再查B最后查C”的流程。这能保证你的系统像瑞士钟表一样稳定。
* 这解决了“不知道 AI 会不会乱跑”的恐惧。
2. **微观上用 ReAct**
* 在 SOP 的某个具体节点(比如“检查病史”节点)里,允许 AI 使用 ReAct 模式(思考-查库-判断)。
* 这保留了处理非结构化数据的灵活性。
3. **实现路径**
* Phase 2.1: 先把之前的 hard\_rules 列表改成简单的 nodes 结构(线性执行)。
* Phase 2.2: 在 nodes 里增加 on\_pass / on\_fail 跳转逻辑。
**一句话总结:用 SOP (状态机) 管住 Agent 的腿(流程),用 ReAct 管住 Agent 的嘴(推理)。这就是既稳定又灵活的最佳实践。**