当静态框架遇到动态 AI:SaMD 监管十年

第二篇:N81,软件的"技术身份证"

N81 不打算解决 N12 在 AI 面前的分类困境。但它提出了另一个问题:传统风险管理标准 ISO 14971,管得了硬件的疲劳和断裂,但管不了软件的漏洞和漂移。描述软件的风险,需要一套新的语法。


一、硬件会疲劳,软件不会——但软件会过期

传统医疗器械的风险管理标准 ISO 14971,核心逻辑是 FMEA(Failure Mode and Effects Analysis,失效模式与影响分析)。它的基本假设很简单:东西会磨损。

手术刀的钢材会疲劳,电池会老化,密封圈会开裂。ISO 14971 要求厂商回答:这个部件可能在什么条件下失效?失效后对患者的伤害是什么?概率和严重度怎么权衡?

这套逻辑在硬件上跑得很顺。但搬到软件上,事情变得古怪起来。

一个训练好的深度学习模型,不会因为"用久了"而性能下降——至少不是因为物理磨损。但它的风险一点不比硬件少:

  • 它依赖的 Python 包明年停止维护,出现漏洞没人修。比如 2021 年 Log4j 事件,一个被广泛使用的日志库爆出远程代码执行漏洞,全球数百万系统受影响
  • 它底层调用的 OpenSSL 版本爆出 CVE,整个信任链崩塌
  • 训练数据里没有足够的特定人群样本,模型对这个群体系统性表现更差
  • 输入图像被加了一层人眼不可见的噪点,模型把良性肿瘤诊断为恶性
  • 真实世界的数据分布随季节、地域、人群变化,模型性能慢慢衰减

这些风险怎么塞进 ISO 14971 的 FMEA 表格?“失效模式"是什么?“概率"怎么估算?一个开源库的维护者突然弃坑,这算设计缺陷、制造缺陷、还是外部事件?

ISO 14971 没有给这些问题准备格子。它的整个语法都是为物理失效设计的。

N81 的核心贡献就是:监管机构终于承认,软件的风险需要单独刻画,不能硬塞进硬件的风险管理框架里。


二、N81 要你交什么:三张清单

N81 把软件的特征化拆成三个部分。下面是逐项拆解,以及可以拿来直接用的 checklist。

清单 1:预期用途声明(Intended Use Statement)

N81 要什么:不只是复制粘贴说明书。它要求一个边界清晰的定义——什么数据进、什么决策出、软件在医疗工作流程里扮演什么角色、跟谁交互。

为什么要这个:软件的风险很大程度上取决于它的"生态位”。同一个算法,输出给医生参考是一个风险画像,直接驱动治疗设备是另一个风险画像。

Checklist:

  • 输入定义:软件接收什么数据?格式是什么?(DICOM、HL7 FHIR、CSV、图像文件等)
  • 输出定义:软件生成什么结果?(概率分数、分类标签、 segmentation mask、诊断建议等)
  • 目标用户:谁用这个输出?(放射科医生、全科医生、患者、另一个软件系统)
  • 使用场景:在什么医疗环节使用?(筛查、辅助诊断、治疗计划制定、疗效评估、随访)
  • 决策层级:输出是"仅供参考”,还是驱动临床决策,还是直接输出诊断/治疗结论?
  • 交互系统:软件跟哪些外部系统通信?(PACS、HIS、EMR、云服务等)
  • 运行环境:部署在哪里?(本地工作站、医院内网服务器、公有云、边缘设备)

给你的模板框架

本软件 [名称] 是一款 [SaMD/SiMD],预期用于 [医疗目的]。软件接收 [输入数据类型],通过 [核心算法/处理逻辑] 生成 [输出类型],供 [目标用户][使用场景][如何使用输出结果]。软件运行于 [部署环境],与 [外部系统/接口] 交互。

常见的坑:很多厂商直接把说明书里的"适用范围"段落复制过来交差。N81 要的不是这个。它要的是软件在系统中的功能边界


清单 2:软件描述(Software Description)

N81 要什么:软件的架构、接口、依赖关系、AI/ML 组件。用 N81 的原话说,是"a comprehensive description of the software that provides an understanding of the software’s design, functionality, and behaviour"。

