乐于分享
好东西不私藏

Nature 揭密 AI 医生 MIRA:从问诊到手术全流程上岗

Nature 揭密 AI 医生 MIRA:从问诊到手术全流程上岗

2026 年 6 月 17 日,海德堡大学医院团队在《Nature》发表论文 Towards autonomous medical artificial intelligence agents,把一个名为 MIRA(Medical Intelligence for Reasoning and Action) 的自主医疗 AI 智能体送进了沙盒电子病历系统。MIRA 不再像过去那些"会答题的医疗大模型"一样只输出文字建议,而是像一名值班医生一样,自己开检查、自己读结果、自己开药、自己安排手术

这背后的数字足够引发整个行业的警觉:在 574 个急诊病例的回顾性测试中,MIRA 平均诊断准确率 88.9%;在与真实医生同台对比的 311 例中,MIRA 87.8% vs 主治级别医生 78.1%。在胰腺炎这个具体病种上,差距更夸张:MIRA 95.2%,主治级别医生 78.6%,混合资历医生队列 61.9%。

这不是又一次"AI 击败医生"的流量剧本,而是一份关于医疗 AI 行动边界的人机对照实验报告。 它真正在回答的问题是:当大模型从聊天框走进电子病历,临床流程会被怎样重写?

一、MIRA 是什么:一个会"办事"的医疗代理

过去几年,医疗大模型的主流形态是"问答系统":输入症状,输出可能诊断;输入检查报告,输出鉴别诊断列表。这种形式在结构化考试题上表现亮眼,却与真实的临床决策链相距甚远。

MIRA 的关键变化,是从静态问答系统变成了能在电子病历里执行临床流程的代理系统(agentic system)。

研究团队基于 MIMIC-IV 数据库构建了 574 个急诊病例。MIMIC-IV 是一个去标识化的电子健康记录数据库,覆盖约 30 万名在美国 Beth Israel Deaconess Medical Center 接受治疗的患者。研究选择了 8 类目标疾病:阑尾炎、胆囊炎、憩室炎、胰腺炎、肺炎、尿路感染、肺栓塞和胰腺癌。这八类疾病覆盖腹痛、咳嗽、呼吸困难、发热等急诊常见主诉,也包含胰腺癌这种低频但高风险的场景。

MIRA 在沙盒电子病历里可以使用 11 类工具,覆盖超过 85,000 个临床选项,包括:

  • • 病史询问(structured HPI intake)
  • • 体格检查(physical exam orders)
  • • 血液检查、尿液检查、微生物学检查
  • • 影像学检查(CT、超声、X 光)
  • • 药物医嘱(prescription)
  • • 手术或操作检索
  • • 操作申请(procedure requests)
  • • 诊疗计划
  • • 入院决策

更关键的是,这些操作不是自由文本幻想,而是被映射到 FHIR(Fast Healthcare Interoperability Resources)框架,并兼容 ICD、LOINC、ATC、NDC、RxNorm 和 SNOMED-CT 等编码体系。换句话说,MIRA 不是在"建议医生可以考虑开个检查",而是在模拟一个能生成结构化医嘱的电子病历使用者。

MIRA 不直接调用真实医院系统,所有动作都发生在一个高保真沙盒环境里。这套环境复刻了真实电子病历的接口和编码体系,让模型可以在不接触真实患者数据的前提下完成完整诊疗闭环。

二、先别看准确率:患者代理的"防漏题"设计

这类研究有一个最容易被忽略的前提:如果"患者"本身是 AI 模拟的,它会不会偷偷泄露答案? 比如病人一开口就说"我得了胰腺癌",那再高的诊断准确率都没有意义。

研究团队专门评估了患者代理(patient agent)的稳定性、忠实度和抗攻击能力。患者代理只能根据病历中的现病史(HPI)回答问题,不能凭空补充信息。

关键数据:

  • • 在 622 组可评估问答中,同一个问题换一种说法提出时,患者代理给出内容一致回答的比例达到 99.4%
  • • 与原始现病史保持一致的比例:原始回答 99.3%,改写问题后的回答 99.1%。
  • • 独立大语言模型作为评估者复核:问答一致性 98.9%,与现病史一致性分别为 98.5% 和 97.8%。
  • • 在 933 次病例对话中,提前泄露诊断信息 0 例(置信区间 0.0%–0.4%)。
  • • 研究人员设计了 11 种提示注入和社会工程攻击方式,覆盖 80 个病例、共 880 次攻击提示。结果仍然没有观察到提前诊断泄露。

这个环节至关重要。它说明后续 MIRA 与医生的对比结果,不是建立在"患者已经告诉医生答案"的漏题环境上。

三、诊断环节:MIRA 不是总赢,但总体明显更强

