
모든 LLM이 동일한 Todo 앱을 작성한다 (문자 그대로)
요약
다양한 LLM 모델들을 대상으로 Todo 앱 작성 능력을 벤치마크한 결과, 서로 다른 회사와 데이터셋을 가진 모델들이 구조적으로 거의 동일한 코드를 생성한다는 사실이 발견되었습니다. 특히 Anthropic, Qwen, Gemma 등의 모델들이 함수명, CSS 클래스, localStorage 키까지 일치시키는 높은 유사성을 보였습니다.
핵심 포인트
- 서로 다른 제조사의 LLM들이 구조적으로 구별 불가능한 코드를 생성함
- Jaccard 유사도 1.000을 기록할 정도로 모델 간 코드 패턴이 매우 유사함
- GPT-5.4-mini는 다른 모델들과 달리 CSS 변수를 사용하는 등 차별화된 패턴을 보임
- 모델의 매개변수 규모와 상관없이 특정 코드 구조가 결정론적으로 나타남
저는 로컬 모델들의 벤치마크를 만들고 있습니다.
간단한 과제는 단일 HTML 파일로 할 일 목록(Todo App)을 만드는 것입니다. 추가, 삭제, 완료 표시, 필터, localStorage 기능이 포함됩니다. 아주 사소한 작업입니다. 각 모델에게는 6번의 시도가 주어집니다. 총 16개 모델에서 나온 96개의 파일들입니다. Claude Sonnet 4.6과 Haiku 4.5부터 전체 Qwen 계열(9B부터 122B), Gemma 4, GPT-OSS 20B와 120B, GPT-4.1-mini, GPT-5.4-mini, Codex-mini까지, 그리고 Z.AI GLM-5-turbo에 이르기까지 모든 모델들입니다.
저는 파일 하나하나를 열어 작동 여부, 코드의 모양을 판단하고 브라우저에서 실행해 봅니다. 마치 구석기 시대 사람처럼요. 자동화하는 대신 직접 확인하고 싶은 것이 AI가 실제로 무엇을 만들어냈는지 보기 위해서입니다.
N번째 파일을 검토하던 어느 순간, 이상한 데자뷔를 느꼈습니다. 다음 파일에서는 확신이 들었습니다. 마치 한 사람이 모든 것을 작성한 것 같았습니다. 동일한 함수 이름(addTodo, saveTodos, deleteTodo), 동일한 CSS 클래스 이름(.filter-btn, .container, .todo-text), 그리고 동일한 localStorage 키: 'todos'였습니다. 서로 다른 세 회사의 모델들이, 서로 다른 데이터셋으로 훈련되었음에도 불구하고 구조적으로 구별할 수 없었습니다.
그래서 확인해 보기로 했습니다. 이번에는 에이전트를 사용해서 말입니다.
차이점 비교(diff) 대신 지문(Fingerprint)
저는 코드를 문자 그대로 비교하는 것이 아닙니다. 공백, 따옴표, 함수 순서는 노이즈일 뿐입니다. 저는 구조를 비교하고 싶습니다. 각 파일에서 다음
96×96 히트맵입니다. 좌측 상단 코너에는 전체 행렬의 62.5%를 차지하는 거대한 어두운 블록이 있습니다. 60개의 파일, 네 개의 회사:
- Anthropic Haiku 4.5 - 모든 6개 시도
- Qwen 3.5 (9B, 27B, 35B, 122B) 및 Qwen 3.6 (27B, 35B)
- Gemma 4 (26B 및 31B)
- Z.AI GLM-5-turbo - 모든 6개 시도
네 개의 회사, 다섯 가지 모델군이 9~1220억 개 매개변수에 걸쳐 있습니다. 구조적으로 동일한 코드입니다.
가장 놀라운 수치들:
Jaccard 1.000 qwen3.5_122b_03 ↔ qwen3.5_122b_04
Jaccard 1.000 qwen3.6_35b_01 ↔ qwen3.6_35b_03
같은 모델, 두 가지 다른 실행 - 동일한 식별자 세트입니다. 분산이 없습니다. 이 모델은 거의 결정론적으로 반환하는
GPT-5.4-mini는 눈에 띄게 다릅니다: CSS 변수(CSS variables)와 색상 팔레트(--primary-color, --bg-color, --danger-color)를 일관되게 사용합니다. 다른 모델들은 색상을 하드 코딩(hard-code)합니다. 이 모델은 학습 과정에서 더 새로운 프런트엔드 패턴을 접한 것 같습니다.
Sonnet 4.6은 흥미로운 사례입니다. 6개의 시도가 세 개의 작은 그룹과 하나의 단일체(singleton)로 나뉩니다. 모델 내부 Jaccard 유사도(Intra-model Jaccard)는 0.441로 '클래스 A' 전체에서 가장 낮습니다. Haiku 4.5는 0.815를 기록합니다. 따라서 동일한 Haiku는 항상 같은 결과를 제공하는 반면, Sonnet은 매번 다른 것을 제공합니다.
Codex-mini는 세트에서 가장 낮은 점수(평균 Jaccard = 0.277)를 받았습니다. OpenAI 클러스터 내에서 세 번의 시도와 세 개의 단일체로 구성되어 있습니다. 사소한 작업에 대해서조차 '선호하는 해결책'이 없는 모델입니다.
Snake는 다를까요?
위에서 말했듯이, Todo 앱은 회상(recall) 작업입니다. Snake는 모드(인간 대 인간, 인간 대 CPU, CPU 대 CPU), 점수, 시작 메뉴, 게임 오버 화면 등 여러 결정 차원(decision dimensions)을 가지고 있어 모델들이 '기억'하기보다는 '설계'하도록 강제합니다. 저는 다른 96개 파일에 동일한 스크립트를 실행했습니다.
히트맵(heatmap)은 완전히 다르게 보입니다. 크고 어두운 블록이 없습니다. 네트워크 뷰를 보면, 한쪽 구석에 몇 개의 작은 그룹과 73개의 단일체로 둘러싸여 있습니다.
| Metric | Todo App | Snake |
|---|---|---|
| Largest cluster | 60 files (62.5%) | 6 files (6.3%) |
| ... |
Todo 앱의 경우 지배적인 시그니처는 addTodo, .active, .filter-btn 같은 것이었습니다. 이는 모두가 다르게 만들 수 있었지만, 모두가 똑같이 만든 특정 디자인 결정에 관한 이름들입니다. Snake의 경우 지배적인 것은 startGame, id="gameCanvas", endGame, draw, spawnFood 등입니다. 이것이 바로 **도메인 어휘(domain vocabulary)**이며, 피할 수 없는 최소한의 요소입니다. 그 외 모든 것—게임 모드, 메뉴 구조, 상태를 유지하는 방식—은 파일마다 다릅니다.
Sonnet 4.6을 Snake에 적용했을 때: 6번 시도, 6개의 싱글톤(singleton), 최대 Jaccard 유사도는 0.324였습니다. 이는 전체 세트에서 가장 높은 모델 내부 다양성입니다.
이로부터 알 수 있는 것들
Todo 앱은 프로그래밍 기술의 벤치마크가 아닙니다. 이것은 회상(recall) 테스트입니다. 코드가 학습 데이터에 수백 개의 복사본으로 존재하기 때문에, 모델이 그것을 재현하는 것입니다. 과제를 실제 복잡성을 가진 것으로 바꾸면
저는 제가 만들고 있는 에이전트가 서로 다른 모델들과 어떻게 작동하는지, 그리고 어떤 것이 "코딩을 위한 최고의 로컬 모델 (best local model for coding)"인지 확인하기 위해 이 벤치마크를 시작했습니다.
결국 저는 기본적인 작업에서는 모든 로컬 모델이 서로 다른 래퍼 (wrapper)를 씌운 동일한 모델과 같다는 결론에 도달했습니다. 진짜 차이점은 학습 데이터에서 TodoMVC가 끝나는 지점, 즉 모델이 이전에 본 적 없는 특정 컨텍스트 (context)와 상태 (state)를 가진 실제 프로젝트에서 시작됩니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
