동일 점수, 다른 실패: Fechamento BR
요약
본 글은 데이터 정규화 및 구조화된 정보 추출의 어려움을 다루며, 단순히 총점만으로는 모델의 오류 유형(의사 결정 vs. 표현)을 구분할 수 없음을 강조합니다. 특히 출처 규칙 준수 여부나 소수점 자릿수 같은 출력 계약 위반이 중요한 실패 지표가 될 수 있음을 보여줍니다.
핵심 포인트
- 총점 외에 의사 결정 오류와 표현 오류를 분리하여 분석해야 합니다.
- 출력 형식(JSON, 소수점 자릿수 등)의 엄격한 준수가 중요합니다.
- 데이터 정규화 시 컨텍스트 기반의 해석 규칙을 명확히 제공해야 합니다.
이 글은 Kaggle Benchmarking Challenge 제출물입니다.
제가 벤치마크한 내용
두 모델 모두 제 데이터 정규화(data-normalization) 벤치마크에서 28개 중 26점을 받았습니다. 이 점수만 보고 보면, 두 모델이 같은 방식으로 실패했다고 생각할 수 있습니다.
하지만 그렇지 않습니다.
동일한 금액 입력값에 대해, 한 모델은 출처 규칙(source convention)이 명시되었음에도 불구하고 선택을 거부했습니다. 다른 모델은 올바른 숫자 크기를 반환했지만, 출력 계약(output contract)에서 요구하는 소수점 자릿수를 생략했습니다.
이 차이가 바로 Fechamento BR의 핵심 교훈입니다: 리더보드 총점만으로는 의사 결정 오류(decision error)와 표현 오류(representation error) 사이의 구분을 가릴 수 있습니다.
이 문제의 배경
저는 관리용 스프레드시트(administrative spreadsheets)를 다룹니다. 빈 필드는 0과 같은 의미가 아닙니다. 00072와 같은 코드가 반드시 숫자 72라는 것을 의미하지는 않습니다. 그리고 출처가 구두점(punctuation)을 어떻게 사용하는지 모른다면, 4.700를 올바르게 해석할 수 없습니다.
저는 다음과 같은 좁은 질문을 테스트하고 싶었습니다: 모델이 제공된 컨텍스트만으로 의미를 변경하지 않고 필드를 정규화할 수 있으며, 주어진 컨텍스트가 실제로 둘 이상의 유효한 해석을 남길 때만 선택을 거부하는가?
이 벤치마크의 모든 기록은 가상의 것입니다. 직장 문서, 환자 정보, 직원 기록 또는 고객 파일 등 실제 업무 자료는 사용되지 않았습니다.
최종 코퍼스(corpus)에는 네 가지 유형(monetary values, missing values, dates, identifiers)에서 각각 일곱 개의 사례를 포함한 28개의 작성된 케이스가 담겨 있습니다. 여기에는 **12쌍의 대비 쌍(contrast pairs)**과 **4개의 독립적인 통제 항목(standalone controls)**이 있습니다. 한 쌍은 유사한 표면 형태를 유지하면서 관련 입력값이나 컨텍스트를 변경하는 반면, 통제 항목은 질문 쌍으로 계산되지 않습니다.
예시로는 400으로 나누어지는 해와 그렇지 않은 세기 연도; 명시적인 0과 누락된 필드; 그리고 식별자(identifier)로 취급되는 동일한 숫자 문자열과 수량(quantity)으로 취급되는 경우 등이 있습니다. 목표는 모델이 숨겨진 규칙을 추측하게 만드는 것이 아닙니다. 필요한 해석 규칙은 제공됩니다.
점수를 얻는 방법
모델 평가 및 데이터 형식 제약 조건
응답은 반드시 status와 value만을 포함하는 순수한 JSON 객체여야 합니다. 허용되는 상태는 ok, missing, ambiguous, 그리고 invalid 네 가지입니다. ok가 아닌 상태의 경우, 임의로 대체 값을 만들어내는 것이 아니라 JSON null을 사용해야 합니다.
주요 항목(primary point)은 다음 세 가지를 모두 요구합니다:
- 정확한 상태(status);
- 필드 계약에 의해 요구되는 정확한 표준 값(canonical value);
- 주변의 서술어 없이 요청된 JSON 키와 타입.
금액(money)의 경우, 값은 소수점과 정확히 두 자리를 가진 문자열이어야 합니다. 식별자(identifier)의 경우, 의미 있는 0과 내부 문자는 유지되어야 합니다.
이는 의도적으로 수치적 등가성보다 더 엄격합니다. "4700"과 "4700.00"은 같은 크기를 나타내지만, 후자만이 선언된 금액 출력 계약을 충족합니다. 코드에 있는 semantic_correct라는 보조 지표 역시 표준 문자열(canonical string)을 요구하며, 이는 무제한적인 의미적 또는 수치적 등가성을 측정하는 것이 아닙니다.
채점기는 다른 모델이 답안에 투표하는 방식이 아닌 결정론적 Python입니다. 저는 개별 정확성, JSON 계약 준수 여부, 완전히 올바른 쌍(fully correct pairs), 제어 항목 및 가족별 카운트를 별도로 보고합니다.
테스트된 모델 (Models Tested)
최종 실행에서는 다음의 정확한 Kaggle 모델 식별자를 평가했습니다:
| 모델 | Kaggle 식별자 |
|---|---|
| Gemini 3.8 Flash | google/gemini-3.8-flash |
| ... |
모델들은 8가지 사례 엔지니어링 파일럿을 거쳐 최종 실행 전에 선택되었습니다. 이전에 시도했던 Qwen 파일럿은 전송 시간 초과(transport timeouts)가 발생하여 제외되었으며, 이는 모델의 추론 품질에 대한 발견이 아닌 운영상의 이유였습니다. 원래의 파일럿 및 중단된 시도는 최종 결과와 별개로 유지됩니다.
최종 프로토콜에서는 Kaggle Benchmarks SDK 0.6.1을 사용했으며, 사례당 한 번의 시도, 두 개의 동시 사례 작업자(concurrent case workers), 그리고 클라이언트 재시도가 비활성화된 120초 HTTP 타임아웃이 적용되었습니다. 각 사례는 자체적인 네이티브 자식 작업 및 대화 기록을 가졌습니다. 골드 레이블, 근거 설명(rationales) 및 사례 ID는 모델 프롬프트에 포함되지 않았습니다.
세 가지 등록된 모델 모두 온도 제어 미지원(temperature control unsupported)을 보고했습니다. 따라서 온도 재정의(temperature override)는 전달되지 않았습니다. 시드 값 0이 요청되었으나, 효과적인 제공자 지원이 확립되지 않았습니다. 이는 동일한 샘플링 내부 구조나 제공자 간 결정론적 응답을 주장하는 것이 아니라, 흔히 기록되는 실행 정책입니다.
실행 전에 SDK의 실행 캐시(run cache)가 비활성화된 것으로 확인되었습니다. 제공자 측 프롬프트 캐싱은 제어되지 않았으며, 비활성화되었다고 주장하지는 않습니다.
측정 전 재현성 (Reproducibility before measurement)
최종 측정 전에 코퍼스(corpus)와 골드 레이블(gold labels)이 검토되어 고정되었습니다. 소프트웨어 점검 및 별도의 2개 구형 사례 통합 테스트가 실행에 앞서 진행되었으며, 스모크 응답(smoke responses)은 제외됩니다. 최종 기록은 네이티브 자식 작업 추적(native child-task traces)과 조정되었습니다. 재현성 자료에는 프로토콜, 소스 해시 및 검증 세부 정보가 보존되어 있습니다.
이러한 점검들은 우발적인 드리프트(drift)를 감지합니다. 그러나 작성자, 연대기 또는 의도적으로 다시 작성된 검증 코드를 외부적으로 인증하지는 않습니다.
발견 사항 (Findings)
세 가지 최종 모델 시도가 모두 완료되어 비교 결과 누락된 사례가 없는 84개의 응답을 얻었습니다. 저는 증거를 다운로드하여 점수를 재계산하고, 프롬프트와 답변을 네이티브 Kaggle 자식 작업 추적에 맞추었습니다.
| 모델 | 엄격하게 정확함 (Strictly correct) | JSON 컨테이너 준수 (JSON-container compliance) | 완벽하게 정확한 쌍 (Fully correct pairs) | 제어 항목 (Controls) |
|---|---|---|---|---|
| Gemini 3.8 Flash | 28/28 | 28/28 | 12/12 | 4/4 |
| ... | ||||
| 모든 모델은 화폐 계열(monetary family)이 아닌 21개 사례에 대해 올바르게 답변했습니다. 7개의 화폐 사례 내에서 Gemini는 7개를 정확하게 답변한 반면, Claude와 Gemma는 각각 5개를 정확하게 답변했습니다. 모든 불일치는 N01A/N01B라는 동일한 쌍에서 발생했습니다. |
한 쌍, 두 가지 다른 실패 (One pair, two different failures)
두 경우 모두 원문 텍스트 4.700을 사용했습니다. N01A는 명시적으로 브라질 표기법(천 단위 구분 기호: 점, 소수점: 쉼표)을 선언하고 있습니다. N01B는 미국 표기법(천 단위 구분 기호: 쉼표, 소수점: 점)을 명시적으로 선언합니다. 지침은 반올림 없이 두 자리 소수점을 가진 금액 문자열을 요구합니다.
결과로 나온 답변은 다음과 같습니다:
| Case | Expected canonical value | Gemini | Claude | Gemma |
|---|---|---|---|---|
| N01A: declared pt-BR | "4700.00" | ok, "4700.00" | ambiguous, null | ok, "4700" |
| N01B: declared en-US | "4.70" | ok, "4.70" | ambiguous, null | ok, "4.7" |
Claude의 두 응답은 유효한 JSON이었지만, 결정된 입력값을 모호하다고 분류했습니다. 이번 테스트에서 이는 **불필요한 자제(unnecessary abstention)**입니다. 원본이 이미 선택하는 데 필요한 누락된 조각을 제공했기 때문입니다.
Gemma의 답변은 올바른 수치 크기를 가지고 있습니다. 이들의 실패는 잘못된 지역 설정이나 금액을 선택했다는 증거가 아니라 표준 금액 표현(canonical money representation) 문제입니다. 이를 “두 개의 잘못된 금액”이라고 설명하는 것은 출력물이 보여주는 것을 과장하는 것입니다.
두 모델 모두 엄격한 점수 2점과 완전 쌍 1개를 잃었습니다. 따라서 그들의 총점과 쌍 개수는 동률이지만, 다음에 조사할 수 있는 개입(interventions)은 다릅니다. 하나는 불필요한 자제를 줄일 수 있는지 테스트하는 것이고, 다른 하나는 표준 출력값 검증을 테스트하는 것입니다. 이 실험은 어느 쪽의 개입도 평가하지 않았으며, 저는 채점 전에 답변을 수정하지 않았습니다.
실패하지 않은 것들
진정한 모호성(genuine-ambiguity) 사례들은 세 모델 모두에 의해 올바르게 처리되었습니다. 또한 이 코퍼스 내에서 누락된 데이터(missing-data), 유효하지 않은 날짜(invalid-date), 식별자(identifier) 사례들도 마찬가지였습니다. 이 실험은 이러한 모델들이 일상적으로 값을 지어내거나 식별자를 잃는다는 것을 보여주지 않습니다.
84개의 모든 응답은 또한 JSON 컨테이너 계약을 충족했습니다. 관찰된 격차는 추가적인 마크다운, 누락된 키 또는 비-JSON 텍스트가 아니었습니다. 컨테이너 형식과 필드의 표준값(canonical value)을 분리함으로써 그 구분이 명확해졌습니다.
한계점 (Limits)
이것은 모든 행정 업무를 대표하는 표본이 아닌, 28개의 구성된 케이스에 대한 한 번의 실행 결과입니다. 쌍으로 된 질문들은 관련된 관찰이며, 상태 분포는 균형 잡혀 있지 않습니다: ok 19개, missing 3개, ambiguous 2개, 그리고 invalid 4개.
여기서 완벽한 점수를 받았다고 해서 일반적인 신뢰성을 확립하는 것은 아니며, 두 점의 차이가 모델의 일반적인 우월성이나 통계적 유의성을 확립하는 것도 아닙니다. 프롬프트는 명시적으로 데이터 계약(data contract)을 가르칩니다. 이들은 모든 레이블이 지정되지 않은 스프레드시트에서 관습을 발견하는 것이 아니라, 그 계약을 따르는 것을 테스트합니다.
이러한 입력값들은 명시적인 정규화 규칙(normalization rules)을 따르므로, 결정론적 구현(deterministic implementation)이 그럴듯한 대안입니다. 저는 이 기준선(baseline)을 측정하지 않았습니다. 이 연구는 LLM이 해당 작업에 필수적이라는 것을 확립하지 않습니다. 결정론적 채점기(grader)가 측정된 정규화 기준선은 아닙니다.
최종 결과가 공개된 이후로 코퍼스나 골드 레이블 편집은 이루어지지 않았습니다. 엄격한 점수는 사전에 선언된 점수 그대로 유지되며, Gemma의 수치적 동등성에 대한 설명은 순위를 변경하기 위해 만들어낸 대체 지표가 아니라, 그 두 응답에 대한 진단적 읽기입니다.
다음으로, 배포 권고를 하기 전에 독립적으로 작성된 의역(paraphrases)과 반복 실행을 테스트할 것입니다. 그것들은 이 제출물로 뒷받침되는 주장이 아닌 미래의 실험들입니다.
나의 벤치마크
Fechamento BR — 공개 Kaggle 벤치마크
Kaggle 벤치마크와 그 근간이 되는 작업은 공개적으로 접근 가능합니다. 위에 설명된 84개 응답의 초기 비교는 이후 공용 리더보드 재실행과는 별도로 보존됩니다. 나중에 플랫폼에서 실행된 것이 원래 고정된 연구에 조용히 병합되지 않습니다.
증거 및 AI 지원
재현성 패키지에는 고정된 케이스와 채점기(grader), 프로토콜 및 소스 해시, 실행 매니페스트, 원본 응답, 네이티브 태스크 트레이스, 그리고 재계산된 요약이 포함되어 있습니다. 스코어러는 고정된 시도, 코퍼스, 그리고 인스트루먼트 매니페스트와 일치하지 않는 기록은 거부하며, 불완전한 실행에는 종합 점수가 부여되지 않습니다.
ChatGPT가 구현, 분석 및 작성에 도움을 주었습니다. Codex는 파일럿 결과에 접근하여 코퍼스와 인스트루먼트에 대한 별도의 AI 검토를 제공했습니다. 이는 블라인드 검토나 독립적인 인간 감사(audit)가 아니었습니다. 저장된 기록과 네이티브 트레이스를 일치시키는 것은 일관성 확인일 뿐, 두 번째 독립적인 측정은 아닙니다. 저는 주장 및 자료에 대해 책임을 집니다.
구현에는 공식 Kaggle Benchmarks SDK와 그 빠른 시작(quick start)이 사용되었습니다. 측정은 개인 유료 API 키 없이 Kaggle의 네이티브 모델 허용치를 사용했습니다. 로컬 고정 응답 테스트는 모델 성능 증거와 명확히 구분됩니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기