Checklist:

架构层面

  • 软件架构类型(单体 / 微服务 / 客户端-服务器 / 云原生)
  • 部署拓扑图(各组件在哪里运行、怎么通信)
  • 数据流图(数据从进入系统到输出结果的全路径)
  • 是否有持续学习 / 在线更新机制?

接口层面

  • 所有外部接口列表(API、文件导入导出、数据库连接、消息队列)
  • 通信协议(HTTP/HTTPS、DICOM、HL7、MQTT 等)
  • 认证和授权机制
  • 数据加密方式(传输中、静态存储)

依赖关系(SBOM)

  • 操作系统及版本
  • 编程语言运行时及版本
  • 所有第三方库和框架(名称、版本、许可证)
  • 开源组件清单(特别关注是否有停止维护的依赖)
  • 云平台/基础设施依赖(AWS、Azure、阿里云等)
  • 硬件依赖(GPU 型号、内存要求等)

AI/ML 组件(如果有)

  • 模型架构(CNN、Transformer、RNN、 ensemble 等)
  • 模型输入输出规格
  • 训练数据来源、规模、时间范围
  • 训练数据质控方法
  • 性能指标(AUC、灵敏度、特异度、PPV、NPV 等)
  • 在不同子群体上的性能差异
  • 模型版本控制方式
  • 模型更新/回滚机制

清单 3:软件特定风险(Software-Specific Risk Considerations)

N81 要什么:识别和描述软件特有的风险,而不是传统的临床风险。N81 列了一个非穷举的清单,下面是整理后的 checklist:

供应链风险

  • 第三方组件是否有已知的停止维护计划?
  • 开源库的社区活跃度如何?(贡献者数量、最近更新时间、issue 响应速度)
  • 关键依赖是否有商业支持替代方案?
  • 供应链上游(训练数据标注外包、云服务提供商)的可靠性评估

网络安全风险

  • 已知漏洞扫描结果(CVE 清单、CVSS 评分)
  • 攻击面分析(暴露的接口、默认凭证、未加密通信)
  • 数据完整性保护(防篡改、防重放、审计日志)
  • 更新机制的安全性(签名验证、防回滚、安全启动)

AI/ML 特有风险

  • 模型漂移监测机制(性能随时间衰减的阈值和报警)
  • 训练数据偏见评估(不同年龄、性别、种族、地域子群体的性能差异)
  • 对抗性攻击防御(输入验证、异常检测、对抗训练)
  • 数据投毒防护(训练数据来源验证、数据清洗流程)
  • 模型可解释性(黑箱模型的决策依据能否被医生理解)

互操作性风险

  • 与医院现有系统的兼容性(不同厂商 PACS、EMR 的对接测试)
  • 数据格式转换中的信息丢失风险
  • 并发使用时的资源竞争(多个医生同时调用 AI 分析)

配置和部署风险

  • 不同医院 IT 环境差异导致的性能不一致(防火墙规则、代理设置、时区配置)
  • 默认配置的安全性问题(开放端口、调试模式、默认密码)
  • 升级过程中的服务中断风险

三、怎么准备这些文档:别重复造轮子

看到上面的 checklist,你可能已经意识到了:N81 要求的东西,和安全团队平时做的 Threat Model、SBOM、架构文档、漏洞评估,大量重叠。 问题只是两套语言还没打通,厂商往往在交两套几乎一样的文档,只是换了个标题。

下面是一份实操指南,告诉你可以怎么"一鱼多吃"。

Step 1:从 Intended Use Statement 开始定边界

不要从"我要交监管文档"开始,从"我要理解这个软件在系统里干什么"开始。回答 checklist 里清单 1 的问题,同时满足:

  • N81 的 Intended Use Statement
  • 系统边界定义(后面做威胁建模和架构设计的基础)

关键原则: Intended Use Statement 写得越清楚,后面的软件描述和风险识别就越省力。边界模糊的地方,就是审评员会追问的地方。

Step 2:整理现有的架构图和 SBOM

你手上大概率已经有这些东西:

  • 系统架构图 / 数据流图
  • SBOM(SPDX 或 CycloneDX 格式)
  • 第三方组件清单
  • 模型文档(Model Card)

