今天在 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 采用模块化架构,核心组件包括:

  1. 模型注册中心:统一的模型发现与加载机制,通过 model_name 即可自动路由到对应模型
  2. 多后端推理引擎:支持 PyTorch(CPU/CUDA)、MLX(Apple Silicon)、CoreML 三条路径
  3. 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 都让"数据不出院"从原则变为了工程实践。