在完整的 574 个病例中,MIRA 的平均诊断准确率为 88.9%。但更值得看的是分病种表现:

病种病例数MIRA 准确率
阑尾炎14898.6%(146/148)
胰腺炎92.3%
尿路感染77.6%
肺炎72.4%

规律很清晰:阑尾炎、胰腺炎这类在急诊中有清晰症状路径、实验室指标和影像标准的疾病,MIRA 表现接近天花板;而肺炎和尿路感染受基础疾病、非典型表现、影像解释和污染因素影响更大,模型表现显著下降。

研究团队进一步挑选了 311 个病例,让 MIRA 与真实医生在相同条件下对比。对照组包括两个队列:4 名主治级别医生组成的"专科组",4 名住院医师和 2 名主治级别医生组成的"混合资历组"。

核心对比数据:

组别平均诊断准确率
MIRA87.8%
主治级别医生78.1%
混合资历医生71.1%

在胰腺炎病例中,差距被进一步拉大:MIRA 95.2% vs 主治级别医生 78.6% vs 混合队列 61.9%。

但 MIRA 并非在所有病种上形成压倒性优势。 肺栓塞和胆囊炎中,差异较小;胰腺癌中,MIRA 与主治级别医生表现相当。这个细节比单一平均值更值得重视:AI 的优势首先出现在规则较清晰、流程较结构化、信息可被电子病历充分表达的场景中。

四、检查规划:MIRA 没有"乱开单"

医疗 AI 一旦能下医嘱,最直接的担忧是:它会不会为了安全把所有检查都开一遍?

研究给出的答案比想象复杂。MIRA 确实比医生更常请求体格检查和更多血液指标。在 574 个病例中,MIRA 请求体格检查的比例为 97.0%;在与主治级别医生对比的子集中,MIRA 为 97.1%,医生为 87.8%。 在憩室炎、胰腺炎、肺炎、肺栓塞和尿路感染中,MIRA 请求体格检查的比例达到 100%。

血液检查方面,MIRA 覆盖了 MIMIC-IV 中记录血液指标的约 51.1%,而主治级别医生为 28.3%,混合队列为 34.6%。也就是说,MIRA 更愿意"多看一些低成本信息"。但它并没有把所有化验都点满:MIRA 请求的血液指标仍只有常规数据基线的一半左右。

影像检查的对比更有意思:

  • • MIRA 与 MIMIC-IV 影像检查的匹配率 55.3%
  • • 主治级别医生 61.5%
  • • 混合队列 62.5%

MIRA 并没有系统性增加高成本影像检查;在不一致的配对中,反而是医生更倾向于请求更多影像。

判断 AI 是否"过度医疗",不能只看检查总数,而要区分检查类型、边际成本、辐射暴露、临床收益和替代路径。 MIRA 增加的主要是血液指标,而不是 CT 这类高成本检查。

五、治疗操作:外科路径越标准,AI 优势越明显

研究评估了 MIRA 对治疗性操作的识别能力。

阑尾炎中,MIRA 精准匹配了所有腹腔镜阑尾切除术(laparoscopic appendectomy):124 例中 124 例,匹配率 100%。 胆囊炎中,腹腔镜胆囊切除术(laparoscopic cholecystectomy)匹配率为 90.6%。

在与主治级别医生的对比中,MIRA 识别并请求相关操作的总体召回率为 53.5%,医生为 38.3%。在阑尾炎和胆囊炎这类外科路径明确的疾病中,MIRA 优势尤其明显。

不过,在胰腺炎、胰腺癌、肺栓塞和憩室炎等场景中,操作匹配率较低,部分原因是相关操作更少、更复杂,或者不同编码之间存在粒度差异。

当临床路径高度标准化时,AI 代理可能迅速接近甚至超过常规执行水平;但当决策涉及复杂背景、长期计划或多学科判断时,模型表现仍受限于数据、工具和评价标准。

六、用药安全:最接近真实临床风险的一组数据

医疗 AI 真正进入临床,最让人担心的不是答错一道题,而是开错药、漏掉过敏、忽略肾功能、制造药物相互作用。

研究团队对 56 个患者输出进行了病例级安全评估,覆盖 6 个风险域:

  1. 1. 高严重度药物相互作用(high-severity drug–drug interaction)
  2. 2. 肾功能剂量调整
  3. 3. 过敏-药物不匹配
  4. 4. QT 风险用药
  5. 5. 不安全阿片处方
  6. 6. 治疗重复

