버디랩스
경력근거: OCR로 검진 PDF에서 데이터를 추출하고, AI를 활용해 이를 구조화된 데이터로 변환하는 파이프라인을 만들고 고도화해요
※ 실제 산출물이 아닌 AI 예측 시안입니다.
'OCR로 검진 PDF에서 데이터를 추출하고, AI를 활용해 이를 구조화된 데이터로 변환하는 파이프라인' 이라는 공고 문장이 이 콘솔의 정의와 그대로 겹치고, '결과의 정확도를 검증하는 장치까지 함께 설계' 라는 요구가 원문 인용 검사와 참고치 규칙 판정으로 구현됩니다. 검진 데이터라는 입력의 모양(항목 별칭·참고치·종별 차이)은 버디케어의 동물병원 고객 맥락에서만 이런 구조가 됩니다. 이 포트폴리오는 비정형 텍스트 구조화 파이프라인과 검증 장치 설계를 보여주며, 수의학 판독 전문성은 주장하지 않습니다. 판정은 참고치 숫자 비교일 뿐 임상 해석이 아니라고 면접에서 밝힙니다.
공고가 검진 PDF 에서 데이터를 추출해 구조화된 데이터로 변환하는 파이프라인과 그 정확도를 검증하는 장치까지 함께 설계한다고 명시합니다. 이 콘솔이 그 파이프라인의 축소 완결판입니다.
공고가 빠른 속도만큼 검증과 회귀 방지를 기본기로 꼽습니다. 골든 케이스 회귀 테스트 세트를 산출물에 포함해 그 기본기를 코드로 보여줍니다.
공고가 AI 가 내놓은 결과를 검증한 뒤 책임지고 반영하라고 요구합니다. LLM 추출값을 참고치 규칙과 원문 인용 검사로 이중 확인하는 이 콘솔의 구조가 같은 태도입니다.
동물병원 검진 리포트의 OCR 완료 텍스트를 입력하면, 검사항목 마스터에 매핑된 구조화된 기록(항목·수치·단위·판정)를 만들어주는 관리자 페이지입니다. 모든 항목에 원문 인용이 붙고, 낮음·정상·높음 판정은 LLM 이 아니라 참고치 규칙이 결정합니다. 마스터에 없는 항목은 추측하지 않고 미매핑으로 분리해 보여줍니다.
검진 결과 PDF 를 받으면 항목 수십 개를 눈으로 옮겨 적으며 오타가 날까 봐 두 번씩 확인하던 동물병원 실장입니다. 원문 어디에서 나온 값인지 바로 짚어주는 정리본을 받아, 옮겨 적는 일 대신 확인 도장만 찍고 싶은 사람입니다.
검사항목 표기가 병원마다 흔들려도(ALT/GPT 처럼 같은 검사의 다른 이름) 별칭 마스터와 원문 인용 검사를 거치면, LLM 추출을 사람이 안심하고 검수할 수 있는 수준의 구조화 레코드로 만들 수 있습니다.
OCR 은 이미 끝난 텍스트를 입력으로 가정하고 시작합니다(이미지 처리 없음). 더미 검진 리포트 10건을 넣으면 항목 매핑·수치 추출·참고치 판정·원문 인용 검사를 통과한 레코드와 검수 화면까지 도는 완결품입니다.
리포트 30건의 정답표 대비 항목·수치 추출 일치율 리포트와, 수정된 케이스가 다시 깨지지 않게 막는 골든 케이스 회귀 테스트 세트가 남은 상태입니다.
별칭 마스터를 확장해 미매핑률 변화를 기록하고, 추출 실패·재시도를 추적하는 구조화 로그와 모니터링 화면이 붙은 상태입니다.
검진 리포트 원문을 넣으면 항목·수치·판정·원문 인용이 달린 구조화 레코드가 나오는 흐름을 시연합니다(더미 리포트 10건 기준).
레코드의 모든 수치·항목 인용이 원문의 실제 문장 조각인지, 낮음·정상·높음 판정이 참고치 규칙 재계산과 일치하는지 자동 검사로 100% 통과를 보여줍니다(표본: 레코드 전수, 검증 스크립트).
별칭 표기(ALT/GPT)·참고치 누락·마스터에 없는 검사·수치 0 같은 하드 케이스 30종을 넣어도 출력 형식이 깨지지 않고 미매핑이 추측 없이 분리됩니다.
위 수치는 정답과 데이터를 작성자가 만든 더미 자가채점이라 성능 증명이 아닙니다. 실제 추출 정확도는 버디랩스의 실제 검진 PDF 와 병원 검수자가 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직하게 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 게 당연해지는 함정이 있습니다. 별칭 표기 흔들림, 참고치 누락, 마스터에 없는 항목, OCR 잡음 문자를 더미에 일부러 섞습니다.
실제 OCR 출력은 더미보다 잡음이 심해 전처리 단계 추가가 필요합니다. 이미지 처리와 OCR 엔진 선택은 도입 단계 과제로 분리합니다.
이 포트폴리오는 텍스트 구조화 파이프라인과 검증 장치 설계를 보여줌할 뿐, 수의학 판독 전문성은 주장하지 않습니다. 판정은 참고치 숫자 비교이며 임상 해석은 수의사의 영역이라고 면접에서 밝힙니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
OCR 이 끝난 검진 리포트 원문 텍스트입니다. 추출·매핑·판정의 입력이며 표기 흔들림과 잡음을 일부러 담았습니다.
혈액화학 검사 결과 ALT 82 U/L (참고치 10-100), BUN 18 mg/dL (참고치 7-27), 크레아티닌 1.1 mg/dL (0.5-1.8). 전 항목 참고 범위 내.
GPT 140 U/L 로 참고 상한(100) 초과. 요소질소 32 mg/dL 상승 소견. Glucose 98 mg/dL 정상.
다음 JSON Schema 를 그대로 만족하는 반려동물 검진 리포트 원문 문서를 20건 더 만들어 주세요: {"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]} title 은 'RPT-### · 품종 나이' 형식, body 는 OCR 완료 텍스트 느낌의 검사 나열로 쓸 것. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 검사의 별칭 표기(ALT/GPT, AST/GOT, BUN/요소질소) 문서 4건 이상, (2) 참고치나 단위가 누락된 항목이 있는 문서 3건, (3) 마스터에 없을 신규 검사 항목 등장 문서 2건, (4) OCR 잡음(숫자 0↔영문 O, 소수점 누락) 문서 2건, (5) 수치 0 이나 참고치 하한·상한 경계값 문서 2건.{"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]}검사항목 마스터입니다. 별칭 매핑과 참고치 규칙 판정의 기준이며, 여기에 없는 항목은 미매핑으로 분리됩니다.
| test_id | name_std | aliases | unit | ref_low | ref_high | species |
|---|---|---|---|---|---|---|
| T-ALT | ALT | ["GPT","ALT(GPT)"] | U/L | 10 | 100 | 개 |
| T-ALT-C | ALT | ["GPT"] | U/L | 20 | 100 | 고양이 |
| T-AST | AST | ["GOT","AST(GOT)"] | U/L | 15 | 66 | 개 |
| T-BUN | BUN | ["요소질소","혈중요소질소"] | mg/dL | 7 | 27 | 개 |
| T-BUN-C | BUN | ["요소질소"] | mg/dL | 16 | 36 | 고양이 |
다음 JSON Schema 를 그대로 만족하는 반려동물 검사항목 마스터 행을 20개 더 만들어 주세요: {"type":"object","properties":{"test_id":{"type":"string"},"name_std":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"unit":{"type":["string","null"]},"ref_low":{"type":["number","null"]},"ref_high":{"type":["number","null"]},"species":{"type":"string","enum":["개","고양이","공통"]}},"required":["test_id","name_std","aliases","species"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 name_std 가 종(개·고양이)별로 참고치가 다른 쌍 3쌍 이상, (2) unit 또는 ref_low/ref_high 가 null 인 행 4개(참고치 미확립 검사), (3) aliases 가 빈 배열인 행 2개, (4) 한글·영문·괄호 혼합 별칭(ALT(GPT) 류) 행 3개.{"type":"object","properties":{"test_id":{"type":"string"},"name_std":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"unit":{"type":["string","null"]},"ref_low":{"type":["number","null"]},"ref_high":{"type":["number","null"]},"species":{"type":"string","enum":["개","고양이","공통"]}},"required":["test_id","name_std","aliases","species"]}| LLM | 원문에서 항목 이름·수치·단위 후보를 추출합니다. 판정과 매핑 확정은 참고치 규칙과 별칭 마스터가 맡아 환각이 정답을 통과하지 못하게 합니다 |
| Claude | 추출 모델로 Claude Sonnet 을 쓰고, 출력 JSON Schema 를 강제해 형식 깨짐을 차단합니다. 공고의 Claude 중심 개발 문화와 같은 도구 축입니다 |
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 정답표 자가채점과 회귀 테스트 세트로 넘어갑니다.
✓ pass → 별칭 마스터 확장과 운영 로그·모니터링으로 확장합니다.
검진 리포트 한 건의 구조화 결과입니다. 항목마다 원문 인용이 붙고 판정은 참고치 규칙이 결정합니다.
{"type":"object","properties":{"report_id":{"type":"string"},"species":{"type":["string","null"]},"results":{"type":"array","items":{"type":"object","properties":{"test_id":{"type":["string","null"]},"name_raw":{"type":"string"},"value":{"type":["number","null"]},"unit_raw":{"type":["string","null"]},"flag":{"type":"string","enum":["낮음","정상","높음","판정불가"]},"quote":{"type":"string"}},"required":["name_raw","flag","quote"]}},"unmapped":{"type":"array","items":{"type":"string"}},"hedge":{"type":"string"}},"required":["report_id","results","unmapped","hedge"]}[
{
"report_id": "RPT-002",
"species": "고양이",
"results": [
{
"test_id": "T-ALT-C",
"name_raw": "GPT",
"value": 140,
"unit_raw": "U/L",
"flag": "높음",
"quote": "GPT 140 U/L 로 참고 상한(100) 초과"
},
{
"test_id": "T-BUN-C",
"name_raw": "요소질소",
"value": 32,
"unit_raw": "mg/dL",
"flag": "정상",
"quote": "요소질소 32 mg/dL 상승 소견"
},
{
"test_id": "T-GLU",
"name_raw": "Glucose",
"value": 98,
"unit_raw": "mg/dL",
"flag": "정상",
"quote": "Glucose 98 mg/dL 정상"
}
],
"unmapped": [],
"hedge": "판정은 더미 마스터 참고치의 규칙 비교이며 임상 해석이 아닙니다. 원문의 '상승 소견' 표현과 규칙 판정(고양이 참고치 기준 정상)이 다른 항목은 검수자 확인 대상으로 표시합니다."
},
{
"report_id": "RPT-008",
"species": "고양이",
"results": [],
"unmapped": [
"프룩토사민 310 umol/L"
],
"hedge": "마스터에 없는 항목은 값을 추측하지 않고 미매핑으로 분리했습니다. 합성 더미 기준 처리 결과입니다."
},
{
"report_id": "RPT-009",
"species": "개",
"results": [
{
"test_id": "T-BUN",
"name_raw": "BUN",
"value": 25,
"unit_raw": null,
"flag": "정상",
"quote": "BUN 25, Cr 1.5"
},
{
"test_id": "T-CRE",
"name_raw": "Cr",
"value": 1.5,
"unit_raw": null,
"flag": "정상",
"quote": "BUN 25, Cr 1.5"
},
{
"test_id": null,
"name_raw": "잠혈",
"value": null,
"unit_raw": null,
"flag": "판정불가",
"quote": "요검사 pH 6.5, 잠혈 음성"
}
],
"unmapped": [],
"hedge": "원문에 참고치 표기가 없어 마스터 기본 참고치로 판정했음을 표시합니다. 합성 더미 기준입니다."
}
][자동 검증 · 스크립트가 전수 수행] 1. 출력이 JSON Schema 형식을 통과하는지 확인합니다(형식 깨진 레코드가 검수 화면에 나가는 것을 차단). 2. 모든 results.quote 가 해당 리포트 원문의 실제 문장 조각(공백 정규화 후 substring)인지 확인합니다(값 환각 차단). 3. flag 가 마스터 참고치로 재계산한 판정과 100% 일치하는지 확인합니다(판정은 LLM 이 아니라 규칙이 결정). 4. results.test_id 가 마스터에 실재하는지, 없으면 unmapped 로 분리됐는지 확인합니다(추측 매핑 차단). [수동 검증 · 사람이 표본 확인] 1. 별칭 매핑(GPT→ALT 등)이 종별 참고치까지 맞게 붙었는지 레코드 10건을 표본 검토합니다. 2. hedge 문구가 원문 소견 표현과 규칙 판정의 충돌을 숨기지 않는지 확인합니다.
근거: OCR로 검진 PDF에서 데이터를 추출하고, AI를 활용해 이를 구조화된 데이터로 변환하는 파이프라인을 만들고 고도화해요