maziyarpanahi/openmed

GitHub: maziyarpanahi/openmed

OpenMed 是一个开源医疗 AI 工具,专注于将临床文本快速转换为结构化洞察并保障 HIPAA 合规。

Stars: 714 | Forks: 81

# OpenMed 将临床文本转换为结构化洞察,只需一行代码。OpenMed 提供企业级实体提取、断言检测和医学推理——无供应商锁定,不牺牲准确性。 [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![arXiv](https://img.shields.io/badge/arXiv-2508.01630-b31b1b.svg)](https://arxiv.org/abs/2508.01630) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1x1xJjTZTWR3Z7uLJ0B5B_FyAomeeZGq5?usp=sharing) ``` 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:<35} {entity.confidence:.2f}") # DISEASE 慢性髓性白血病 0.98 # DRUG 伊马替尼 0.95 ``` ## ✨ 为何选择 OpenMed? - **专用模型**:12+ 个经过策划的医学 NER 模型,性能优于专有解决方案 - **符合 HIPAA 的 PII 检测**:智能去识别化,涵盖全部 18 个 Safe Harbor 标识符 - **一键部署**:从原型到生产只需几分钟 - **Docker 化 REST API**:FastAPI 端点用于服务部署 - **批量处理**:多文件工作流与进度追踪 - **生产就绪**:配置文件、性能分析工具以及医学感知分词 - **零锁定**:采用 Apache 2.0 许可,可在您的基础设施上运行 ## 快速开始 ### 安装 ``` # 从该仓库的本地检出: # 使用 Hugging Face 支持安装 uv pip install -e ".[hf]" # 或包含 REST 服务依赖项 uv pip install -e ".[hf,service]" ``` Apple Silicon 加速(Python): ``` uv pip install -e ".[mlx]" ``` Swift 应用(macOS 和 iOS)使用 `OpenMedKit`。在 `1.0.0` 中,这意味着: - **MLX**:适用于 Apple Silicon macOS 及真实 iPhone/iPad 硬件,用于支持的 BERT 系列 OpenMed 工件 - **CoreML**:当您已有打包的 Apple 模型包或希望使用 Apple 备用路径时 像这样添加 Swift 包: ``` dependencies: [ .package(url: "https://github.com/maziyarpanahi/openmed.git", from: "1.0.0"), ] ``` OpenMedKit 在 `1.0.0` 中已公开。适用于 Apple 平台的通用 OpenMed 模型打包流程仍在对 BERT、DistilBERT、RoBERTa、XLM-R、Longformer、ModernBERT 等进行加固,因此请将转换视为正在进行的工作,而非完全公开的发布范围。 在 `1.0.0` 发布到 PyPI 后,上述可编辑安装示例可以替换为简单的 `uv pip install "openmed[...]"`。 ### 三种使用方式 **1️⃣ Python API** — 脚本和笔记本的一行代码 ``` from openmed import analyze_text result = analyze_text( "Patient received 75mg clopidogrel for NSTEMI.", model_name="pharma_detection_superclinical" ) ``` **2️⃣ REST API 服务** — 用于应用后端的 FastAPI 端点 ``` uvicorn openmed.service.app:app --host 0.0.0.0 --port 8080 ``` **3️⃣ 批量处理** — 多文档可编程工作流 ``` from openmed import BatchProcessor processor = BatchProcessor( model_name="disease_detection_superclinical", confidence_threshold=0.55, group_entities=True, ) result = processor.process_texts([ "Patient started metformin for type 2 diabetes.", "Imatinib started for chronic myeloid leukemia.", ]) ``` ## 关键特性 ### 核心能力 - ** curated 模型注册表**:含元数据的 12+ 个专用医学 NER 模型目录 - **PII 检测与去识别化**:HIPAA 合规的去识别化,含智能实体合并 - **医学感知分词**:清晰处理临床模式(`COVID-19`、`CAR-T`、`IL-6`) - **高级 NER 处理**:置信度过滤、实体分组与跨度对齐 - **多输出格式**:字典、JSON、HTML、CSV,适配任意下游系统 ### 生产工具(v1.0.0) - **批量处理**:含进度追踪的多文本与多文件工作流 - **配置简介**:`dev`/`prod`/`test`/`fast` 预设,支持灵活覆盖 - **性能分析**:内置推理计时与瓶颈分析 - **Docker 化 REST API**:`GET /health`、`POST /analyze`、`POST /pii/extract`、`POST /pii/deidentify` - **服务可靠性强化**:请求验证、共享流水线预加载、超时与错误封装 ## 文档 完整指南请访问 **[openmed.life/docs](https://openmed.life/docs/)** 快速链接: - [入门指南](https://openmed.life/docs/) — 安装与首次分析 - [Analyze Text Helper](https://openmed.life/docs/analyze-text) — Python API 参考 - [MLX 后端](docs/mlx-backend.md) — Apple Silicon Python 运行时 - [OpenMedKit (Swift)](docs/swift-openmedkit.md) — 在 macOS 和 iOS 应用中使用 OpenMed 模型 - [PII 检测指南](examples/notebooks/PII_Detection_Complete_Guide.ipynb) — 完整去识别化教程(v0.5.0) - [批量处理](https://openmed.life/docs/batch-processing) — 多文本与多文件工作流 - [配置简介](https://openmed.life/docs/profiles) — 环境特定预设 - [REST 服务](docs/rest-service.md) — FastAPI 与 Docker 用法 - [模型注册表](https://openmed.life/docs/model-registry) — 浏览可用模型 - [配置](https://openmed.life/docs/configuration) — 设置与环境变量 ## REST API(v1.0.0) OpenMed 包含一个适合 Docker 的 FastAPI 服务,具备可靠性强化: - `GET /health` - `POST /analyze` - `POST /pii/extract` - `POST /pii/deidentify` ### 本地运行 ``` uv pip install -e ".[hf,service]" uvicorn openmed.service.app:app --host 0.0.0.0 --port 8080 ``` 可选的共享模型预热: ``` OPENMED_SERVICE_PRELOAD_MODELS=disease_detection_superclinical,OpenMed/OpenMed-PII-SuperClinical-Small-44M-v1 \ uvicorn openmed.service.app:app --host 0.0.0.0 --port 8080 ``` ### 使用 Docker 运行 ``` docker build -t openmed:1.0.0 . docker run --rm -p 8080:8080 -e OPENMED_PROFILE=prod openmed:1.0.0 ``` ### 示例请求 ``` 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 服务文档](docs/rest-service.md)。 非 2xx 响应现在使用统一封装: ``` { "error": { "code": "validation_error", "message": "Request validation failed", "details": [ { "field": "body.text", "message": "Text must not be blank", "type": "value_error" } ] } } ``` ## 模型 OpenMed 包含一个经过策划的 12+ 个专用医学 NER 模型注册表: | 模型 | 专长 | 实体类型 | 体积 | |------|------|----------|------| | `disease_detection_superclinical` | 疾病与状况 | DISEASE, CONDITION, DIAGNOSIS | 434M | | `pharma_detection_superclinical` | 药物与药品 | DRUG, MEDICATION, TREATMENT | 434M | | `pii_detection_superclinical` | PII 与去识别化 | NAME, DATE, SSN, PHONE, EMAIL, ADDRESS | 434M | | `anatomy_detection_electramed` | 解剖学与身体部位 | ANATOMY, ORGAN, BODY_PART | 109M | | `gene_detection_genecorpus` | 基因与蛋白质 | GENE, PROTEIN | 109M | [📖 完整模型目录](https://openmed.life/docs/model-registry) ## 高级用法 ### PII 检测与去识别化(v0.5.0) ``` from openmed import extract_pii, deidentify # 使用智能合并提取 PII 实体(默认) result = extract_pii( "Patient: John Doe, DOB: 01/15/1970, SSN: 123-45-6789", model_name="pii_detection_superclinical", use_smart_merging=True # Prevents entity fragmentation ) # 使用多种方法去识别 masked = deidentify(text, method="mask") # [NAME], [DATE] removed = deidentify(text, method="remove") # Complete removal replaced = deidentify(text, method="replace") # Synthetic data hashed = deidentify(text, method="hash") # Cryptographic hashing shifted = deidentify(text, method="shift_dates", date_shift_days=180) ``` **智能实体合并**(v0.5.0 新功能):通过合并拆分实体(如日期 `01/15/1970` 而非 `01` + `/15/1970`)修复分词碎片化,确保生产就绪的去识别化。 **HIPAA 合规性**:涵盖全部 18 个 Safe Harbor 标识符,支持可配置置信度阈值。 [📓 完整 PII 笔记本](examples/notebooks/PII_Detection_Complete_Guide.ipynb) | [📖 文档](docs/pii-smart-merging.md) ### 多语言 PII(8 种语言) OpenMed 现在支持多语言 PII 提取与去识别化,涵盖 `en`、`fr`、`de`、`it`、`es`、`nl`、`hi` 和 `te`。 法语、德语、意大利语和西班牙语提供完整的 35 模型家族;荷兰语、印地语和泰卢固语目前各提供一个旗舰公共模型,使 PII 目录总数达到 **179 个模型**。 ``` from openmed import extract_pii dutch = extract_pii( "Patiënt: Eva de Vries, geboortedatum: 15 januari 1984, BSN: 123456782, telefoon: +31 6 12345678", lang="nl", model_name="OpenMed/OpenMed-PII-Dutch-SuperClinical-Large-434M-v1", use_smart_merging=True, ) hindi = extract_pii( "रोगी: अनीता शर्मा, जन्मतिथि: 15 जनवरी 1984, फोन: +91 9876543210, पता: 12 गली संख्या 5, नई दिल्ली 110001", lang="hi", model_name="OpenMed/OpenMed-PII-Hindi-SuperClinical-Large-434M-v1", use_smart_merging=True, ) telugu = extract_pii( "రోగి: సితా రెడ్డి, జన్మ తేదీ: 15 జనవరి 1984, ఫోన్: +91 9876543210, చిరునామా: 12 వీధి 5, హైదరాబాద్ 500001", lang="te", model_name="OpenMed/OpenMed-PII-Telugu-SuperClinical-Large-434M-v1", use_smart_merging=True, ) print([(e.label, e.text) for e in dutch.entities]) print([(e.label, e.text) for e in hindi.entities]) print([(e.label, e.text) for e in telugu.entities]) ``` ### 批量处理 ``` from openmed import BatchProcessor, OpenMedConfig config = OpenMedConfig.from_profile("prod") processor = BatchProcessor( model_name="disease_detection_superclinical", config=config, group_entities=True, ) result = processor.process_texts([ "Metastatic breast cancer treated with trastuzumab.", "Acute lymphoblastic leukemia diagnosed.", ]) ``` ### 配置简介 ``` from openmed import analyze_text # 以编程方式应用配置文件 result = analyze_text( text, model_name="disease_detection_superclinical", config_profile="prod" # High confidence, grouped entities ) ``` ### 性能分析 ``` from openmed import analyze_text, profile_inference with profile_inference() as profiler: result = analyze_text(text, model_name="disease_detection_superclinical") print(profiler.summary()) # Inference time, bottlenecks, recommendations ``` [📖 更多](https://openmed.life/docs/examples) ## 许可 OpenMed 在 [Apache-2.0 许可](LICENSE) 下发布。 ## 引用 如果您将 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}, } ``` ## 星标历史 如果您发现 OpenMed 有用,请考虑给它一个 ⭐ 星标,帮助他人发现它! **用心 ❤️ 打造,由 OpenMed 团队构建** [🌐 网站](https://openmed.life) • [📚 文档](https://openmed.life/docs) • [🐦 X/Twitter](https://x.com/openmed_ai) • [💬 LinkedIn](https://www.linkedin.com/company/openmed-ai/)
标签:Apache 2.0, Apple Silicon, arXiv, AV绕过, Colab, Docker, FastAPI, HIPAA, Hugging Face, IaC 扫描, NER, PII脱敏, Python, REST API, 临床文本, 企业级, 健康数据, 凭据扫描, 医学推理, 医疗AI, 医疗NLP, 大模型, 安全合规, 安全防御评估, 实体抽取, 开源医疗, 批量处理, 断言检测, 无后门, 模型推理, 生产就绪, 网络代理, 网络安全, 请求拦截, 逆向工具, 隐私保护