포트로직스
경력근거: 무역 서류와 운송 데이터를 공개 원천과 대조해 정합성을 검증하는 일
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고가 디플로이드 셀이 푸는 문제 가운데 '무역 서류와 운송 데이터를 공개 원천과 대조해 정합성을 검증하는 일' 을 그대로 적었고, 데이터 통합 항목은 '정합성 검증 도구를 직접 만듭니다' 입니다. '디플로이드 셀의 사용자는 회사 밖에 있습니다' 라고 밝혀, 결과가 고객사 운영 담당의 손으로 넘어가야 하는 자리임을 못박습니다. 포워딩 현장의 서류는 회사마다 중량 단위와 선명 표기가 달라, 대조 규칙과 단위표를 파일로 빼 두어야 다음 고객사에서 값만 갈아끼울 수 있습니다. 이 포트폴리오는 두 표를 키로 맞추고 단위를 환산해 견주는 기술을 보여주며, 관세 신고 실무나 선사 계약 조건 해석 전문성은 주장하지 않습니다. 그 두 가지를 묻는 질문이 오면 답을 지어내지 않고, 제가 붙잡은 것은 선하증권 번호로 두 표를 맞추고 중량 단위를 한 자리에 모으는 데까지라고 선을 긋겠습니다.
공고가 이 셀의 일 가운데 '무역 서류와 운송 데이터를 공개 원천과 대조해 정합성을 검증하는 일' 을 짚었고, 데이터 통합 항목에도 '정합성 검증 도구를 직접 만듭니다' 가 있습니다. 고객사 선적 대장과 선사 매니페스트를 선하증권 번호로 맞춰 보는 도구가 그 문장의 실물입니다.
'디플로이드 셀의 사용자는 회사 밖에 있습니다. 고객사의 운영 담당자와 관리자, 그리고 그 회사의 협력사' 라고 밝힙니다. 판정 결과를 고객사 운영 담당이 선사에 그대로 되물을 수 있는 표로 내야 그 사용자에게 닿습니다.
'프로젝트마다 얻은 방법과 도구를 회사 자산으로 남겨 다음 프로젝트에 다시 쓰는 일' 을 셀의 일로 적었고, 도구 제작 항목은 '고객사 담당자가 직접 쓰는 도구를 만듭니다. 비개발자가 스스로 고칠 수 있는 표면까지 포함합니다' 입니다. 대조 규칙과 단위표를 파일로 빼 두면 다음 고객사에서 값만 갈아끼웁니다.
고객사 운영 시스템에서 내려받은 주간 선적 대장을 선사 매니페스트 추출본과 선하증권 번호로 맞춰, 선적 건마다 다섯 사유 중 하나를 정합니다. 신고 중량은 서류마다 KG·MT·LBS 로 제각각 적혀 있어, 숫자에서 천 단위 구분을 지우고 단위표의 환산 계수를 곱해 킬로그램으로 바꾼 뒤에 선사 검량과 견줍니다. 출항 예정일과 실제 출항일은 날짜 차이로 재고, 선사 매니페스트에 짝이 없는 건은 따로 사유를 붙입니다. 표준출력은 사유별 구획으로 나뉘어 두 값을 나란히 세우고, 같은 실행이 고객사 운영 담당이 선사에 그대로 되물을 수 있는 확인용 엑셀 파일을 남깁니다.
고객사 현장에 들어가 운영 시스템을 세우는 디플로이드 셀 FDE 엔지니어
통관에서 막히는 선적이 매주 나오는 이유는 담당자가 덜 챙겨서가 아니라, 고객사 서류와 선사 원천이 서로 다른 화면에 있고 중량 단위조차 달라 한자리에서 견준 적이 없기 때문입니다. 두 표를 선하증권 번호로 맞추고 중량을 같은 단위로 바꾸면, 선적을 넘기기 전에 되물을 건이 목록으로 나옵니다.
고객사 선적 대장과 선사 매니페스트 추출본, 단위표를 넣으면 선적 건마다 다섯 사유 중 하나를 정하고, 환산한 중량과 벌어진 비율, 날짜 차이를 달아 사유별 구획 출력과 확인용 엑셀 파일을 내는 CLI 가 도는 완결품입니다. 중량 허용 폭 5퍼센트와 출항 지연 기준 사흘은 코드에 박지 않고 단위표와 같은 자리의 고객사별 설정 파일에서 읽어, 계약이 다른 고객사로 옮길 때 값만 갈아끼웁니다. 매니페스트는 선사 화면에서 내려받은 표로 두고, 선사 API 연동은 3주차로 미룹니다.
여러 주 실행을 합쳐 선사별로 사유가 나온 횟수를 세고, 같은 사유가 되풀이되는 선사를 서류 작성 규칙 손질 후보로 냅니다.
선사에 되물은 건이 다음 매니페스트에서 어떻게 바뀌었는지 선하증권 번호로 맞춰 사유가 풀렸는지 확인하고, 검량 중량이 비어 있던 건을 받아야 할 증명 목록으로 따로 냅니다.
고객사와 주차를 주고 한 번 돌리면 표준출력이 사유별 구획으로 갈리고, 구획마다 선적 번호 옆에 고객사 값과 선사 값이 한 줄로 나란히 섭니다. 같은 실행이 남기는 확인용 엑셀 파일까지 열어 보이는 것이 시연입니다.
선적 80건에 정답 사유를 손으로 달아 두고 일치율을 냅니다. 대장도 매니페스트도 작성자가 만든 합성 더미이므로, 이 값은 성능이 아니라 데모 조건에서 다섯 갈래가 제대로 갈리는지를 보는 숫자입니다.
입력 30종은 일부러 어렵게 만듭니다 — 검량 중량이 빈 매니페스트 줄, KG·MT·LBS 가 뒤섞인 중량 문구, 짝이 없는 선하증권 번호. 그 30종을 넣어도 표준출력 구획이 흐트러지지 않고 사유별 건수가 그대로 나오는지 봅니다.
중량 허용 폭을 5퍼센트에서 3퍼센트로 좁히면 어느 선적의 사유가 뒤집히는지 회귀로 확인합니다. 임계값이 설정 파일에서 오는 값이라는 것을 이 자리에서 보입니다.
여기 적힌 숫자는 전부 작성자가 만든 선적 대장과 매니페스트 위에서 나온 자가채점입니다. 통관에서 막히는 건이 실제로 줄었는지는 디플로이드 셀이 시스템을 세운 고객사의 실 선적을 몇 주 돌려 봐야 나옵니다. 이 포트폴리오가 만들어 두는 것은 그 몇 주를 바로 시작할 수 있는 판정기와 평가 러너입니다.
일치율 숫자는 작성자가 만든 선적 대장을 작성자가 채점한 값이라 이 도구의 성능이 아닙니다. 고객사 실 선적과 선사 매니페스트가 붙기 전까지는 "이 입력에서 이렇게 돈다" 까지만 말합니다.
더미가 깨끗하면 환산기가 늘 맞으므로, 검량 중량이 비어 있는 매니페스트 줄과 파운드·톤으로 적힌 중량, 매니페스트에 짝이 없는 선하증권 번호를 일부러 섞어 두었습니다.
이 포트폴리오는 두 표를 업무 번호로 맞추고 단위를 환산해 견주는 기술을 보여주며, 관세 신고 실무나 선사 계약 조건 해석 전문성은 주장하지 않습니다. 판정은 번호 대조와 환산, 날짜 계산이 정하고 클로드는 선사에 보낼 문의 문장만 씁니다.
어긋난다는 판정이 고객사 서류가 틀렸다는 뜻은 아닙니다. 선사 매니페스트가 늦게 갱신되거나 환적으로 배가 바뀌는 일도 있어, 어느 쪽을 고칠지는 고객사 운영 담당이 정합니다.
중량 허용 폭 5퍼센트와 출항 지연 기준 사흘은 이 더미에서 쓴 값이고 고객사마다 계약이 다릅니다. 실제 도입에서는 그 두 수치를 설정 파일로 빼 고객사와 먼저 맞춥니다.
선적 대장에는 화주 이름과 단가가 함께 실려 고객사 밖으로 내보낼 수 없는 칸이 섞여 있습니다. 실제 도입이라면 판정기를 고객사 망 안에 두고, 문의 문장을 쓰는 자리에 넘길 값을 선적 번호와 사유, 두 중량으로 줄이는 합의부터 받아야 합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사 운영 시스템에서 주 단위로 내려받은 선적 대장입니다. 선적 번호와 선하증권 번호, 컨테이너 번호, 선사 코드, 출항 예정일, 신고 중량을 한 줄에 둡니다. 신고 중량은 서류를 쓴 사람에 따라 KG·KGS·MT·LBS 로 제각각 적혀 선사 검량과 그대로는 견줄 수 없습니다. 선사 매니페스트에 짝이 없는 선하증권 번호와 선명이 다르게 적힌 줄을 일부러 섞어 사유가 갈리게 둡니다.
| shipment_no | bl_no | container_no | vessel_code | etd | gross_weight |
|---|---|---|---|---|---|
| SH-20418 | HLCUBU2409 | HLXU8801234 | HLCU-ROTTERDAM | 2026-09-14 | 18,200 KG |
| SH-20431 | MAEU5512301 | MSKU7712009 | MAEU-ALGECIRAS | 2026-09-15 | 12,500 KG |
| SH-20455 | ONEY7781002 | ONEU4412887 | ONEY-SINGAPORE | 2026-09-16 | 18,400 KG |
| SH-20460 | COSU4410877 | CSNU6650021 | COSU-NINGBO | 2026-09-14 | 22.4 MT |
| SH-20472 | HLCUBU2511 | HLXU8802456 | HLCU-HAMBURG | 2026-09-17 | 9,800 KG |
아래 JSON Schema 를 그대로 만족하는 선적 대장 줄을 250개 더 만들어 주세요. 선사는 HLCU·MAEU·ONEY·COSU·EGLV 다섯 계열로 두고 선하증권 번호는 그 앞머리에 숫자 일곱 자리를 붙여 씁니다. 컨테이너 번호는 영문 네 자와 숫자 일곱 자로 쓰고, 선사 코드는 '선사앞머리-도착항' 모양으로 씁니다. 출항 예정일은 2026년 9월과 10월로 흩뿌리고, 신고 중량은 '18,200 KG'·'22.4 MT'·'40,565 LBS'·'31,700 KGS' 처럼 단위 표기를 섞되 스무 줄에 한 번꼴로 비웁니다. 판정 결과나 사유는 넣지 마세요.
{"type": "object", "properties": {"shipment_no": {"type": "string"}, "bl_no": {"type": "string"}, "container_no": {"type": "string"}, "vessel_code": {"type": "string"}, "etd": {"type": ["string", "null"]}, "gross_weight": {"type": ["string", "null"]}}, "required": ["shipment_no", "bl_no", "container_no", "vessel_code", "etd", "gross_weight"]}{"type": "object", "properties": {"shipment_no": {"type": "string"}, "bl_no": {"type": "string"}, "container_no": {"type": "string"}, "vessel_code": {"type": "string"}, "etd": {"type": ["string", "null"]}, "gross_weight": {"type": ["string", "null"]}}, "required": ["shipment_no", "bl_no", "container_no", "vessel_code", "etd", "gross_weight"]}선사 화면에서 내려받은 매니페스트 추출본입니다. 매니페스트 줄 번호와 선하증권 번호, 컨테이너 번호, 선사 코드, 실제 출항일, 검량 중량을 한 줄에 둡니다. 검량 중량은 킬로그램 정수로 들어오고, 선사가 검량 증명을 아직 안 올린 줄은 그 칸이 비어 있습니다. 고객사 대장에는 없는 선적 줄도 섞여 있어, 대조가 한 방향으로만 성립한다는 것이 드러납니다.
| manifest_no | bl_no | container_no | vessel_code | atd | verified_weight |
|---|---|---|---|---|---|
| CM-001 | HLCUBU2409 | HLXU8801234 | HLCU-BREMEN | 2026-09-15 | 18,250 |
| CM-002 | ONEY7781002 | ONEU4412887 | ONEY-SINGAPORE | 2026-09-16 | 20,150 |
| CM-003 | COSU4410877 | CSNU6650021 | COSU-NINGBO | 2026-09-19 | 22,380 |
| CM-004 | HLCUBU2511 | HLXU8802456 | HLCU-HAMBURG | 2026-09-17 | 9,795 |
| CM-005 | MAEU5512455 | MSKU7713120 | MAEU-VALENCIA | 2026-09-18 | 18,380 |
아래 JSON Schema 를 그대로 만족하는 매니페스트 줄을 250개 더 만들어 주세요. 선하증권 번호와 컨테이너 번호는 선적 대장과 같은 표기 규칙으로 쓰되, 스무 줄에 한 번꼴로 선적 대장에 없는 번호를 넣습니다. 선사 코드는 대부분 대장과 같게 쓰고 열 줄에 한 번쯤 도착항을 다르게 씁니다. 실제 출항일은 출항 예정일에서 0일에서 7일 사이로 밀려 있게 두고, 검량 중량은 킬로그램 정수로 쓰되 스무 줄에 한 번꼴로 비웁니다. 판정 결과는 넣지 마세요.
{"type": "object", "properties": {"manifest_no": {"type": "string"}, "bl_no": {"type": "string"}, "container_no": {"type": "string"}, "vessel_code": {"type": "string"}, "atd": {"type": ["string", "null"]}, "verified_weight": {"type": ["integer", "null"]}}, "required": ["manifest_no", "bl_no", "container_no", "vessel_code", "atd", "verified_weight"]}{"type": "object", "properties": {"manifest_no": {"type": "string"}, "bl_no": {"type": "string"}, "container_no": {"type": "string"}, "vessel_code": {"type": "string"}, "atd": {"type": ["string", "null"]}, "verified_weight": {"type": ["integer", "null"]}}, "required": ["manifest_no", "bl_no", "container_no", "vessel_code", "atd", "verified_weight"]}중량 단위 표기와 킬로그램 환산 계수를 담은 표입니다. 단위 줄 번호와 단위 표기, 킬로그램 환산 계수를 한 줄에 둡니다. 서류마다 같은 단위를 KG·KGS·kg 로 다르게 적고 톤을 MT·M/T·TON·T 로 적어, 표기마다 줄을 두어야 환산이 한 자리에서 끝납니다. 이 표는 고객사와 맞춰 파일로 받는 설정이고 이 도구가 만들지 않습니다.
| unit_no | unit_text | to_kg |
|---|---|---|
| WU-001 | KG | 1 |
| WU-002 | KGS | 1 |
| WU-003 | kg | 1 |
| WU-004 | MT | 1,000 |
| WU-005 | M/T | 1,000 |
아래 JSON Schema 를 그대로 만족하는 단위 줄을 20개 더 만들어 주세요. 무역 서류에서 실제로 쓰는 중량 단위 표기를 대소문자와 구분 기호를 바꿔 가며 넣고, 킬로그램 환산 계수를 정확한 수치로 적습니다. 톤 계열은 1000, 파운드 계열은 0.45359237, 그램 계열은 0.001 로 둡니다. 판정 결과는 넣지 마세요.
{"type": "object", "properties": {"unit_no": {"type": "string"}, "unit_text": {"type": "string"}, "to_kg": {"type": "number"}}, "required": ["unit_no", "unit_text", "to_kg"]}{"type": "object", "properties": {"unit_no": {"type": "string"}, "unit_text": {"type": "string"}, "to_kg": {"type": "number"}}, "required": ["unit_no", "unit_text", "to_kg"]}| AWS | 2주차부터 주간 판정 작업과 결과 파일 보관을 AWS 로 배포해 운영하고, 고객사 계정 안에서 돌도록 실행 환경을 나눕니다. |
| LLM | 어긋난 선적 건을 고객사 운영 담당이 선사에 그대로 보낼 문의 문장으로 씁니다. |
| LangChain | 문의 문장을 만드는 호출 앞뒤에 값 검사 단계를 두어 판정에 없는 숫자가 문장에 섞이면 되돌립니다. |
| LlamaIndex | 3주차 문의 문장에 선사별 운송 약관의 해당 조항을 붙이려고 약관 문서 단위 색인을 둡니다. |
| Claude | 판정 사유를 선사 담당이 읽는 문의 문장으로 옮기는 모델로 클로드를 씁니다. |
| Python | 중량 환산과 날짜 차이 계산, 두 표 대조를 맡는 규칙 엔진과 CLI 를 맡습니다. |
| PostgreSQL | 주마다의 판정 결과와 단위표를 담아 두어 되물은 건이 풀렸는지 주차별로 견줍니다. |
✗ fail → 원천에 없음이 절반을 넘으면 대조 규칙이 아니라 매니페스트를 내려받는 시점이 문제입니다. 주 단위 추출을 언제 뜨는지부터 고객사와 맞추고 그다음에 다시 돕니다.
✓ pass → 2주차 선사별 집계로 넘어갑니다.
✗ fail → 한 주에만 몰린 사유면 손질 후보를 내지 않고 그 주 운항 사정으로 둡니다.
✓ pass → 3주차 되물은 결과 확인으로 넘어갑니다.
선적 건 하나가 선사 원천과 어디서 벌어지는지 적습니다. 다섯 사유 중 하나와 함께 어긋난 칸 이름, 그 칸의 고객사 값과 선사 값을 한 줄에 나란히 싣고, 킬로그램으로 바꾼 신고 중량과 벌어진 비율, 출항 날짜 차이, 대조한 매니페스트 줄 번호를 붙여 사유별 구획 출력과 확인용 표가 그대로 읽습니다. 맞은 건은 세 칸이 모두 비어 있어 구획을 훑기만 해도 되물을 자리가 드러납니다.
{"type":"object","properties":{"verdict_no":{"type":"string"},"shipment_no":{"type":"string"},"bl_no":{"type":"string"},"container_no":{"type":"string"},"manifest_no":{"type":["string","null"]},"verdict":{"type":"string","enum":["원천과 맞음","원천에 없음","선명이 다름","출항일이 밀림","중량이 어긋남"]},"client_weight_kg":{"type":["number","null"],"description":"gross_weight 에서 단위 문자를 떼고 천 단위 구분을 지운 수치에 weight_unit.to_kg 를 곱해 소수 첫째 자리에서 반올림한 정수입니다. 단위 문자가 weight_unit 에 없거나 수치가 안 읽히면 null 입니다"},"weight_over_pct":{"type":["number","null"],"description":"verified_weight 에서 client_weight_kg 를 물리고 그 값을 client_weight_kg 로 나눠 100 을 곱한 뒤 소수 둘째 자리에서 반올림해 소수 첫째 자리까지 남긴 비율입니다. 반올림 결과가 음의 영이면 0.0 으로 적습니다 — 0.05퍼센트도 안 되게 가벼운 쪽으로 어긋난 건이 화면에서 -0.0 으로 보이면 읽는 사람이 부호를 사유로 오해합니다. 어느 한쪽이 비어 있으면 null 입니다"},"delay_days":{"type":["integer","null"],"description":"carrier_manifest.atd 에서 client_shipments.etd 를 밀어낸 일수입니다. 어느 한쪽이 비어 있거나 원천에 없는 선적이면 null 입니다"},"evidence":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string","enum":["client_shipments","carrier_manifest","weight_unit"]},"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{}},"required":["table","field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]},"gap_field":{"type":["string","null"],"description":"고객사 값과 선사 값이 갈린 칸의 컬럼 이름입니다. bl_no·vessel_code·etd·verified_weight 중 하나이고, 원천과 맞음이면 null 입니다"},"client_value":{"type":["string","null"],"description":"gap_field 가 가리키는 칸의 client_shipments 쪽 값을 적힌 그대로 옮긴 문자열입니다. gap_field 가 null 이면 null 입니다"},"carrier_value":{"type":["string","null"],"description":"gap_field 가 가리키는 칸의 carrier_manifest 쪽 값을 적힌 그대로 옮긴 문자열입니다. 매니페스트에 짝이 없거나 gap_field 가 null 이면 null 입니다"}},"required":["verdict_no","shipment_no","bl_no","container_no","verdict","evidence","summary"]}[
{
"verdict_no": "RV-001",
"shipment_no": "SH-20418",
"bl_no": "HLCUBU2409",
"container_no": "HLXU8801234",
"manifest_no": "CM-001",
"verdict": "선명이 다름",
"client_weight_kg": 18200,
"weight_over_pct": 0.3,
"delay_days": 1,
"evidence": [
{
"table": "client_shipments",
"field": "vessel_code",
"agg": null,
"value": "HLCU-ROTTERDAM"
},
{
"table": "carrier_manifest",
"field": "vessel_code",
"agg": null,
"value": "HLCU-BREMEN"
}
],
"summary": "고객사 서류는 로테르담 선박으로 적었는데 선사 매니페스트는 브레멘 선박으로 실려 있습니다.",
"hedge": "환적 일정이 바뀌면 선사가 배를 갈아 태우는 일이 있어, 서류를 고칠지 선사에 되물을지는 고객사 운영 담당이 정합니다.",
"gap_field": "vessel_code",
"client_value": "HLCU-ROTTERDAM",
"carrier_value": "HLCU-BREMEN"
},
{
"verdict_no": "RV-002",
"shipment_no": "SH-20431",
"bl_no": "MAEU5512301",
"container_no": "MSKU7712009",
"manifest_no": null,
"verdict": "원천에 없음",
"client_weight_kg": 12500,
"weight_over_pct": null,
"delay_days": null,
"evidence": [
{
"table": "client_shipments",
"field": "bl_no",
"agg": null,
"value": "MAEU5512301"
},
{
"table": "carrier_manifest",
"field": "bl_no",
"agg": "count",
"value": 11
}
],
"summary": "이 선하증권 번호가 선사 매니페스트 열한 줄 어디에도 없습니다.",
"hedge": "선사가 아직 매니페스트를 올리지 않았을 수 있어, 반려가 아니라 다음 실행에서 다시 봅니다.",
"gap_field": "bl_no",
"client_value": "MAEU5512301",
"carrier_value": null
},
{
"verdict_no": "RV-003",
"shipment_no": "SH-20455",
"bl_no": "ONEY7781002",
"container_no": "ONEU4412887",
"manifest_no": "CM-002",
"verdict": "중량이 어긋남",
"client_weight_kg": 18400,
"weight_over_pct": 9.5,
"delay_days": 0,
"evidence": [
{
"table": "client_shipments",
"field": "gross_weight",
"agg": null,
"value": "18,400 KG"
},
{
"table": "weight_unit",
"field": "to_kg",
"agg": null,
"value": 1
},
{
"table": "carrier_manifest",
"field": "verified_weight",
"agg": null,
"value": 20150
}
],
"summary": "신고 중량은 18,400킬로그램인데 선사 검량은 20,150킬로그램이라 9.5퍼센트가 벌어집니다.",
"hedge": null,
"gap_field": "verified_weight",
"client_value": "18,400 KG",
"carrier_value": "20150"
},
{
"verdict_no": "RV-004",
"shipment_no": "SH-20460",
"bl_no": "COSU4410877",
"container_no": "CSNU6650021",
"manifest_no": "CM-003",
"verdict": "출항일이 밀림",
"client_weight_kg": 22400,
"weight_over_pct": -0.1,
"delay_days": 5,
"evidence": [
{
"table": "client_shipments",
"field": "etd",
"agg": null,
"value": "2026-09-14"
},
{
"table": "carrier_manifest",
"field": "atd",
"agg": null,
"value": "2026-09-19"
}
],
"summary": "서류에 적힌 출항 예정일보다 실제 출항이 닷새 늦었습니다.",
"hedge": null,
"gap_field": "etd",
"client_value": "2026-09-14",
"carrier_value": "2026-09-19"
},
{
"verdict_no": "RV-005",
"shipment_no": "SH-20488",
"bl_no": "MAEU5512455",
"container_no": "MSKU7713120",
"manifest_no": "CM-005",
"verdict": "원천과 맞음",
"client_weight_kg": 18400,
"weight_over_pct": -0.1,
"delay_days": 1,
"evidence": [
{
"table": "client_shipments",
"field": "gross_weight",
"agg": null,
"value": "40,565 LBS"
},
{
"table": "weight_unit",
"field": "to_kg",
"agg": null,
"value": 0.45359237
},
{
"table": "carrier_manifest",
"field": "verified_weight",
"agg": null,
"value": 18380
}
],
"summary": "파운드로 적힌 중량을 킬로그램으로 바꾸면 18,400이라 검량과 0.1퍼센트 안에서 맞습니다.",
"hedge": null,
"gap_field": null,
"client_value": null,
"carrier_value": null
},
{
"verdict_no": "RV-006",
"shipment_no": "SH-20495",
"bl_no": "ONEY7781455",
"container_no": "ONEU4413002",
"manifest_no": "CM-006",
"verdict": "원천과 맞음",
"client_weight_kg": 15300,
"weight_over_pct": null,
"delay_days": 1,
"evidence": [
{
"table": "carrier_manifest",
"field": "verified_weight",
"agg": null,
"value": null
},
{
"table": "client_shipments",
"field": "etd",
"agg": null,
"value": "2026-09-18"
},
{
"table": "carrier_manifest",
"field": "atd",
"agg": null,
"value": "2026-09-19"
}
],
"summary": "선명과 출항일은 원천과 맞지만 선사 검량 중량이 아직 비어 있어 중량은 견주지 못했습니다.",
"hedge": "검량 증명이 올라온 뒤 다시 돌려야 중량까지 본 판정이 되므로, 이 건은 맞음으로 두되 다음 실행에서 한 번 더 봅니다.",
"gap_field": null,
"client_value": null,
"carrier_value": null
},
{
"verdict_no": "RV-007",
"shipment_no": "SH-20512",
"bl_no": "HLCUBU2633",
"container_no": "HLXU8803001",
"manifest_no": "CM-008",
"verdict": "원천과 맞음",
"client_weight_kg": 7900,
"weight_over_pct": -0.2,
"delay_days": 1,
"evidence": [
{
"table": "client_shipments",
"field": "gross_weight",
"agg": null,
"value": "7.9 MT"
},
{
"table": "weight_unit",
"field": "to_kg",
"agg": null,
"value": 1000
},
{
"table": "carrier_manifest",
"field": "verified_weight",
"agg": null,
"value": 7885
}
],
"summary": "톤으로 적힌 중량을 킬로그램으로 바꾸면 7,900이라 검량 7,885와 0.2퍼센트 안에서 맞습니다.",
"hedge": null,
"gap_field": null,
"client_value": null,
"carrier_value": null
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 다섯 값 중 하나인지 확인합니다. 2. verdict_no·shipment_no·bl_no·container_no·verdict·evidence·summary 가 모두 채워졌는지 확인합니다. 2-1. verdict 가 원천과 맞음이면 gap_field·client_value·carrier_value 가 모두 null 이고, 나머지 네 사유에는 gap_field 가 채워졌는지 확인합니다. gap_field 는 사유마다 정해져 있습니다 — 원천에 없음은 bl_no, 선명이 다름은 vessel_code, 출항일이 밀림은 etd, 중량이 어긋남은 verified_weight 입니다. 2-2. client_value·carrier_value 가 gap_field 컬럼의 값을 적힌 그대로 옮겼는지 두 표에서 다시 읽어 대조합니다. 원천에 없음은 짝이 없으므로 carrier_value 가 null 입니다. 3. client_weight_kg 가 gross_weight 의 숫자 부분에서 천 단위 구분을 지운 값에 그 단위 문자의 weight_unit.to_kg 를 곱한 값과 같은지 다시 계산합니다. 단위 문자가 weight_unit 에 없으면 null 인지 봅니다. 4. weight_over_pct 가 verified_weight 에서 client_weight_kg 를 물리고 client_weight_kg 로 나눠 100 을 곱한 뒤 소수 둘째 자리에서 반올림한 값과 같은지 다시 계산합니다. 반올림 결과가 -0.0 이면 0.0 으로 접었는지 함께 봅니다 — SH-20501 이 31,700kg 신고에 31,690kg 검량이라 -0.03퍼센트로 떨어지는 그런 줄입니다. 어느 한쪽이 비어 있으면 null 인지 봅니다. 5. delay_days 가 atd 에서 etd 를 밀어낸 일수와 같은지 다시 계산합니다. 어느 한쪽이 비어 있거나 원천에 없는 선적이면 null 인지 봅니다. 6. client_weight_kg 가 0 보다 크고 50000 이하인지, delay_days 가 -30 이상 180 이하인지 범위를 봅니다. 7. client_shipments.bl_no 가 carrier_manifest.bl_no 에 없으면 verdict 가 원천에 없음인지 확인합니다. 8. 같은 bl_no 의 vessel_code 가 두 표에서 다르면 verdict 가 선명이 다름인지 확인합니다. 9. delay_days 가 3 보다 크면 verdict 가 출항일이 밀림인지 확인합니다. 10. weight_over_pct 의 절댓값이 5 보다 크면 verdict 가 중량이 어긋남인지 확인합니다. 11. verdict 가 원천과 맞음이면 위 네 검사에 하나도 걸리지 않는지 다시 봅니다. 12. 판정 순서는 원천에 없음, 선명이 다름, 출항일이 밀림, 중량이 어긋남 순으로 먼저 걸리는 갈래를 씁니다. 다만 원천에 없는 선적은 견줄 상대가 없어 나머지 세 검사를 돌리지 않습니다. 13. 선사 검량 중량이 비어 있는 선적은 weight_over_pct 가 null 인 채로 원천과 맞음까지 갈 수 있으므로, 그 건은 hedge 에 중량을 못 견줬다고 적었는지 봅니다. 비워 둔 칸을 맞음으로만 넘기면 통관에서 처음 드러납니다. CM-006 이 그런 줄입니다. 14. manifest_no 가 있으면 carrier_manifest 에 실재하는 줄 번호이고 그 줄의 bl_no·container_no 가 판정과 같은지 대조합니다. 15. evidence 의 field 이름과 gap_field 가 세 데이터셋에 실재하는 컬럼인지 대조합니다. 16. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 줄 값과 같은지 확인합니다. 17. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 1. 선적 80건에 정답 사유를 손으로 달아 일치율을 냅니다. 2. 사유별 건수를 선사별로 세어 되풀이되는 선사를 추립니다. [수동 검증 · 사람이 봅니다] 1. 선명이 다른 건을 서류 쪽에서 고칠지 선사에 되물을지 고객사 운영 담당이 정합니다. 2. 검량 중량이 비어 있던 건은 증명이 올라온 뒤 다시 돌립니다.