OpenMed:让医疗 AI 在本地运行,数据永不离开你的设备

你是否担心患者的医疗数据在云端处理时会泄露?你是否希望拥有一套专业、免费、且完全运行在你自有硬件上的临床文本分析工具?如果你的答案是“是”,那么今天要介绍的开源项目 OpenMed 或许正是你需要的。

OpenMed 是一套本地优先的医疗人工智能框架。它可以从临床文本中抽取疾病、药物、解剖部位等实体,还能自动识别并隐藏个人敏感信息(PII)——所有计算都在你自己的设备、服务器或手机上完成,数据绝不离开你的网络。

OpenMed Logo

图中是 OpenMed 的品牌标识,融合了波斯绿松石元素与医学典籍的象征。


为什么我们需要本地医疗 AI?

在常规的医疗信息化建设中,许多机构会选择云端 API 服务来分析病历、抽取关键词或做匿名化处理。但云端方案存在几个难以回避的问题:

  • 数据隐私风险:患者姓名、身份证号、诊断记录必须传输给第三方服务器。
  • 合规成本高:HIPAA、GDPR 等法规要求严格的数据本地化与审计。
  • 持续费用:按调用次数计费,长期使用成本高昂。
  • 供应商锁定:迁移到其他平台需要重写代码。
  • 离线不可用:断网或隔离网络环境下无法工作。

而 OpenMed 完全反转了这些痛点。

对比项 OpenMed(本地) 云端医疗 API
运行位置 你的设备 / 服务器 供应商云端
患者数据是否离开网络 从不 必须发送
费用 免费且开源 按调用计费
专业医疗模型数量 1,000+ 有限
支持语言 12 种以上 各不相同
离线 / 隔离网络可用
Apple Silicon 加速 ✅ (MLX) 不适用
原生 iOS / macOS 应用 ✅ (OpenMedKit)
供应商锁定 无 – Apache 2.0

简单说:OpenMed 让你在自己的硬件上拥有媲美商业方案的医疗 NLP 能力,同时完全掌控数据。


OpenMed 能做什么?

1. 临床实体识别

从一段病历描述中自动识别出疾病名称药物名称解剖部位基因等专业实体。

例如下面这段文本:

“Patient started on imatinib for chronic myeloid leukemia.”

通过 OpenMed 的疾病检测模型,你可以得到:

  • 疾病:chronic myeloid leukemia(置信度 0.98)
  • 药物:imatinib(置信度 0.95)

整个过程在你的电脑上完成,不需要联网。

2. 个人敏感信息(PII)检测与去标识化

医疗文本中通常包含大量患者隐私信息:姓名、出生日期、社保号、地址、电话号码、病历号等。OpenMed 提供了一整套 PII 处理工具:

  • 抽取:识别出所有 PII 实体及其类型(姓名、日期、身份证等)。
  • 去标识化:支持多种匿名化方法 —— 遮盖([NAME])、假数据替换(保留格式的伪造内容)、哈希加密、日期偏移等。

举个例子:

from openmed import extract_pii, deidentify

text = "Patient: John Doe, DOB: 01/15/1970, SSN: 123-45-6789"

# 抽取PII
result = extract_pii(text, model_name="pii_superclinical_large", use_smart_merging=True)
for e in result.entities:
    print(e.label, e.text)

# 遮盖处理
print(deidentify(text, method="mask"))
# 输出: Patient: [NAME], DOB: [DATE], SSN: [SSN]

你还可以选择基于 Faker 库的替换方法,它会生成符合当地格式的伪造数据(比如巴西的 CPF、荷兰的 BSN、法国的 NIR、中国的身份证号暂未列出,但支持自定义)。

下图展示了对一份真实出院记录进行实时 PII 脱敏的过程(图中所有数据均为合成数据):

实时 PII 脱敏演示

3. 多语言支持

