
GitHub: https://github.com/maziyarpanahi/openmed
OpenMed 是一个端侧优先的医疗 NLP 开源栈,把 1,000+ 医疗 LLM 模型 + 12 语种 PII 脱敏 + Apple MLX/Swift 原生部署打包成 Apache-2.0 协议下「数据永远不出域」的可验证承诺——单人 9 个月、890 commit、2,733 stars 的蓝海项目。
local_files_only=True 被硬编码到所有模型加载路径,配合 __about__.py 的 1.5.2 RCE 修复白名单(trust_remote_code 严格白名单 + 子串防误判),「主权 AI」不再是营销话术。openmed[mlx] + Swift OpenMedKit + Dockerized FastAPI 三套部署形态共享同一份模型注册表(models.jsonl 1,518 行),且 MLX 在 Apple Silicon 上比 CPU 快 24–33 倍。
动图展示对一份临床出院小结进行 PII 实时识别与脱敏——这是项目对外最强的"隐私可验证"卖点。

Swift
OpenMedKit直接在 iPhone 上跑模型权重(CoreML + MLX),零网络。

Apple Silicon M 系列芯片上 MLX 后端比 PyTorch CPU 快 24–33 倍,量化后批处理吞吐再涨 2.2 倍。

v1.5.5 引入的
BatchProcessor在 CPU/MLX 上分别把吞吐量推到 3.3×/2.2×。

