GS글로벌
경력근거: 사업 현업의 비효율적인 프로세스를 진단하고, AI 중심의 해결 방안 정의
※ 실제 산출물이 아닌 AI 예측 시안입니다.
GS글로벌 FDE 의 수행업무는 사업 현업의 비효율적인 프로세스를 진단해 AI 중심의 해결 방안을 정의하고, 데이터 분석과 LLM/Agent 로 프로토타입을 직접 개발·검증한 뒤, 현업과 임원진과 IT 인프라·보안팀 사이를 조율해 도입까지 끌고 가는 일입니다. 지원자격에는 레거시 ERP·CRM 과 AI 솔루션을 잇는 API 설계·통합 역량이, 우대사항에는 종합상사 업무인 제품 트레이딩과 SCM 이해가 적혀 있습니다. 이 도구는 그 조합이 가리키는 첫 과제에 그대로 놓입니다. 현업이 매달 ERP 추출 엑셀과 계약서를 눈으로 맞춰보던 대조를 규칙으로 옮기고, 걸린 건마다 계약 조항과 원본 행을 붙여 현업이 근거를 보고 납득하게 만들며, 애매한 건은 임의로 판정하지 않고 되물어 도입 초기의 신뢰를 지킵니다. 해외 법인마다 거래처명 표기가 흔들리고 통화가 갈리는 지점을 하드 케이스로 둔 것도 종합상사라는 이 회사 업무 맥락에서 나온 것입니다. 다만 이 포트폴리오는 업무용 엑셀 파싱과 계약 매칭, 규칙 기반 대조와 근거 추적, 컨테이너·클라우드 배포라는 기술 역량을 보여주며, 종합상사 트레이딩과 SCM 도메인 전문성은 주장하지 않습니다. 모르는 도메인 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
수행업무 첫 줄이 사업 현업의 비효율적인 프로세스를 진단하고 AI 중심의 해결 방안을 정의하는 일입니다. 진단은 회의록이 아니라 현업이 지금 손으로 하고 있는 대조 작업을 그대로 돌려 보이는 것에서 시작합니다.
데이터 분석과 LLM/Agent 기술로 프로토타입을 직접 개발하고 검증하는 일이 업무로 적혀 있습니다. 기획서를 넘기는 자리가 아니라 돌아가는 것을 만들어 현업 앞에서 돌려 보이는 자리입니다.
지원자격에 레거시 시스템(ERP, CRM 등)과 AI 솔루션 연동을 위한 API 설계 및 통합 역량이 명시돼 있습니다. 현업이 쓰는 자료가 ERP 추출 엑셀이므로 그 형태를 그대로 받아 읽는 것이 첫 관문이고, 그다음이 시스템 연동입니다.
현업이 ERP 에서 내려받은 선적·정산 엑셀과 계약 조건표를 인자로 받아 `tradecheck run --month 2026-06` 한 줄로 도는 명령줄 도구입니다. 거래 건마다 해당 계약을 찾아 붙인 다음 단가·수량·납기·통화 네 축을 규칙으로 대조해 계약과 어긋난 건만 골라냅니다. 각 건에는 근거가 된 계약 조항 번호와 그 조항 원문, 그리고 판단의 출처가 된 엑셀 원본 행 번호가 함께 붙어, 현업 담당자가 결과를 받고 '이거 왜 걸렸냐' 고 물으면 바로 그 줄과 조항을 펼쳐 보여줍니다. 계약을 못 찾은 건이나 환율 기준일이 비어 있어 금액을 확정할 수 없는 건은 어긋난 건에 섞지 않고 확인 질문 목록으로 따로 뺍니다. 결과는 터미널 요약과 현업에게 그대로 넘길 확인용 엑셀 파일입니다.
종합상사 트레이딩팀에서 정산을 맡은 담당자입니다. 매달 마감 때 ERP 에서 선적 내역과 매입매출을 내려받아 계약서 폴더를 열어 놓고 한 줄씩 맞춰봅니다. 건수가 수백이라 이틀이 걸리고, 그렇게 봐도 단가 소수점이나 통화가 다른 건을 놓쳐 나중에 거래처에서 연락이 옵니다. 시스템에 넣어달라고 요청해도 계약마다 조건이 달라 '규칙을 다 적어 달라' 는 답만 돌아옵니다. 걸린 건만 추려서 근거 조항과 함께 보고 싶고, 애매한 건은 시스템이 임의로 판정하지 말고 물어봐 주기를 바라는 사람입니다.
계약 대조는 담당자의 감이 아니라 계약 조건표에 적힌 값과 거래 데이터의 비교라고 보고, 계약 찾기와 네 축 비교를 전부 규칙으로 처리한 다음 모델에게는 걸린 사유를 현업의 언어로 옮기는 일만 맡기면, (a) 이틀짜리 눈 대조가 명령 한 줄로 끝나고, (b) 걸린 건마다 조항 번호와 원본 행이 붙어 그 자리에서 근거 확인이 되며, (c) 계약 미매칭과 환율 기준일 결측이 어긋난 건에 섞이지 않고 확인 질문으로 분리되어 담당자가 시스템 판정을 믿을 수 있게 됩니다.
선적·정산 엑셀과 계약 조건표를 받아 거래별로 계약을 붙이고 단가·수량·납기·통화를 대조해, 걸린 건에 계약 조항 번호와 원본 행 번호를 붙인 확인용 엑셀을 내보내는 명령줄 도구입니다. 계약 미매칭과 환율 기준일 결측은 확인 질문 목록으로 뺍니다. ERP 에 직접 붙는 연동은 사내 계정과 접근 승인이 필요하므로 1주차에는 추출 엑셀 입력만 가정하고, 연동은 3주차로 미룹니다.
해외 법인마다 다르게 적힌 거래처명과 품목 코드를 정규화 규칙으로 묶어 같은 상대가 따로 잡히지 않게 하고, 트레이딩 담당 2명이 걸린 건이 실제로 확인이 필요한 건인지 라벨링해 판정 일치도를 붙이는 단계입니다. 이때부터 도구를 Docker 이미지로 감싸 AWS 위에서 돌립니다.
추출 엑셀 대신 ERP 조회 API 로 선적·정산 데이터를 직접 읽는 연동 계층을 붙이고, 월 마감 일정에 맞춰 자동 실행해 확인용 엑셀을 담당자에게 전달 가능한 위치에 남기는 단계입니다.
함정을 섞은 한 달분 거래 120건을 넣으면 걸린 건과 확인 질문이 갈려 나오고, 걸린 건을 펼치면 계약 조항 번호와 조항 원문, 원본 엑셀 행 번호가 함께 붙어 있는 걸 시연합니다
걸린 건 목록을 손으로 대조한 정답과 대조해 100% 자동 판정합니다. 일부러 만든 함정 4종(계약 미매칭, 환율 기준일 결측, 수량 단위 불일치, 거래처명 표기 흔들림)이 어긋난 건에 섞이지 않고 확인 질문으로 빠지는지 매번 검사합니다
엑셀이 지저분한 30종(병합 셀·머리글 반복·소계 행·숫자가 문자열로 저장·빈 시트·열 순서 뒤바뀜)을 넣어도 파싱이 죽지 않고 읽지 못한 행을 따로 세워 보여줍니다
생성된 사유 문장이 인용 조항 밖 조건을 말했는지, 문장 속 금액과 수량을 계약값·실제값과 기계로 대조해 검사합니다. 단, 거래와 계약과 정답을 모두 작성자가 만든 합성 기준이라 '성능 검증' 이 아니라 '데모 조건에서의 동작' 입니다
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 대조 정확도는 GS글로벌 현업의 실제 ERP 추출본과 실제 계약서, 그리고 트레이딩 담당자 검수가 있어야 측정 가능합니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다
이건 현업·실데이터 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 데이터 자가채점이라 '성능 증명' 이 아닙니다. 면접에서 '데모 조건 동작 + 실검증 준비 상태' 로 솔직히 설명합니다
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 계약 미매칭·환율 기준일 결측·수량 단위 불일치·거래처명 표기 흔들림 같은 경계 케이스를 더미에 섞어, 쉬운 문제만 푸는 게 아님을 보여줍니다
계약 조건표가 곧 이 도구의 한계선입니다. 구두 합의나 이메일로만 남은 조건은 규칙이 볼 수 없어 어긋난 건으로 잘못 잡히므로, 걸린 건은 확정이 아니라 확인 대상이라는 전제를 엑셀 첫 줄에 함께 씁니다
정산 도구는 틀린 금액을 말하는 순간 신뢰를 잃습니다. 판단이 안 되는 건은 유리하게든 불리하게든 추정하지 않고 확인 질문으로 돌리며, 모델이 금액을 만들지 못하도록 판정과 수치를 규칙에만 맡깁니다
실제 도입 시 달라지는 것을 명시합니다. ERP 조회 권한과 사내 보안 검토, 해외 법인별 계약 서식, 현업 담당자 검수로 교체해야 하며 이는 도입 단계 과제로 분리합니다
이 포트폴리오는 업무용 엑셀 파싱과 계약 매칭, 규칙 기반 대조와 근거 추적, 컨테이너·클라우드 배포라는 기술 역량을 보여주며, 종합상사 트레이딩과 SCM 도메인 전문성은 주장하지 않습니다. 모르는 도메인 깊이는 면접에서 모른다고 말하는 편이 낫습니다
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
현업이 ERP 에서 내려받은 선적·정산 내역입니다. 거래 한 건이 한 행이며 계약 대조의 대상입니다. 환율 기준일 결측, 거래처명 표기 흔들림, 수량 단위 혼재, 계약번호 결측, 숫자가 문자열로 저장된 열을 일부러 섞어 쉬운 데이터만 푸는 게 아님을 보여줍니다.
| txn_id | contract_no_raw | counterparty_raw | item_code_raw | shipped_on | qty | qty_unit | unit_price | currency | fx_base_date | invoice_amount | incoterms | source_row |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| x001 | CT-2026-0011 | PT Sinar Baja | HRC-3.0 | 2026-06-03 | 500 | MT | 1,250 | USD | 2026-06-03 | 625,000 | FOB | 12 |
| x002 | CT-2026-0011 | PT Sinar Baja | HRC-3.0 | 2026-06-11 | 400 | MT | 1,320 | USD | 2026-06-11 | 528,000 | FOB | 13 |
| x003 | CT-2026-0024 | Sinar Baja PT. | hrc-3.0 | 2026-06-18 | 300 | MT | 1,250 | USD | — | 375,000 | FOB | 14 |
| x004 | CT-2026-0033 | Vinaco Trading JSC | CRC-1.2 | 2026-06-05 | 220 | MT | 1,480 | USD | 2026-06-05 | 325,600 | CIF | 21 |
| x005 | CT-2026-0033 | Vinaco Trading JSC | CRC-1.2 | 2026-06-27 | 180 | MT | 1,480 | EUR | 2026-06-27 | 266,400 | CIF | 22 |
아래 JSON Schema 에 맞는 종합상사 선적·정산 거래 내역 150건을 JSON 배열로 생성. 철강(HRC·CRC·PLT)·비철(CU-CAT)·석유화학(PP-HOMO) 품목과 동남아·일본·남미 거래처를 섞을 것.
{"type":"object","properties":{"txn_id":{"type":"string"},"contract_no_raw":{"type":["string","null"]},"counterparty_raw":{"type":"string"},"item_code_raw":{"type":"string"},"shipped_on":{"type":["string","null"]},"qty":{"type":"number"},"qty_unit":{"type":"string"},"unit_price":{"type":["number","null"]},"currency":{"type":"string"},"fx_base_date":{"type":["string","null"]},"invoice_amount":{"type":["number","null"]},"incoterms":{"type":["string","null"]},"source_row":{"type":"number"}},"required":["txn_id","counterparty_raw","item_code_raw","qty","qty_unit","currency","source_row"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. (1) contract_no_raw 가 null 이라 계약을 못 붙이는 행 10건, (2) 같은 거래처를 표기만 다르게 적은 counterparty_raw 흔들림(PT Sinar Baja / Sinar Baja PT. / SINAR BAJA) 12건 이상과 item_code_raw 대소문자 흔들림 8건, (3) fx_base_date 가 null 이라 환산 기준을 정할 수 없는 행 8건, (4) 같은 품목인데 qty_unit 이 MT 와 KG 로 뒤섞여 환산하지 않으면 계약 수량 비교가 틀어지는 행 10건, (5) unit_price 나 invoice_amount 가 null 인 행 각각 5건, (6) currency 가 계약 통화와 다른 행 8건, (7) shipped_on 이 계약 납기를 넘긴 행 10건과 null 인 행 4건. source_row 는 원본 엑셀 행 번호처럼 띄엄띄엄 매길 것. txn_id 는 x001 부터 연속으로. JSON 배열만.{"type":"object","properties":{"txn_id":{"type":"string"},"contract_no_raw":{"type":["string","null"]},"counterparty_raw":{"type":"string"},"item_code_raw":{"type":"string"},"shipped_on":{"type":["string","null"]},"qty":{"type":"number"},"qty_unit":{"type":"string"},"unit_price":{"type":["number","null"]},"currency":{"type":"string"},"fx_base_date":{"type":["string","null"]},"invoice_amount":{"type":["number","null"]},"incoterms":{"type":["string","null"]},"source_row":{"type":"number"}},"required":["txn_id","counterparty_raw","item_code_raw","qty","qty_unit","currency","source_row"]}거래처와 맺은 계약의 조건표입니다. 대조의 기준값이자 걸린 건의 근거 조항 출처입니다. 계약마다 허용 오차와 통화가 다르고, 개정으로 이전 계약을 대체하는 건과 수량 상한이 비어 있는 건을 섞어 판정이 한쪽으로 쉽게 기울지 않게 합니다.
| contract_no | clause_id | counterparty | item_code | valid_from | valid_to | agreed_unit_price | price_tolerance_pct | agreed_currency | qty_cap | qty_unit | delivery_deadline | clause_text | supersedes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CT-2026-0011 | CT-2026-0011-3.1 | PT Sinar Baja | HRC-3.0 | 2026-04-01 | 2026-09-30 | 1,250 | 2 | USD | 1,000 | MT | 2026-06-30 | 열연강판 3.0mm 의 단가는 톤당 미화 1,250 달러로 하며 허용… | — |
| CT-2026-0024 | CT-2026-0024-3.1 | PT Sinar Baja | HRC-3.0 | 2026-06-15 | 2026-12-31 | 1,250 | 2 | USD | — | MT | 2026-12-15 | 열연강판 3.0mm 의 단가는 종전과 동일하게 유지하며 총량 상한은 … | CT-2026-0011 |
| CT-2026-0033 | CT-2026-0033-2.4 | Vinaco Trading JSC | CRC-1.2 | 2026-05-01 | 2026-08-31 | 1,480 | 0 | USD | 500 | MT | 2026-08-15 | 냉연강판 1.2mm 의 단가는 톤당 미화 1,480 달러로 고정하며 … | — |
| CT-2026-0041 | CT-2026-0041-2.1 | Nippon Kizai K.K. | PLT-12 | 2026-05-15 | 2026-11-30 | 1,610 | 1.5 | USD | 300 | MT | 2026-06-30 | 후판 12mm 의 단가는 톤당 미화 1,610 달러이며 허용 오차는 … | — |
| CT-2026-0052 | CT-2026-0052-4.2 | Andes Minerales SA | CU-CAT | 2026-06-01 | 2026-12-31 | 8,900 | 3 | USD | 120 | MT | 2026-06-30 | 전기동 캐소드의 단가는 톤당 미화 8,900 달러로 하며 허용 오차는… | — |
아래 JSON Schema 에 맞는 종합상사 계약 조건 조항 45건을 JSON 배열로 생성. 한 계약에 단가·수량·통화·납기·환율기준·인도조건 조항이 나뉘어 들어가도록.
{"type":"object","properties":{"contract_no":{"type":"string"},"clause_id":{"type":"string"},"counterparty":{"type":"string"},"item_code":{"type":"string"},"valid_from":{"type":"string"},"valid_to":{"type":"string"},"agreed_unit_price":{"type":["number","null"]},"price_tolerance_pct":{"type":["number","null"]},"agreed_currency":{"type":"string"},"qty_cap":{"type":["number","null"]},"qty_unit":{"type":"string"},"delivery_deadline":{"type":["string","null"]},"clause_text":{"type":"string"},"supersedes":{"type":["string","null"]}},"required":["contract_no","clause_id","counterparty","item_code","valid_from","valid_to","agreed_currency","qty_unit","clause_text"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. (1) supersedes 로 이전 계약을 대체하면서 유효기간이 겹쳐 어느 계약을 적용할지 판단이 필요한 쌍 4쌍, (2) qty_cap 이 null 이라 수량 초과를 판정할 수 없는 조항 8건, (3) price_tolerance_pct 가 0 이라 1원 차이도 걸리는 조항 4건과 3 이상으로 느슨한 조항 4건, (4) agreed_unit_price 가 null 이고 clause_text 로만 조건을 서술한 조항 10건(환율 기준·인도 조건·지연 통지 등), (5) delivery_deadline 이 null 인 조항 8건, (6) 같은 품목인데 계약마다 qty_unit 이 MT 와 KG 로 갈리는 조항 3건, (7) '별도 협의' '서면 합의' 처럼 자동 판정을 하면 안 된다고 명시한 조항 5건. clause_text 는 계약서 문어체로 쓰고, 대조 규칙이 참조할 수치를 문장 안에도 적을 것. JSON 배열만.{"type":"object","properties":{"contract_no":{"type":"string"},"clause_id":{"type":"string"},"counterparty":{"type":"string"},"item_code":{"type":"string"},"valid_from":{"type":"string"},"valid_to":{"type":"string"},"agreed_unit_price":{"type":["number","null"]},"price_tolerance_pct":{"type":["number","null"]},"agreed_currency":{"type":"string"},"qty_cap":{"type":["number","null"]},"qty_unit":{"type":"string"},"delivery_deadline":{"type":["string","null"]},"clause_text":{"type":"string"},"supersedes":{"type":["string","null"]}},"required":["contract_no","clause_id","counterparty","item_code","valid_from","valid_to","agreed_currency","qty_unit","clause_text"]}| Python | 선적·정산 엑셀 파싱, 계약 매칭, 네 축 대조 규칙과 확인용 엑셀 생성을 구현하는 대표 언어 |
| SQL | 거래·계약·환율 데이터를 한 저장소에 넣고 기간·거래처·품목 축으로 집계해 대조 대상을 뽑는 질의 계층 |
| AWS | 2주차부터 도구를 클라우드에서 돌리며 확인용 엑셀 산출물과 실행 이력을 남기는 실행 기반 |
| Azure | 사내 표준이 다를 경우를 대비해 컨테이너와 오브젝트 저장소만 쓰는 구성으로 유지해 양쪽에서 같은 이미지가 돌게 합니다 |
| Docker | 사내 PC 환경에 상관없이 같은 결과가 나오도록 도구를 이미지 한 장으로 배포하고 클라우드 실행에도 그대로 씁니다 |
| LLM/Agent | 걸린 사유를 계약 조항을 인용해 현업의 언어로 옮기는 문장 생성에만 쓰며, 어긋났는지 여부 판정은 규칙이 맡습니다 |
| ERP 연동 API | 3주차에 추출 엑셀 대신 선적·정산 데이터를 조회로 직접 받아오는 통합 계층 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우고 싶으면 2주차(거래처·품목 표기 정규화·현업 검수)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(ERP 조회 연동·월 마감 자동 실행)로 진행합니다.
한 달분 대조 실행 결과입니다. 계약과 어긋난 거래 목록과 각 건의 어긋난 축·계약값·실제값·근거 조항 번호와 원문·원본 엑셀 행 번호, 그리고 판단이 안 되어 확인이 필요한 건을 담습니다. 판정과 근거가 어긋난 출력을 기계로 걸러낼 수 있게 필드를 나눠 둡니다.
{"type":"object","properties":{"run_id":{"type":"string"},"period":{"type":"string"},"total_txns":{"type":"number"},"checked_txn_ids":{"type":"array","items":{"type":"string"}},"skipped_txn_ids":{"type":"array","items":{"type":"string"}},"mismatches":{"type":"array","items":{"type":"object","properties":{"txn_id":{"type":"string"},"mismatch_kind":{"enum":["단가차이","수량초과","납기경과","통화불일치","인도조건상이"]},"contract_value":{"type":["string","number","null"]},"actual_value":{"type":["string","number","null"]},"gap":{"type":["number","null"]},"cited_clause_id":{"type":"string"},"cited_quote":{"type":"string"},"source_row":{"type":"number"},"message_ko":{"type":"string"},"severity":{"enum":["high","mid","low"]}},"required":["txn_id","mismatch_kind","cited_clause_id","cited_quote","source_row","message_ko","severity"]}},"needs_confirmation":{"type":"array","items":{"type":"object","properties":{"reason":{"enum":["계약_미매칭","환율기준일_결측","수량단위_불일치","계약_중복적용","자동판정_금지조항"]},"txn_ids":{"type":"array","items":{"type":"string"}},"question_ko":{"type":"string"}},"required":["reason","txn_ids","question_ko"]}}},"required":["run_id","period","total_txns","checked_txn_ids","skipped_txn_ids","mismatches","needs_confirmation"]}[
{
"input_ref": "2026년 6월 거래 12건 · 계약 조건표 12조항",
"output": {
"run_id": "run-2026-06",
"period": "2026-06",
"total_txns": 12,
"checked_txn_ids": [
"x001",
"x002",
"x004",
"x005",
"x009",
"x010",
"x012"
],
"skipped_txn_ids": [
"x003",
"x006",
"x007",
"x008",
"x011"
],
"mismatches": [
{
"txn_id": "x002",
"mismatch_kind": "단가차이",
"contract_value": 1250,
"actual_value": 1320,
"gap": 0.056,
"cited_clause_id": "CT-2026-0011-3.1",
"cited_quote": "열연강판 3.0mm 의 단가는 톤당 미화 1,250 달러로 하며 허용 오차는 2% 이내로 한다.",
"source_row": 13,
"message_ko": "계약 단가는 톤당 1,250 달러인데 1,320 달러로 청구됐습니다. 5.6% 차이라 허용 오차 2%를 넘습니다.",
"severity": "high"
},
{
"txn_id": "x005",
"mismatch_kind": "통화불일치",
"contract_value": "USD",
"actual_value": "EUR",
"gap": null,
"cited_clause_id": "CT-2026-0033-2.4",
"cited_quote": "결제 통화는 미화로 한다. 다른 통화로의 결제는 사전 서면 합의를 요한다.",
"source_row": 22,
"message_ko": "계약 결제 통화는 미화인데 유로로 청구됐습니다. 서면 합의가 있었는지 확인이 필요합니다.",
"severity": "high"
},
{
"txn_id": "x010",
"mismatch_kind": "납기경과",
"contract_value": "2026-06-30",
"actual_value": "2026-07-08",
"gap": 8,
"cited_clause_id": "CT-2026-0052-4.2",
"cited_quote": "선적은 2026년 6월 30일까지 완료한다.",
"source_row": 42,
"message_ko": "계약 선적 기한 6월 30일을 8일 넘겨 선적됐습니다. 다만 통지 후 30일 이내 지연은 위반으로 보지 않는다는 조항이 따로 있어 통지 여부를 함께 봐야 합니다.",
"severity": "mid"
},
{
"txn_id": "x012",
"mismatch_kind": "통화불일치",
"contract_value": "USD",
"actual_value": "THB",
"gap": null,
"cited_clause_id": "CT-2026-0060-1.3",
"cited_quote": "결제 통화는 미화로 한다.",
"source_row": 52,
"message_ko": "계약 결제 통화는 미화인데 바트로 청구됐습니다. 금액도 미화 기준과 자릿수가 맞지 않아 함께 확인해야 합니다.",
"severity": "high"
}
],
"needs_confirmation": [
{
"reason": "계약_미매칭",
"txn_ids": [
"x006"
],
"question_ko": "Global Steel Ltd 의 후판 거래에 계약번호가 비어 있고, 이름이 맞는 계약은 7월 1일부터 유효합니다. 6월 9일 선적분은 어느 계약으로 볼까요?"
},
{
"reason": "계약_중복적용",
"txn_ids": [
"x003"
],
"question_ko": "PT Sinar Baja 6월 18일 선적분은 CT-2026-0011 과 이를 대체하는 CT-2026-0024 의 유효기간에 모두 걸칩니다. 어느 계약을 적용할까요?"
},
{
"reason": "수량단위_불일치",
"txn_ids": [
"x007"
],
"question_ko": "Nippon Kizai 건이 킬로그램으로 기록돼 있습니다. 계약 조항대로 1,000킬로그램을 1톤으로 환산해 120톤으로 볼까요?"
},
{
"reason": "환율기준일_결측",
"txn_ids": [
"x008",
"x011"
],
"question_ko": "선적일 또는 환율 기준일이 비어 있어 금액을 확정할 수 없는 건이 두 건 있습니다. 기준일을 알 수 있을까요?"
}
]
}
},
{
"input_ref": "계약 조항이 자동 판정을 금지한 납기 지연 건만 뽑은 경우",
"output": {
"run_id": "run-delay-only",
"period": "2026-06",
"total_txns": 2,
"checked_txn_ids": [
"x010"
],
"skipped_txn_ids": [
"x008"
],
"mismatches": [
{
"txn_id": "x010",
"mismatch_kind": "납기경과",
"contract_value": "2026-06-30",
"actual_value": "2026-07-08",
"gap": 8,
"cited_clause_id": "CT-2026-0052-4.2",
"cited_quote": "선적은 2026년 6월 30일까지 완료한다.",
"source_row": 42,
"message_ko": "선적 기한을 8일 넘겼습니다. 위약금은 계산하지 않았습니다.",
"severity": "mid"
}
],
"needs_confirmation": [
{
"reason": "자동판정_금지조항",
"txn_ids": [
"x010"
],
"question_ko": "지연 위약금은 별도 협의로 정한다는 조항이 있어 금액을 산정하지 않았습니다. 협의 결과를 반영해 주시겠습니까?"
}
]
}
},
{
"input_ref": "수량 상한이 비어 있어 초과 판정을 못 하는 계약",
"output": {
"run_id": "run-qty-cap",
"period": "2026-06",
"total_txns": 1,
"checked_txn_ids": [],
"skipped_txn_ids": [
"x003"
],
"mismatches": [],
"needs_confirmation": [
{
"reason": "계약_중복적용",
"txn_ids": [
"x003"
],
"question_ko": "적용 후보인 CT-2026-0024 는 총량 상한을 별도 합의로 정한다고만 적혀 있어 수량 초과를 판정할 수 없습니다. 합의된 상한이 있을까요?"
}
]
}
}
][자동 검증: 결정론, 사람 없이 통과] 1. JSON Schema 통과: mismatches·needs_confirmation 의 필수 필드와 mismatch_kind·reason 열거값을 기계로 검사해 형식이 깨진 출력을 거릅니다. 2. 판정 정답 대조: 걸린 거래 집합과 각 건의 mismatch_kind 를 정답과 비교합니다. checked_txn_ids 와 skipped_txn_ids 의 합이 total_txns 와 맞는지도 함께 봅니다. 3. 인용 조항 실재·원문 일치: cited_clause_id 가 contract_terms 에 있는지 대조하고, cited_quote 가 그 조항 clause_text 의 부분 문자열인지 공백 정규화 후 검사합니다. 4. 수치 재계산: contract_value 와 actual_value, gap 을 원본 거래·계약값으로 다시 계산해 맞추고, message_ko 속 숫자도 같은 값과 대조해 모델이 금액을 지어낸 출력을 거릅니다. 5. 보류 규칙 강제: 계약 미매칭·환율 기준일 결측·수량 단위 불일치·자동 판정 금지 조항에 걸린 거래가 mismatches 에 들어가면 실패로 처리합니다. 애매한 건을 임의로 판정하지 않게 하는 핵심 검사입니다. [수동 검증: 사람 필요] 1. 트레이딩 담당 2명이 걸린 건이 실제로 거래처에 문의할 만한 건인지(구두 합의로 이미 정리된 건을 걸지 않았는지) 라벨링하고, 두 사람 판정 일치도를 Cohen's κ(두 사람 답이 우연 이상으로 일치하는 정도, 0~1)로 봅니다. 2. message_ko 의 표현이 거래처 문의로 그대로 옮겨도 될 수준인지 10% 표본을 사람이 읽습니다.