Skip to content

Latest commit

 

History

History
418 lines (299 loc) · 17.1 KB

File metadata and controls

418 lines (299 loc) · 17.1 KB
OpenMed — 本地优先的医疗 AI

本地优先的医疗 AI——数据永不离开你的设备

一行代码,将临床文本转化为结构化洞见。
实体抽取、PII 去标识化,以及 1,000+ 个完全运行在你自己硬件上的专业医疗模型——从 Python 的一行调用, 到由 Apple MLX 驱动的 iPhone 原生 Swift 应用。无需云端,无供应商锁定,患者数据绝不离开你的网络。

PyPI Python Models arXiv License Stars

Swift — OpenMedKit Apple Silicon — MLX Platforms Docs

1,000+ 模型  ·  12 种语言  ·  247 个 PII 检查点  ·  100% 本地运行  ·  Apache-2.0

English · 简体中文 · Español · Français · Deutsch · Italiano · Português · Nederlands · العربية · हिन्दी · తెలుగు · 日本語 · Türkçe · فارسی


现场演示

OpenMed 实时对一份临床出院记录进行 PII 脱敏
实时 PII 去标识化——Nemotron Privacy Filter 正在对一份临床出院记录中的姓名、地址、证件号和账单数据进行脱敏,全程在本地设备上完成。(图中所有数值均为合成数据。)

30 秒上手示例

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

一个最先进的临床 NER 模型在本地运行——无需 API 密钥,无网络调用。


为什么选择 OpenMed?

OpenMed 云端医疗 API
在你的设备/服务器上运行
患者数据离开你的网络 从不 发送给供应商
成本 免费且开源 按调用计费
专业医疗模型 1,000+ 有限
语言 12+ 不一
离线 / 隔离网络(air-gapped)
Apple Silicon (MLX) 加速 不适用
原生 iOS / macOS 应用 ✅ 通过 OpenMedKit
供应商锁定 无 — Apache-2.0
  • 专业模型 — 1,000+ 个精选的生物医学与临床模型,其中许多性能超越商业专有方案。
  • 符合 HIPAA 的去标识化 — 覆盖全部 18 项 Safe Harbor 标识符,智能实体合并,保留格式的伪造替换。
  • 随处运行 — CPU、CUDA、Apple Silicon (MLX),并可通过 OpenMedKit 原生运行于 iOS/macOS 应用。
  • 一行部署 — Python API、Docker 化的 REST 服务,或批处理流水线。
  • 零锁定 — Apache-2.0,你的基础设施,你的数据。

在 Apple 设备上本地运行 — Swift、MLX 与 iOS

OpenMed 专为在你数据所在之处运行而打造。在 Apple 硬件上,它借助 MLX 加速,并通过 OpenMedKit 直接进入 iPhone、iPad 和 Mac 应用——因此 PII 检测与临床抽取完全离线、 在设备本地完成。

// Add OpenMedKit to your app
dependencies: [
    .package(url: "https://github.com/maziyarpanahi/openmed.git", from: "1.5.5"),
]
  • MLX 运行时,用于 PII token 分类、Privacy Filter 系列,以及实验性的 GLiNER 系列 zero-shot 任务——并提供 CoreML 回退路径。
  • 一个模型名,所有平台 — 在非 Apple 硬件上,MLX 模型名会自动回退到对应的 PyTorch 检查点。
  • Apple Silicon 上的 Python 同样支持:pip install "openmed[mlx]"

指南:MLX 后端 · OpenMedKit (Swift) · CoreML 导出


工作原理

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
Loading

快速开始

# Core + Hugging Face runtime (Linux, macOS, Windows; CPU or CUDA)
pip install "openmed[hf]"

# Add the REST service
pip install "openmed[hf,service]"

# Apple Silicon acceleration (MLX)
pip install "openmed[mlx]"

Python API

from openmed import analyze_text

analyze_text(
  "Patient received 75mg "
  "clopidogrel for NSTEMI.",
  model_name=
  "pharma_detection_superclinical",
)

REST 服务

uvicorn openmed.service.app:app \
  --host 0.0.0.0 --port 8080

GET /health POST /analyze POST /pii/extract POST /pii/deidentify

批处理

from openmed import BatchProcessor

p = BatchProcessor(
  model_name=
  "disease_detection_superclinical",
  group_entities=True,
)
p.process_texts([...])

离线 / 隔离网络? 只需将 model_name(或 model_id)指向本地目录,OpenMed 即会在本地加载,而不会连接 Hugging Face Hub:

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"),
)

模型

精选的专业医疗 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

隐私:PII 检测与去标识化

from openmed import extract_pii, deidentify

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

# Extract PII with smart merging (prevents tokenization fragmentation)
result = extract_pii(text, model_name="pii_superclinical_large", use_smart_merging=True)

# De-identify with the method you need
deidentify(text, method="mask")     # [NAME], [DATE]
deidentify(text, method="replace")  # Faker-backed, locale-aware, format-preserving fakes
deidentify(text, method="hash")     # Cryptographic hashing
deidentify(text, method="shift_dates", date_shift_days=180)
  • 智能实体合并01/15/1970 保持完整,而不会被拆分。
  • 基于 Faker 的混淆,内置自定义临床证件号 provider(CPF、CNPJ、BSN、NIR、Codice Fiscale、NIE、Aadhaar、Steuer-ID、NPI)。
  • HIPAA:覆盖全部 18 项 Safe Harbor 标识符,可配置置信度阈值。