Apache-2.0 + 13 个生物医学域 + 12 语种 PII 的"主权医疗 AI"总纲。
维度 | 数据 |
|---|---|
GitHub | https://github.com/maziyarpanahi/openmed |
Star / Fork | 2,733 / 268 |
监看者 | 24 |
开放 Issue / PR | 65 / 19 |
代码行数 | 54,791(Python 57.8% + Swift 28.2% + CSS/JS/HTML/JSON 等) |
文件数 | 349 |
项目年龄 | 9 个月(首次提交 2025-09-10) |
开发阶段 | 密集开发(近 30 天 102 commit) |
贡献模式 | 单人主导(Maziyar Panahi 99.8%,853/890 commit) |
热度定位 | 中等热度,单日 133 星爆发型 |
质量评级 | 文档 A+ 测试 A- CI A+ 依赖 A+ 错误处理 B+ |
License | Apache-2.0 |
最新版本 | v1.5.5(37 tag,33 release,月均 3.7 个) |
话题标签 | healthcare, llm, bert, deepseek, on-device, on-premise, qwen, sovereign-ai, mlx, swift, ios, swift-package, swiftui, ner, pii, pii-detection |
主页 | https://openmed.life/ |
Maziyar Panahi 12.6 年 GitHub 老账号,bio 写着「AI in Health & Life Sciences」,隶属巴黎复杂系统研究所(@ISCPIF),工作地点在 Paris / London。仓库层面他几乎把所有精力都砸在 openmed(repo_rank=1,最近活跃列表里其他项目 stars 多在 0–14 之间)。典型画像:欧洲学术圈医疗 AI 研究员,「白天科研 + 夜间 OSS」的副业型主力——14.9% 周末 commit 偏低、21.7% 深夜 commit 偏高,正好对应这种生活节奏。
「医疗 AI 的护城河不是参数规模,而是合规与可验证的隐私。」
医疗数据有 GDPR / HIPAA / LGPD / PIPL 等多套区域法规,数据出域就构成商业风险。但市面上主流方案(AWS HealthLake、Azure Health Insights、Google MedLM)恰恰是云 API——把"调一次接口"和"把病历送出医院"画了等号。同时 HF Hub 上 1,000+ 医疗专用 NER/PII 模型长期被"加载即联网"的默认设置绑架,没法做空隙部署。作者看到这是被忽视的细分空白。
local_files_only=True 硬编码到所有加载路径;Anonymizer 拿 Faker 做同语种替代;mapping table 保留 reidentify 链路。local_files_only=True + _TRUSTED_PRIVACY_FILTER_PREFIXES 白名单 + 公开 models.jsonl 注册表,让"主权 AI"在 CI 流水线里就能被 grep 出来。三条战线:
避战区是云端 LLM 推理(不与 AWS HealthLake、Azure Health Insights 正面对抗)。
按"新颖度×实用性×可迁移性"综合分排序的 Top 5:
trust_remote_code 白名单 + 子串防误判(I6,14/15) - 位置:openmed/core/pii.py:140-172 - 1.5.2 安全公告修复了原 trust_remote_code=True 的 RCE 漏洞——任何子串含 "privacy-filter" 的仓库名都能触发。修复采用"严格白名单(_PRIVACY_FILTER_FAMILY_ALIASES) + 前缀白名单(_TRUSTED_PRIVACY_FILTER_PREFIXES) + env var 覆盖"三道关。任何动态加载模型的库都该学。
openmed/core/labels.py 的 CANONICAL_LABELS(UPPER_SNAKE_CASE)+ normalize_label() - 把 4 套标签约定(snake_case / UPPERCASE / BIOES / B-EMAIL)统一到 canonical 层,下游 Anonymizer 只对接一套。多源 NER 标签融合的通用模式。
openmed-mlx.json(I3,12/15) - 位置:openmed/mlx/artifact.py,MANIFEST_FORMAT = "openmed-mlx", MANIFEST_VERSION = 2 - 自研的 Python↔Swift 共享 manifest 格式,含 format_version / preferred_weights / fallback_weights / available_weights / tokenizer.path / runtime / prompt_spec。与 GGUF / MLX 社区格式并列。
openmed/core/pii_entity_merger.py - 公开承认借鉴 Microsoft Presidio 的 PatternRecognizer(base_score + context_boost + validator 三角验证),把正则当 fallback,模型当主路径——解决编码器把"01/15/1970"切碎成 "01" "/15/1970" 的典型问题。
openmed/mlx/convert.py 5 套 _KEY_REPLACEMENTS(BERT/DeBERTa/RoBERTa/DistilBERT/ELECTRA) - HuggingFace 权重命名 ≠ MLX 命名,OpenMed 维护了 5 套线性替换表,任何跨框架 ML 部署都能用。
InferenceBackend Protocol + get_backend() 自动探测(openmed/core/backends.py:115-152),同一份 Python API 跨 PyTorch/MLX/CoreML。任何多硬件 NLP 栈可复用。models.jsonl(1,518 行),model_registry.py 派生——避免代码膨胀。_torch_fallback_for 家族感知(multilingual/nemotron),MLX-only 模型在 Linux 上自动降级到 PyTorch + UserWarning 告知。openmed/core/anonymizer/ 用 Faker 做同语种替代,跨文档保持一致 hash(hash_value 字段)以做分析链接。service/runtime.py 引用类似 Erlang 进程模型的 keep_alive 卸载语义,长生命周期 ML 服务的资源管理。local_files_only=True(D9)local_files_only=True + _resolve_model_name 先于 HF 拼接pii_entity_merger.py PIIPattern(base_score + context_boost + validator 三角验证)openmed-mlx.json manifest + 多种权重候选(safetensors / npz)+ tokenizer 子目录use_medical_tokenizer=True 默认开启,模型照常分词但推理完后把 span 重新映射到医学友好的 token 边界维度 | OpenMed | PyHealth | MedRAX | 闭源云(AWS/Azure/Google) |
|---|---|---|---|---|
部署位置 | 端侧 / 本地 | 训练侧 | 端侧 + 云混合 | 仅云 |
任务类型 | NER / PII / 抽取 | 多任务训练 | 视觉问答 | 多模态诊断 |
隐私 | 可验证 0 网络 | 取决于下游 | 数据出端 | 数据必须出端 |
模态 | 文本 (+ Apple 端视觉 demo) | 多模态 | 图像为主 | 文本+图像+语音 |
许可证 | Apache-2.0 | MIT | Apache-2.0 | 专有 |
iOS 支持 | 原生 Swift MLX | 无 | 无 | 无 |
多语 PII | 12 语种 + 国别 ID 校验 | 取决于模型 | 英文为主 | en/es 为主 |
主护城河:主权医疗 NLP——"data never leaves the device" 是可验证、可营销、可合规审计的硬属性。在 GDPR / LGPD / HIPAA / PIPL 区域强监管下,这是结构性优势,不是产品优势。
次护城河:多语种 PII 广度——12 语种 + 国别 ID 校验,覆盖新兴市场(巴西/印度/土耳其/日本),是闭源云尚未投入的领域。
OpenMed 处于"医疗 NLP 工具链"的部署 / 集成象限,与 PyHealth(研究/训练)、MedRAX(视觉/Agent)、闭源云(API/服务)形成 4 元互补生态——类似 Hugging Face transformers 在通用 NLP 中的事实标准之于 OpenMed 在医疗 NLP 的潜在位置。
trust_remote_code 白名单(I6)是所有动态加载模型库必学的安全模式。analyze_text 职责过重:~400 行单函数承担句子检测 → 块划分 → 推理 → 实体合并 → 格式输出全链路,违反"短函数"原则,对维护者是负担。__about__.py、30 次改 CHANGELOG.md——发版密度高(月均 3.7 个)但靠人手,容易出现"刚发 v1.5.5 又合并新代码到 master"的常见事故。tests/ 40 个文件齐全(覆盖 PII 准确性、国际化回归、隐私过滤安全、模型注册表多语种),但 pyproject.toml 未配 --cov-fail-under。.pre-commit-config.yaml 在但 pyproject.toml 缺 ruff/black 显式规则,错误处理上 try/except Exception 偏宽。OpenMedKit,配 OpenMedModelStore 做模型下载管理;MLX 后端在 M1+ 设备上 24–33× 加速。analyze_text 跑通端到端,再切到 BatchProcessor(v1.5.5)拿 2–3× 吞吐。openmed/core/pii.py:140-172 — trust_remote_code 白名单 + 子串防误判的完整实现 2. openmed/core/backends.py:115-152 — InferenceBackend Protocol 多后端抽象 3. openmed/core/labels.py — CANONICAL_LABELS + normalize_label() 多源标签融合 4. openmed/mlx/artifact.py — openmed-mlx.json 跨语言 manifest 协议 5. openmed/mlx/convert.py — 5 套权重重映射表 6. openmed/core/pii_entity_merger.py — Presidio 风格的 ML+规则融合 7. swift/OpenMedKit/Sources/OpenMedKit/PostProcessing.swift(47KB)— BIO/BILOU 聚合analyze_text 拆成 sentence_detector / chunker / inferencer / merger / formatter 五个独立可测的 stage--cov-fail-under=80%:现在 40 个测试文件齐全但无量化阈值__about__.py 38 次手改应改 hatch version + 自动化 changelogopenmed/multimodal/ 下加图像/病理切片 NERopenmed/mcp/ 已有 FastMCP,可包装成 Claude/Cursor 的医疗 NER 工具资源 | 链接 |
|---|---|
DeepWiki | https://deepwiki.com/maziyarpanahi/openmed(已收录,最后索引 2026-06-05,commit 6d094a0f) |
Zread.ai | https://zread.ai/maziyarpanahi/openmed(已收录) |
关联论文 | arXiv:2508.01630(自报 12 项 NER 基准中 10 项 SOTA,第三方独立验证缺失) |
在线 Demo | 无(项目定位为本地 SDK,不提供 hosted demo) |
文档站 | https://openmed.life/ |
品牌站 | openmed.life(MkDocs + Material 主题) |