콕스웨이브
경력근거: 80%가 맞아도 어느 20%가 틀렸는지 모르면 결국 100%를 검토해야 하니까요
※ 실제 산출물이 아닌 AI 예측 시안입니다.
콕스웨이브 공고는 이 자리의 할 일로 "Trust System이 실행을 멈췄을 때 운영자가 맥락을 몇 초 안에 파악하고 승인·수정·거절할 수 있는 UI" 를 적었고, krewa 가 풀려는 문제를 "80%가 맞아도 어느 20%가 틀렸는지 모르면 결국 100%를 검토" 하는 상황으로 설명합니다. 이 검토 화면은 그 20% 를 칸 단위로 가려내는 계산을 먼저 두고 화면을 그 위에 얹습니다. 서버 응답이 항상 정상이라고 가정하지 말라는 자격요건과 SSE 스트리밍 요건은 2주차에 멈춤 이벤트가 순서 없이 도착하는 흐름으로 이어집니다. 이 포트폴리오는 추출값을 원문과 맞대는 규칙과 그 결과를 읽는 검토 화면을 보여줍니다. Trust System 의 이상 행동 탐지나 AI 실행 통제 표준의 전문성은 주장하지 않습니다.
공고는 Trust System 이 실행을 멈췄을 때 운영자가 맥락을 몇 초 안에 파악하고 승인·수정·거절하는 UI 를 이 자리의 일로 적었습니다. 칸마다 원문과 맞는지 먼저 계산해 두는 것이 그 몇 초를 만드는 쪽입니다.
krewa 소개가 80% 가 맞아도 어느 20% 가 틀렸는지 모르면 전부 다시 검토해야 한다고 문제를 정의합니다. 원문과 맞는 칸과 걸린 칸을 판정으로 나누는 이 화면이 그 20% 를 가리키는 자리입니다.
SSE 같은 실시간 데이터를 다뤄 봤거나 중간 상태·순서·에러 복구의 어려움을 설명할 수 있어야 하고, 서버 응답이 늘 정상이라고 가정하지 않는다고 적었습니다. 2주차에 순서가 뒤바뀐 멈춤 이벤트와 모양이 틀린 응답을 받아도 칸 상태를 지키는 부분이 여기에 닿습니다.
krewa 에서 업무를 맡은 AI(AI Worker)가 서류를 처리하다가, 실행을 검증하는 장치(Trust System)가 위험을 보고 실행을 멈추면 사람이 이어받습니다. 그렇게 멈춘 실행 하나를 열면, AI Worker 가 서류에서 뽑은 값과 인용한 근거 문구를 원문 페이지와 칸 규칙에 맞대 칸마다 판정을 붙이는 검토 화면입니다. 인용 문구가 그 쪽에 실제로 있는지, 있으면 그 문구 속 값이 AI 가 적은 값과 같은지, 필수 칸이 비었는지, 형식이 규칙에 맞는지를 계산합니다. 고객사 업무 운영자는 원문과 맞는 칸을 건너뛰고 걸린 칸만 원문 페이지를 옆에 띄운 채 승인·수정·거절합니다.
Trust System 이 멈춘 실행을 받아 승인·수정·거절하는 고객사 업무 운영자
Trust System 이 실행을 멈추면 운영자는 멈춘 이유만 받고 어느 칸이 틀렸는지는 모릅니다. 서류 여러 장과 추출 결과 열 칸을 처음부터 다시 맞춰 보게 되고, 공고가 말한 대로 80% 가 맞아도 100% 를 다시 읽습니다. 칸마다 인용 문구와 원문을 계산으로 맞대 둘을 나눠 보여주면 운영자가 읽을 칸이 걸린 몇 칸으로 줄어듭니다.
운영자가 실행 하나를 열면 추출 칸마다 다섯 판정 가운데 하나가 붙고, 걸린 칸을 누르면 원문 페이지에서 인용 문구 자리가 칠해진 채 승인·수정·거절 버튼이 나오는 검토 화면입니다. 실행 결과와 원문 페이지는 JSON 파일로 받는다고 두고 시작합니다.
Mastra 로 만든 작은 추출 워크플로우가 Claude 로 서류를 읽다 멈추면 SSE 로 이벤트를 보내고, 검토 화면이 순서가 뒤바뀌거나 중간에 끊긴 이벤트를 받아도 칸 상태를 잃지 않습니다. 실행 결과 200칸에 손으로 매긴 정답과 판정을 견줘 판정별 일치율을 냅니다.
운영자의 승인·수정·거절 기록을 칸별로 모아 수정이 잦은 칸과 그때 원문 문구를 규칙 보정 후보로 보여주고, 실행 단계를 React Flow 그래프로 펼쳐 어느 단계에서 멈췄는지 함께 보여줍니다.
운영자가 실행 R-20931 을 열면 여섯 칸 가운데 걸린 세 칸만 위로 올라오고, 한 칸을 누르면 원문 쪽에서 인용 자리가 칠해진 채 승인·수정·거절을 고릅니다.
인용 문구가 비어 있는 칸, 값이 빈 문자열인 필수 칸, 칸 자체가 빠진 실행, ㈜ 와 (주) 가 섞인 상호를 넣어도 칸마다 판정이 하나씩 붙습니다.
순서가 뒤바뀐 이벤트, 중간에 끊긴 스트림, 모양이 틀린 응답 20종을 흘려도 화면이 멈추지 않고 그 칸만 다시 불러오기 상태로 남습니다.
실행 결과 200칸 각각에 제가 원문을 보고 적은 판정을 두고, 도구 판정이 그와 같은 칸의 비율을 판정별로 냅니다. 서류도 정답도 제가 만든 것이라 이 숫자는 판정 규칙이 흔들리지 않는지 보는 값입니다.
운영자의 검토 시간이 실제로 몇 초로 줄지는 이 데이터로 말하지 못합니다. krewa 고객사의 실제 멈춤 실행과 운영자 기록이 있어야 재며, 그때 바로 돌 수 있게 채점 러너와 결정 기록 서식을 먼저 만들어 두었습니다.
서류 원문, 추출 결과, 정답 판정을 모두 제가 썼습니다. 일치율은 규칙이 제가 만든 경우에서 일관되게 돈다는 뜻이라, 면접에서는 판정 차례와 이벤트 처리 방식을 설명하는 데 씁니다.
깨끗한 추출 결과만 넣으면 화면이 늘 초록으로 끝납니다. 근거 쪽수가 틀린 칸, 인용이 비어 있는 칸, 빈 문자열인 필수 칸, 칸 자체가 빠진 실행을 일부러 넣었습니다.
인용 문구를 지정한 쪽에서만 찾으므로, 값은 맞는데 쪽수만 틀린 칸도 근거 문구가 원문에 없음으로 나옵니다. 운영자가 쪽수 오류를 따로 세게 해 전 페이지 검색을 넣을지 정합니다.
이 포트폴리오는 추출값을 원문과 맞대는 규칙과 검토 화면을 보여줍니다. Trust System 의 이상 행동 탐지나 AI 실행 통제 표준의 깊이는 주장하지 않습니다.
실제 서류는 스캔 이미지라 원문 텍스트 자체가 OCR 결과이고, OCR 이 틀리면 원문과 맞음도 틀립니다. 여기서는 원문 텍스트를 정답으로 두었으니, OCR 신뢰도를 판정에 넣는 일은 도입 단계 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
AI Worker 가 협력사 등록 심사 서류에서 칸마다 뽑은 값과 근거 쪽수, 인용 문구입니다. 인용 문구가 비어 있는 칸, 값은 맞는데 근거 쪽수가 틀린 칸, 값이 빈 문자열인 필수 칸, 대표자명 칸이 통째로 빠진 실행을 담았습니다.
| run_id | field_name | value | evidence_page | evidence_text |
|---|---|---|---|---|
| R-20931 | biz_reg_no | 123-45-67819 | 2 | 등록번호 : 123-45-67891 |
| R-20931 | company_name | 한빛건설 주식회사 | 2 | 법인명(단체명) : 한빛건설 주식회사 |
| R-20931 | ceo_name | 홍길동 | 1 | 대표이사 홍길동 |
| R-20931 | credit_grade | BBB+ | 4 | 신용등급 : BBB+ |
| R-20931 | construction_capacity_krw | 약 120억 | 3 | 시공능력평가액 : 12,034,500,000원 |
아래 JSON Schema 에 맞는 AI Worker 추출 결과 행을 더 만들어 주세요. {"type":"object","properties":{"run_id":{"type":"string"},"field_name":{"type":"string"},"value":{"type":["string","null"]},"evidence_page":{"type":["integer","null"],"minimum":1},"evidence_text":{"type":["string","null"],"description":"AI Worker 가 값의 근거로 인용한 원문 문구입니다. 인용하지 않았으면 비웁니다."}},"required":["run_id","field_name","value","evidence_page","evidence_text"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) evidence_page 와 evidence_text 가 null 인 칸, (2) value 가 빈 문자열인 필수 칸, (3) 한 run_id 에서 필수 field_name 하나가 아예 없는 실행, (4) evidence_text 는 원문에 있는데 value 의 숫자 두 자리가 뒤바뀐 칸, (5) evidence_page 가 실제 문구가 있는 쪽과 다른 칸. 생성한 행은 반드시 위 스키마를 통과해야 합니다.{"type":"object","properties":{"run_id":{"type":"string"},"field_name":{"type":"string"},"value":{"type":["string","null"]},"evidence_page":{"type":["integer","null"],"minimum":1},"evidence_text":{"type":["string","null"],"description":"AI Worker 가 값의 근거로 인용한 원문 문구입니다. 인용하지 않았으면 비웁니다."}},"required":["run_id","field_name","value","evidence_page","evidence_text"]}실행마다 들어온 서류의 쪽별 원문 텍스트입니다. 법인과 개인사업자 사업자등록증이 섞여 상호 줄 이름이 다르고, 신용등급이 BBB0 처럼 0 으로 적힌 쪽을 담았습니다.
| run_id | page | doc_name | text |
|---|---|---|---|
| R-20931 | 1 | 협력사 등록 신청서 | 협력사 등록 신청서 상호 : 한빛건설 주식회사 대표이사 홍길동 담당자… |
| R-20931 | 2 | 사업자등록증 | 사업자등록증 (법인사업자) 등록번호 : 123-45-67891 법인명… |
| R-20931 | 3 | 시공능력평가 확인서 | 건설업 시공능력평가 확인서 상호 : 한빛건설 주식회사 업종 : 철근·… |
| R-20931 | 4 | 기업신용평가등급 확인서 | 기업신용평가등급 확인서 평가대상 : 한빛건설 주식회사 신용등급 : B… |
| R-20935 | 1 | 사업자등록증 | 사업자등록증 (법인사업자) 등록번호 : 214-81-55320 법인명… |
아래 JSON Schema 에 맞는 서류 쪽별 원문 행을 더 만들어 주세요. {"type":"object","properties":{"run_id":{"type":"string"},"page":{"type":"integer","minimum":1},"doc_name":{"type":"string"},"text":{"type":"string"}},"required":["run_id","page","doc_name","text"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 법인명 대신 상호 줄이 있는 개인사업자 사업자등록증, (2) 금액이 쉼표와 원 단위로 적힌 쪽, (3) 신용등급이 BBB0 처럼 0 으로 끝나는 쪽, (4) 상호에 (주) 가 붙은 쪽. 한 run_id 의 page 는 1부터 이어지게 하고 생성한 행은 반드시 위 스키마를 통과해야 합니다.{"type":"object","properties":{"run_id":{"type":"string"},"page":{"type":"integer","minimum":1},"doc_name":{"type":"string"},"text":{"type":"string"}},"required":["run_id","page","doc_name","text"]}협력사 등록 심사에서 뽑는 열 칸의 필수 여부와 값 종류, 정규식을 적은 기준 표입니다. 형식을 따지지 않는 text 칸은 정규식이 비어 있습니다.
| field_name | label | value_type | required | pattern |
|---|---|---|---|---|
| biz_reg_no | 사업자등록번호 | biz_no | true | ^\d{3}-\d{2}-\d{5}$ |
| company_name | 상호 | text | true | — |
| ceo_name | 대표자명 | text | true | — |
| opened_on | 개업일 | date | false | ^\d{4}-\d{2}-\d{2}$ |
| credit_grade | 신용평가등급 | grade | true | ^(AAA|AA[+0-]|A[+0-]|BBB[+0-]|BB[+0-]|… |
아래 JSON Schema 에 맞는 추출 칸 규칙 행을 더 만들어 주세요. {"type":"object","properties":{"field_name":{"type":"string"},"label":{"type":"string"},"value_type":{"type":"string","enum":["text","biz_no","date","grade","amount_krw","phone"]},"required":{"type":"boolean"},"pattern":{"type":["string","null"],"description":"값 전체가 맞아야 하는 정규식입니다. text 칸처럼 형식을 따지지 않으면 비웁니다."}},"required":["field_name","label","value_type","required","pattern"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) pattern 이 null 인 text 칸, (2) required 는 거짓인데 pattern 은 있는 칸, (3) 금액처럼 쉼표 없는 숫자만 받는 칸. 생성한 행은 반드시 위 스키마를 통과해야 합니다.{"type":"object","properties":{"field_name":{"type":"string"},"label":{"type":"string"},"value_type":{"type":"string","enum":["text","biz_no","date","grade","amount_krw","phone"]},"required":{"type":"boolean"},"pattern":{"type":["string","null"],"description":"값 전체가 맞아야 하는 정규식입니다. text 칸처럼 형식을 따지지 않으면 비웁니다."}},"required":["field_name","label","value_type","required","pattern"]}| React | 칸별 판정 목록과 원문 페이지 뷰어, 승인·수정·거절 패널을 그립니다. |
| TypeScript | 입력 세 표와 판정 결과의 타입을 한 곳에 두고 판정 규칙과 화면이 같이 씁니다. |
| Vite | 검토 화면 앱을 빌드하고 개발 서버를 띄웁니다. |
| Bun | 2주차 멈춤 이벤트를 흘려보내는 모의 SSE 서버와 판정 스크립트를 돌립니다. |
| Turborepo | 판정 규칙 패키지, 검토 화면 앱, 모의 이벤트 서버를 한 모노레포로 나눕니다. |
| TanStack Query | 실행 목록과 실행 상세를 서버 상태로 두고, 운영자가 칸을 고치면 낙관적 갱신 뒤 실패 시 되돌립니다. |
| React Flow(@xyflow) | 3주차에 실행 단계를 그래프로 펼쳐 멈춘 단계를 표시합니다. |
| zod | SSE 로 들어온 이벤트와 실행 결과를 파싱해 모양이 틀린 응답을 화면에 올리기 전에 걸러냅니다. |
| Biome | 린트와 포맷을 한 도구로 맞춥니다. |
| Vitest | 판정 규칙 다섯 갈래와 순서가 뒤바뀐 이벤트, 모양이 틀린 응답을 테스트로 남깁니다. |
| LLM 스트리밍(SSE) | 2주차에 멈춤 이벤트와 추출 중간 결과를 받아 칸 상태를 순서와 무관하게 합칩니다. |
| Mastra | 2주차에 서류 읽기, 칸 추출, 멈춤 판단 세 단계짜리 워크플로우를 만들어 실제 이벤트를 냅니다. |
| Claude Code | 판정 규칙과 화면 컴포넌트 초안을 짜는 코딩 에이전트로 쓰고, 접근성과 타입 검사는 직접 돌려 확인합니다. |
✓ pass → 여기서 멈춰도 운영자가 쓰는 완결품입니다. 더 키우려면 2주차에 실제 멈춤 이벤트를 SSE 로 받습니다.
✓ pass → 3주차 수정 기록 모음과 실행 그래프로 넘어갑니다. 어긋남이 한 판정에 몰리면 그 규칙부터 다시 봅니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · item_key + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
원문과 맞음원문 일치근거 문구가 원문에 없음근거 없음원문 값과 다름값 불일치필수 칸이 빔필수 누락형식이 규칙과 다름형식 오류추출값 검토 판정 형식입니다. 실행 하나의 추출 칸이 원문과 칸 규칙에 견줘 어떤 판정을 받는지 남기며, 판정은 규칙이 정하고 운영자가 읽을 한 문장만 모델이 씁니다.
{"type":"object","properties":{"item_key":{"type":"string","description":"run_id 와 field_name 을 쌍점으로 이은 검토 항목 번호입니다."},"run_id":{"type":"string"},"field_name":{"type":"string"},"verdict":{"type":"string","enum":["원문과 맞음","근거 문구가 원문에 없음","원문 값과 다름","필수 칸이 빔","형식이 규칙과 다름"]},"ai_value":{"type":["string","null"]},"source_value":{"type":["string","null"],"description":"evidence_text 가 원문에 있을 때 그 문구에서 value_type 에 맞는 값을 뽑은 것입니다. 문구가 원문에 없거나 뽑을 값이 없으면 비웁니다."},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"],"enum":["count","sum","avg","min","max",null]},"value":{}},"required":["field","value"]}},"summary":{"type":"string","description":"운영자가 승인·수정·거절을 고르기 전에 읽는 한 문장입니다."},"hedge":{"type":["string","null"]}},"required":["item_key","run_id","field_name","verdict","ai_value","source_value","evidence","summary"]}[
{
"item_key": "R-20931:ceo_name",
"run_id": "R-20931",
"field_name": "ceo_name",
"verdict": "원문과 맞음",
"ai_value": "홍길동",
"source_value": "홍길동",
"evidence": [
{
"field": "run_id",
"value": "R-20931"
},
{
"field": "evidence_page",
"value": 1
},
{
"field": "evidence_text",
"value": "대표이사 홍길동"
}
],
"summary": "대표자명 홍길동은 1쪽 신청서의 '대표이사 홍길동' 과 같습니다.",
"hedge": null
},
{
"item_key": "R-20935:construction_capacity_krw",
"run_id": "R-20935",
"field_name": "construction_capacity_krw",
"verdict": "원문과 맞음",
"ai_value": "8450000000",
"source_value": "8,450,000,000",
"evidence": [
{
"field": "run_id",
"value": "R-20935"
},
{
"field": "value",
"value": "8450000000"
},
{
"field": "evidence_text",
"value": "시공능력평가액 : 8,450,000,000원"
}
],
"summary": "시공능력평가액 8450000000원은 3쪽 원문의 8,450,000,000원과 쉼표만 빼면 같습니다.",
"hedge": null
},
{
"item_key": "R-20931:biz_reg_no",
"run_id": "R-20931",
"field_name": "biz_reg_no",
"verdict": "원문 값과 다름",
"ai_value": "123-45-67819",
"source_value": "123-45-67891",
"evidence": [
{
"field": "run_id",
"value": "R-20931"
},
{
"field": "value",
"value": "123-45-67819"
},
{
"field": "evidence_page",
"value": 2
},
{
"field": "evidence_text",
"value": "등록번호 : 123-45-67891"
}
],
"summary": "AI 가 적은 사업자등록번호는 2쪽 원문과 끝 세 자리의 순서가 다릅니다. 원문은 123-45-67891 입니다.",
"hedge": null
},
{
"item_key": "R-20931:credit_grade",
"run_id": "R-20931",
"field_name": "credit_grade",
"verdict": "근거 문구가 원문에 없음",
"ai_value": "BBB+",
"source_value": null,
"evidence": [
{
"field": "run_id",
"value": "R-20931"
},
{
"field": "evidence_page",
"value": 4
},
{
"field": "evidence_text",
"value": "신용등급 : BBB+"
},
{
"field": "doc_name",
"value": "기업신용평가등급 확인서"
}
],
"summary": "AI 가 4쪽에서 인용했다는 '신용등급 : BBB+' 는 4쪽 신용평가등급 확인서에 없는 문구입니다.",
"hedge": "4쪽에는 신용등급 BBB0 이 적혀 있어, 운영자가 그 줄을 보고 값을 고칠지 정합니다."
},
{
"item_key": "R-20931:construction_capacity_krw",
"run_id": "R-20931",
"field_name": "construction_capacity_krw",
"verdict": "형식이 규칙과 다름",
"ai_value": "약 120억",
"source_value": "12,034,500,000",
"evidence": [
{
"field": "run_id",
"value": "R-20931"
},
{
"field": "value",
"value": "약 120억"
},
{
"field": "pattern",
"value": "^\\d+$"
},
{
"field": "evidence_text",
"value": "시공능력평가액 : 12,034,500,000원"
}
],
"summary": "시공능력평가액에 '약 120억' 이 들어가 원 단위 숫자 규칙에 맞지 않습니다. 3쪽 원문은 12,034,500,000원입니다.",
"hedge": null
},
{
"item_key": "R-20935:ceo_name",
"run_id": "R-20935",
"field_name": "ceo_name",
"verdict": "필수 칸이 빔",
"ai_value": null,
"source_value": null,
"evidence": [
{
"field": "run_id",
"value": "R-20935"
},
{
"field": "required",
"value": true
},
{
"field": "field_name",
"agg": "count",
"value": 0
}
],
"summary": "필수 칸인 대표자명이 이번 실행 결과에 아예 없습니다.",
"hedge": "AI Worker 가 칸 자체를 내지 않은 경우라 인용 문구도 없습니다. 1쪽 사업자등록증의 대표자 줄을 운영자가 직접 봐야 합니다."
},
{
"item_key": "R-20940:company_name",
"run_id": "R-20940",
"field_name": "company_name",
"verdict": "필수 칸이 빔",
"ai_value": "",
"source_value": null,
"evidence": [
{
"field": "run_id",
"value": "R-20940"
},
{
"field": "value",
"value": ""
},
{
"field": "evidence_page",
"value": null
},
{
"field": "required",
"value": true
}
],
"summary": "필수 칸인 상호가 빈 값으로 들어왔습니다.",
"hedge": "개인사업자 서류라 '법인명' 대신 '상호' 줄에 이름이 있어 AI Worker 가 놓친 것으로 보입니다."
},
{
"item_key": "R-20940:credit_grade",
"run_id": "R-20940",
"field_name": "credit_grade",
"verdict": "근거 문구가 원문에 없음",
"ai_value": "B+",
"source_value": null,
"evidence": [
{
"field": "run_id",
"value": "R-20940"
},
{
"field": "value",
"value": "B+"
},
{
"field": "evidence_page",
"value": null
},
{
"field": "evidence_text",
"value": null
}
],
"summary": "신용평가등급 B+ 에 근거 쪽수와 인용 문구가 모두 비어 있습니다.",
"hedge": "값 자체는 2쪽 확인서와 같아 보이지만, 근거를 대지 않은 값은 원문과 맞음으로 올리지 않습니다."
},
{
"item_key": "R-20935:credit_valid_until",
"run_id": "R-20935",
"field_name": "credit_valid_until",
"verdict": "근거 문구가 원문에 없음",
"ai_value": "2027-02-02",
"source_value": null,
"evidence": [
{
"field": "run_id",
"value": "R-20935"
},
{
"field": "value",
"value": "2027-02-02"
},
{
"field": "evidence_page",
"value": 1
},
{
"field": "evidence_text",
"value": "유효기간 : 2027-02-02"
}
],
"summary": "AI 가 1쪽에서 인용했다는 '유효기간 : 2027-02-02' 는 1쪽 사업자등록증에 없는 문구입니다.",
"hedge": "같은 문구가 2쪽 신용평가등급 확인서에 있어 값은 맞고 쪽수만 틀린 칸으로 보입니다. 쪽을 넘어 찾지 않으므로 운영자가 2쪽을 보고 승인할지 정합니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 다섯 값 가운데 하나인지 확인합니다. 2. item_key·run_id·field_name·verdict·ai_value·source_value·evidence·summary 필드가 빠짐없이 존재하는지 확인합니다. 3. evidence_page 가 1 이상이고 그 run_id 의 source_pages.page 가운데 가장 큰 값 이하인지 확인합니다. 4. field_rules.required 가 참인 field_name 이 그 run_id 의 worker_outputs 에 없거나 value 가 빈 문자열이면 verdict 는 필수 칸이 빔입니다. 5. pattern 이 있는 칸의 value 가 그 정규식에 전체가 맞지 않으면 verdict 는 형식이 규칙과 다름입니다. 6. evidence_text 가 비었거나, 같은 run_id·evidence_page 의 source_pages.text 에 그대로 들어 있지 않으면 verdict 는 근거 문구가 원문에 없음입니다. 7. evidence_text 가 원문에 있으면 그 문구에서 source_value 를 뽑습니다. 문구에 ' : ' 가 있으면 그 뒤를, 없으면 마지막 어절을 뽑고, amount_krw 는 끝의 '원' 을 뗍니다. 이 source_value 가 value 와 다르면 verdict 는 원문 값과 다름입니다. biz_no·amount_krw·phone·date 는 숫자만 남겨 견주고, text·grade 는 NFKC 로 바꾼 뒤 견줘 ㈜ 와 (주) 를 같은 글자로 봅니다. 8. 4~7번이 둘 이상 걸리면 4, 5, 6, 7번 차례로 하나만 남기고, 하나도 안 걸리면 verdict 는 원문과 맞음입니다. 9. evidence 의 field 이름이 세 입력 표의 컬럼에 실재하는지 대조합니다. 10. agg 가 없는 evidence 의 value 가 수록된 행의 원문 값과 같은지, evidence_text 가 그 run_id 원문 페이지의 substring 인지 확인합니다. 11. summary 와 hedge 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 실행 결과 200칸에 손으로 정답 판정을 매겨 자동 판정과 대조하고, 판정별 일치율과 어긋난 칸 목록을 냅니다. [수동 검증 · 사람이 봅니다] 1. 근거 문구가 원문에 없음으로 나온 칸 가운데 값은 맞는데 쪽수만 틀린 경우가 몇 건인지 운영자가 세어, 쪽수를 넘어 전 페이지를 찾을지 정합니다. 2. 운영자가 한 칸을 보고 승인·수정·거절을 고르기까지 걸린 시간을 열 칸 재어 화면 배치를 고칩니다.