结果显示:MIRA 没有出现高严重度药物相互作用、肾功能剂量不兼容、过敏-药物不匹配、QT 风险处方或不安全阿片处方。 治疗重复出现 3 例,占 5%,包括重复开具昂丹司琼、华法林与依诺肝素重叠、以及高钾血症处理中胰岛素/葡萄糖推注表述不够明确。研究人员认为这些处方本身在临床上有合理性,但剂量说明可以更清楚。

在药物层面,MIRA 共生成 468 条处方。细节拆解如下:

字段正确条数正确率
自由文本剂量说明467/46899.8%
剂量数值457/46897.6%
剂量单位460/46898.3%
给药频次464/46899.1%
给药途径453/46897.0%(错误最多)

这个结果很强,但并不等于可以自动放行。 临床用药的风险常常来自边界病例:肾功能快速变化、患者自述不完整、药物名称相似、院内替代药、临时医嘱和长期医嘱叠加。MIRA 在沙盒中表现稳定,但真实世界会更嘈杂。

七、入院决策:MIRA 更偏"谨慎"

研究还测试了 MIRA 能否判断患者应该入院还是急诊出院,重点选择肺炎和肺栓塞,因为这两类疾病有常用风险评分:肺炎参考 CURB-65,肺栓塞参考 sPESI(simplified pulmonary embolism severity index)。研究没有把评分结果直接告诉 MIRA,只提供基础临床数据,让它自己判断。

肺栓塞 40 例: MIRA 没有漏掉需要入院的患者,召回率 1.00;特异性 0.70,准确率 0.85。换句话说,它倾向于多收一些肺栓塞患者。

肺炎: 召回率 1.00;特异性 0.86,准确率 0.93。同样没有漏掉需要入院者。

这是一种临床上可以理解的错误方向:宁愿多收不愿漏收高风险患者。但医疗系统不能无限承受"保守性过度入院"。如果未来这类系统被使用,资源管理(resource stewardship)必须成为模型目标的一部分,而不是事后补丁

八、API 集成示例:如何把 MIRA 思路接入自家系统

虽然 MIRA 论文没有公开完整代码,但沙盒 EHR 的核心交互模式可以参考以下伪代码实现。这是一个可直接落到生产环境的最小可执行框架

# mira_agent.py
# 自主医疗 AI 代理的最小集成示例

from
 typing import List, Dict
import
 json

class
 EHRClient:
    """沙盒电子病历客户端,封装 FHIR 接口"""

    def
 __init__(self, base_url: str):
        self
.base_url = base_url
        self
.session_token = None

    def
 login(self, doctor_id: str) -> None:
        # 真实环境需对接 OAuth2 / 院内 CA

        self
.session_token = f"token_for_{doctor_id}"

    def
 get_patient_hpi(self, patient_id: str) -> str:
        # 拉取主诉与现病史

        return
 f"Patient {patient_id}: 腹痛 6 小时, 转移性右下腹痛"

    def
 order_exam(self, code: str, system: str = "LOINC") -> Dict:
        # 下立检查医嘱,code 必须是标准编码

        return
 {"order_id": f"ord_{code}", "code": code, "system": system}

    def
 prescribe(self, drug_atc: str, dose: str, route: str) -> Dict:
        # 开立处方,drug_atc 必须是 ATC 编码

        return
 {"rx_id": f"rx_{drug_atc}", "atc": drug_atc, "dose": dose, "route": route}

    def
 get_lab_result(self, order_id: str) -> Dict:
        # 拉取检查结果

        return
 {"order_id": order_id, "value": "WBC 14.2", "abnormal": True}


class
 MIRAAgent:
    """MIRA 风格的自主医疗代理"""

    TOOL_REGISTRY = {
        "history"
: "patient_agent.query",        # 病史追问
        "exam"
:    "ehr.order_exam",              # 体格检查
        "lab"
:     "ehr.order_exam",              # 实验室检查
        "imaging"
: "ehr.order_exam",              # 影像学检查
        "drug"
:    "ehr.prescribe",               # 药物医嘱
        "procedure"
: "ehr.order_procedure",       # 手术或操作
        "disposition"
: "ehr.decide_admission",    # 入院或出院
    }

    def
 __init__(self, llm, ehr: EHRClient):
        self
.llm = llm
        self
.ehr = ehr
        self
.trace = []  # 审计轨迹

    def
 run(self, patient_id: str, max_steps: int = 20) -> Dict:
        hpi = self.ehr.get_patient_hpi(patient_id)
        self
._log("start", {"hpi": hpi})

        for
 step in range(max_steps):
            # LLM 基于当前状态决定下一步动作

            action = self.llm.decide_next_action(
                hpi=hpi,
                trace=self.trace,
                tools=self.TOOL_REGISTRY,
            )

            # 执行工具调用

            if
 action["type"] == "disposition":
                decision = self.ehr.decide_admission(patient_id, action["payload"])
                self
