OpenMed — local-first healthcare AI
단 한 줄의 코드로 임상 텍스트를 구조화된 인사이트로 변환하세요.
개체명 추출 (Entity extraction), 개인정보 (PII) 비식별화, 그리고 귀하의 자체 하드웨어에서 완전히 실행되는 1,000개 이상의 특화된 의료 모델 — Python의 한 줄 코드부터 Apple MLX 기반의 iPhone용 네이티브 Swift 앱까지 지원합니다. 클라우드는 없습니다. 벤더 종속성 (Vendor lock-in)도 없습니다. 환자 데이터가 귀하의 네트워크를 벗어나지 않습니다.
1,000개 이상의 모델 · 12개 언어 · 247개 PII 체크포인트 · 100% 온디바이스 (on-device) · Apache-2.0
English ·
简体中文 ·
Español ·
Français ·
Deutsch ·
Italiano ·
Português ·
Nederlands ·
العربية ·
हिन्दी ·
తెలుగు ·
日本語 ·
Türkçe ·
فارسی
OpenMed는 **완전히 온디바이스 (on-device)**로 실행됩니다 — 임상 텍스트가 기기를 절대 벗어나지 않습니다. 여기 iPhone에서 완전히 오프라인으로 작동하는 모습이 있습니다:
OpenMed Scan on iPhone — on-device PII de-identification and clinical extraction via OpenMedKit
OpenMedKit을 통한 iPhone에서의 실행 — 임상 노트를 스캔하고, 비식별화하며, 임상 신호를 추출합니다. 이 모든 과정은 Apple MLX를 통해 로컬에서 이루어집니다. 아무것도 업로드되지 않습니다.OpenMed redacting PII from a clinical discharge document in real time
실시간 PII 비식별화 — Nemotron Privacy Filter가 임상 퇴원 패킷에서 이름, 주소, ID 및 청구 데이터를 완전히 온디바이스 (on-device)로 편집합니다.(표시된 모든 값은 합성 데이터입니다.)
from openmed import analyze_text
result = analyze_text(
"Patient started on imatinib for chronic myeloid leukemia.",
...
API 키나 네트워크 호출 없이 로컬에서 실행되는 최첨단 임상 NER (Named Entity Recognition) 모델입니다.
OpenMed |
Cloud medical APIs | |
|---|---|---|
| 사용자의 장치/서버에서 실행 | ✅ | ❌ |
| 환자 데이터가 네트워크를 벗어남 | 절대 없음 (Never) | 벤더로 전송됨 |
| 비용 | 무료 및 오픈 소스 (Free & open-source) | 호출당 과금 |
| 특화된 의료 모델 | 1,000개 이상 | 제한적 |
| 언어 | 12개 이상 | 다양함 |
| ... |
특화된 모델 (Specialized models)— 엄선된 1,000개 이상의 생물 의학 및 임상 모델이 포함되어 있으며, 다수가 독점적인 스택 (proprietary stacks)보다 뛰어난 성능을 발휘합니다.
HIPAA 준수 비식별화 (HIPAA-aware de-identification)— 18가지 Safe Harbor 식별자 전체를 지원하며, 스마트 엔티티 병합 (smart entity merging) 및 형식 보존 가상 데이터 (format-preserving fakes) 기능을 제공합니다.
어디서나 실행 가능 (Runs everywhere)— CPU, CUDA, Apple Silicon (MLX)에서 작동하며, OpenMedKit을 통해 iOS/macOS 앱에서 네이티브로 실행됩니다.
한 줄 배포 (One-line deployment)— Python API, Docker화된 REST 서비스 또는 배치 파이프라인 (batch pipelines)을 지원합니다.
종속성 없음 (Zero lock-in)— Apache-2.0 라이선스, 귀하의 인프라, 귀하의 데이터를 사용합니다.
OpenMed는 데이터가 이미 존재하는 곳에서 실행되도록 설계되었습니다. Apple 하드웨어에서는 MLX를 통해 가속화되며, OpenMedKit을 통해 iPhone, iPad, Mac 앱으로 직접 탑재됩니다. 따라서 개인정보 (PII) 탐지 및 임상 추출이 장치 내에서 완전히 오프라인으로 수행됩니다.
// 앱에 OpenMedKit 추가
dependencies: [
.package(url: "https://github.com/maziyarpanahi/openmed.git", from: "1.5.5"),
...
PII 토큰 분류, Privacy Filter 제품군, 그리고 실험적인 GLiNER 제품군 제로샷 (zero-shot) 작업을 위한 MLX 런타임 (MLX runtime) — CoreML 폴백 (fallback) 경로를 포함합니다.
하나의 모델 이름으로 모든 플랫폼 지원— MLX 모델 이름은 Apple 이외의 하드웨어에서 자동으로 일치하는 PyTorch 체크포인트로 폴백됩니다.
Apple Silicon에서의 Python도 지원합니다: pip install "openmed[mlx]"
.
가이드: MLX 백엔드 · OpenMedKit (Swift) · CoreML 내보내기
MLX vs CPU latency on Apple Silicon — 24 to 33 times faster
Apple Silicon에서의 MLX: CPU PyTorch보다 24–33배 빠름 — Privacy Filter 기준 — 추론 단계당 중앙값 지연 시간 (median latency), 낮을수록 좋습니다.
flowchart LR
A["임상 텍스트 (Clinical text)"] --> B["OpenMed<br/>(100% 온디바이스)"]
B --> C["의료 엔티티 (Medical entities)"]
...
# Core + Hugging Face 런타임 (Linux, macOS, Windows; CPU 또는 CUDA)
pip install "openmed[hf]"
# REST 서비스 추가
...
from openmed import analyze_text
analyze_text(
"Patient received 75mg "
...
|
uvicorn openmed.service.app:app \
--host 0.0.0.0 --port 8080
|
from openmed import BatchProcessor
p = BatchProcessor(
model_name=
...
오프라인/에어갭 환경에서 사용하려면? 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.",
...
전문 의료 NER(Named Entity Recognition) 모델의 엄선된 레지스트리 — 전체 카탈로그를 확인하세요.
| Model | Specialization (특화 분야) | Entity types (개체 유형) | Size (크기) |
|---|
disease_detection_superclinical | Disease & conditions (질병 및 상태) | DISEASE, CONDITION, DIAGNOSIS | 434M |
pharma_detection_superclinical | Drugs & medications (약물 및 의약품) | DRUG, MEDICATION, TREATMENT | 434M |
pii_superclinical_large | PII & de-identification (개인 식별 정보 및 비식별화) | NAME, DATE, SSN, PHONE, EMAIL, ADDRESS | 434M |
anatomy_detection_electramed | Anatomy & body parts (해부학 및 신체 부위) | ANATOMY, ORGAN, BODY_PART | 109M |
gene_detection_genecorpus | Genes & proteins (유전자 및 단백질) | GENE, PROTEIN | 109M |
from openmed import extract_pii, deidentify
text = "Patient: John Doe, DOB: 01/15/1970, SSN: 123-45-6789"
# 스마트 병합(smart merging)으로 PII 추출 (토큰화 파편화를 방지)
...
**스마트 개체 병합(Smart entity merging)**은 01/15/1970을 분리하지 않고 온전하게 유지합니다. **Faker 기반 난독화(Faker-backed obfuscation)**는 사용자 지정 임상 ID 제공업체(CPF, CNPJ, BSN, NIR, Codice Fiscale, NIE, Aadhaar, Steuer-ID, NPI)를 지원합니다. HIPAA: 18개 Safe Harbor 식별자 모두 구성 가능하며 신뢰도 임계값 설정이 가능합니다. 배치 PII(Batch PII) (v1.5.5): BatchProcessor(operation="extract_pii" | "deidentify", batch_size=16)를 사용하여 여러 문서에서 추출 또는 비식별화할 수 있습니다.
Complete PII notebook · Smart merging · Anonymization
Privacy Filter family — OpenAI Privacy Filter 아키텍처 기반의 세 가지 모델 패밀리
동일한 모델 코드(로컬 어텐션 (local attention), 싱크 토큰 (sink tokens), RoPE+YaRN, tiktoken o200k_base를 사용하는 gpt-oss-style sparse-MoE 트랜스포머 (transformer))를 사용하지만, 학습 데이터는 다릅니다. 모든 모델은 동일한 extract_pii() / deidentify() API를 통해 경로를 지정하며, 오직 model_name= 파라미터만 변경하면 됩니다.
| 변형 (Variant) | PyTorch (CPU + CUDA) | MLX (Apple Silicon) | MLX 8-bit |
|---|
| OpenAI Privacy Filter | openai/privacy-filter | OpenMed/privacy-filter-mlx | …-mlx-8bit |
| Nemotron-PII fine-tune | OpenMed/privacy-filter-nemotron | …-nemotron-mlx | …-nemotron-mlx-8bit |
| OpenMed Multilingual | OpenMed/privacy-filter-multilingual | …-multilingual-mlx | …-multilingual-mlx-8bit |
from openmed import extract_pii
text = "Patient Sarah Connor (DOB: 03/15/1985) at MRN 4471882."
extract_pii(text, model_name="openai/privacy-filter") # PyTorch 베이스라인
...
Apple Silicon이 아닌 호스트에서는 MLX 모델 이름이 일치하는 PyTorch 체크포인트(checkpoint)로 자동 대체됩니다(1회성 경고 발생) — 하나의 모델 이름만 전달하면 어디서든 실행할 수 있습니다. Privacy Filter 아키텍처 및 백엔드 라우팅 (backend routing)을 참조하세요.
en, fr, de, it, es, nl, hi, te, pt, ar, ja, tr에 걸친 추출 및 비식별화 (de-identification) — 총 247개의 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: [email protected]', lang='pt').entities])"
언어별 예시 보기 (포르투갈어, 네덜란드어, 힌디어, 아랍어, 일본어, 터키어)
from openmed import extract_pii
portuguese = extract_pii("Paciente: Pedro Almeida, CPF: 123.456.789-09, telefone: +351 912 345 678", lang="pt", use_smart_merging=True)
dutch = extract_pii("Patiënt: Eva de Vries, BSN: 123456782, telefoon: +31 6 12345678", lang="nl", use_smart_merging=True)
...
요청 검증 (request validation), 공유 파이프라인 프리로드 (pipeline preload), 통합 에러 엔벨로프 (error envelopes)를 갖춘 Docker 친화적인 FastAPI 서비스입니다.
pip install "openmed[hf,service]"
uvicorn openmed.service.app:app --host 0.0.0.0 --port 8080
또는 Docker 사용 시
...
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"}'
모델 생명주기 (v1.5.5): GET /models/loaded를 통해 필요할 때 메모리 확보 및 POST /models/unload, 그리고 keep_alive 유휴 시간 설정:
OPENMED_SERVICE_KEEP_ALIVE=10m 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}'
전체 REST 서비스 가이드를 참조하세요.
전체 가이드는 openmed.life/docs에서 확인 가능합니다.
| 시작하기 | 텍스트 분석 | 모델 레지스트리 |
| FAQ | 익명화 (Anonymization) | 배치 처리 (Batch Processing) |
| 구성 프로필 (Configuration Profiles) | REST 서비스 | MLX 백엔드 |
OpenMed의 수호자는 작은 아비세나(Avicenna, Ibn Sina) 스타일의 복슬복슬한 페르시아 고양이입니다. 아비세나는 600년 동안 세계 표준 의학 교과서였던 『의학정전 (Canon of Medicine)』을 쓴 위대한 페르시아 의사입니다. 그는 페르시아 청록색(fīrūza) 팔레트로 구성된 오픈 북 형태의 의료 지식을 감시하며, 가장 사적인 데이터를 위한 로컬 우선(local-first) 수호자 역할을 합니다.
기여를 환영합니다 — 버그 보고, 기능 요청, PR 모두 환영합니다.
- 이슈 열기 (Open an issue)
번역도 환영합니다— 상단의 스위처에 연결된 다른 언어의 README 파일을 완성하는 데 도움을 주세요.
OpenMed는 훌륭한 오픈 소스 작업 위에 구축되었습니다 — 특히 OpenAI(Privacy Filter 아키텍처), NVIDIA(Nemotron PII 데이터셋), Hugging Face(transformers 및 모델 생태계), Apple(MLX), 그리고 Faker 유지보자들에게 감사를 표합니다.
Apache-2.0 라이선스 하에 배포됩니다.
@misc{panahi2025openmedneropensourcedomainadapted,
title={OpenMed NER: Open-Source, Domain-Adapted State-of-the-Art Transformers for Biomedical NER Across 12 Public Datasets},
author={Maziyar Panahi},
...
만약 OpenMed가 유용하다면, 스타(star)를 눌러 다른 사람들이 발견할 수 있도록 도와주세요.