
本地优先的临床 AIOpenMed 临床 NER 与 HIPAA PII 去标识化实战指南【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmedOpenMed 是一个本地优先local-first的开源医疗 AI SDK在模型工件就绪后所有临床文本抽取与去标识化都在你自己掌控的硬件上完成数据不离开你的网络。本文基于 README.te.md项目多语言 README 之一展开结合仓库源码系统讲解 OpenMed 的核心运行时、临床 NER 模型目录、PII 检测与四种去标识化方法、多语言支持、Apple MLX 端与 REST 服务读完即可上手搭建一条完整的临床实体抽取 隐私脱敏本地流水线。从 30 秒示例说起一行代码跑通临床 NEROpenMed 的顶层 API 极其简洁analyze_text一行即可对临床文本执行 token 分类token-classification推理from openmed import analyze_text result analyze_text( Patient started on imatinib for chronic myeloid leukemia., model_namedisease_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示例中的disease_detection_superclinical是临床 NER 模型使用本地运行时完成推理模型工件就绪后即可离线运行。从源码看openmed/init.py 中analyze_text的完整签名远比示例丰富理解这些参数能让你在真实项目中精准控制行为参数默认值作用model_namedisease_detection_superclinical注册表键、Hugging Face 模型 ID 或本地模型路径model_idNonemodel_name的别名二者只能传一个aggregation_strategysimpleHugging Face 聚合策略设为None可拿到原始 token 输出output_formatdict输出格式dict/json/html/csvconfidence_threshold0.0实体最低置信度过滤group_entitiesFalse是否合并相邻同类实体sentence_detectionTrue句子级分块推理支持超长文本自动切块assert_contextFalse附加否定、不确定性、经历者、时态等临床上下文标签cache_resultsFalse进程内 LRU 缓存缓存可能含 PHI但绝不落盘其中sentence_detectionTrue时源码会先做句子切分再按每块最多 6 句、最长约max_length*4字符的策略分块推理最后把各块的实体 span 偏移量精确映射回原文见 openmed/init.py因此返回的start/end始终对应原始输入文本。为什么选择 OpenMed部署边界与设计取舍README 用一张表格界定了 OpenMed 的职责边界这是理解整个项目设计哲学的关键部署考量OpenMed SDK 边界核心运行时模型工件就绪后完全本地处理可选网络路径模型下载、远程适配器、遥测路径与用户配置的集成可能使用网络验证责任部署方负责验证模型与数据集条款、隐私行为与临床适用性接口面在受支持的平台上提供 Python、Swift、Android、浏览器与服务接口精选模型目录针对你的使用场景逐一核对每个模型、许可证与数据集条款对齐 Safe Harbor 的配置可覆盖 HIPAA 18 类标识符但专家级部署评审仍然必需仅使用 SDK 本身不构成 HIPAA 合规受支持的执行路径CPU、CUDA、MLX、移动端、服务端与浏览器适配器因环境与工件而异部署接口Python、容器、服务与批处理工作流均需配置与验证SDK 源码以 Apache-2.0 许可发布模型与数据集的条款各不相同。一句话概括OpenMed 保证推理在本地但把模型和数据合不合规的最终判断权交给部署方——这也是医疗场景下负责任的开源边界。工作原理从临床文本到去标识化洞察官方 README 给出的流水线如下图所示一次调用同时产出三样东西医学实体疾病、药物、解剖部位、基因等、PII 检出结果姓名、日期、证件号等、去标识化文本。因为全部推理在本地完成临床文本无需发送到任何云端 API——这正是你的数据、你的模型、你的硬件的落地形态。快速开始安装与三种入口安装命令按需选择核心运行时基于 Hugging Facetransformers支持 Linux、macOS、Windows 的 CPU 或 CUDA# Core Hugging Face runtime (Linux, macOS, Windows; CPU or CUDA) pip install --upgrade openmed[hf] # 追加 REST 服务 pip install --upgrade openmed[hf,service] # Apple Silicon 加速 (MLX) pip install --upgrade openmed[mlx]安装完成后有三种使用入口Python API——单文档即时分析from openmed import analyze_text result analyze_text( Patient received 75mg clopidogrel for NSTEMI., model_namepharma_detection_superclinical, ) print([(e.label, e.text) for e in result.entities]) # [(DRUG, clopidogrel), (CONDITION, NSTEMI)]REST 服务——以 FastAPI 应用形式启动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_namedisease_detection_superclinical, group_entitiesTrue, ) p.process_texts([...])批处理内部复用已加载的模型流水线避免重复加载开销。英文 README 提供的实测参考是批处理相比单文档逐条处理CPU 上最高约 3.3 倍、MLX 上约 2.2 倍的吞吐提升详见 README.md 与基准图 pii-batch-benchmark.png。离线 / 隔离环境model_id指向本地目录需要完全断网运行时把model_name或model_id指向本地目录即可OpenMed 不会访问 Hugging Face Hubfrom 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, configOpenMedConfig(devicecpu), ) for entity in result.entities: print(f{entity.label:12} {entity.text:28} {entity.confidence:.2f}) # DISEASE chronic myeloid leukemia 0.98 # DISEASE Type 2 diabetes 0.96由于model_id指向本地路径本例不会接触 Hugging Face Hub 或任何外部模型提供方非常适合内网/气隙air-gapped部署。Apple 端Swift、MLX 与 iOS在受支持的 Apple 硬件上OpenMed 通过MLX与原生 Swift 库OpenMedKit实现本地处理。模型获取与用户配置的远程集成属于独立的网络边界。在 Swift Package Manager 中引入 OpenMedKit// Add OpenMedKit to your app dependencies: [ .package(url: https://github.com/maziyarpanahi/openmed.git, from: 2.3.0), ]解析成功后即可import OpenMedKit使用。MLX 运行时覆盖PII token 分类、Privacy Filter 家族、实验性GLiNER 家族 zero-shot任务以及 Python MLX-LM 文本生成Laneformer并为受支持的 token 分类工件提供CoreML 回退路径一个模型名全平台可用在非 Apple 硬件上MLX 模型名会自动回退到对应的 PyTorch checkpoint一次性警告Apple Silicon 上的 Pythonpip install --upgrade openmed[mlx]同样可用。配套指南MLX 后端 · OpenMedKit (Swift) · CoreML 导出。模型目录精选医疗 NER 注册表OpenMed 维护着一份经过策划的专业医疗 NER 模型注册表README 顶部声明约 2,266 条 manifest 记录。下表是几个代表性模型模型专长实体类型规模disease_detection_superclinical疾病与病症DISEASE, CONDITION, DIAGNOSIS434Mpharma_detection_superclinical药物与用药DRUG, MEDICATION, TREATMENT434Mpii_superclinical_largePII 与去标识化NAME, DATE, SSN, PHONE, EMAIL, ADDRESS434Manatomy_detection_electramed解剖与身体部位ANATOMY, ORGAN, BODY_PART109Mgene_detection_genecorpus基因与蛋白质GENE, PROTEIN109M从源码 openmed/core/model_registry.py 可以看到这些简短注册表键如disease_detection_superclinical是完整 Hugging Face 仓库 ID 的别名例如OpenMed/OpenMed-NER-DiseaseDetect-SuperClinical-434M。这意味着你既能用短键快速上手也能直接用限定模型 ID 精确锁定权重。注册表还内置了按精度分层fast / balanced / accurate的推荐组合model_registry.pyaccurate档即包含disease_detection_superclinical、pharma_detection_superclinical、pii_superclinical_large等旗舰模型。隐私能力PII 检测与去标识化这是 OpenMed 的核心战场。先抽取、再按需脱敏from openmed import extract_pii, deidentify text Patient: John Doe, DOB: 01/15/1970, SSN: 123-45-6789 # 智能合并抽取 PII防止分词把实体切碎 result extract_pii(text, model_namepii_superclinical_large, use_smart_mergingTrue) # 按需选择去标识化方法 deidentify(text, methodmask) # [NAME], [DATE] deidentify(text, methodreplace) # Faker 支撑、locale 感知、保格式的伪造数据 deidentify(text, methodhash) # 密码学哈希 deidentify(text, methodshift_dates, date_shift_days180)对应输出来自英文 README 的实际示例[(NAME, John Doe), (DATE, 01/15/1970), (SSN, 123-45-6789)] Patient: [NAME], DOB: [DATE], SSN: [SSN] Patient: Emily Chen, DOB: 03/22/1985, SSN: 456-78-9012 Patient: 6b8f...c4a1, DOB: 48b1...91de, SSN: 3f13...e912 Patient: John Doe, DOB: 07/14/1970, SSN: 123-45-6789方法级参数源码视角openmed/core/pii.py 中deidentify的实现比 README 展示的更完整除上述四种方法外还支持方法行为mask替换为[NAME]、[EMAIL]等占位符默认方法aadhaar_maskAadhaar 值渲染为XXXX XXXX NNNN其余实体用普通占位符remove直接删除 PII空串replaceFaker 生成的逼真但伪造的数据hash一致的哈希值可用于跨文档实体关联format_preserve结构化标识符替换为保留形状与分隔符的合成值shift_dates日期按随机偏移平移并保持日期间隔几个高价值参数confidence_threshold去标识化默认0.7比抽取的 0.5 更保守宁可少脱敏也不误伤的安全取向patient_keydate_shift_secret用稳定的患者标识派生确定性 HMAC 日期偏移同一患者在不同文档间偏移一致原始 key 不会被记录、持久化或返回date_shift_max_days未设置时默认上限 365 天keep_year日期脱敏时保留年份use_safety_sweep默认True模型检测之后再跑一遍确定性的结构化标识符扫描作为最终安全网。智能实体合并Smart Entity Mergingextract_pii的use_smart_mergingTrue依赖正则识别语义单元日期、SSN、电话号码等把模型因分词被打散的片段合并成完整实体并做主导标签裁决——例如保证01/15/1970作为一个完整 DATE 实体返回而不是被切碎成01和/15/1970两段。源码实现位于 openmed/core/pii.py 与 openmed/core/pii_entity_merger.py其 docstring 明确指出这是强烈推荐开启的选项。Faker 支撑的混淆临床 ID 专属 Providerreplace方法背后是 Faker 生态 临床 ID 专属 provider覆盖 CPF巴西、CNPJ、BSN荷兰、NIR法国、Codice Fiscale意大利、NIE西班牙、Aadhaar印度、Steuer-ID德国、NPI美国医生号等且遵循对应 locale 与格式。Privacy Filter 家族同一架构的三套权重extract_pii与deidentify还支持一个Privacy Filter 家族三个模型共享同一份模型代码gpt-oss 风格稀疏 MoE 变换器含局部注意力、sink token、RoPEYaRN 与 tiktokeno200k_base分词仅训练数据不同全部走同一个extract_pii()/deidentify()API只改model_name变体PyTorch (CPU CUDA)MLX (Apple Silicon)MLX 8-bitOpenAI Privacy Filteropenai/privacy-filterOpenMed/privacy-filter-mlxOpenMed/privacy-filter-mlx-8bitNemotron-PII 微调OpenMed/privacy-filter-nemotronOpenMed/privacy-filter-nemotron-mlxOpenMed/privacy-filter-nemotron-mlx-8bitOpenMed MultilingualOpenMed/privacy-filter-multilingualOpenMed/privacy-filter-multilingual-mlxOpenMed/privacy-filter-multilingual-mlx-8bitfrom openmed import extract_pii text Patient Sarah Connor (DOB: 03/15/1985) at MRN 4471882. extract_pii(text, model_nameopenai/privacy-filter) # PyTorch 基线 extract_pii(text, model_nameOpenMed/privacy-filter-nemotron) # 同一代码、不同权重 extract_pii(text, model_nameOpenMed/privacy-filter-mlx) # Apple Silicon (MLX)注意openai/privacy-filter仅是 Hugging Face 上的本地权重标识符这里不会调用 OpenAI 的云端 API。在非 Apple Silicon 主机上MLX 模型名会自动替换为对应 PyTorch checkpoint一次性警告。详细架构与后端路由见 匿名化文档。HIPAA 边界OpenMed 提供的是对齐 Safe Harbor 的类别 可配置阈值这类实现辅助手段专家级部署评审仍然必须进行仅使用 SDK 本身不构成 HIPAA 合规声明。落地时建议配合 合规说明、审计报告 与策略门禁如 gates/ 下的发布预算与漂移参考一起使用。多语言 PII36 条支持路线多语言是 OpenMed 的另一大卖点README 声明合计36 条受支持的 PII 语言路线、其中 33 条由模型直接支撑覆盖en、fr、de、it、es、nl、hi、te、pt、ar、ja、tr等语言。英文 README 进一步列出完整语言代码集含am、bn、zh、ko、ru、sw、ta、te、vi等见 README.md并为孟加拉语、中文、泰米尔语设有独立注册表条目。单行命令即可体验葡萄牙语 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: pedrohospital.pt, langpt).entities]) # [(NAME, Pedro Almeida), (ID, 123.456.789-09), (EMAIL, pedrohospital.pt)]六种语言的全套示例from openmed import extract_pii portuguese extract_pii(Paciente: Pedro Almeida, CPF: 123.456.789-09, telefone: 351 912 345 678, langpt, use_smart_mergingTrue) dutch extract_pii(Patiënt: Eva de Vries, BSN: 123456782, telefoon: 31 6 12345678, langnl, use_smart_mergingTrue) hindi extract_pii(रोगी: अनीता शर्मा, फोन: 91 9876543210, पता: नई दिल्ली 110001, langhi, use_smart_mergingTrue) arabic extract_pii(المريضة ليلى حسن، الهاتف 20 10 1234 5678، الرقم القومي 29801011234567., langar, use_smart_mergingTrue) japanese extract_pii(患者 佐藤 花子、電話 81 90 1234 5678、マイナンバー 1234 5678 9012., langja, use_smart_mergingTrue) turkish extract_pii(Hasta Ayşe Yılmaz, telefon 90 532 123 45 67, TCKN 10000000146., langtr, use_smart_mergingTrue) for r in (portuguese, dutch, hindi, arabic, japanese, turkish): print([(e.label, e.text) for e in r.entities])[(NAME, Pedro Almeida), (ID, 123.456.789-09), (PHONE, 351 912 345 678)] [(NAME, Eva de Vries), (ID, 123456782), (PHONE, 31 6 12345678)] [(NAME, अनीता शर्मा), (PHONE, 91 9876543210), (ADDRESS, नई दिल्ली 110001)] [(NAME, ليلى حسن), (PHONE, 20 10 1234 5678), (ID, 29801011234567)] [(NAME, 佐藤 花子), (PHONE, 81 90 1234 5678), (ID, 1234 5678 9012)] [(NAME, Ayşe Yılmaz), (PHONE, 90 532 123 45 67), (ID, 10000000146)]从源码看openmed/core/pii.pylang参数同时决定三件事语言对应的默认 PII 模型、正则模式库与替换用 Faker locale。印地语/泰卢固语等拉丁-天城文/泰卢固文混写文本会自动切换到脚本感知的印度临床路由且支持 ABDM 标识符捆绑abdm参数与显式英语/Hinglish code-mixed 路线code_mixedTrue。逐语言默认模型与脱敏前后示例见 语言指南。REST 服务Docker 友好的 FastAPI服务模式基于 FastAPI内置请求校验、共享流水线预加载与统一错误信封pip install --upgrade openmed[hf,service] uvicorn openmed.service.app:app --host 0.0.0.0 --port 8080 # 或使用 Docker docker build -t openmed:local . docker run --rm -p 8080:8080 -e OPENMED_PROFILEprod openmed:local调用示例西班牙语 PII 抽取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}节选响应{ text: Paciente: Maria Garcia, DNI: 12345678Z, entities: [ {text: Maria Garcia, label: NAME, confidence: 0.99, start: 10, end: 22}, {text: 12345678Z, label: ID, confidence: 0.98, start: 29, end: 38} ], model_name: OpenMed/privacy-filter-multilingual }模型生命周期与服务控制可随时释放显存/内存——GET /models/loaded查询已加载模型POST /models/unload卸载keep_alive设置空闲窗口服务还支持 API-key/JWT 鉴权、无 PHI 请求日志、链路追踪、gRPC、异步任务、webhook、预热池、动态批处理、请求合并、速率与并发限制以及/livez、/readyz探针OPENMED_SERVICE_KEEP_ALIVE10m uvicorn openmed.service.app:app --host 0.0.0.0 --port 8080 curl -X POST http://127.0.0.1:8080/models/unload -H Content-Type: application/json -d {all:true}{ unloaded: true, released: {models: 1, tokenizers: 1, pipelines: 1}, active_models: {} }完整接口与运维细节见 REST 服务指南。继续深入仓库内可验证的文档与示例PII 完整实战 Notebook —— 端到端 PII 检测流程PII 智能合并 —— 合并算法与语义单元匿名化快速上手 —— 方法选择与 Privacy Filter 家族分析文本 · 模型注册表 · 批处理配置 Profiles · MLX 后端 · Transformers.js 导出FHIR 互操作 · HL7 v2 去标识化发布说明 · v1 到 v2 迁移 · 合规态势源码入口顶层 API、PII 核心实现、模型注册表、批处理合规边界与许可HIPAA 边界Safe Harbor 对齐类别与可配置阈值只是实现辅助专家级部署评审仍不可省略许可OpenMed SDK 源码以 Apache-2.0 发布第三方资产声明见 NOTICE模型与数据集条款各异使用前需逐一核对致谢项目建立在 OpenAIPrivacy Filter 架构、NVIDIANemotron PII 数据集、Hugging Facetransformers 生态、AppleMLX与 Faker 等优秀开源工作之上。以 OpenMed 构建本地流水线的推荐路径是先用analyze_text/extract_pii验证模型效果再通过deidentify选择与业务匹配的脱敏方法最后按需演进为BatchProcessor批处理或 FastAPI 服务并始终在合成数据上完成验证后再接触真实患者数据。【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考