具体做法

  • 拿现有的数据流图,给每个节点加一句"这个模块干什么、用什么技术栈"
  • 拿现有的 SBOM,按 N81 要求的分类整理(第三方库、开源组件、AI/ML 组件、操作系统)
  • 如果有 AI 模型,单独整理一份 Model Card:架构、训练数据、性能指标、版本控制

一个小技巧:N81 不要求特定格式,但建议你在 Software Description 里显式标注 AI/ML 组件。不要让它藏在依赖清单里混过去。监管机构现在对 AI 部分格外敏感,主动标出来反而显得透明。

Step 3:从现有的安全评估导出 Software-Specific Risk

你手上大概率也已经有:

  • 威胁建模报告(STRIDE 或 Attack Tree)
  • 漏洞扫描报告
  • 网络安全风险评估
  • 渗透测试报告

做法:把这些报告里的发现,翻译到 N81 的监管语言里。

安全评估的说法N81 的监管语言
第三方开源库存在已知 CVE供应链风险:第三方组件的已知漏洞和维护状态
模型可能受到对抗性样本攻击AI/ML 特有风险:对抗性攻击导致模型输出错误
训练数据对某些人群覆盖不足AI/ML 特有风险:数据偏见导致模型在特定子群体上性能不佳
固件更新缺乏 anti-rollback 机制网络安全风险:软件更新机制被恶意利用
不同医院 IT 环境差异大配置和部署风险:环境差异导致的行为不可预测

关键原则:N81 不要求你重新做一套风险评估。它要求你证明你已经考虑了软件特有的风险,并且这些风险被纳入了整体风险管理。所以你可以直接引用已有的安全评估报告,只需要在前面加一页"映射说明"。

Step 4:跟 524B 的 Cybersecurity 文档复用

如果你在做美国市场,524B 要求提交:

  • Cybersecurity Management Plan
  • SBOM
  • 威胁建模文档
  • 安全控制实施证据

N81 要求的 Software Description 和 Software-Specific Risk,跟 524B 的文档包高度重叠。建议策略

  • SBOM:一份 SPDX/CycloneDX,同时满足 N81 和 524B
  • 架构图/数据流图:同一套图,N81 的 Software Description 里用文字描述,524B 的提交包里放图形
  • 威胁建模:同一份 Threat Model,N81 侧重点是"软件特定风险识别",524B 侧重点是"安全控制怎么 mitigation",互为补充
  • 已知漏洞评估:同一份漏洞扫描报告,两边都引用

唯一需要单独准备的是 Intended Use Statement——524B 不明确要求这个,但 N81 把它作为软件特征化的起点。


四、一个提醒:N81 不是终点

N81 解决的是"怎么描述软件"的问题,但它没有解决"怎么量化软件风险"的问题。它要求你交一份软件的"技术身份证",但没有告诉你这份身份证上的信息怎么映射到监管决策。

比如 N81 要求你描述 AI 模型的训练数据来源,但它没有说"训练数据覆盖不足到什么程度就不给批"。它要求你列出已知漏洞,但没有说"有几个 CVE 就触发拒绝"。

这些判断仍然是审评员的自由裁量权。N81 只是在要求你把信息交出来,为未来的标准化判断打基础。

从这个角度看,N81 和 SBOM 的运动是同一股浪潮:监管机构意识到,他们无法管理看不见的东西。先把软件的家谱和漏洞摊开在阳光下,才有资格谈动态监控、持续学习、风险分级。


N81 不是一份激动人心的文件, 但它标志着一个重要的转折点:医疗器械监管从"管设备"转向"管软件"的过程中,终于有人意识到,软件需要自己的语言。

ISO 14971 不会消失,硬件风险管理依然需要它。但软件的风险,得用软件的语法来描述。N81 就是在尝试建立这套语法。

下一篇,我们会把镜头拉远,看看 IMDRF SaMD 系列的全图——N10 给了身份,N12 给了分类,QMS 给了质量管理,N41 给了临床评价,N81 给了软件特征化。这五块拼图合在一起,才构成全球软件医疗器械监管的完整地图。


(未完待续)