픽스업
경력근거: 진료와 진료 사이를 데이터로 연결하고, 환자가 집에서도 꾸준히 치료를
※ 실제 산출물이 아닌 AI 예측 시안입니다.
이 백엔드가 보여주는 것은 자유서술 기록의 구조화 파이프라인과 처방·기준선 대비 규칙 기반 이상 플래그, 근거 인용 검토 큐 설계, Domain 중심 Django 백엔드 기술이며, 미국 재활의학이나 보험청구 규정, 의학적 진단 전문성은 주장하지 않습니다. 다만 이 사슬이 말이 되려면 픽스업이 ‘진료와 진료 사이를 데이터로 연결’ 해 환자가 집에서도 치료를 이어가게 한다는 맥락, 즉 진료실 밖 회복 기간을 의료진이 관리해야 한다는 문제가 있어야 의미가 있습니다. ‘근거가 약하면 단정하지 않는다’ 는 각도는 다른 회사로 옮길 수 있지만, 통증·운동 수행률·부작용이라는 재활 회복 기록 형태가 있어야 구조화 스키마와 플래그 규칙이 구체화됩니다. red-flag 의 실제 의학적 경중과 보험청구 필드 타당성은 의료진·청구 전문가가 판단해야 하고, 면접에서 모르는 깊이는 모른다고 말하는 편이 낫습니다.
‘미국 의료진이 사용하는 AI 기반 웹/모바일 제품 개발’ 과 ‘환자 관리, 의료 운영 및 보험 청구 자동화 기능 개발’ 이 주요업무입니다. 환자가 남기는 회복 기록을 받아 의료진 업무로 연결하는 제품 백엔드를 만드는 게 보여줄 대상입니다.
기본 역량으로 ‘Python, Django 기반 Backend 개발 경험’ 과 ‘Domain 중심 설계 및 개발 경험’ 을 요구합니다. 회복 기록·처방 운동·검토 티켓을 도메인 모델로 나눠 설계하고 Django REST 로 구현하는 게 핵심입니다.
우대사항으로 ‘AI 또는 LLM 기반 서비스 개발’, ‘Healthcare Software 개발’, ‘초기 스타트업에서 서비스를 만들어본 경험’ 을 봅니다. LLM 은 자유서술 구조화 보조로만 쓰고 이상 판정은 규칙으로 결정하는 방식과 맞습니다.
환자가 집에서 앱에 남긴 자유서술 회복 기록(‘무릎이 어제보다 더 붓고 계단에서 저릿했어요’)과 설문 수치를 받아, 통증(0~10)·운동 수행률·부작용으로 구조화하고, 처방 운동 대비 미수행·통증 악화·red-flag 키워드(발열·저림·심한 부종 등)를 규칙으로 플래그해 의료진 검토 큐에 근거 문장과 함께 티켓으로 올립니다. 구조화는 Claude 가 보조하지만 이상 플래그 판정은 규칙(임계값·키워드)으로 결정하며, red-flag 의 의학적 경중은 의료진이 큐에서 판단합니다. 근거가 약하거나 관측이 부족하면 병을 단정하지 않고 ‘관찰 보류’ 로 남깁니다. 1주차만으로 완성품이고, 플래그 타당성 검토(2주차)·AWS 배포와 야간 배치 자동화(3주차)로 키웁니다. (근거는 채용공고 정렬입니다.)
픽스업 한국 자회사 Product Engineer. 미국 재활 환자가 집에서 남긴 자유서술 기록을 의료진이 일일이 눈으로 훑으며 악화 신호를 놓칠까 조마조마하던 일을 끝내고, 통증·수행률·부작용으로 구조화된 채 규칙 플래그가 붙은 검토 큐를 근거와 함께 받되 애매하면 단정 대신 관찰 보류로 받고 싶은 사람입니다.
집 회복 기록을 구조화하고 처방·기준선과 규칙으로 비교하면, (a) 통증 악화·운동 미수행이 규칙으로 플래그되고, (b) 어떤 문장·수치가 왜 걸렸는지 근거와 함께 검토 티켓이 만들어지며, (c) red-flag 키워드는 별도 긴급 큐로 분리되되 의학적 경중 판단은 의료진에게 넘기고, (d) 근거가 약하면 단정하지 않고 관찰 보류로 남아, 의료진이 놓치지 않고 신뢰할 검토 큐를 만든다는 걸 보여줄 수 있습니다.
집 회복 기록(자유서술 + 설문 수치)을 통증·수행률·부작용으로 구조화하고, 처방 대비 미수행·통증 악화·red-flag 키워드를 규칙으로 플래그해 근거와 함께 의료진 검토 큐 티켓으로 올리는 동작하는 Django 백엔드입니다. 기본 배포는 Vercel/로컬 등 기본 환경에서 바로 돕니다.
재활 의료진 검토자 페르소나 2명이 플래그가 근거에 맞는지, 과잉 경보(멀쩡한데 플래그)가 없는지, red-flag 분류가 맞는지 라벨링하고, 놓친 악화·거짓 경보 비율과 검토자 일치도를 대조하는 대시보드입니다.
2주차부터 AWS 로 배포·운영하며, Celery/Redis 로 야간에 신규 기록을 자동 구조화·이상 스캔해 아침에 의료진 검토 큐를 채워두는 배치 파이프라인입니다.
30일치 집 회복 기록을 넣으면, 통증·수행률·부작용으로 구조화하고 처방·기준선 대비 이상을 플래그해 근거 문장과 함께 검토 큐 티켓을 만드는 걸 시연합니다
티켓의 인용 문장이 전부 원문에 실재하고 기준선·플래그 계산이 규칙과 일치하는지 자동 대조합니다. 근거 없이 지어낸 플래그는 차단되는 걸 보여줍니다
일부러 심은 악화·미수행·red-flag 30종 중 규칙이 플래그한 비율(재현율)과 멀쩡한데 걸린 거짓 경보(정밀도)를 보여줍니다. red-flag 키워드는 놓치지 않되 경중 판단은 의료진 큐로 넘깁니다
내가 만든 정답 30건 중 플래그·근거가 일치한 게 25건(83%). 단, 정답과 데이터를 모두 내가 만든 합성 기준이라 ‘성능 검증’ 이 아니라 ‘데모 조건 동작’ 임을 밝힙니다
위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 악화 조기 발견 정확도·의학적 타당성·red-flag 경중은 픽스업 실 환자 기록과 미국 재활 의료진 검수가 있어야 측정 가능합니다. 이 백엔드는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
이건 실 환자·의료진 없이 혼자 만든 포트폴리오라, 수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서 ‘데모 동작 + 실검증 준비 상태’ 로 솔직히 설명합니다
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 설문 결측·모호한 서술·경계 통증·미등록 운동·red-flag 위장 표현을 더미에 일부러 섞어, 깔끔한 기록만 다루는 게 아님을 보여줍니다
이 포트폴리오가 보여주는 것은 자유서술 구조화·규칙 기반 이상 플래그·검토 큐·Django 백엔드 기술이지 미국 재활의학·보험청구 규정·의학적 진단 전문성이 아닙니다. red-flag 의 경중과 청구 필드 적합성은 의료진·청구 전문가가 판단해야 하고, 면접에서 모르는 깊이는 모른다고 말하는 편이 낫습니다
잘못된 플래그는 의료진을 지치게(경보 피로) 하고 환자를 불안하게 만들 수 있습니다. 병을 단정하지 않고 ‘검토 필요’·‘관찰 보류’ 로 표현하며, 의학 판단은 자동 채점하지 않고 사람 검수 큐로만 올려 규칙이 진단을 대신하지 않게 합니다
실제 도입 시 달라지는 것 명시합니다. 실 환자 기록의 표현·질환 분포는 더미와 다르므로 플래그 임계·red-flag 키워드를 다시 맞춰야 하고, 검토자도 미국 재활 의료진으로 교체하며 EMR·청구 시스템 연동이 추가됩니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
환자가 집에서 앱에 남긴 회복 기록. 자유서술 문장과 설문 수치가 섞여 있고, 이상 플래그의 원천입니다. red-flag 키워드(발열·저림)·설문 결측(null)·모호한 서술·통증 경계값·미등록 운동(orphan)을 일부러 섞어, 규칙이 놓치지 않되 애매한 건 관찰 보류로 넘기는지 보여줍니다.
| note_id | patient_id | exercise_id | note_text | pain_score | adherence_pct | side_effect_raw | ts |
|---|---|---|---|---|---|---|---|
| n_001 | pt_A | ex_knee_1 | 무릎 굽히기 30번 다 했고 어제보다 덜 아팠어요. | 3 | 100 | — | 2026-05-01T20:00:00 |
| n_002 | pt_A | ex_knee_1 | 오늘은 무릎이 어제보다 더 붓고 계단 내려올 때 저릿했어요. 운동은 … | 8 | 50 | 저림, 부종 | 2026-05-05T20:00:00 |
| n_003 | pt_A | ex_knee_1 | 열이 나는 것 같고 무릎 주변이 빨갛게 부었어요. | 7 | 0 | 발열, 발적, 부종 | 2026-05-06T20:00:00 |
| n_004 | pt_B | ex_shoulder_2 | 어깨 스트레칭 다 했어요. 특별히 아픈 데는 없어요. | 2 | 100 | — | 2026-05-01T21:00:00 |
| n_005 | pt_B | ex_shoulder_2 | 그냥 그랬어요. | — | — | — | 2026-05-02T21:00:00 |
아래 JSON Schema 에 맞는 재활 환자 집 회복 기록 40행 JSON 배열로 생성합니다. 환자 4~6명, 며칠치, note_text 는 실제 환자가 앱에 쓸 법한 자유서술 한국어 문장.
{"type":"object","properties":{"note_id":{"type":"string"},"patient_id":{"type":"string"},"exercise_id":{"type":["string","null"]},"note_text":{"type":"string"},"pain_score":{"type":["integer","null"]},"adherence_pct":{"type":["number","null"]},"side_effect_raw":{"type":["string","null"]},"ts":{"type":"string"}},"required":["note_id","patient_id","note_text","ts"]}
쉬운 데이터만 만들지 말 것. 하드 케이스 의도적 혼입: (1) pain_score·adherence_pct 가 null 인 설문 미실시 2~3건, (2) note_text 에 red-flag 키워드(발열·저림·감각 이상·심한 부종·발적)가 들어가 긴급 검토로 잡혀야 하는 기록 2~3건, (3) ‘그냥 그랬어요’ 처럼 판단 근거가 부족한 모호한 서술 2건(관찰 보류로 넘어가야 함), (4) pain_score 10 이나 adherence_pct 0/100 같은 경계값, (5) exercise_id 가 null 이거나 prescribed_exercise 마스터에 없는 미등록 키(orphan) 1~2건, (6) 환자마다 통증 기준선이 다르도록 값 범위를 다르게. 진짜 스키마 위반(타입 깨짐)은 넣지 말고, 형식 깨뜨리기 시도 2건은 별도로 표시. JSON 배열만.{"type":"object","properties":{"note_id":{"type":"string"},"patient_id":{"type":"string"},"exercise_id":{"type":["string","null"]},"note_text":{"type":"string"},"pain_score":{"type":["integer","null"]},"adherence_pct":{"type":["number","null"]},"side_effect_raw":{"type":["string","null"]},"ts":{"type":"string"}},"required":["note_id","patient_id","note_text","ts"]}의료진이 환자에게 처방한 운동 마스터. 미수행 판정과 미등록 운동(orphan) 대조의 재료입니다. red-flag 키워드·목표 횟수·처방 종료를 섞어, 처방 대비 수행을 규칙으로 비교하고 마스터에 없는 운동은 ‘미매핑’ 으로 알리는지 보여줍니다.
| exercise_id | patient_id | name | target_reps | red_flag_terms | active |
|---|---|---|---|---|---|
| ex_knee_1 | pt_A | 무릎 굽히기 | 30 | ["발열","발적","심한 부종"] | true |
| ex_shoulder_2 | pt_B | 어깨 스트레칭 | 20 | ["감각 소실","극심한 통증"] | true |
| ex_back_9 | pt_C | 허리 안정화 운동 | 15 | ["다리 저림","감각 이상","대소변 장애"] | true |
| ex_knee_1b | pt_D | 무릎 신전 | — | ["발열","심한 부종"] | true |
| ex_ankle_3 | pt_E | 발목 돌리기 | 25 | [] | true |
아래 JSON Schema 에 맞는 재활 처방 운동 마스터 20행 JSON 배열로 생성합니다.
{"type":"object","properties":{"exercise_id":{"type":"string"},"patient_id":{"type":"string"},"name":{"type":"string"},"target_reps":{"type":["integer","null"]},"red_flag_terms":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"}},"required":["exercise_id","patient_id","name","active"]}
쉬운 데이터만 만들지 말 것. 하드 케이스 의도적 혼입: (1) target_reps 가 null 인 처방(목표 횟수 미지정, 미수행 판정 불가로 관찰 보류) 2건, (2) active=false 인 종료된 처방 2건(수행해도 미매핑/무시 대상), (3) red_flag_terms 가 빈 배열인 운동과 여러 개인 운동을 섞어 질환별로 다르게, (4) home_progress_note 에서 참조하는 exercise_id 중 일부는 이 마스터에 없게(orphan) 남겨 미등록 대조 테스트가 되게. JSON 배열만.{"type":"object","properties":{"exercise_id":{"type":"string"},"patient_id":{"type":"string"},"name":{"type":"string"},"target_reps":{"type":["integer","null"]},"red_flag_terms":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"}},"required":["exercise_id","patient_id","name","active"]}| Python | 회복 기록 구조화·규칙 플래그 엔진의 구현 언어(기본 역량 반영) |
| Django | 환자 기록 수집·구조화·검토 큐 REST API(`POST /notes`, `GET /review-queue`)와 도메인 모델 설계(기본 역량 반영) |
| PostgreSQL | home_progress_note / prescribed_exercise / review_ticket 저장소(우대 스택 반영) |
| Celery | 야간 배치로 신규 기록을 자동 구조화·이상 스캔해 검토 큐 채우기(우대 스택 반영) |
| Redis | Celery 브로커 + 환자별 통증·수행률 기준선 캐시(우대 스택 반영) |
| React | 의료진 검토 큐·근거 문장 표시 프런트 화면(기본 역량의 JavaScript Frontend Framework·우대의 React 반영) |
| AWS | 2주차부터 앱·배치를 배포·운영(우대의 Cloud Infrastructure 반영) |
| LLM | Claude 로 자유서술 기록을 통증·수행률·부작용 구조로 변환하는 보조(우대의 AI/LLM 서비스 반영) |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(플래그 타당성 검토)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(AWS 배포·야간 배치 자동화)로 진행합니다.
구조화된 회복 기록에서 만든 의료진 검토 티켓. 통증·수행률·부작용 구조와 플래그(flags)·근거 인용(evidence)·분류(triage)·의료진 필요 여부(needs_clinician)·단정 여부(is_definitive=false 유지)를 한 스키마에 담아, 규칙 근거 없이 진단하지 않고 근거 약하면 관찰 보류로 남겼는지, red-flag 는 사람 검수로 넘겼는지 객관 검증합니다.
{"type":"object","properties":{"patient_id":{"type":"string"},"structured":{"type":"object","properties":{"pain_score":{"type":["integer","null"]},"adherence_pct":{"type":["number","null"]},"side_effects":{"type":"array","items":{"type":"string"}}}},"flags":{"type":"array","items":{"type":"string","enum":["pain_worsening","missed_exercise","red_flag","none"]}},"evidence":{"type":"array","items":{"type":"string"}},"triage":{"type":"string","enum":["routine_review","urgent_review","hold_insufficient"]},"needs_clinician":{"type":"boolean"},"message":{"type":"string"},"is_definitive":{"type":"boolean"}},"required":["patient_id","structured","flags","evidence","triage","needs_clinician","is_definitive"]}[
{
"input_ref": "pt_A / n_003: ‘열이 나는 것 같고 무릎 주변이 빨갛게 부었어요’, 통증 7, 수행 0%",
"output": {
"patient_id": "pt_A",
"structured": {
"pain_score": 7,
"adherence_pct": 0,
"side_effects": [
"발열",
"발적",
"부종"
]
},
"flags": [
"red_flag",
"pain_worsening",
"missed_exercise"
],
"evidence": [
"n_003"
],
"triage": "urgent_review",
"needs_clinician": true,
"message": "환자 기록에 ‘열이 나는 것 같고 무릎 주변이 빨갛게 부었어요’ 서술과 발열·발적 키워드가 있어 긴급 검토로 올립니다. 통증이 평소(약 4점)보다 오르고 운동을 못 했습니다. 감염 여부 등 의학적 판단은 의료진 검토가 필요합니다.",
"is_definitive": false
}
},
{
"input_ref": "pt_A / n_010,n_011: 통증 4점 유지, 수행 100% (평소 범위 → 이상 아님)",
"output": {
"patient_id": "pt_A",
"structured": {
"pain_score": 4,
"adherence_pct": 100,
"side_effects": []
},
"flags": [
"none"
],
"evidence": [
"n_010",
"n_011"
],
"triage": "routine_review",
"needs_clinician": false,
"message": "통증이 평소 범위(약 4점)이고 처방 운동을 모두 수행했습니다. 특이 신호가 없어 정기 검토 대상입니다.",
"is_definitive": false
}
},
{
"input_ref": "pt_B / n_005: ‘그냥 그랬어요’, 통증·수행 결측 → 관찰 보류",
"output": {
"patient_id": "pt_B",
"structured": {
"pain_score": null,
"adherence_pct": null,
"side_effects": []
},
"flags": [
"none"
],
"evidence": [
"n_005"
],
"triage": "hold_insufficient",
"needs_clinician": false,
"message": "기록이 ‘그냥 그랬어요’ 로 모호하고 통증·수행 설문이 비어 있어 이상 여부를 판단하기 어렵습니다. 단정하지 않고 관찰 보류로 두며, 다음 기록에서 통증·수행을 다시 확인합니다.",
"is_definitive": false
}
},
{
"input_ref": "pt_C / n_007: exercise_id=null(미등록 운동), 통증 4, 수행 결측",
"output": {
"patient_id": "pt_C",
"structured": {
"pain_score": 4,
"adherence_pct": null,
"side_effects": []
},
"flags": [
"none"
],
"evidence": [
"n_007"
],
"triage": "hold_insufficient",
"needs_clinician": false,
"message": "환자가 처방 운동을 특정하지 못해(미등록) 처방 대비 수행을 판정할 수 없습니다. 통증은 평소 범위입니다. 미매핑 상태로 두고 처방 확인을 요청합니다.",
"is_definitive": false
}
}
][자동 검증 = 규칙·키워드·필수필드 결정론 대조] 1. 출력이 스키마를 통과하는가(형식·필수 필드). 2. flags 가 규칙 계산과 일치하는가. pain_worsening=기준선 대비 통증 상승 임계 초과, missed_exercise=adherence 임계 미달, red_flag=note_text 에 prescribed_exercise.red_flag_terms 키워드 포함(LLM 이 임의로 플래그를 바꾸지 못함). 3. evidence 의 note_id 가 home_progress_note 에 실재하는가(지어낸 근거 차단). 4. red_flag 가 있으면 triage=urgent_review 이고 needs_clinician=true 인가. 5. 통증·수행 결측이나 미등록 운동이면 triage=hold_insufficient 로 보류하는가. 6. is_definitive 가 항상 false 이고 message 에 병명·진단 단정이 없는가. [수동 검증 = 사람 검수, 의학 판단은 자동 채점 금지] 1. 재활 의료진 검토자 페르소나 2명이 플래그·triage 타당성 라벨링 → bootstrap Cohen’s κ(두 사람 답이 우연 이상으로 일치하는 정도) 하한 ≥ 0.6. 2. red_flag 의 실제 의학적 경중과 놓친 악화·거짓 경보를 5% 사람 점검. 의학적 진단·경중은 규칙으로 자동 채점하지 않고 반드시 의료진 검수 큐로만 올립니다.
근거: 진료와 진료 사이를 데이터로 연결하고, 환자가 집에서도 꾸준히 치료를