maziyarapanahi openmed
本地优先的医疗AI,永不离开设备
用一行代码将临床文本转化为结构化洞察。实体提取、PII去标识化,以及1000+专业医疗模型,完全运行在您自己的硬件上——从Python的一行代码到iPhone上的原生Swift应用,由Apple MLX驱动。无需云端。无供应商锁定。无患者数据离开您的网络。
1000+模型 · 12种语言 · 247个PII检查点 · 100%设备端运行 · Apache-2.0
English · 简体中文 · Español · Français · Deutsch · Italiano · Português · Nederlands · العربية · हिन्दी · తెలుగు · 日本語 · Türkçe · فارسی
实际演示
OpenMed完全在设备端运行——临床文本永不离开设备。以下是在iPhone上完全离线运行的效果:
通过OpenMedKit在iPhone上运行——扫描临床记录,去标识化,提取临床信号,全部在本地使用Apple MLX完成。没有任何数据被上传。
实时PII去标识化——Nemotron隐私过滤器从临床出院文件中隐去姓名、地址、ID和账单数据,完全在设备端完成。(所有显示的值均为合成数据。)
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 | |------|---------|-------------| | 在您的设备/服务器上运行 | ✅ | ❌ | | 患者数据离开您的网络 | 从不 | 发送给供应商 | | 成本 | 免费且开源 | 按调用计费 | | 专业医疗模型 | 1000+ | 有限 | | 语言支持 | 12+ | 视情况而定 | | 离线/隔离环境 | ✅ | ❌ | | Apple Silicon (MLX) 加速 | ✅ | 不适用 | | 原生iOS/macOS应用 | ✅ 通过OpenMedKit | ❌ | | 供应商锁定 | 无 — Apache-2.0 | 是 |
- 专业模型 — 1000+精心策划的生物医学与临床模型,许多性能超越专有技术栈。
- 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检测和临床提取完全离线、在设备端完成。
// 将OpenMedKit添加到您的应用依赖中:
.package(url: "https://github.com/maziyarapanahi/openmed.git", from: "1.5.5")
MLX运行时用于PII令牌分类、隐私过滤器系列,以及实验性的GLiNER系列零样本任务——并带有CoreML回退路径。
一个模型名称,所有平台——MLX模型名称在非Apple硬件上自动回退到匹配的PyTorch检查点。在Apple Silicon上使用Python同样简单:pip install "openmed[mlx]"。
指南:[MLX后端] · [OpenMedKit (Swift)] · [CoreML导出]
MLX在Apple Silicon上:隐私过滤器的推理速度比CPU PyTorch快24–33倍——每次推理步骤的中位延迟,越低越好。
工作原理
flowchart LR
A["临床文本"] --> B["OpenMed
(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
快速开始
# 核心 + Hugging Face运行时(Linux、macOS、Windows;CPU或CUDA)
pip install "openmed[hf]"
# 添加REST服务
pip install "openmed[hf,service]"
# Apple Silicon加速(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模型注册表 — [浏览完整目录](https://github.com/maziyarapanahi/openmed)。
| 模型 | 专长 | 实体类型 | 大小 | |------|------|----------|------| | 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"
# 使用智能合并提取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)
智能实体合并确保01/15/1