목록으로
AI 연구
전체공개
한국어

MoE LLM 개발을 통해 본 Claude code 와 Codex 최신 모델 간 바이브 코딩 성능 비교

같은 PRD로 문자 단위 MoE 언어 모델(nano MoE)과 학습·생성 웹 UI를 Claude Code(Fable 5)와 Codex(GPT-6 Astra)에게 각각 개발시켜, 소요 시간·토큰·코드 규모와 알고리즘·코드 견고성 차이를 비교한 결과입니다. (출처: 한국건설기술연구원 강태욱 박사)

같은 PRD로 개발한 결과 — Claude Code(Fable 5, 왼쪽)와 Codex(GPT-6 Astra, 오른쪽)
같은 PRD로 개발한 결과 — Claude Code(Fable 5, 왼쪽)와 Codex(GPT-6 Astra, 오른쪽)

연구 배경 — 같은 과제로 두 바이브 코딩 도구 비교하기

이 글은 현 시점의 Claude Code와 Codex 최신 모델 간 바이브 코딩 성능을 비교하기 위해, 간단한 LLM의 MoE(Mixture-of-Experts) 구조를 개발하고 테스트한 사례를 정리한 것입니다.

비교 과제로 고른 것은 PyTorch로 만드는 작은 문자 단위 MoE 언어 모델과, 이를 학습시키고 대화형으로 생성해 볼 수 있는 웹 UI입니다. 라우터, top-k 선택, 전문가 용량 제한, 균형 손실처럼 구현 판단이 필요한 요소가 많으면서도 규모가 작아, 두 도구가 같은 요구사항을 어떻게 해석하고 구현하는지 비교하기에 알맞습니다.

비교 대상인 Codex의 최신 모델 GPT-6 Astra비교 대상인 Codex의 최신 모델 GPT-6 Astra

구분

Claude Code

Codex

모델

Fable 5

GPT-6 Astra (medium)

실행 방식

CLI 모드, 독립 폴더

CLI 모드, 독립 폴더

입력

같은 PRD 문서

같은 PRD 문서

연구 방법 — 같은 PRD를 주고 개발시키기

가급적 동일한 조건에서 비교하기 위해, 목적에 맞는 MoE 기반 LLM 개발용 PRD(제품 요구사항 문서) 를 먼저 설계했습니다. 두 도구 모두 이 PRD 하나만 읽고 프로젝트를 개발합니다. PRD의 주요 내용은 다음과 같습니다.

PRD 개요 — nano MoE

문자 단위 Mixture-of-Experts 언어 모델 학습·실험 도구

항목

내용

프로젝트

nano_moe

버전

1.0 (2026-10-04 기준 구현 반영)

상태

구현 완료 (모델 코어 · CLI · 웹 UX)

실행 환경

Windows, Python 3.12 (venv_lmm), PyTorch ≥ 2.5, Flask ≥ 3.0

nano MoE는 PyTorch만으로 구현한 소형 문자 단위 decoder-only MoE 언어 모델입니다. MoE 학습 구조(top-k 라우팅, 전문가 용량, 균형 손실)를 작은 규모에서 직접 실행하며 익히기 위한 교육·실험용 프로젝트이며, 범용 언어 모델 제작이 목적은 아닙니다. CLI(train.py)로 학습·생성을 수행하고, Flask 기반 웹 UX(webapp/)에서 데이터 설정 → 학습 → 로그·그래프 확인 → 모델 저장·로딩 → 챗봇 스타일 생성까지 한 화면에서 처리합니다.