._log("disposition", decision)
                return
 decision

            elif
 action["type"] in ("exam", "lab", "imaging"):
                result = self.ehr.order_exam(action["code"])
                # 同步拉取结果(如已就绪)

                result.update(self.ehr.get_lab_result(result["order_id"]))
                self
._log(action["type"], result)

            elif
 action["type"] == "drug":
                rx = self.ehr.prescribe(
                    action["atc_code"], action["dose"], action["route"]
                )
                self
._log("drug", rx)

            # 安全护栏:超长循环强制终止

            if
 step >= max_steps - 1:
                self
._log("timeout", {"patient": patient_id})
                return
 {"decision": "escalate_to_human"}

        return
 {"decision": "incomplete"}

    def
 _log(self, action_type: str, payload: Dict) -> None:
        # 审计轨迹:每一次工具调用都应留痕

        self
.trace.append({
            "ts"
: "iso8601",
            "action"
: action_type,
            "payload"
: payload,
        })


# 使用示例

ehr = EHRClient(base_url="https://ehr-sandbox.hospital.local")
ehr.login(doctor_id="mira_01")
agent = MIRAAgent(llm=your_llm_client, ehr=ehr)
result = agent.run(patient_id="P-2026-06-29-001")
print
(json.dumps(result, ensure_ascii=False, indent=2))

生产环境必须配套的几个安全护栏:

  1. 1. 审计轨迹self.trace 不应只存内存,需实时落库。监管要求每次医嘱生成都可追溯。
  2. 2. 人类否决权:所有"高严重度"动作(手术、化疗药物)必须人工复核。
  3. 3. 编码校验:LLM 输出的 code / atc_code 必须经 FHIR 术语服务器二次校验,防止幻觉。
  4. 4. 超时熔断max_steps 默认 20,超出强制转人工。
  5. 5. 人机对话日志:患者代理的回答必须可回放,便于事后追责。

九、局限与争议:为什么这还不是终点

研究团队没有回避 MIRA 的局限。客观讲,至少有四类问题需要在下一阶段解决。

第一,仿真与真实的差距。 所有患者互动都来自现病史文本模拟,真实急诊患者的表达更混乱,可能遗漏、误解、矛盾甚至无法沟通。真实诊室中还有眼神、姿态、犹豫、不愿透露的隐私信息,这些都不在 HPI 文本里。

第二,数据污染风险。 MIMIC-IV 是公开给合规研究者使用的数据集,不能完全排除训练数据重叠的可能。如果 MIRA 训练过程中接触过 MIMIC-IV 的某些病例,性能就可能偏高。这要求团队在评测时严格做"未参与训练"的数据切分。

第三,沙盒环境未对接真实系统。 真实医院有跨系统数据断裂、医患沟通、突发变化、伦理审查、责任划分等问题,沙盒环境无法复刻这些。

第四,资源与公平的隐性偏差。 MIRA 在结构化病种上表现强,在非典型表现上表现弱。这意味着在罕见病、复杂共病、老年或儿童患者群体中,AI 的可靠性可能下降。如果这类工具被优先部署到资源紧张的基层,反而可能放大医疗不平等。

十、下一阶段的核心问题

MIRA 给出的不是终点,而是一个明确的信号:医疗 AI 正在从"回答医学问题"走向"参与医疗流程"。

这一步的临床价值很大,风险也同样真实。下一阶段的关键,已经不是问 AI 能不能像医生,而是问医疗系统能否被设计得足够安全、透明、可控,让 AI 的能力真正服务于患者和医生

具体到工程层面,至少有三个问题需要在落地前明确:

  • 谁授权 AI 行动,谁监督 AI 行动,又由谁为 AI 的行动负责。 这是医疗 AI 与一般 AI 代理最本质的区别——出错代价是人的生命。
  • 哪些医嘱可以自动草拟,哪些必须人工确认。 MIRA 的"保守性过度入院"是模型偏好的体现,但系统设计者必须把规则写进前置约束,而不是寄希望于模型的"自觉"。
  • 模型每一次调用检查、调整药物、建议入院,是否都应留下可审计轨迹。 这是事后追责、临床研究、模型迭代的基础设施。第八节代码示例中的 self.trace 看似简单,实际是整个系统可信度的基石。

如果说过去的医疗 AI 像一本会说话的教科书,那么 MIRA 更像一个会操作电子病历的实习助手。 它能做很多事,也会犯错;它的价值不在于取代临床判断,而在于把医生从机械性流程中部分解放出来,同时把决策过程变得更可追踪、更结构化。

当 AI 开始拥有"行动能力",医院需要重新设计权限、监督和责任边界。这不是技术问题,是治理问题。