이것은 Kaggle Benchmarking Challenge에 제출하는 자료입니다.
🎥 3분 개요 (내레이션):
제가 벤치마크한 내용
표준화 과정에는 실제 출시되지 않은(never shipped) 제안들이 길게 남아 있습니다. 초안 목록에서 제외된 이모지, 거부되거나 연기된 PEPs(Python Enhancement Proposals), 만료된 IETF Internet-Drafts, 레지스트리에 포함되지 못한 HTTP 헤더 등이 그것입니다. 이러한 내용들은 웹 전반에 걸쳐 블로그 게시물, 메일링 리스트, 초기 구현 등의 형태로 존재합니다. 따라서 모델은 이 주제들에 대한 방대한 텍스트를 접해왔으며, 종종 마치 실제인 것처럼 작성된 경우도 많습니다.
저는 다음을 알고 싶었습니다. LLM(대규모 언어 모델)이 이러한 사장된 제안들을 실제 표준으로 취급하는가? 그리고 더 중요하게는, 모델이 직접적으로 질문받았을 때뿐만 아니라, 모델이 생성해내는 결과물에서도 이것이 나타나는지 여부입니다. "PEP 505는 연기되었다"고 말하면서도 코드에 a?.b와 같은 구문을 작성하는 모델이야말로 위험한 경우입니다.
Drafts That Never Shipped는 다섯 가지 계열에 걸쳐 약 122개의 개체에 대해 질문합니다:
| 계열 | 미출시 예시 (Never shipped example) | 출시된 "쌍둥이" 매칭 (Matched shipped "twin") |
|---|
| 이모지 (Emoji) | Apple Core (Emoji 17.0 초안에서 제외됨) | 라임, 흔들리는 얼굴 |
| ... | | |
여기에 순수한 환각(hallucination)을 측정하기 위한 가상의 플레이스보 (존재하지 않는 가짜 이모지 이름, PEP 번호, Datatracker에서 404 에러가 나는 초안 이름)도 포함됩니다.
각 개체는 여러 **표면(surfaces)**에 걸쳐 질문받습니다:
- 상태 (Status): "X가 출시되었습니까?" →
{"shipped": true|false}
- 조회 (Lookup): 코드포인트 / Python 버전 / RFC 번호, 또는
NONE
- 아티팩트 (Artefact): 실제로 그것을 _사용_하는 경우:
- 이모지가 포함된 채팅 메시지;
- Python 3.14 스니펫;
- 인용문;
- 순수 HTTP 헤더.
모든 아티팩트 프롬프트는 중립적인 제외 옵션(NOT_AVAILABLE)을 제공하므로, 항상 정확한 답변이 존재합니다.
정답(Ground truth)은 절대 수동으로 타이핑되지 않습니다. 모든 레이블은 고정되고 해시 처리된, 기계가 읽을 수 있는 출처에서 가져옵니다:
- Unicode
emoji-test.txt / UnicodeData.txt (15.1 → 18.0);
peps.json;
- IETF Datatracker API;
- IANA HTTP Field Name Registry.
점수는 LLM 심사관 없이 완전히 결정론적입니다. Python 스니펫은 Python 3.14 환경에서 컴파일만 되며 (실행되지 않음), 만약 귀하의 "PEP 505 예시"가 컴파일되지 않는다면, 그것은 해당 문법이 존재한다고 믿었다는 증거입니다. 저 자신의 정리 과정도 한 번 틀린 적이 있습니다 (HTTP QUERY 메서드 초안이 출시되지 않았다고 가정했으나, Datatracker에 따르면 이는 RFC 10008이 되었습니다). 고정된 출처가 승리했고 충돌은 기록되었습니다.
테스트 모델
| Model | Lab | Why |
|---|
| Claude Sonnet 5 | Anthropic | frontier general model |
| ... | | |
| 그것은 5개의 연구소에서 나온 8개 모델을 포괄합니다: 계열 내의 최첨단(frontier) 대 소형 티어, 오픈 vs. 클로즈드, 추론 모델, 그리고 가장 새로운 Gemini까지입니다. Qwen 모델이 계획되었으나 엔드포인트가 응답하지 않아 제외되었습니다. 총 약 6,000개의 채점된 답변을 온도 0으로, 비출시 항목에 대해 3회 반복하여 처리했습니다. | | |
발견 사항
Believed-shipped rate by model
1. 출시되지 않은 표준에 대한 답변 4개 중 1개가 실제로 출시되었다고 말하며, 오류는 한 방향을 가리킵니다. 전체 7개 모델을 취합했을 때, 실제 비출시 항목에 대한 답변의 **26%**가 해당 항목이 출시되었다고 주장합니다. 매우 최근에 출시된 것을 제외하면, **모든 오류 중 84%**가 "출시되었다고 믿음"입니다. 반대로 ("실제 존재하는 것을 부인함") 말하는 경우는 약 10%에 불과합니다.
| Model | 비출시 표준이 출시되었다고 주장 | 실제 쌍둥이에 대한 정확도 |
|---|
| Claude Sonnet 5 | 9 % | 90 % |
| ... | | |
| 2. 강력한 모델은 예/아니오 질문은 맞히지만 세부 사항을 틀립니다. 최첨단(frontier) 모델들은 | | |
- Claude Sonnet 5에게 RateLimit 헤더를 정의하는 RFC(여전히 Internet-Draft 상태인)가 무엇인지 물었더니: **"RFC 9777"**이라고 답했습니다. 예시 헤더를 요청하자, 마치 등록된 필드인 것처럼
RateLimit-Policy: 100;w=60을 작성했습니다.
- DeepSeek R1에게 같은 초안(draft)을 인용해달라고 요청했더니, 완벽하게 형식화된
… "RateLimit Header Fields for HTTP", RFC 9436, DOI 10.17487/RFC9436, August 2023.를 생성했습니다. 하지만 이 인용은 존재하지 않는 문서인 RFC에 대한 것입니다.
Fabricated RFC numbers and citations
- Claude와 Gemini 모두
Digest가 RFC 9530에 의해 정의되었다고 말하는데, 이 RFC는 오히려 해당 기능을 _폐기(obsoleted)_한 것입니다.
- gpt-oss-120b에게 PEP 622의 리딩-닷 패턴(leading-dot pattern)을 요청하자
case .RED:라고 작성했습니다. 이것은 패턴 매칭이 PEP 634로 출시되기 전에 폐기된 초안 구문이며, 컴파일되지 않습니다.
gpt-oss-120b writes dropped PEP 622 draft syntax
- Gemini 3 Flash(파일럿 실행 중)에게 PEP 750을 요청하자
tag'Python {name}'를 작성했습니다. 이는 PEP의 **초기 초안(first draft)**에서 나온 커스텀 접두사 구문입니다. 실제로 Python 3.14에 출시된 것은 오직 `t
PEP 초안 구문 패턴이 가장 놀라웠습니다. 이것들은 어디서 온 환각(hallucinations)이 아닙니다. 이들은 나중에 변경된 사양의 이전 초안에 대한 충실한 기억입니다. 모델은 제안 자체는 학습했지만, 그 결과까지는 학습하지 못했습니다.
3. "알고 있다" ≠ "할 수 있다", 그리고 이는 모델에 크게 의존합니다. 모델이 상태 질문을 올바르게 이해한 사례들 중에서, 그 아티팩트(artefact)가 여전히 틀렸던 경우는 얼마나 자주 있었을까요?
- Claude 1.4 %, Gemini Flash 2.1 %, DeepSeek R1 2.0 %;
- Gemini 3.1 Flash Lite 23 %, GPT-5.4 nano 26 %.
Flash Lite는 드롭된 초안 구문 두 가지(PEP 572의 (expr as name) 및 PEP 622의 case .RED:)가 Python에 존재하지 않는다고 정확히 말했고, 제가 요청한 6가지 코드 샘플 모두에서 이를 사용했습니다. 등록되지 않은 HTTP 필드의 경우 "현재 필드가 아니다"라고 답하면서도 헤더를 9번 중 9번이나 생성했습니다. 작은 모델의 경우, "X가 존재하나요?"라는 질문에 대한 정확한 답변이 그들이 코드로 X를 사용할지 여부에 대해서는 거의 알려주지 못합니다.
Gemini 3.1 Flash Lite: correct status, then dropped syntax
강력한 모델들도 예외는 아닙니다. Claude Sonnet 5는 RateLimit-Policy가 등록된 HTTP 필드가 아님을 정확히 말했지만, 요청받은 예시를 작성할 때 이를 HTTP 응답에 포함했습니다:
Claude Sonnet 5 knows, then does anyway
역(逆) 실패 사례도 있습니다. Claude는 Goal Net 🥅와 Sauropod 🦕가 실제 이모지라고 말한 다음, 이를 사용하도록 메시지를 작성해 달라는 요청에 NO_SUCH_EMOJI라고 답합니다. 이것은 성급한 믿음이 아니라 과도한 신중함이지만, 역시 아는 것과 하는 것 사이의 괴리입니다.
4. 출처를 보여주는 것은 작동하지만, 모델에게 "조심하라"고 말하는 것은 대부분 효과가 없습니다. 제가 비교한 세 가지 조건은 제외된 항목(held-out items)에 대한 것입니다:
- 수정 없음;
- 플라시보 지침("주의: 일부 제안은 실제로 출시되지 않았습니다.")
- 프롬프트 내 실제 고정 출처 행(peps.json 항목, emoji-test.txt 라인, Datatracker 상태, IANA 레지스트리 행).
Fix experiment: evidence vs placebo instruction
| 모델 | 수정 없음 (No fix) | "주의" 지침 ("Be careful") | 프롬프트 내 출처 행 (Source row in prompt) |
|---|
| Claude Sonnet 5 | 4.5 % | 9.1 % | 2.3 % |
| ... | | | |
| (보류된 미출시 항목 + 플라시보 항목에 대한 추정 출시율) | | | |
이 증거는 모든 모델의 오류율을 대략 절반으로 줄이거나 그 이상 개선합니다. 또한 실제 항목에 대한 정확도도 높입니다 (nano의 쌍둥이 정확도는 60%에서 97%로 상승). 경고 문구는 일부 약한 모델에는 도움이 되지만 신뢰하기는 어렵습니다: Claude의 경우, 셀은 작지만 오히려 성능을 약간 악화시켰습니다.
5. 최신성(Recency)은 반대 실패 모드이며 분리되어야 합니다. 제가 처음 수행한 파일럿 테스트에서는 벤치마크가 작동하지 않는 것처럼 보였습니다: 모델들이 실제 쌍둥이 항목에 대해 폐기된 초안보다 더 낮은 성능을 보였습니다. 원인은 최근에 출시된 쌍둥이 항목(2026년 9월의 Emoji 18.0, Python 3.14, 2024~25년 RFC 등) 때문이었으며, 모델들은 아직 이를 알지 못합니다. 저는 이들을 별도의 "최신" 슬라이스로 옮겨 재파일럿 테스트를 진행했습니다. 커트오프 이후의 구식화(staleness)와 성급한 믿음은 거울상입니다: 하나는 실제 항목이 존재하지 않는다고 말하고, 다른 하나는 폐기된 것이 존재한다고 말합니다.
저를 놀라게 한 점
- 잘못된 답변들이 얼마나 구체적인지: DOI, RFC 번호, 정확한 초안 구문 등.
- 추론 모델(DeepSeek R1)이 가장 자신감 있는 믿음을 가진 모델 중 하나였다는 사실.
- 저렴한 모델 하나가 특정 사실에 대해서는 맞을 수 있지만, 그것을 사용하는 방식에 대해서는 매번 틀릴 수 있다는 점.
다음으로 측정하고 싶은 것
- 대규모 초안 상세 질문 (Draft-detail questions at scale): python/peps와 Datatracker 개정 기록을 활용하여, 초안과 최종 텍스트 사이에 구문이나 필드 이름이 변경된 모든 PEP/RFC를 검사합니다.
- 에이전트 설정 (Agentic settings): linter나 테스트 루프가 있는 코딩 에이전트는 죽은(dead) 구문을 포착할까요, 아니면 이를 합리화할까요?
- 잘못된 문서 검색 (Retrieval of the wrong document): 만약 컨텍스트에 최종 사양이 아닌 오래된 초안이 포함되어 있다면 어떻게 될까요?
솔직한 주의사항 (Honest caveats)
- 저의 첫 번째 파일럿은 사전 등록 게이트를 통과하지 못했습니다. 수정 사항(신선도 슬라이스, 두 가지 새로운 항목군, 풀링된 게이트에 대한 역량 하한선)은 파일럿 결과를 본 후에 선택되었습니다. 이 모든 것은 리포지토리의 사전 등록 기록에 날짜가 명시되어 있습니다.
- Claude의 파일럿에서 나타난 '쌍(twin)' 대 '출시되지 않은' 격차(+81개 항목 중 16점)는 전체 세트(≈ 0)에서는 재현되지 않았습니다; DeepSeek R1의 격차만이 통계적으로 명확합니다(+18점, McNemar p = 0.008).
- 출력 감사 과정에서 몇 가지 채점기 버그가 발견되었으며, 모두 단위 테스트를 통해 수정하고 캐시된 응답을 바탕으로 재채점했습니다.
제 벤치마크 (My Benchmark)
👉 Kaggle 벤치마크: https://www.kaggle.com/benchmarks/tasks/shs123/drafts-that-never-shipped
📦 항목 데이터셋 (Items dataset): kaggle.com/datasets/shs123/drafts-that-never-shipped-items
Kaggle의 kaggle-benchmarks 라이브러리로 구축되었습니다 (@kbench.task, llm.prompt(schema=...)를 통한 구조화된 출력, 온디스크 캐싱을 사용한 .evaluate()). 리더보드 점수는 (정답 수, 채점 수)이며, 형식 오류 및 API 오류는 제외되어 별도로 보고됩니다.