목표와 비목표

  • 목표 — MoE 핵심 메커니즘(라우터, top-k 선택, 용량 제한, 균형 손실, z-loss)을 읽기 쉬운 최소 코드로 구현
  • 목표 — CPU에서도 수 초 안에 확인 가능한 소규모 학습 루프, CUDA가 있으면 자동 활용(bf16 autocast 포함)
  • 목표 — 비전문가도 브라우저에서 하이퍼파라미터 설정부터 텍스트 생성까지 전체 사이클을 수행할 수 있는 웹 UI
  • 비목표 — 대규모·분산 학습, 프로덕션 서빙, 멀티유저 동시 사용, 서브워드(BPE 등) 토크나이저, 학습 데이터에 없는 문자를 포함한 프롬프트 처리
  • 대상 사용자 — MoE 내부 동작을 코드로 확인하려는 개발자·학습자, 작은 텍스트로 학습→생성 사이클을 빠르게 반복 실험하려는 사용자

시스템 구성

nano_moe/
├─ nano_moe/            # 모델 패키지
│  ├─ model.py          #   ModelConfig, CausalAttention, Block, NanoMoE(forward/generate)
│  ├─ moe.py            #   Expert(FFN), MoELayer(top-k 라우터·용량·균형/z 손실)
│  └─ data.py           #   TextData: 문자 토큰화, 90/10 분할, 배치 샘플링
├─ train.py             # CLI: train / generate 서브커맨드
├─ webapp/              # Flask 웹 UX
│  ├─ app.py            #   REST API + 백그라운드 학습 스레드
│  ├─ templates/index.html
│  └─ static/{style.css, app.js}
├─ tests/test_model.py  # 단위 테스트 3종
├─ data/sample.txt      # 예제 학습 텍스트
├─ checkpoints/         # 체크포인트 저장 위치 (기본 nano_moe.pt)
└─ run.bat              # 웹 UI 원클릭 실행 (venv python 직접 호출 + 브라우저 자동 오픈)

기능 요구사항 — 모델 코어

요구사항

구현

M-1 문자 단위 토큰화: UTF-8 텍스트의 고유 문자 집합을 vocab으로 사용, train/validation 90/10 분할

data.py TextData

M-2 decoder-only Transformer: 토큰+위치 임베딩, 인과적 어텐션(SDPA is_causal), pre-LayerNorm 잔차 블록

model.py

M-3 moe_every 번째 블록의 FFN을 MoE 레이어로 교체, 나머지는 일반 FFN(Expert)

model.py Block

M-4 top-k 라우팅: 라우터는 float32로 계산, 학습 중에만 노이즈 라우팅(softplus 스케일 가우시안) 적용

moe.py MoELayer

M-5 전문가 용량 제한: ceil(tokens × top_k × capacity_factor / experts), 초과분은 후순위 선택부터 드롭

moe.py

M-6 보조 손실: 전문가 사용 균형 손실(가중치 0.01) + 라우터 z-loss(가중치 0.001)를 LM 손실에 합산

model.py forward

M-7 자기회귀 생성: 온도 샘플링, 컨텍스트 길이 초과 시 최근 토큰으로 절단

model.py generate

M-8 설정 검증: vocab/context/width/heads/layers 유효성, top-k ≤ experts 등 즉시 예외

ModelConfig, MoELayer

기능 요구사항 — CLI

요구사항

구현

C-1 train 서브커맨드: 데이터·하이퍼파라미터 인자, 주기적 train/val 손실 출력, 체크포인트 저장(config+vocab+state_dict)

기본 100스텝, checkpoints/nano_moe.pt

C-2 generate 서브커맨드: 체크포인트 로딩 후 프롬프트 이어쓰기, vocab에 없는 문자는 에러

기본 80토큰, 온도 0.8

C-3 CUDA 자동 감지, bf16 지원 시 autocast, grad clip 1.0

train()

기능 요구사항 — 웹 UX

다크 테마 단일 페이지에 좌우 2패널로 구성하고, 헤더에서 한국어·영어를 전환합니다(localStorage 유지).

왼쪽 패널 — 학습 관리

요구사항

구현

W-1 학습 데이터 파일 경로 + 하이퍼파라미터 13종(스텝, 배치, 컨텍스트, 폭, 헤드, 레이어, MoE 주기, 전문가 수, top-k, 학습률, 로그 주기, 시드) 입력 폼

POST /api/train/start

