← 返回日报
🌐 机器翻译 · DeepSeek · GitHub

maziyarpanahi openmed


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 | 是 |

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

📖 阅读原文 →