OpenMed 的 PII 模型覆盖了 12 种语言:英语、法语、德语、意大利语、西班牙语、荷兰语、葡萄牙语、印地语、泰卢固语、阿拉伯语、日语、土耳其语。总计 247 个 PII 检查点

你可以这样调用:

from openmed import extract_pii

portuguese = extract_pii("Paciente: Pedro Almeida, CPF: 123.456.789-09, telefone: +351 912 345 678", lang="pt")
dutch = extract_pii("Patiënt: Eva de Vries, BSN: 123456782, telefoon: +31 6 12345678", lang="nl")
japanese = extract_pii("患者 佐藤 花子、電話 +81 90 1234 5678、マイナンバー 1234 5678 9012.", lang="ja")

不需要切换模型,只需指定 lang 参数即可。


它是如何工作的?

下面这张流程图清晰地展示了 OpenMed 的处理逻辑:

flowchart LR
    A["临床文本"] --> B["OpenMed<br/>(100% 本地)"]
    B --> C["医疗实体"]
    B --> D["检测到的 PII"]
    B --> E["去标识化文本"]
    style B fill:#0D6E6E,stroke:#0A5656,stroke-width:2px,color:#ffffff
    style C fill:#D6EBEB,stroke:#0D6E6E,color:#0E1116
    style D fill:#F7DCD8,stroke:#C5453A,color:#0E1116
    style E fill:#F5E27A,stroke:#A9A088,color:#0E1116

你输入一段原始临床文本,OpenMed 在本地加载预训练模型,输出三样东西:医疗实体列表、检测到的 PII 实体列表、以及脱敏后的文本。

所有这些模型都来自 1,000+ 个精选的生物医学与临床 Transformer 模型,许多模型在特定任务上性能优于商业闭源方案。


30 秒快速上手

安装非常简单。根据你的硬件环境选择对应的命令:

# 基础版本 + Hugging Face 运行时(Linux, macOS, Windows;CPU或CUDA)
pip install "openmed[hf]"

# 如果需要REST服务
pip install "openmed[hf,service]"

# 如果你使用的是 Apple Silicon(M1/M2/M3),启用MLX加速
pip install "openmed[mlx]"

安装完成后,你就可以在 Python 中直接调用了:

from openmed import analyze_text