W-2 학습 시작·중지: 백그라운드 스레드 실행, 중복 실행 거부(409), 중지 플래그로 안전 중단

POST /api/train/stop

W-3 실시간 로그: 1초 폴링으로 증분 수신(since 인덱스), 자동 스크롤

GET /api/status

W-4 손실 그래프: train/val 손실을 스텝별 라인 차트로 표시(Chart.js)

status의 history

W-5 모델 저장·로딩: 경로 지정 후 체크포인트 저장·로딩, 결과를 상태 표시줄에 피드백

POST /api/model/save, /api/model/load

W-6 모델 상태 배지: 메모리 내 모델 유무를 헤더에 표시

model_loaded

오른쪽 패널 — 챗봇 생성

요구사항

구현

W-7 챗봇 스타일 UI: 사용자·모델 말풍선, Enter 전송(Shift+Enter 줄바꿈)

POST /api/generate

W-8 생성 파라미터: 토큰 수, 온도 조절

기본 80토큰 / 0.8

W-9 에러 안내: 모델 없음, 빈 프롬프트, vocab에 없는 문자(해당 문자 목록 표시)를 구분해 현재 언어로 표시

에러 코드 기반 i18n

실행 편의(R-1) — conda 없이 venv python 절대경로로 서버를 띄우고, 3초 후 브라우저를 자동으로 열며, 종료 시 에러를 확인할 수 있도록 창을 유지하는 원클릭 실행 파일(run.bat)

비기능 요구사항과 검증 기준

  • 성능 — 기본 설정(100스텝, width 64) 학습이 단일 GPU에서 수 초, CPU에서도 분 단위 안에 완료. 생성 응답은 동기 처리
  • 동시성 — 단일 사용자 가정. 공유 상태는 lock으로 보호하고 학습 중복 시작은 거부
  • 신뢰성 — 학습 스레드 예외는 로그로 노출하고 서버는 유지. 체크포인트는 weights_only=True로 로딩
  • 사용성·이식성 — 한·영 즉시 전환, 900px 이하 1열 반응형. 외부 의존성은 torch, flask 두 개, 프론트엔드는 Chart.js CDN 외 순수 HTML/CSS/JS
  • 검증(Definition of Done) — 단위 테스트(라우터 그래디언트 존재, 인과성, 용량 제한·생성 shape) 통과, CLI 학습 후 생성 확인, 웹에서 페이지 로드 → 학습 → 로그·손실 수신 → 저장 → 로딩 → 생성 → 미지원 문자 400 응답까지 전체 플로우 검증

제약과 향후 과제(PRD 범위 밖)

  • 프롬프트는 학습 데이터에 등장한 문자만 사용 가능(문자 단위 vocab의 구조적 제약), Flask 개발 서버 기반의 로컬 단일 사용자 용도
  • 향후 과제로 학습 중 체크포인트 중간 저장, 데이터 파일 업로드 UI, 전문가별 라우팅 통계(사용률 히트맵) 시각화, 서브워드 토크나이저 옵션을 제안

실험 설정 — CLI 모드에서 PRD 하나로 개발

각 도구를 독립 폴더에서 CLI 모드로 실행하고, 모델을 다음과 같이 설정했습니다.

Codex 설정 — GPT-6-Astra mediumCodex 설정 — GPT-6-Astra medium Claude Code 설정 — /model에서 Fable 5 선택Claude Code 설정 — /model에서 Fable 5 선택

이후 PRD를 읽게 하고 프로젝트를 개발하도록 지시했습니다. 프롬프트는 "@PRD.md 파일 읽고 플젝 개발해" 한 줄입니다. Claude Code는 디렉터리와 Python 환경(Python 3.12, PyTorch, Flask, CUDA)을 먼저 확인한 뒤 모델 코어 → CLI → 웹 UX → 테스트 순서로 PRD 전체 구현을 시작했습니다.

Claude Code(Fable 5)가 PRD를 읽고 개발을 시작하는 화면Claude Code(Fable 5)가 PRD를 읽고 개발을 시작하는 화면

