로봇컴
경력근거: 병원의 전화·상담·진료 음성을 데이터로 잇는 의료 특화 Voice AI D voice를 만듭니다
※ 실제 산출물이 아닌 AI 예측 시안입니다.
로봇컴은 병원의 전화·상담·진료 음성을 데이터로 잇는 의료 특화 Voice AI D voice를 만들고, 공고에 적힌 대로 현재 40+곳의 병·의원에서 D voice를 운영하며 누적 100만 건의 음성 데이터를 분석하고 있습니다. 전사가 이미 쌓이는 제품이라 안내 금액을 가격표와 맞추는 화면이 그 데이터 바로 옆에 붙고, 공고가 바꾸겠다고 적은 원장·의사·상담실장·인포데스크 네 사람 중 상담실장이 이 화면을 여는 사람입니다. 시술 금액이 구간으로 바뀌고 그 금액을 전화로 말하는 병·의원 말고는 같은 사슬이 생기지 않습니다. 제 몫은 한국어 금액 표기를 숫자로 바꿔 그날 적용되던 구간과 맞춰 보는 자리였습니다. 진료와 시술을 아는 사람은 병원 안에 따로 있고, 저는 그분들이 하는 말을 표로 받는 쪽만 맡았습니다.
공고는 병원의 전화·상담·진료 음성을 데이터로 잇는 의료 특화 Voice AI 를 만든다고 밝혔습니다. 전사가 이미 쌓이는 제품 위라면 안내 금액을 가격표와 맞추는 화면이 그 데이터 바로 다음 칸에 붙습니다.
원장·의사·상담실장·인포데스크 네 사람의 일하는 방식을 바꾸고 있다고 적혀 있습니다. 전화로 금액을 말하는 사람이 상담실장이라 이 화면의 사용자가 공고 안에 이미 지목돼 있습니다.
제품 엔지니어 한 명이 큰 권한을 가지고 현장에 배포되는 기능을 주도적으로 만든다고 적혀 있습니다. 한 사람이 표 두 장에서 화면까지 닫아 본 결과물이 그 일하는 모양과 같습니다.
상담실장이 통화 전사에서 금액이 오간 대목과 병원 시술 가격표를 올리면, 전화가 걸려 온 날에 적용되던 가격 구간을 골라 안내 금액과 맞춰 봅니다. 안내 금액은 삼십팔만 원이나 9만 9천 원처럼 말한 그대로 적혀 있어서, 한글 수사와 만·천 단위를 읽어 원 단위 숫자로 바꾼 뒤에 견줍니다. 시술 코드가 안 잡힌 통화와 끝난 구간만 남고 진행 구간이 비어 있는 시술은 견줄 금액 자체가 없으므로 따로 갈라 세웁니다. 어긋난 통화는 다섯 판정 중 하나를 달고 사유별로 서며, 그 대목의 전사 한 줄이 같이 붙어 무엇을 잘못 말했는지 상담실장이 그 자리에서 읽습니다.
전화 문의 응대를 챙기는 병·의원 상담실장
시술 가격은 구간으로 바뀌고 끝난 구간이 가격표에 그대로 남아 있어서, 상담실장이 통화 중에 기억으로 금액을 말하면 지난 금액이나 다른 금액이 섞입니다. 안내 금액을 그날 적용되던 구간과 맞춰 사유별로 내면 다시 연락해 바로잡을 통화가 그 주 안에 가려집니다.
통화 전사에서 금액이 오간 대목을 뽑은 표와 시술 가격표를 올리면 통화마다 다섯 판정 중 하나가 붙고 사유별로 나오는 관리자 페이지입니다. 금액 읽기는 한글 수사와 만·천 단위까지 다루는 작은 해석기로 시작하고, 시술이 안 잡힌 통화와 진행 구간이 없는 시술을 어디로 내릴지도 이 주에 닫습니다. 음성 파일과 실시간 전사는 사내 API 가 이미 뽑아 준 표를 받는 것으로 가정합니다.
가격 안내 통화 186건에 손으로 매긴 정답 판정을 붙여 자동 판정과 대조하고 사유별 일치율을 냅니다. 2주차부터 AWS 로 배포해 상담실장이 웹 주소로 들어와 그 주 통화를 올려 봅니다.
가격표 개정 이력을 화면에 세우고 개정일 앞뒤 2주 통화를 한 번에 되짚어, 바뀐 금액을 아직 옛 값으로 말하는 상담실이 어디인지 실장별로 보여주는 단계입니다.
상담실장이 통화 표와 가격표를 올리면 어긋난 안내가 사유별로 나오고 그 대목의 전사 한 줄이 같이 서는 과정을 시연합니다.
가격 안내 통화 186건에 손으로 매긴 정답 판정을 붙여 대조하고 사유별 일치율을 냅니다. 통화 대사를 쓴 사람과 정답을 붙인 사람이 같아서 이 수치는 병원 성적이 아니라 금액 해석기와 구간 선택이 제 규칙대로 도는지를 확인한 값입니다.
성한 표부터 올리지 않습니다. 금액 칸이 비거나, 시술 코드가 아예 안 잡혔거나, 가격표에 그 코드가 없거나, 진행 구간 없이 끝난 구간만 남았거나, 가격 구간이 서로 겹치게 적힌 표 스물두 가지를 먼저 올려 봅니다. 그래도 화면이 서고 읽지 못한 금액 표기는 판정 자리 대신 hedge 로 내려갑니다.
통화 5천 건·가격표 400줄을 올렸을 때 판정이 끝나는 데 걸리는 시간을 재고, 그 주 통화를 아침마다 한 번 돌려도 되는 범위인지 봅니다.
제 손으로 확인한 범위는 위까지입니다. 일치율은 제가 만든 통화에 제가 매긴 정답을 붙여 나온 숫자이고, 잘못 안내한 통화가 실제로 예약 취소로 이어졌는지는 병원의 통화와 예약 기록이 있어야 나옵니다. 병원 전사를 받는 자리에 그대로 물릴 수 있게 대조 러너와 정답 표 모양을 먼저 맞춰 뒀습니다.
186건 일치율은 제가 지어낸 통화에 제가 붙인 정답을 맞춘 수라, 병원에서 얼마나 맞을지는 이 숫자로 알 수 없습니다. 면접에서 말할 수 있는 것은 금액 해석기가 어느 표기까지 읽고 어디서 손을 드는지까지이고, 병원 전사가 오는 날 같은 러너로 다시 잽니다.
통화 대사를 쓴 사람과 정답을 붙인 사람이 같으니 여기서 높은 일치율은 아무것도 증명하지 않습니다. 금액 칸이 빈 통화와 가격표에 없는 코드, 시술이 안 잡힌 통화, 진행 구간 없이 끝난 구간만 남은 시술을 먼저 넣어 결측과 경계 케이스가 화면을 지나가게 했습니다.
금액이 가격표와 다르다고 해서 잘못된 안내는 아닙니다. 묶음 할인과 이벤트가를 전화로 적용하는 병원이 많아, 이 판정은 확정이 아니라 상담실장이 열어 볼 후보로 냅니다.
실제 통화의 금액 표기는 여기서 읽는 범위보다 넓고 '한 회에 사십 정도'처럼 단위를 생략한 말도 섞입니다. 읽지 못한 표기를 만나면 그 통화를 판정 대상에서 빼고 목록에 따로 세우며, 읽는 범위를 넓히는 일은 운영 과제로 둡니다.
이 포트폴리오는 한국어 금액 읽기와 구간 비교, 그 결과를 읽는 화면을 보여줍니다. 실시간 전사 지연이나 화자분리, 의료 용어 인식의 깊이는 주장하지 않습니다. 판정은 환산과 비교가 하고 모델은 상담실장이 읽을 문장만 씁니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
통화 전사에서 금액이 오간 대목을 한 줄씩 뽑아 둔 표입니다. 판정의 대상 표이며, 금액을 말하지 않고 끝난 통화와 시술 코드가 아예 안 잡힌 통화를 담아 빈 칸이 그대로 판정 사유가 되는 경로를 보여줍니다.
| call_id | staff_id | called_at | item_code | quoted_price | transcript_line |
|---|---|---|---|---|---|
| C-90412 | S-KIM | 2026-09-16T11:02 | IT-RJ01 | 삼십팔만 원 | 리쥬란 힐러는 한 회에 삼십팔만 원이시고요, 세 번 묶어 받으시면 조… |
| C-90418 | S-LEE | 2026-09-16T15:20 | IT-SK04 | 십오만원 | 스킨부스터는 한 회 십오만원으로 받고 계십니다. |
| C-90455 | S-PARK | 2026-09-17T14:30 | IT-LP02 | 29만원 | 울쎄라 리프팅 300샷이 29만원이에요, 이번 주까지 그 금액으로 잡… |
| C-90462 | S-PARK | 2026-09-17T17:05 | IT-BT03 | 9만 9천 원 | 보톡스 이마는 9만 9천 원이고 당일 시술도 됩니다. |
| C-90470 | S-KIM | 2026-09-18T09:50 | IT-LP02 | 34만 원 | 울쎄라 리프팅 300샷은 34만 원으로 바뀌었어요. |
아래 JSON Schema 에 맞는 행을 더 만들어 주세요. {"type":"object","properties":{"call_id":{"type":"string"},"staff_id":{"type":"string"},"called_at":{"type":"string"},"item_code":{"type":["string","null"]},"quoted_price":{"type":["string","null"]},"transcript_line":{"type":"string"}},"required":["call_id","staff_id","called_at","item_code","quoted_price","transcript_line"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) quoted_price 가 null 인 통화, (2) 한글 수사로만 적힌 금액(삼십팔만 원·이십구만원), (3) 만 단위와 천 단위가 섞인 금액(9만 9천 원), (4) 부터·정도·안팎 같은 말이 붙은 금액, (5) price_list 에 없는 item_code, (6) 같은 상담실장이 같은 시술을 하루에 다른 금액으로 안내한 통화 쌍, (7) item_code 가 null 이라 어느 시술인지 안 잡힌 통화. transcript_line 은 상담실장이 실제로 할 법한 구어체 한 문장으로 쓰고, 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"call_id":{"type":"string"},"staff_id":{"type":"string"},"called_at":{"type":"string"},"item_code":{"type":["string","null"]},"quoted_price":{"type":["string","null"]},"transcript_line":{"type":"string"}},"required":["call_id","staff_id","called_at","item_code","quoted_price","transcript_line"]}병원이 쓰는 시술 가격표입니다. 판정의 기준 표이며, 같은 시술이 적용 구간별로 여러 줄을 갖고 종료일이 비어 있는 진행 구간도 함께 담았습니다. 끝난 구간만 남고 진행 구간이 비어 있는 시술도 한 줄 담아, 지금 얼마인지가 가격표에 없는 자리를 보입니다.
| item_code | item_name | price | valid_from | valid_to |
|---|---|---|---|---|
| IT-RJ01 | 리쥬란 힐러 1회 | 350,000 | 2026-01-01 | 2026-06-30 |
| IT-RJ01 | 리쥬란 힐러 1회 | 420,000 | 2026-07-01 | — |
| IT-LP02 | 울쎄라 리프팅 300샷 | 290,000 | 2026-03-01 | 2026-08-31 |
| IT-LP02 | 울쎄라 리프팅 300샷 | 340,000 | 2026-09-01 | — |
| IT-BT03 | 보톡스 이마 | 99,000 | 2026-01-01 | — |
아래 JSON Schema 에 맞는 행을 더 만들어 주세요. {"type":"object","properties":{"item_code":{"type":"string"},"item_name":{"type":"string"},"price":{"type":"integer","minimum":0},"valid_from":{"type":"string"},"valid_to":{"type":["string","null"]}},"required":["item_code","item_name","price","valid_from","valid_to"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) valid_to 가 null 인 진행 구간, (2) 같은 item_code 가 구간을 나눠 두 줄 이상인 시술, (3) 끝난 구간만 있고 진행 구간이 없는 시술, (4) 금액이 세 자리 쉼표 없이 적힌 줄, (5) 시술 이름이 묶음 회차까지 달고 있는 줄(3회 묶음). 한 item_code 안에서 구간이 서로 겹치지 않게 두고, 생성한 행은 반드시 위 스키마를 통과해야 합니다.{"type":"object","properties":{"item_code":{"type":"string"},"item_name":{"type":"string"},"price":{"type":"integer","minimum":0},"valid_from":{"type":"string"},"valid_to":{"type":["string","null"]}},"required":["item_code","item_name","price","valid_from","valid_to"]}상담실장과 데스크를 적은 명단입니다. 걸린 통화를 누가 받았는지 이름으로 되짚고, 3주차 실장별 추이를 세는 기준이 됩니다.
| staff_id | staff_name | desk | joined_at |
|---|---|---|---|
| S-KIM | 김 실장 | 1층 상담실 | 2023-04-03 |
| S-PARK | 박 실장 | 2층 상담실 | 2024-09-02 |
| S-LEE | 이 실장 | 인포데스크 | 2026-03-16 |
| S-JUNG | 정 실장 | 1층 상담실 | 2025-01-06 |
| S-CHOI | 최 실장 | 2층 상담실 | 2022-11-14 |
아래 JSON Schema 에 맞는 행을 더 만들어 주세요. {"type":"object","properties":{"staff_id":{"type":"string"},"staff_name":{"type":"string"},"desk":{"type":"string"},"joined_at":{"type":"string"}},"required":["staff_id","staff_name","desk","joined_at"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 입사한 지 한 달이 안 된 실장, (2) 같은 성을 쓰는 실장 둘, (3) 데스크가 인포데스크인 줄. 한 staff_id 는 한 줄만 두고, 생성한 행은 반드시 위 스키마를 통과해야 합니다.{"type":"object","properties":{"staff_id":{"type":"string"},"staff_name":{"type":"string"},"desk":{"type":"string"},"joined_at":{"type":"string"}},"required":["staff_id","staff_name","desk","joined_at"]}| Python | 금액 해석기와 판정 규칙 엔진의 언어입니다. 한글 수사와 만·천 단위를 원 단위 정수로 바꾸고, 통화 날짜가 드는 가격 구간을 고르는 계산이 여기 있습니다. |
| FastAPI | 전사 표와 가격표를 올리고 판정 결과를 화면에 넘기는 API 서버입니다. 판정 한 건의 응답 모양을 출력 스키마 그대로 고정합니다. |
| TypeScript | 화면과 서버가 주고받는 판정 결과의 타입을 한 곳에 정의해 양쪽이 같은 모양을 씁니다. |
| Next.js | 사유별 목록과 통화 하나를 펼치는 상세, 가격표 이력 화면을 담는 관리자 페이지입니다. |
| React | 판정 카드와 전사 한 줄 미리보기를 그리는 화면 부분입니다. |
| PostgreSQL | 통화·가격표·상담실장 세 표를 담고, 가격표에 item_code 와 valid_from 조합 유일 제약을 걸어 같은 시술의 구간이 겹치지 않게 합니다. |
| Redis | 가격표 구간을 시술별로 미리 펼쳐 담아 두어 그 주 통화 수천 건을 한 번에 판정할 때 같은 구간을 다시 찾지 않게 합니다. |
| Java | 기존 병원 CRM 연동부가 Spring Boot 로 돌아가는 자리를 가정해, 판정 결과를 CRM 의 상담 기록에 붙이는 연계 모듈을 3주차에 이쪽으로 둡니다. |
| Spring | 위 연계 모듈의 실행 골격입니다. 판정 결과를 받아 상담 기록 한 줄로 바꾸는 배치가 여기서 돕니다. |
| Docker | 금액 해석기와 API 서버, 화면을 한 묶음으로 띄워 병원 안 서버에서도 같은 이미지로 돌게 합니다. |
| AWS | 2주차에 상담실장이 병원 밖에서도 그 주 통화를 올릴 수 있게 하는 곳입니다. 판정 결과와 올린 표 원본을 S3 에 남기고 RDS 로 저장소를 띄웁니다. |
| C++ | 전화망에서 통화 구간을 잡아 주는 SIP/VoIP 모니터링이 앞단에 있다고 보고, 그쪽이 넘겨 주는 통화 식별자와 시각을 이 표의 call_id·called_at 으로 받습니다. |
| STT | 전사 자체는 제품이 이미 만들고 있으므로, 이 편은 그 결과에서 금액이 오간 한 줄을 골라 받는 자리까지만 맡습니다. |
| RAG | 3주차에 가격표 개정 공지 문서를 찾아 그 시술이 왜 바뀌었는지 상세 화면에 덧붙이는 자리에 씁니다. 1주차 판정에는 문서 검색이 필요 없습니다. |
| LLM | 판정이 정해진 뒤 걸린 통화의 시술 이름과 두 금액을 상담실장이 쓰는 말로 한 문장에 담습니다. |
✗ fail → 못 읽은 표기가 열에 하나를 넘으면 읽는 문법을 좁혀 다시 정하고 그때까지 그 통화를 판정 대상에서 뺍니다.
✓ pass → 다음 주에는 통화 186건에 정답을 매겨 대조하고 AWS 에 올립니다.
✗ fail → 갈린 통화만 모아 판정 차례와 구간 고르는 기준을 다시 잡습니다.
✓ pass → 3주차 가격표 개정 되짚기로 넘어갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · call_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
가격표와 맞음가격표와 같음가격표와 다름금액 차이가격표에 없는 시술가격표에 없음지난 가격표를 안내지난 금액가격을 말하지 않음금액 없음가격 안내 통화 한 건이 금액 환산과 구간 비교를 거쳐 어떤 판정을 받는지 남기는 형식입니다. 판정은 규칙이 정하고 요약 문장만 모델이 씁니다.
{"type":"object","properties":{"call_id":{"type":"string"},"item_code":{"type":["string","null"]},"verdict":{"type":"string","enum":["가격표와 맞음","가격표와 다름","가격표에 없는 시술","지난 가격표를 안내","가격을 말하지 않음"]},"quoted_won":{"type":["integer","null"],"description":"quoted_price 에 적힌 한국어 금액 표기를 원 단위 정수로 환산한 값입니다. 한글 수사와 만·천 단위를 함께 읽고, quoted_price 가 비어 있으면 이 칸도 비웁니다."},"list_price_won":{"type":["integer","null"],"description":"called_at 이 valid_from 과 valid_to 사이에 드는 price_list 행의 price 입니다. 그런 행이 하나도 없으면 비웁니다."},"applied_from":{"type":["string","null"]},"applied_to":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{}},"required":["field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["call_id","verdict","quoted_won","list_price_won","evidence","summary"]}[
{
"call_id": "C-90412",
"item_code": "IT-RJ01",
"verdict": "가격표와 다름",
"quoted_won": 380000,
"list_price_won": 420000,
"applied_from": "2026-07-01",
"applied_to": null,
"evidence": [
{
"field": "quoted_price",
"value": "삼십팔만 원"
},
{
"field": "price",
"value": 420000
},
{
"field": "item_name",
"value": "리쥬란 힐러 1회"
},
{
"field": "called_at",
"value": "2026-09-16T11:02"
}
],
"summary": "리쥬란 힐러를 삼십팔만 원으로 안내했는데 9월에 적용되는 가격은 42만 원입니다.",
"hedge": null
},
{
"call_id": "C-90455",
"item_code": "IT-LP02",
"verdict": "지난 가격표를 안내",
"quoted_won": 290000,
"list_price_won": 340000,
"applied_from": "2026-09-01",
"applied_to": null,
"evidence": [
{
"field": "quoted_price",
"value": "29만원"
},
{
"field": "price",
"value": 290000
},
{
"field": "valid_to",
"value": "2026-08-31"
},
{
"field": "called_at",
"value": "2026-09-17T14:30"
}
],
"summary": "울쎄라 리프팅 29만 원은 8월 31일로 끝난 구간의 금액이고 9월부터는 34만 원입니다.",
"hedge": null
},
{
"call_id": "C-90491",
"item_code": "IT-LDM9",
"verdict": "가격표에 없는 시술",
"quoted_won": 350000,
"list_price_won": null,
"applied_from": null,
"applied_to": null,
"evidence": [
{
"field": "item_code",
"value": "IT-LDM9"
},
{
"field": "quoted_price",
"value": "삼십오만 원"
},
{
"field": "transcript_line",
"value": "LDM 물방울은 삼십오만 원 정도 생각하시면 되세요."
},
{
"field": "item_code",
"agg": "count",
"value": 0
}
],
"summary": "LDM 물방울은 이 병원 가격표에 한 줄도 올라 있지 않은데 삼십오만 원으로 안내했습니다.",
"hedge": "가격표에 올리지 않은 신규 시술인지 코드를 잘못 붙인 통화인지는 원장이 정합니다."
},
{
"call_id": "C-90520",
"item_code": "IT-BT03",
"verdict": "가격을 말하지 않음",
"quoted_won": null,
"list_price_won": 99000,
"applied_from": "2026-01-01",
"applied_to": null,
"evidence": [
{
"field": "item_code",
"value": "IT-BT03"
},
{
"field": "transcript_line",
"value": "보톡스 문의 주셨는데요, 원장님 상담 뒤에 정확한 금액을 다시 안내드릴게요."
},
{
"field": "called_at",
"value": "2026-09-19T10:45"
},
{
"field": "price",
"value": 99000
}
],
"summary": "보톡스 문의인데 통화에서 금액이 한 번도 나오지 않아 환자가 가격을 모른 채 끊었습니다.",
"hedge": "금액을 일부러 미룬 응대일 수 있어 이 판정은 다시 연락할 후보로만 세웁니다."
},
{
"call_id": "C-90577",
"item_code": "IT-SK04",
"verdict": "가격표와 맞음",
"quoted_won": 150000,
"list_price_won": 150000,
"applied_from": "2026-05-01",
"applied_to": null,
"evidence": [
{
"field": "quoted_price",
"value": "15만 원"
},
{
"field": "price",
"value": 150000
},
{
"field": "item_name",
"value": "스킨부스터 1회"
},
{
"field": "called_at",
"value": "2026-09-21T09:20"
}
],
"summary": "스킨부스터를 15만 원으로 안내해 가격표와 같습니다.",
"hedge": null
},
{
"call_id": "C-90462",
"item_code": "IT-BT03",
"verdict": "가격표와 맞음",
"quoted_won": 99000,
"list_price_won": 99000,
"applied_from": "2026-01-01",
"applied_to": null,
"evidence": [
{
"field": "quoted_price",
"value": "9만 9천 원"
},
{
"field": "price",
"value": 99000
},
{
"field": "item_name",
"value": "보톡스 이마"
},
{
"field": "staff_id",
"value": "S-PARK"
}
],
"summary": "보톡스 이마를 9만 9천 원으로 안내해 가격표와 같고, 만 단위와 천 단위를 함께 읽은 통화입니다.",
"hedge": null
},
{
"call_id": "C-90624",
"item_code": "IT-TL10",
"verdict": "지난 가격표를 안내",
"quoted_won": 990000,
"list_price_won": null,
"applied_from": null,
"applied_to": null,
"evidence": [
{
"field": "quoted_price",
"value": "구십구만 원"
},
{
"field": "price",
"value": 990000
},
{
"field": "valid_to",
"value": "2026-08-31"
},
{
"field": "item_name",
"value": "써마지 FLX 300샷"
}
],
"summary": "써마지 FLX 300샷을 구십구만 원으로 안내했는데 그 금액은 8월 31일로 끝난 구간이고 가격표에는 지금 적용되는 구간이 없습니다.",
"hedge": "진행 구간이 비어 있어 얼마가 맞는지는 가격표만으로 정해지지 않습니다. 가격표를 갱신할지 시술을 내릴지는 원장이 정합니다."
},
{
"call_id": "C-90632",
"item_code": null,
"verdict": "가격표에 없는 시술",
"quoted_won": 200000,
"list_price_won": null,
"applied_from": null,
"applied_to": null,
"evidence": [
{
"field": "item_code",
"value": null
},
{
"field": "quoted_price",
"value": "이십만 원"
},
{
"field": "transcript_line",
"value": "말씀하신 시술은 이십만 원 정도인데 어떤 시술인지 한 번 더 확인해 볼게요."
},
{
"field": "item_code",
"agg": "count",
"value": 0
}
],
"summary": "어느 시술인지 안 잡힌 통화에서 이십만 원을 안내해 견줄 가격표 줄이 한 줄도 없습니다.",
"hedge": "전사에서 시술 코드를 못 뽑은 통화라 금액이 맞는지 틀리는지는 판정하지 않고, 코드를 붙이는 앞단을 손볼 후보로만 세웁니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 다섯 값 중 하나인지 확인합니다. 규칙이 정한 값이라 모델이 새 값을 적으면 그 응답을 버립니다. 2. call_id·verdict·quoted_won·list_price_won·evidence·summary 필드가 빠짐없이 있는지 확인합니다. 3. quoted_won 과 list_price_won 이 0 이상인지 확인합니다. 4. quoted_won 을 quoted_price 원문에서 다시 환산해 같은 값이 나오는지 계산합니다. 만은 10000, 천은 1000 을 곱하고 한글 수사는 자릿수로 풀어 더합니다. 5. list_price_won 을 다시 계산합니다. called_at 이 valid_from 이상이고 valid_to 이하이거나 valid_to 가 비어 있는 price_list 행의 price 를 그 값으로 씁니다. 그런 행이 없으면 비우고, 그 item_code 에 끝난 구간만 남았는지 아예 한 줄도 없는지를 갈라 둡니다. 6. 가격표와 다름은 quoted_won 과 list_price_won 이 둘 다 있고 서로 다른지 다시 계산합니다. 둘 중 하나라도 비어 있으면 이 사유로 가지 않습니다 — 견줄 값이 없는 통화가 금액 차이로 불리면 안 됩니다. 7. 지난 가격표를 안내는 두 갈래입니다. (가) called_at 이 드는 구간이 없고 그 item_code 에 끝난 구간만 남아 있으면, 안내 금액이 그 끝난 구간 금액과 같든 다르든 이쪽으로 내립니다. 지금 파는 값이 가격표에 없는데 금액을 말한 통화라서, 진행 구간이 비어 있다는 사실을 hedge 에 적습니다. (나) called_at 이 드는 진행 구간이 있는데 quoted_won 이 그 앞의 끝난 구간 price 와 같으면 이쪽으로 내립니다. 진행 구간이 있고 금액이 어느 구간과도 안 맞으면 가격표와 다름입니다. 8. 가격표에 없는 시술은 item_code 가 비어 있거나 그 item_code 를 가진 price_list 행 수가 0 인지 다시 계산합니다. 어느 시술인지 안 잡힌 통화는 고를 구간 자체가 없으므로 같은 사유로 내리고 그 사실을 hedge 에 남깁니다. 9. 가격을 말하지 않음은 quoted_price 가 비어 있는지 확인합니다. item_code 가 적혀 있든 비어 있든 금액이 없으면 이 사유가 먼저 섭니다 — 빈 칸이 판정의 근거라서 다른 사유보다 앞에 걸러 냅니다. 10. evidence 의 field 이름이 입력 표에 있는 컬럼인지 대조합니다. 없는 이름을 인용하면 요약이 지어낸 문장이라는 뜻이라 규칙이 만든 기본 문장으로 되돌립니다. 11. evidence 의 value 가 수록된 행의 원문 값과 같은지 확인합니다. 여러 행을 세어 얻은 수치는 agg 를 함께 적습니다. 12. summary 가 존댓말 한 문장으로 끝나는지 확인합니다. [판정 차례 · 위 규칙이 둘 이상 동시에 걸릴 때] 한 통화에는 판정을 하나만 남깁니다. ① 가격을 말하지 않음 → ② 가격표에 없는 시술 → ③ 지난 가격표를 안내 → ④ 가격표와 다름 → ⑤ 나머지는 가격표와 맞음. 위 6~9번은 「~면 그 판정」이 아니라 「~면 그 후보」로 읽습니다. 금액도 코드도 비어 있는 통화는 ① 이 먼저라 「가격을 말하지 않음」입니다. [평가 러너 · 2주차] 손으로 매긴 정답 판정 186건과 자동 판정을 대조해 사유별 일치율을 내고, 어긋난 통화는 따로 모아 금액 해석기가 못 읽은 표기를 넓힐지 정합니다. 금액 표기를 무작위로 섞어 만든 통화에 어긋난 안내를 일부러 심어 두고 심은 수와 잡은 수를 견주는 일도 이 러너에서 합니다. [수동 검증 · 사람이 봅니다] 1. 가격표와 다름으로 걸린 통화 20건을 열어 할인이나 묶음 상담이라 금액이 달라진 것인지 상담실장이 판단합니다. 2. 가격을 말하지 않음으로 걸린 통화를 들어 금액을 미루는 응대가 병원 방침인지 확인하고 판정 차례를 다시 봅니다. 3. 진행 구간이 비어 있는 시술 목록을 원장에게 올려 가격표를 갱신할지 정합니다.
근거: 병원의 전화·상담·진료 음성을 데이터로 잇는 의료 특화 Voice AI D voice를 만듭니다