result = analyze_text(
    "Patient presents with chronic myeloid leukemia and Type 2 diabetes.",
    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
DISEASE      Type 2 diabetes              0.97

没有 API 密钥,没有网络调用,一切都在你的电脑上运行。


可用的模型有哪些?

OpenMed 维护了一个专业医疗 NER 模型的注册表。下面列出几个代表性模型:

模型名 专长 识别的实体类型 参数量
disease_detection_superclinical 疾病与病症 DISEASE, CONDITION, DIAGNOSIS 434M
pharma_detection_superclinical 药物与用药 DRUG, MEDICATION, TREATMENT 434M
pii_superclinical_large PII 与去标识化 NAME, DATE, SSN, PHONE, EMAIL, ADDRESS 434M
anatomy_detection_electramed 解剖与身体部位 ANATOMY, ORGAN, BODY_PART 109M
gene_detection_genecorpus 基因与蛋白质 GENE, PROTEIN 109M

你可以根据任务选择合适的模型。如果需要零样本抽取(不限定实体类型),OpenMed 也实验性地支持 GLiNER 系列模型。

另外,OpenMed 还包含了三个基于 OpenAI Privacy Filter 架构的“隐私过滤器”系列模型:

  • OpenAI 原始权重版openai/privacy-filter
  • Nemotron 微调版OpenMed/privacy-filter-nemotron
  • 多语言版OpenMed/privacy-filter-multilingual

这些模型使用完全相同的代码结构(稀疏 MoE Transformer + 局部注意力 + RoPE 位置编码),只是在训练数据上不同。你可以通过 model_name 参数自由切换。在 Apple Silicon 设备上,还可以使用 MLX 格式的 8bit 量化版本,速度更快。


在 iPhone 和 Mac 上本地运行?

是的。OpenMed 专门为 Apple 生态打造了 OpenMedKit —— 一个 Swift 包,允许你在 iOS、iPadOS 和 macOS 应用中直接调用 PII 检测和临床实体抽取功能,所有计算都在设备本地完成,不需要网络。

你只需要在 Xcode 项目的依赖中添加:

dependencies: [
    .package(url: "https://github.com/maziyarpanahi/openmed.git", from: "1.5.5"),
]

然后就可以在 Swift 代码中使用与 Python 端相同的模型名。OpenMedKit 会自动根据硬件选择最佳运行时:在 Apple Silicon 上用 MLX 加速,在旧设备或模拟器上回退到 CoreML。

这意味着你可以开发一款离线可用的医疗记录分析 App,患者数据永远不会上传到任何服务器。


REST 服务与批处理

除了 Python 函数调用,OpenMed 还提供了一个 FastAPI 实现的 REST 服务,适合部署在服务器上作为微服务。

启动服务:

pip install "openmed[hf,service]"
uvicorn openmed.service.app:app --host 0.0.0.0 --port 8080

或者使用 Docker:

docker build -t openmed:1.5.5 .
docker run --rm -p 8080:8080 -e OPENMED_PROFILE=prod openmed:1.5.5

服务提供了三个主要端点:

  • GET /health — 健康检查
  • POST /analyze — 通用文本分析(NER)
  • POST /pii/extract — 仅抽取 PII
  • POST /pii/deidentify — 去标识化

调用示例:

curl -X POST http://127.0.0.1:8080/pii/extract \
  -H "Content-Type: application/json" \
  -d '{"text":"Paciente: Maria Garcia, DNI: 12345678Z","lang":"es"}'

如果你需要处理大批量文档,可以使用 BatchProcessor

from openmed import BatchProcessor

processor = BatchProcessor(
    model_name="disease_detection_superclinical",
    group_entities=True,
)
results = processor.process_texts(["text1", "text2", ...])

如何处理离线或隔离网络环境?

OpenMed 完全支持在无互联网连接的环境下运行。你只需要提前将模型文件下载到本地目录,然后在调用时指定 model_id 参数指向该目录即可。

例如:

from openmed import analyze_text, OpenMedConfig

result = analyze_text(
    "Patient presents with chronic myeloid leukemia.",
    model_id="./models/OpenMed-NER-DiseaseDetect-SuperClinical-434M",
    config=OpenMedConfig(device="cpu"),
)

OpenMed 将直接从本地加载模型,不会尝试连接 Hugging Face Hub。这对于医院内网、保密实验室等场景非常实用。


常见问题(FAQ)

Q: OpenMed 对硬件有什么要求?

A: 最低要求是任何支持 Python 3.10+ 的电脑(Windows、macOS、Linux)。如果使用 CPU 运行,模型速度会慢一些,但依然可用。推荐使用 NVIDIA GPU(CUDA)或 Apple Silicon(MLX 加速)。内存建议至少 8GB。

Q: 它真的免费吗?商用也可以?

A: 是的,OpenMed 采用 Apache 2.0 许可证。你可以免费使用、修改、分发,甚至用于商业产品,无需支付任何授权费用。

Q: 模型的准确率如何?

A: 根据论文中的基准测试,OpenMed 的多个模型在生物医学 NER 任务上达到了与商业方案相当甚至更优的效果。具体性能指标可以参考 arXiv 论文(2508.01630)。

Q: 我能训练自己的模型吗?

A: OpenMed 目前主要提供预训练模型和推理框架。如果你想微调模型,可以使用 Hugging Face transformers 库加载基础模型,并在你自己的数据上继续训练。社区正在计划增加微调工具。

Q: 多语言 PII 检测支持哪些国家/地区的身份证格式?

A: 基于 Faker 的假数据替换支持多种本地化证件号:巴西 CPF/CNPJ、荷兰 BSN、法国 NIR、意大利 Codice Fiscale、西班牙 NIE、印度 Aadhaar、德国 Steuer-ID、美国 NPI 等。你也可以自定义 provider。

Q: 如何确保“智能合并”不会错误合并实体?

A: 智能合并功能通过解析 token 级别的 BIO 标签,将同一实体内部被分词器拆散的片段重新连接。例如日期 “01/15/1970” 不会被拆成 “01” “/” “15” “/” “1970”。你可以通过 use_smart_merging=False 关闭该功能。

Q: 我能在 Jupyter Notebook 里运行吗?

A: 当然可以。OpenMed 的 Python API 完全兼容 Jupyter。

Q: 是否有图形界面?

A: 目前官方提供的是 Python 库和 REST API。图形界面可以由开发者基于 OpenMedKit 在 iOS/macOS 上构建,或者使用 Streamlit 等工具快速搭建演示界面。


一个真实的使用场景

假设你在一家区域医疗中心工作,负责处理每天从各个科室收集的数万份出院小结。这些文本中包含诊断、用药、检查结果,也包含大量患者隐私信息。你需要:

  1. 抽取疾病和药物统计,用于流行病学研究。
  2. 去除所有 PII,然后将匿名化数据共享给合作机构。
  3. 整个过程必须符合 HIPAA 合规要求,且不允许数据离开医院内网。

使用 OpenMed,你可以编写一个批处理脚本,在医院的 Linux 服务器上(配置了 NVIDIA GPU)运行:

from openmed import analyze_text, deidentify
import pandas as pd

# 假设你已经从数据库读取了10000份出院小结
for idx, record in enumerate(discharge_summaries):
    # 抽取疾病实体
    ner_result = analyze_text(record.text, model_name="disease_detection_superclinical")
    diseases = [e.text for e in ner_result.entities]
    
    # 去标识化
    anonymized = deidentify(record.text, method="replace")
    
    # 保存结果到本地数据库
    save_result(record.id, diseases, anonymized)

整个过程不依赖外网,所有模型文件已预先下载到内网共享存储。处理完成后,你可以放心地将匿名化文本导出给研究伙伴。


开源社区与贡献

OpenMed 是一个活跃的开源项目。你可以在 GitHub 上找到完整代码、提交 issue 或贡献翻译。项目支持多种语言的 README(中文、西班牙语、法语、德语、意大利语、葡萄牙语、荷兰语、阿拉伯语、印地语、泰卢固语、日语、土耳其语、波斯语),欢迎帮助完善。

如果 OpenMed 对你的工作或研究有帮助,请考虑引用他们的论文:

@misc{panahi2025openmedneropensourcedomainadapted,
      title={OpenMed NER: Open-Source, Domain-Adapted State-of-the-Art Transformers for Biomedical NER Across 12 Public Datasets},
      author={Maziyar Panahi},
      year={2025},
      eprint={2508.01630},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2508.01630},
}

Star 历史

OpenMed 在 GitHub 上的受欢迎程度持续增长。如果你觉得这个项目有用,点一个 star 可以帮助更多人发现它。

Star 历史

总结

OpenMed 为医疗信息化提供了一个真正本地优先、隐私安全、免费且专业的 AI 基础设施。无论你是医院 IT 人员、医疗软件开发者、数据科学家,还是对临床 NLP 感兴趣的研究者,都可以通过几行代码获得强大的文本分析能力。

  • 核心优势:数据不离开你的硬件,无供应商锁定,成本为零。
  • 功能完整:实体抽取 + PII 检测 + 多语言 + 匿名化 + REST API + 移动端 SDK。
  • 生态友好:支持 CPU、CUDA、Apple MLX、CoreML,从 Python 到 Swift 无缝衔接。

你可以从 PyPI 安装,在 5 分钟内运行第一个示例。如果遇到问题,文档网站 openmed.life/docs 提供了详细指南。