결과와 해석

개발 결과 수치

항목

Claude Code (Fable 5)

Codex (GPT-6 Astra)

소요 시간

12.9분

23분

소요 토큰

251,278

1,038,041

파일 수

23개

35개

총 용량

1.82MB

1.86MB

총 라인 수

1,370줄 (코드 1,203줄)

1,337줄 (코드 1,088줄)

UX 테마

간략한 다크 테마

형광색 위주의 화려한 테마

두 결과물은 같은 방식으로 실행되고 학습·생성도 비슷하게 동작합니다. 다만 PRD에서 명확히 지시하지 않은 UX 테마 스타일은 달랐는데, Codex는 형광색 위주의 화려한 스타일로, Claude Code(Fable 5)는 간략화된 다크 테마 스타일로 만들었습니다. 결과 화면 기준으로 같은 하이퍼파라미터(1,000스텝)의 최종 손실은 Codex가 train 0.0919 / val 0.6584(45.9초), Claude Code가 train 0.0985 / val 0.6515(37.6초)로 거의 같습니다.

Codex(GPT-6 Astra)가 만든 nano MoE 웹 UI — 형광색 강조 테마Codex(GPT-6 Astra)가 만든 nano MoE 웹 UI — 형광색 강조 테마 Claude Code(Fable 5)가 만든 nano MoE Studio — 간략한 다크 테마Claude Code(Fable 5)가 만든 nano MoE Studio — 간략한 다크 테마

알고리즘과 코드 견고성 차이

관점

Claude Code (Fable 5)

Codex (GPT-6 Astra)

전문가 용량 처리

라우팅 순위 우선 — top-1 선택을 먼저 배정

시간 순 우선 — 앞 토큰을 먼저 보존해 생성 시 prefix 라우팅의 인과성 보존

학습 안정성·재현성

eval 배치가 매번 랜덤이라 val 곡선에 노이즈가 섞임

노이즈 라우터 0 초기화 + 1e-2 하한(초반 안정), std=0.02 초기화, 시드 고정 Generator로 손실 곡선 완전 재현

코드 견고성

프로젝트 목적에 맞는 읽기 쉬운 미니멀 코드

체크포인트 원자적 저장(tempfile+replace), 로딩 시 vocab 무결성 검증, utf-8-sig(BOM) 처리, 데이터 로딩 시점 split 길이 즉시 검증, 웹 전역 errorhandler, lock 2개로 학습·생성·로딩 직렬화, run_id로 세션 구분, CLI 인자를 dataclass에서 자동 생성

결론

깊게 생각하는 시간의 차이(12.9분과 23분)를 고려하면, 결과물로 볼 때 두 바이브 코딩 모델의 성능 차이는 크지 않아 보입니다.

  • 모델 수렴 성능 — 결과물인 MoE 모델의 수렴 성능을 가르는 차이는 없었습니다(실측 동일).
  • Codex(GPT-6 Astra) — 더 오래 생각하며, 방어 코드와 재현성 측면에서 더 촘촘하게 개발했습니다. 대신 시간은 약 1.8배, 토큰은 약 4배를 썼습니다.
  • Claude Code(Fable 5) — 더 짧은 시간과 적은 토큰으로, 본 프로젝트 목적에 맞는 읽기 쉬운 미니멀한 코드를 만들었습니다.
  • 명시하지 않은 부분 — UX 테마처럼 PRD에 적지 않은 항목은 도구마다 다르게 채워졌습니다.

출처

이 글은 한국건설기술연구원 강태욱 박사의 블로그 글 「MoE LLM 개발을 통해 본 Claude code 와 Codex 최신 모델 간 바이브 코딩 성능 비교」(Daddy Makers, 2026년 10월 3일)를 AI LAB 형식에 맞게 정리한 것입니다. 본문의 이미지는 원문에서 가져왔으며, 대표 이미지는 원문의 두 결과 화면을 나란히 배치한 것입니다.