OpenMed:让医疗 AI 在本地运行,数据永不离开你的设备
你是否担心患者的医疗数据在云端处理时会泄露?你是否希望拥有一套专业、免费、且完全运行在你自有硬件上的临床文本分析工具?如果你的答案是“是”,那么今天要介绍的开源项目 OpenMed 或许正是你需要的。
OpenMed 是一套本地优先的医疗人工智能框架。它可以从临床文本中抽取疾病、药物、解剖部位等实体,还能自动识别并隐藏个人敏感信息(PII)——所有计算都在你自己的设备、服务器或手机上完成,数据绝不离开你的网络。

图中是 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 脱敏的过程(图中所有数据均为合成数据):

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 等工具快速搭建演示界面。
一个真实的使用场景
假设你在一家区域医疗中心工作,负责处理每天从各个科室收集的数万份出院小结。这些文本中包含诊断、用药、检查结果,也包含大量患者隐私信息。你需要:
-
抽取疾病和药物统计,用于流行病学研究。 -
去除所有 PII,然后将匿名化数据共享给合作机构。 -
整个过程必须符合 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 可以帮助更多人发现它。
总结
OpenMed 为医疗信息化提供了一个真正本地优先、隐私安全、免费且专业的 AI 基础设施。无论你是医院 IT 人员、医疗软件开发者、数据科学家,还是对临床 NLP 感兴趣的研究者,都可以通过几行代码获得强大的文本分析能力。
-
核心优势:数据不离开你的硬件,无供应商锁定,成本为零。 -
功能完整:实体抽取 + PII 检测 + 多语言 + 匿名化 + REST API + 移动端 SDK。 -
生态友好:支持 CPU、CUDA、Apple MLX、CoreML,从 Python 到 Swift 无缝衔接。
你可以从 PyPI 安装,在 5 分钟内运行第一个示例。如果遇到问题,文档网站 openmed.life/docs 提供了详细指南。

