中文EN
0012345678900123456789001234567890012345678900123456789

2026 — Adam. 保留所有权利。

    返回文章列表
    AI
    开源
    安全

    病历不让出内网,OpenMed 让医疗 NLP 跑在本地工作站上

    Adam
    2026年8月8日星期六
    2 分钟读完

    一、开篇:为什么你需要这个工具?

    医院信息科王主任最近遇到一个棘手问题:科室要上一个临床 NLP 系统,从电子病历里抽取疾病、药物、剂量。安全部门一句话卡死——「病历不能出医院内网」。他先后试了三个云端方案,每次都要走安全评估、签数据处理协议,预算报价单上写着年付 36 万起。

    这不是个例。医疗数据的合规要求让大量团队卡在「想用 AI 干点活」的第一步:HIPAA、GDPR、院内网络安全规定都在说同一件事——别把 PHI 发到外部 API。可一旦要求 100% 本地化,市面上能跑得动临床 NER 的开源方案屈指可数,而且大多数只支持英语。

    OpenMed 想解决的正是这个矛盾:本地跑、海量医疗模型、覆盖多语言 PII、自带去标识化能力。GitHub 4,976 stars,PyPI 月下载量超 340 万,已经在不少医院的内网工作站上稳定运行。

    二、项目简介:用一句话概括

    OpenMed 是一个本地优先(local-first)的医疗 AI 工具包,围绕临床命名实体识别(NER)和 HIPAA 对齐的 PII 去标识化两条主线展开,2,200+ 医疗模型、33 种 PII 语言、Apache-2.0 开源协议。核心运行时默认完全离线,数据不出内网,可部署在 CPU、CUDA、Apple MLX、Android ONNX 和浏览器上。SDK 用 Python,移动端配 Swift/Kotlin 双端,REST 服务、FHIR/HL7 互通、Transformers.js 导出都已就位。

    三、核心功能深度解析

    1. 临床 NER:识别疾病、药物、解剖、基因

    OpenMed 的模型目录覆盖五个垂直方向:disease_detection_superclinical(疾病/诊断,434M)、pharma_detection_superclinical(药物/治疗,434M)、pii_superclinical_large(PII,434M)、anatomy_detection_electramed(解剖/器官,109M)、gene_detection_genecorpus(基因/蛋白,109M)。一行代码即可调用:

    from openmed import analyze_text
    result = analyze_text(
        "Patient started on imatinib for chronic myeloid leukemia.",
        model_name="disease_detection_superclinical",
    )
    for entity in result.entities:
        print(f"{entity.label:<12} {entity.text:<28} {entity.confidence:.2f}")
    

    输出:DISEASE chronic myeloid leukemia 0.98;DRUG imatinib 0.95。这种开箱即用的 API 形态让临床 NLP 不再需要几周的数据标注和微调周期。

    2. PII 去标识化:HIPAA Safe Harbor 对齐

    extract_pii 和 deidentify 两个函数构成隐私保护核心。支持 18 类标识符,覆盖姓名、生日、SSN、电话、邮箱、地址、就诊号等。脱敏方法四种可选:mask(掩码)、replace(Faker 替换为同语种伪数据)、hash(哈希)、shift_dates(日期偏移保留时间序列)。

    值得注意的是 smart entity merging 机制:传统 NER 常把 01/15/1970 切成 01、/15、/1970 三个碎片,OpenMed 通过合并策略把完整日期、电话、身份证号作为一个实体保留,避免下游规则引擎漏判。

    3. 33 种 PII 语言 + 国家 ID 校验

    从阿拉伯语的 29801011234567 到日本的 マイナンバー 1234 5678 9012、荷兰的 BSN、巴西的 CPF、西班牙的 DNI,OpenMed 都配了对应 Faker locale 和校验器。一行 lang="ja" 就能切换,无需手动加载多份模型。

    4. 多端部署:Python / Swift / Kotlin / 浏览器

    同一份 ONNX 模型既能在 Python CPU 上跑,也能在 Android ONNX Runtime Mobile、iOS 的 Apple MLX、浏览器 Transformers.js + WebGPU 上跑。对需要在手机端离线录入病历的野外场景,OpenMedKit (Swift) 提供了扫描即去标识化的链路。

    四、技术亮点与性能数据

    MLX 加速 在 Apple Silicon 上表现亮眼:Privacy Filter 推理延迟比 CPU PyTorch 快 24–33 倍(中位数推理时延)。批量 PII 处理 在 CPU 上吞吐提升 3.3 倍,在 MLX 上提升 2.2 倍,相比逐文档处理。

    架构层面有几个值得关注的点:

    • OpenAI Privacy Filter 架构作为基座(gpt-oss 风格稀疏 MoE + 局部注意力 + sink tokens + RoPE+YaRN + tiktoken o200k_base),OpenMed 提供三个变体(baseline、Nemotron 微调、多语言),共用同一 API;
    • 后端自动路由:MLX 模型名在非 Apple 硬件上自动回退到 PyTorch 检查点;
    • 离线/气隙部署:把 model_id 指向本地目录,运行时完全不再联系 Hugging Face Hub;
    • 生态兼容:PyTorch、CUDA、MLX、CoreML、ONNX Runtime Mobile、Transformers.js、WebGPU 全覆盖;
    • REST 服务 提供 /health、/analyze、/pii/extract、/pii/deidentify 四类接口,附 keep_alive、模型热卸载、API key/JWT、动态批处理、限流、可观测指标。

    五、适用场景与人群

    典型场景:

    • 医院信息科要把 10 年电子病历批量结构化抽实体,又要满足数据不出内网;
    • 保险科技公司在本地工作站跑理赔文本去标识化,再喂给下游分析;
    • 跨国多语言病历研究,需要葡萄牙语、阿拉伯语、日语、土耳其语混合抽取;
    • 移动端随访 App 让医生在 iPad 上离线录入并自动遮蔽患者姓名;
    • 学术研究用 FHIR/HL7 把脱敏后的临床数据接入队列分析。

    适合谁: 医疗信息化工程师、临床研究人员、医学 NLP 团队、医疗 SaaS 初创、需要合规审计的乙方集成商。不适合谁: 只想跑几个公开数据集 demo、不在意本地化部署的纯算法爱好者——直接用 Hugging Face 云端推理更省事。

    六、竞品对比

    维度OpenMedAWS Comprehend MedicalHugging Face 云端 NER自训 BERT-Biomedical
    部署形态本地 / 移动 / 浏览器仅云 API仅云 API本地
    模型数量2,200+ 医疗模型闭源单一模型通用模型自己训练
    多语言 PII33 种 + 国家 ID 校验有限需自配从零搭建
    去标识化方法4 种 + 策略配置文件单一方案无内置无内置
    数据出网默认不出必须出必须出可不出
    许可Apache-2.0商业付费Apache/MIT自定

    选择 OpenMed 的核心理由只有一个:它是少数同时满足「医疗垂直模型丰富」「完全本地化」「多语言 PII 内建」三个条件的开源方案,而且 SDK 是 Apache-2.0,商用没有授权障碍。

    七、如何快速上手

    1. 安装(30 秒)

    # CPU / CUDA
    pip install --upgrade "openmed[hf]"
    
    # Apple Silicon 加速
    pip install --upgrade "openmed[mlx]"
    
    # REST 服务
    pip install --upgrade "openmed[hf,service]"
    

    2. 最小可用示例

    from openmed import analyze_text
    
    result = analyze_text(
        "Patient received 75mg clopidogrel for NSTEMI.",
        model_name="pharma_detection_superclinical",
    )
    print([(e.label, e.text) for e in result.entities])
    

    3. 进阶建议

    • 内网环境把 model_id 指向预下载的本地目录,断网也能跑;
    • 用 BatchProcessor(operation="deidentify", batch_size=16) 处理万级文档;
    • 生产部署用 Docker 镜像 + OPENMED_PROFILE=prod 启动 REST 服务;
    • Android 集成参考 android/README.md,iOS 集成参考 swift/OpenMedKit;
    • Agent 开发者可直接装 ./install-skills.sh 把 Skill 注入 Claude Code / Codex / OpenCode。

    八、总结与行动建议

    OpenMed 把「医疗 NLP 必须上云」这件事的默认假设打破了。2,200+ 模型、33 种 PII 语言、Apple MLX 24 倍加速、Apache-2.0 商用友好,再加上 iOS/Android/浏览器全端覆盖——它已经不是一个 demo 项目,而是一套可以塞进医院内网工作站的工程化方案。

    使用建议: 先用 disease_detection_superclinical 跑通你科室的真实数据样本,确认实体准确率;再叠加 pii_superclinical_large 加一道合规护栏;最后用 REST 服务或 Docker 镜像接入现有 ETL。如果你正在做多语言项目,强烈建议跑一遍 lang="pt"、lang="ja"、lang="ar" 的端到端 demo,亲眼看 Faker 替换的伪数据是否符合本地习惯。

    • GitHub:https://github.com/maziyarpanahi/openmed
    • 官网:https://openmed.life/
    • 文档:https://openmed.life/docs/
    • PyPI:https://pypi.org/project/openmed/
    • 论文:https://arxiv.org/abs/2508.01630

    一句话推荐:如果你受够了病历不能出内网和 NLP 精度不可兼得的拉扯,OpenMed 是当下最值得在本地工作站上跑一遍的开源医疗 AI 工具包。

    返回文章列表