文章 Lilian Huang · 七月 23 5m read

Triage Park:基于IRIS的多智能体临床平台

InterSystems 编程竞赛: https://openexchange.intersystems.com/contest/46上的 FHIR 人工智能代理 。 

代码: https://github.com/eungi-hong/central-park

演示: https://triagepark.78-47-167-98.sslip.io/ 


就诊的前十分钟总是千篇一律:采集病史、调取病历、核对用药情况、判断病情紧急程度。Triage Park通过一支完全在 InterSystems IRIS for Health 内部运行的 AI 代理团队来完成这一初步筛查,并向临床医生提供一份附有依据且可解释的交接报告。 大多数“AI分诊”演示所忽略的部分,恰恰是我们最重视的:安全性。这里的所有安全机制都是确定性的且单向的。系统只能提高病例的紧急程度,绝不会降低,因此患者的安全绝不会取决于模型是否判断正确。

代理、检查与技能

该平台经过刻意划分:需要大量判断的工作以代理的形式运行(即使用工具的循环,负责决策和执行),安全关键型工作以确定性检查的形式运行(基于规则,而非大型语言模型),其余部分则专注于大型语言模型技能。 一个监督协调器将请求路由到相应组件,并在需要时串联多个组件,所有操作均在单个 IRIS 互操作性生产环境中进行,因此每次分诊都可在 Visual Trace 中形成可追溯的 Ens.MessageHeader 记录。

能力 类型 写入
协调器 监督代理 (路由 + 将其余部分串联起来)
分诊推理器 代理(工具循环) Encounter, ServiceRequest, Communication
自适应接案访谈(多语言) 代理(自适应循环) QuestionnaireResponse
副驾驶 智能体(只读工具循环) -
评审员 LLM 批评者 (仅限升级处理)
风险预警关口安全/交互 确定性检查 DetectedIssue
护理缺口结果随访 确定性检查 Task
队列分析 确定性(批处理) -
风险 集成机器学习/启发式 -
摘要检查结果说明护理计划自然语言→FHIR查询 大语言模型技能 CarePlan(护理计划)

输入“总结该患者情况、检查再入院风险并标记护理缺口”,协调器将 summary → risk → gaps 整合为一个答案。控制台展示的工作列表包含关键绩效指标(KPI)、队列分析、基于自然语言的 FHIR Explore 视图,以及由协调器驱动的助手。 每个病例均仅基于FHIR数据进行可解释的重建。

自首次提交以来的更新

首次提交仅是在“红旗”门控机制后的一次单一分诊LLM调用。此后,它已发展成为一个平台:

领域 首次提交 当前
分诊推理 一次LLM调用 带约束的工具使用ReAct循环 + 一个自我批判式审阅器
接收 固定问题形式 自适应、多语言访谈
安全 仅设“红旗”门槛 筛查环节外加确定性的用药/过敏检查,结果记录为 DetectedIssue
范围 一名分诊员 由一名主管协调员领导的一组人员
新功能 (无) 集成机器学习风险评估、队列分析、自然语言→FHIR查询
FHIR写回 5种资源类型 8(新增 DetectedIssueTaskCarePlan

核心原则未变:安全性始终保持确定性且单向性。所有新增功能均在此基础上构建,绝不绕过这一基础。

安全底层

分诊流程是一个 LangGraph 状态机,包含三个单向安全层:

gather_context → check_safety → validate_red_flags → reason (tool loop) → verify → escalate
  • 红旗闸门(不使用LLM):绝对不能遗漏的短语(中风、气道阻塞、过敏性休克、出血、晕厥、自杀意念)将直接跳转至急诊科,并设有否定条件,因此“无言语含糊”等情况不会触发。
  • 药物相互作用检查(不使用LLM):将药物和过敏史与主诉进行交叉比对,写入 DetectedIssue,并设定分诊层级。例如,一名正在服用ACE抑制剂且报告面部肿胀的患者,在生成令牌之前会被升级为血管性水肿。
  • 审核员:剔除任何未实际检索到的引用,随后可升级但绝不降级:
if verdict == "escalate":
    final_level = _higher(level, proposed)   # escalate-only by construction

在门控和审核员之间,reason是一个有界ReAct循环:代理在确定处理方案前会获取更多指南、具体观察结果或风险评分,且始终能得到解决。 遗漏的关键字、虚构的引用或过于自信的模型,都只会使分诊结果更加审慎。

IRIS原生功能,非后加组件

  • 向量搜索:将 VECTOR(float, 1536) 作为指南语料库,通过 VECTOR_COSINE 进行查询;IRIS 通过 %Embedding.OpenAI(AI Hub)在服务器端计算嵌入向量。
  • IntegratedMLCREATE MODEL / TRAIN MODEL + 行级 PREDICT 用于再入院风险评估,作为工具进行参考。
  • 互操作性:每次分诊都会在 Visual Trace 中生成一条可追溯的消息。
  • FHIR R4:读取上下文,写入8种资源类型;叙述内容保存在 ServiceRequest 上,因此无需重新运行LLM即可全面复查过往病例。

两点诚恳说明

  • 采用 Sidecar 模式,而非嵌入式 Python。该代理仍是一流的业务操作,但此镜像中的 ARM64 嵌入式 Python 不稳定,因此 LangGraph 堆栈在 Sidecar 中运行,以确保每个评判者都能可靠启动。
  • IntegratedML 处于禁用状态CP_ENABLE_ML=0 针对 ARM64,因为 AutoML 需要相同的运行时环境)。风险代理会回退到带标签的启发式算法,因此它在任何环境下都可用,并且在 x86 平台上只需一个标志即可完全启用。

试试看

git clone https://github.com/eungi-hong/central-park.git
cd central-park && cp .env.example .env   # set OPENAI_API_KEY=sk-...
docker compose up --build                  # IRIS cold start ~90s

打开 http://localhost:8501,在 /intake 处让演示患者经历胸闷场景,观察病例的生成、分诊及引用过程。安全逻辑已通过单元测试: docker compose exec agent python -m pytest tests/ -q


这是 Hong Eungi 和 Antor Chowdhury 首次向 InterSystems Open Exchange 提交的贡献。如果您认同这种分层安全方法,欢迎在评论区为我们投票并提供反馈。