完整 PII 笔记本 · 智能合并 · 匿名化

Privacy Filter 系列 — 基于 OpenAI Privacy Filter 架构的三个模型系列

模型代码相同(gpt-oss 风格的稀疏 MoE Transformer,带局部注意力、sink token、RoPE+YaRN、tiktoken o200k_base 分词),仅训练数据不同。它们都通过同一套 extract_pii() / deidentify() API 调用——只需更改 model_name= 参数。

变体 PyTorch (CPU + CUDA) MLX (Apple Silicon) MLX 8-bit
OpenAI Privacy Filter openai/privacy-filter OpenMed/privacy-filter-mlx …-mlx-8bit
Nemotron-PII fine-tune OpenMed/privacy-filter-nemotron …-nemotron-mlx …-nemotron-mlx-8bit
OpenMed Multilingual OpenMed/privacy-filter-multilingual …-multilingual-mlx …-multilingual-mlx-8bit
from openmed import extract_pii

text = "Patient Sarah Connor (DOB: 03/15/1985) at MRN 4471882."

extract_pii(text, model_name="openai/privacy-filter")              # PyTorch baseline
extract_pii(text, model_name="OpenMed/privacy-filter-nemotron")    # same code, different weights
extract_pii(text, model_name="OpenMed/privacy-filter-mlx")         # Apple Silicon (MLX)

在非 Apple Silicon 主机上,MLX 模型名会自动替换为对应的 PyTorch 检查点(并给出一次性警告)——写一个模型名,随处运行。参见 Privacy Filter 架构与后端路由


多语言 PII(12 种语言)

enfrdeitesnlhiteptarjatr 等语言上进行抽取与去标识化——共 247 个 PII 检查点

python -c "from openmed import extract_pii; print([(e.label, e.text) for e in extract_pii('Dr. Pedro Almeida, CPF: 123.456.789-09, email: pedro@hospital.pt', lang='pt').entities])"
查看各语言示例(葡萄牙语、荷兰语、印地语、阿拉伯语、日语、土耳其语)
from openmed import extract_pii

portuguese = extract_pii("Paciente: Pedro Almeida, CPF: 123.456.789-09, telefone: +351 912 345 678", lang="pt", use_smart_merging=True)
dutch      = extract_pii("Patiënt: Eva de Vries, BSN: 123456782, telefoon: +31 6 12345678", lang="nl", use_smart_merging=True)
hindi      = extract_pii("रोगी: अनीता शर्मा, फोन: +91 9876543210, पता: नई दिल्ली 110001", lang="hi", use_smart_merging=True)
arabic     = extract_pii("المريضة ليلى حسن، الهاتف +20 10 1234 5678، الرقم القومي 29801011234567.", lang="ar", use_smart_merging=True)
japanese   = extract_pii("患者 佐藤 花子、電話 +81 90 1234 5678、マイナンバー 1234 5678 9012.", lang="ja", use_smart_merging=True)
turkish    = extract_pii("Hasta Ayşe Yılmaz, telefon +90 532 123 45 67, TCKN 10000000146.", lang="tr", use_smart_merging=True)

for r in (portuguese, dutch, hindi, arabic, japanese, turkish):
    print([(e.label, e.text) for e in r.entities])

REST API

一个对 Docker 友好的 FastAPI 服务,具备请求校验、共享流水线预加载,以及统一的错误响应封装。

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

# or with Docker
docker build -t openmed:1.5.5 .
docker run --rm -p 8080:8080 -e OPENMED_PROFILE=prod openmed:1.5.5
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"}'

参见完整的 REST 服务指南


文档

完整指南见 openmed.life/docs

快速入门 文本分析 模型注册表
PII 检测指南 匿名化 批处理
配置档案 REST 服务 MLX 后端

认识一下我们的吉祥物

OpenMed 吉祥物

OpenMed 的守护者是一只蓬松的波斯猫,化身为小小的阿维森纳(伊本·西那,Avicenna / Ibn Sina)——这位伟大的 波斯医师所著的《医典》(Canon of Medicine)在约 600 年间一直是全世界的标准医学教科书。它守护着翻开的 医学知识之书,配色取自波斯绿松石(fīrūza):一位守护你最私密数据的本地优先卫士。



贡献

欢迎贡献——bug 报告、功能请求和 PR 都欢迎。

  • 提交 issue
  • 欢迎翻译 — 帮助完善顶部语言切换栏中链接的其他语言 README。

致谢

OpenMed 建立在优秀的开源工作之上——特别感谢 OpenAIPrivacy Filter 架构)、NVIDIANemotron PII 数据集)、Hugging Facetransformers 及模型生态)、AppleMLX),以及 Faker 的维护者。

许可证

基于 Apache-2.0 许可证 发布。

引用

如果 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 对你有帮助,点个 star 能帮助更多人发现它。

Star 历史图表

由 OpenMed 团队打造

网站 · 文档 · X / Twitter · LinkedIn