유효한 JSON, 틀린 답변: 소년과 그의 LLM. SEC 공시, 90%의 안드로이드, 그리고 지금까지 30%의 좀비가 함께하는 대서사시...
요약
M&A 합병 계약서에서 복잡한 데이터를 JSON 형식으로 추출하는 MAUD 데이터셋과 그 성능 평가에 관한 글입니다. 단순한 스키마 강제를 넘어 데이터의 의미론적 정확도와 환각률을 측정하는 실험적 접근을 다룹니다.
핵심 포인트
- M&A 계약서의 92개 필드를 JSON으로 추출하는 고난도 과업 수행
- 단순 스키마 강제가 아닌 데이터의 의미론적 정확도 중요성 강조
- 전체 계약서 매핑 방식을 통해 기존 벤치마크보다 높은 난이도 설정
- GPT-5.5 베이스라인 기준 약 90%의 높은 필드 정확도 기록
구조화된 추출 (structured extraction)을 위해 "그저 JSON 스키마 (JSON schema)를 강제하면 끝이다"라는 댓글을 계속 보게 됩니다.
만약 당신이 진정으로 "LocalLLaMA"를 하고 있다면, 즉 자신만의 언어 모델 (LM)을 구축하거나 미세 조정 (fine tuning)을 하고 있다면, 해결책은 사소합니다. llguidance와 같은 스키마 제약 디코더 (schema constrained decoder)를 적용하면 끝입니다. 쉬운 부분은 말이죠....
호스팅된 LLM들도 유사한 메커니즘을 가지고 있지만, 이곳은 r/LocalLLaMA이므로 그 부분은 무시하겠습니다.
하지만 그 모든 JSON의 의미론 (semantics)은 어떻게 될까요? 그것은 그리 쉽지 않습니다.
저는 공개적으로 어려운 데이터셋을 실행해보고 싶었고, 아마 실패할지도 모릅니다. 사실 이미 조금 실패했습니다.
코드가 포함된 리포지토리 (Repo): https://github.com/validjson/MAUD. 지금까지의 공개 단계(E0-E1)를 위한 스코어보드, 하네스 (harness), 그리고 원본 예측/정답 (raw prediction/gold) 파일들이 포함되어 있습니다. 여러분이 직접 이 대서사시를 재점수화할 수 있습니다 (REPRODUCE.md).
공개 사항: 이 작업의 생성에는 LLM이 사용되었습니다. 사실 요즘 저는 LLM 없이는 양치질조차 제대로 못 할 정도입니다. 참고로 치아는 아주 깨끗합니다. 가끔씩 보이는 대시(—) 정도가 유일한 흔적일 뿐입니다. 하지만 이 포스트는 100% 유기적입니다. 우리는 지하로 들어갔고, LLM은 제가 돌아오기를 지상에서 끈기 있게 기다리고 있습니다.
과업: 실제 M&A 합병 계약서(MAUD 데이터셋)에서 92개의 거래 시점 필드 (deal-point fields)를 추출하여 계약당 하나의 JSON 객체로 만듭니다. 디코딩 시점에 엄격한 JSON 스키마 (JSON Schema)가 강제됩니다. 모든 필드에 값이 있는 것은 아니며, 계약서에서 다루지 않는 경우 결과는 null이 됩니다. 이것은 제가 30년 동안 접해본 것 중 가장 높은 품질의 어노테이션 (annotation) 중 하나입니다. 변호사들이 수행했기 때문에(각 어노테이션당 3명) 엄청난 비용이 들었을 것입니다.
긴장되는 부분: X/Twitter 인수 공시(https://www.sec.gov/Archives/edgar/data/1418091/000119312522120461/d310843dex21.htm)를 한번 살펴보세요. MAUD에 있는 것은 아니지만 형식이 같습니다. 우리는 다음 JSON 스키마(https://github.com/validjson/MAUD/blob/main/data/combined/schema.json)를 추출하려고 시도할 것입니다.
제가 이 문제를 실제 상황처럼 현실적으로 만들었으며, 그 결과 기존에 발표된 표준 MAUD 결과보다 훨씬 더 어렵게 만들었다는 점에 유의하십시오. 원본 .csv 주석(https://github.com/TheAtticusProject/maud/blob/main/data.zip)에서 수행된 방식처럼 계약서의 발췌본을 분류하는 대신, 전체 계약서에서 JSON을 매핑하는 방식으로 구성했습니다.
평가. 15개의 홀드아웃 (held-out) 계약서, 1,380개의 필드 셀 (field cells). 지표:
필드별 정확도 (Per-field accuracy) = 정답/전체
환각률 (Hallucination rate) = 계약서가 비워둔 셀(정답 = null) 중 모델이 어쨌든 답변을 내놓은 비율
베이스라인 GPT-5.5
정확도:
E0: 전체 계약서 -> 90.7% 정확도 (1,251 / 1,380 필드).
E0partial: 약 20K 토큰 윈도우(window)로 청킹 (chunking)하고 청크별 JSON을 병합했을 때 정확도는 90.0% (1,242 / 1,380)를 유지합니다. 따라서 대부분의 청크는 JSON 페이로드(payload)에 단 몇 개의 항목만 추가하게 될 것입니다.
환각은 계약서가 비워둔 110개의 셀(1,380개 중 정답 = null)에 대해서만 측정되었습니다:
E0: 전체 계약서 모델은 이 중 37 / 110 (33.6%)에 대해 답변을 지어냈습니다.
E0partial: 청킹을 적용하면 이 수치가 17 / 110 (15.5%)로 떨어집니다.
좋습니다, 스키마 (schema)와 강력한 폐쇄형 모델 (closed model)을 사용하면 약 90%를 얻을 수 있습니다. 이는 매우 어려운 작업처럼 보였기에 저를 놀라게 했습니다. 하지만 우려되는 점이 있습니다(아래 참조).
E1: 그다음 저, 즉 제 LLM/강아지가 동일한 프롬프트와 동일한 모든 설정을 사용하여 오픈 모델 (Qwen 2.5 32B)로 교체했습니다. 저는 먼저 추측을 사전 등록해 두었습니다. GPT-5.5가 정말 잘 해냈으니 생각보다 쉬울 것이라고 말이죠:
예측: 정확도 약 80-85%, 유사한 환각률. 완전히 틀렸습니다.
모델 정확도 (1,380개 필드 중) / 환각 (110개 null 셀 중) / 유효한 JSON
GPT-5.5 (청킹 적용) 90.0% (1,242) / 15.5% (17) / 100%
Qwen 2.5 32B (동일 프롬프트) 30.6% (422) / 54.5% (60) / 100%
100% 스키마 유효. 약 70% 오답. 무작위는 아니지만, 더 심각합니다:
구역질 나는 (Barfy) LLM: 모델이 78개 청크 중 약 23개에서 단 하나의 ~20K 토큰 슬라이스(slice)만으로 92개 필드 전체에 대한 추측을 쏟아냅니다. 일론 머스크의 M&A 문서를 직접 확인해 보세요, 절대로 그런 식으로 작동하지 않습니다. 그러다 증거가 포함된 청크에 도달하게 되면, 모델은 승리할 수 없습니다.
GPT-5.5의 7개 사례(좀비 대 안드로이드 행동)와 비교했을 때, 청크 간 충돌(cross-chunk conflicts)이 293건 발생했습니다.
문제의 한 예: contract_88에서 "특정 이행 (specific performance)" 필드를 다루는 5개의 청크 모두가 답변을 내놓았지만, 그 중 어느 것도 "specific performance"라는 문구를 포함하지 않았습니다. 모델이 법적 판결을 지어낸 것입니다. 해당 계약서 전체를 통틀어, 92개의 필드 중 72개가 서로 다른 청크로부터 모순된 값을 받았습니다.
이는 어떤 JSON 스키마 강제 (JSON schema enforcement)로도 해결할 수 없는 엉망진창인 상태입니다. JSON 형식은 예쁘지만, 의미론 (semantics)은 추잡합니다. 그리고 의미론이야말로 다운스트림 LLM (downstream LLM)의 꼬리를 흔들게 만드는 핵심 요소입니다.
주의 사항: GPT-5.5의 90%라는 수치를 보고 제 스파이더 센스(spidy-sense)가 요동쳤습니다. 너무 뛰어납니다. MAUD는 2023년부터 공개되어 왔으므로, GPT-5.5의 90% 중 일부는 실력이 아니라 오염 (contamination)일 수 있습니다. 오염 교체 테스트 (contamination swap-test)를 계획 중이지만, 제가 원본 .csv 데이터를 상당히 심하게 변형했기 때문에 암기 (memorization) 때문일 가능성은 낮다고 봅니다. 다만 사실상 미세 조정 (fine-tuned)된 상태라고는 믿습니다. 이것이 오픈 모델 (open-model)의 결과에 영향을 주지는 않습니다. 덧붙이자면, 한 모더레이터로부터 Qwen 2.5가 구식이라 쓸모없다는 말을 들었지만, 제 LLM들이 가장 좋아하는 장난감인걸요. 좀 봐주세요.
다음 단계는 실시간으로 진행됩니다: 표준 LoRA 미세 조정 (fine-tuning) (E2, 현재 실행 중), 그 다음에는 모델에게 null이라고 말하도록 가르치는 것이 실제로 격차를 줄이는지 확인하기 위한 기권 재라벨링 (abstention relabeling) 미세 조정 (E2a)입니다. 모더레이터들이 허락한다면, 상업적 방법 (E3, 결과만 공개할 예정, 제 것이니까요)도 진행할 것입니다. 각 단계가 실패할 수도 있습니다. 결과가 나오는 대로 게시하겠습니다.
예측, 비판, 그리고 "방법이 틀렸다"는 지적 모두 환영합니다. 어쩌면 프롬프트 (prompt)가 문제일 수도 있습니다. 프롬프트는 여기 있습니다 (https://github.com/validjson/MAUD/blob/main/scripts/run_e0_chunked.py).
- Harlan Ellison의 소설/영화 "A Boy and his Dog" (https://en.wikipedia.org/wiki/A_Boy_and_His_Dog_(1975_film))를 인용했습니다. 이제부터 Claude를 'Blood'라고 불러야 할 것 같네요... 하지만 여성혐오적인 결말은 참여하지 않겠습니다.
제출자: /u/Skiata
[link] [comments]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/LocalLLaMA의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기