今天在 GitHub Trending 上看到一个有意思的项目:OpenMed,一个本地优先的开源医疗AI框架,让临床文本分析、PII去标识化等任务完全在本地设备上完成,患者数据永不离开你的网络。
一、项目概述
OpenMed 由 Maziyar Panahi 开发,是一个面向医疗领域的开源AI工具链,核心价值在于:
- 100% 本地运行:所有模型在本地设备上推理,无需云端API,患者数据不出网络边界
- 1000+ 专业医学模型:涵盖疾病检测、药物识别、解剖学、基因检测等,许多模型性能超越商业方案
- PII 去标识化:覆盖 HIPAA 全部 18 类 Safe Harbor 标识符,支持 12 种语言、247 个检测检查点
- 多平台支持:CPU、CUDA、Apple Silicon (MLX),以及通过 OpenMedKit 在 iOS/macOS 原生运行
- Apache-2.0 开源:零供应商锁定
项目已发表 arXiv 论文(2508.01630),并在 PyPI 上发布,一行 pip install 即可使用。
二、技术原理
架构设计
OpenMed 采用模块化架构,核心组件包括:
- 模型注册中心:统一的模型发现与加载机制,通过
model_name即可自动路由到对应模型 - 多后端推理引擎:支持 PyTorch(CPU/CUDA)、MLX(Apple Silicon)、CoreML 三条路径
- PII 处理管线:基于 OpenAI Privacy Filter 架构的稀疏 MoE Transformer,结合智能实体合并与格式保持伪造
Privacy Filter 架构
PII 检测的核心基于 OpenAI 的 Privacy Filter 架构——一种 gpt-oss 风格的稀疏 MoE Transformer,具备:
- 局部注意力机制:减少全局上下文依赖,提升推理效率
- Sink Tokens:稳定长序列训练
- RoPE + YaRN:支持位置外推,处理超长临床文档
- tiktoken o200k_base 分词器:与 OpenAI 生态对齐
OpenMed 在此基础上提供了三个模型变体:
| 变体 | 说明 | MLX 支持 |
|---|---|---|
| OpenAI Privacy Filter | 基线模型 | ✅ |
| Nemotron-PII 微调 | 基于 NVIDIA Nemotron PII 数据集微调 | ✅ |
| OpenMed Multilingual | 多语言扩展 | ✅ |
智能实体合并
传统 NER 的分词机制容易将连续实体打碎(如 01/15/1970 被分为三个 token),OpenMed 的 use_smart_merging=True 参数能合并碎片化实体,保持日期、地址等完整。
Apple Silicon MLX 加速
# 非 Apple 硬件上,MLX 模型名自动回退到 PyTorch 版本
extract_pii(text, model_name="OpenMed/privacy-filter-mlx") # 自动路由
MLX 后端在 Apple Silicon 上提供显著加速,同时支持 8-bit 量化(-mlx-8bit)以适配内存受限设备。
数据流
临床文本 → OpenMed (100% on-device) → 医学实体 / PII 检测 / 去标识化文本
三、安装与快速开始
环境要求
- Python 3.10+
- 可选:CUDA(GPU 加速)、Apple Silicon(MLX 加速)
安装
# 核心包 + Hugging Face 运行时(Linux/macOS/Windows)
pip install "openmed[hf]"
# 添加 REST 服务
pip install "openmed[hf,service]"
# Apple Silicon MLX 加速
pip install "openmed[mlx]"
最简运行示例
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 Key,无需网络调用,模型在本地完成推理。
四、使用方法与实战
PII 去标识化
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)
# 多种脱敏方式
deidentify(text, method="mask") # [NAME], [DATE]
deidentify(text, method="replace") # Faker 生成格式保持的假数据
deidentify(text, method="hash") # 密码学哈希
deidentify(text, method="shift_dates", date_shift_days=180) # 日期偏移
多语言支持
支持 12 种语言的 PII 检测,包括葡萄牙语、荷兰语、印地语、阿拉伯语、日语、土耳其语等:
from openmed import extract_pii
# 葡萄牙语
result = extract_pii(
"Paciente: Pedro Almeida, CPF: 123.456.789-09, telefone: +351 912 345 678",
lang="pt",
use_smart_merging=True
)
REST API 服务
# 启动服务
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
v1.5.5 新增模型生命周期管理:
# 查看已加载模型
curl http://127.0.0.1:8080/models/loaded
# 卸载模型释放内存
curl -X POST http://127.0.0.1:8080/models/unload -H "Content-Type: application/json" -d '{"all":true}'
Swift / iOS 集成
通过 OpenMedKit 在 iPhone、iPad、Mac 上原生运行:
// Package.swift
dependencies: [
.package(url: "https://github.com/maziyarpanahi/openmed.git", from: "1.5.5"),
]
离线 / 气隙环境
from openmed import OpenMedConfig, analyze_text
result = analyze_text(
"Patient presents with chronic myeloid leukemia and Type 2 diabetes.",
model_id="./models/OpenMed-NER-DiseaseDetect-SuperClinical-434M",
config=OpenMedConfig(device="cpu"),
)
直接指向本地目录,无需连接 Hugging Face Hub。
批量处理
from openmed import BatchProcessor
p = BatchProcessor(
model_name="disease_detection_superclinical",
group_entities=True,
)
p.process_texts([...])
五、常见问题与解决方案
Q: 安装 openmed[hf] 时 torch 下载缓慢?
A: 建议使用国内 PyTorch 镜像或单独安装 torch CPU 版本:
pip install torch --index-url https://download.pytorch.org/whl/cpu
pip install "openmed[hf]"
Q: MLX 模型在非 Apple Silicon 设备上报错?
A: OpenMed 会自动将 MLX 模型名回退到对应的 PyTorch checkpoint,无需手动切换。确保安装了 openmed[hf] 即可。
Q: PII 检测中日期被拆分为多个实体?
A: 使用 use_smart_merging=True 参数,该功能会合并因分词碎片化的连续实体。
Q: 大模型内存占用过高?
A: (1) 使用较小的模型(如 109M 的 anatomy/gene 检测模型);(2) MLX 后端支持 8-bit 量化版本;(3) REST 服务中设置 keep_alive 超时自动卸载闲置模型。
Q: Docker 构建时间过长?
A: Dockerfile 使用 --no-cache-dir 和 CPU 版 torch,如需加速可预构建基础镜像或使用多阶段构建。
六、总结
OpenMed 为医疗AI落地提供了一个关键缺失——本地优先的隐私保护推理。在 HIPAA 合规、患者数据主权日益重要的今天,一个能完全离线运行、覆盖 12 种语言 247 个 PII 检查点、同时提供 1000+ 专业医学模型的开源框架,无疑为医疗信息化的安全底线提供了坚实的技术保障。无论是 Python 一行代码调用,还是 iOS 原生集成,OpenMed 都让"数据不出院"从原则变为了工程实践。