← 코드 아키텍처 맵  /  런타임 해부  /  v1→v6 개선 실제 과정  ·  배치 카탈로그 →  ·  메트릭 발견·근거 →

v1 → v6 개선 실제 과정

코드 diff가 아니라 실험 그 자체 — 측정된 실패 하나를 겨냥해 변수 하나를 바꾸고, temp=0 A/B로 재고, promoted/rejected/inconclusive 판정을 남긴 루프. 수치는 모두 live DB의 experiments 원장(EXP-37~148)에서 그대로.

실험 원장 기반L1 pass@1 0.36→0.57has_attach 0.0→0.50 promoted 5 · rejected 1 · inconclusive 11배치=1조건 · 1팀=1변수출처: eval_ph1 DB
데이터 출처 & 정직성. 아래 수치는 experiments.key_evidence JSONB 실값이다(기준 2026-06-24). 각 행은 그 실험의 A/B 쌍이라 셋·분모가 조금씩 다르다 — 그래서 “하나의 매끈한 곡선”이 아니라 쌍별 delta가 진실이다. 주력 라인(입력→프롬프트→도구)은 누적 개선, v6은 v1에서 갈라진 별도 가지(라우팅)이며 결론은 inconclusive다.

1개선 곡선 — 실제 pass@1 사다리

두 축. ① L1 전체 pass@1(주력 라인) ② 첨부(has_attachment) 태스크 pass@1 — 도구 레버의 인과가 가장 깨끗한 지표.

① GAIA L1 전체 pass@1 (입력→프롬프트→도구 누적)

v1-baseline
0.36
v2-attach-path
0.48 ▲5.7pp
v3-prompt-fix
0.57 ▲21pp*
v4-prompt-fix
0.60 ▲6.7pp†
v5-multitool
0.58 ~flat‡

* EXP-41은 v1 대비(L1 0.36→0.571) — v2의 경로주입 + v3의 템플릿수정이 함께 반영. † EXP-46 공유 15태스크 기준(0.533→0.600). ‡ EXP-42 전체 24태스크(0.52→0.577); v5의 진짜 효과는 아래 첨부 축에서 드러난다.

② 첨부(has_attachment) 태스크 pass@1 — 도구 레버

v1~v3
0.00
v4(구도구 상한)
0.182
v5-multitool
0.50 ▲31.8pp
v5 · Level-2 일반화
0.50 (0→0.50)
핵심 발견(EXP-42). 구도구(UTF-8 리더+산술 calc)의 이론 상한은 첨부 11개 중 텍스트 2개 = 2/11=0.182인데, v4가 정확히 0.182를 실측했다 → “첨부를 못 푸는 건 추론이 아니라 도구”라는 가설이 데이터로 확정. v5가 멀티포맷 파서로 그 벽을 0.50까지 밀어올림.

별도 가지 — v6-verify-gate (라우팅 실험, inconclusive)

v1 (exp_b_v1)
0.35
v6 (exp_b_v6)
0.40 ▲1태스크/20

v6은 v5의 후속이 아니라 v1에 검증 게이트만 더한 가지. critic 경유율·검증부재실패는 분명히 고쳤지만 pass@1은 통계적으로 미미(§4 EXP-148).

2개선 루프의 구조 — 추측이 아니라 측정

모든 버전은 같은 6단계를 돈다. 이 루프가 experiments 테이블 한 행으로 응결된다.

① observe
실패 run 측정(SQL)
② hypothesize
검증가능 가설
③ 1변수 개입
딱 하나만 변경
④ A/B 측정
temp=0·seed 고정
⑤ verdict
promoted/rejected
⑥ lesson
다음 가설의 씨앗

3출발점 — v1이 진 실패 모드 지도 (EXP-37)

실 GAIA L1 첫 실측(gaia_l1_real_20260610, n=25, pass@1=0.36, loop_rate=0.32). 이 4가지 실패가 v2~v5의 타깃이 됐다.

실패 모드건수근본 원인겨냥한 버전
template_literal6모델이 FINAL ANSWER: <answer> 예시를 그대로 출력 → 추출 실패v3
loop_exhaust5형식 못 맞춰 max_messages까지 소진v3(부수효과)
wrong_answer3순수 오답(추론)—(도구/추론 한계)
empty_format2한 단어 답에 형식 생략(예: Guava)v4
전(全) 첨부 태스크 실패 — 별도 축: attachment_path_not_injected(경로 미주입 → 환각) + binary_file_unreadable(xlsx/png/mp3를 UTF-8로) + python_calc_misuse(산술 전용에 파싱코드) → v2(경로) · v5(멀티포맷·python_exec)
읽는 법. v2~v5는 위 표를 위에서 아래로 하나씩 격리해 친다 — 입력층(v2 경로) → 프롬프트층(v3 템플릿, v4 단답) → 도구층(v5 파서/실행). v6은 이 표 밖의 다섯 번째 모드(검증 미경유, FM-3.2)를 겨냥한 별도 가지다.

4실험별 상세 — 가설 · 개입 · 측정 · 교훈

각 카드는 원장 1행. 측정값은 key_evidence 실수치(before → after).

EXP-45rejectedmax_messages 20→16 효율 개입v5-multitool · ab_v5_l1 → v5_mm16
가설
루프소진 run이 전체 토큰의 17.9%를 태운다. 캡을 16(≈8턴)으로 줄이면 토큰 절약이 점수 손실(최대 1태스크)을 상회한다.
개입(1변수)
EVAL_MAX_MESSAGES=16 환경변수만 — 팀·프롬프트·도구 불변.
측정
pass@1 0.652→0.542 avg_tokens −38% (19.7k→12.2k) format_invalid 0.0→0.21 improved 1 · regressed 3
교훈
기각. 토큰 −38%는 루프 절약이 아니라 정상 작업 절단에서 나왔다(fmt_invalid 0→0.21 부활, 안정 태스크 손실). 루프소진은 메시지 캡이 아니라 “불가능 조기 포기”(프롬프트)로 잡아야. 효율 레버에는 정확도 가드가 필수.
EXP-148inconclusive검증 의무 경유 게이트 (MAST FM-3.2)v1-baseline → v6-verify-gate · exp_b_v1 → exp_b_v6
가설
실패 run의 critic 미경유는 selector가 검증 단계를 생략하기 때문. selector에 “FINAL ANSWER 초안 시 critic 경유 필수” 게이트를 넣으면 검증부재실패↓·pass@1↑ (논문 다층검증 +15.6%p의 라우팅판).
개입(1변수)
selector 프롬프트에 검증 게이트 1블록 추가 — planner/executor/critic·도구·종료조건은 v1과 동일.
측정 (n=20)
critic 경유율 0.60→0.75 검증부재실패(FM-3.2) 8→5 강제종료 8→5 pass@1 0.35→0.40 (+1/20) 승인오답(FM-3.3) 5→7 format_valid 0.7→0.8 avg_tokens 15.3k→14.6k
교훈
게이트가 FM-3.2를 명확히 고침(경유율↑, 검증부재실패↓, 턴·토큰↓). 그러나 pass@1은 통계적으로 미미하고 병목이 FM-3.3(승인오답 5→7)으로 이동 — “경유는 하나 검증이 무르다”. 논문의 “verifier is not a silver bullet”을 실증. 다음: critic 검증 ‘깊이’ 실험.

5메타 패턴 — 무엇이 promoted/rejected를 가르나

7개 실험(+타 도메인 원장)에서 반복된, 데이터로 확정된 규칙성.

레버 종류실험결과
도구 / 입력 / 데이터 수정EXP-40(경로) · EXP-41(예시값) · EXP-42·43(파서/실행)전부 promoted — surgical, 회귀 적음
프롬프트 ‘추가’ / 구조 변경EXP-45(캡) · (타도메인) EXP-57·60·63전부 rejected — 비단조적 부작용·정확도 붕괴
라우팅 게이트EXP-148(검증 경유)inconclusive — 한 실패 고치자 병목이 이동

6재현 — 각 A/B를 다시 돌리는 명령

옵션·환경 상세는 런타임 해부 §L(명령어) / §M(테스트 가이드). 핵심은 같은 task 셋·temp=0·seed 고정.

# 공통 전제 — 깨끗한 A/B를 위한 .env 고정
EVAL_DEFAULT_TEMPERATURE=0      # greedy (소규모 효과를 노이즈가 가리지 않게)
EVAL_DEFAULT_SEED=42

# EXP-40  v1 → v2 (첨부 경로주입)  같은 L1 셋으로 두 배치
python cli.py run --batch a_v1 --team v1-baseline   --benchmark gaia --level 1
python cli.py run --batch a_v2 --team v2-attach-path --benchmark gaia --level 1
python cli.py compare --batches a_v1,a_v2

# EXP-41/46  프롬프트 라인 (v3, v4)
python cli.py run --batch a_v3 --team v3-prompt-fix --level 1
python cli.py run --batch a_v4 --team v4-prompt-fix --level 1

# EXP-42  도구 교체 A/B (v4 대조 vs v5)  — 첨부 태스크에서 갈림
python cli.py run --batch a_v4ctl --team v4-prompt-fix --level 1
python cli.py run --batch a_v5    --team v5-multitool  --level 1
python cli.py compare --batches a_v4ctl,a_v5

# EXP-43  v5의 Level-2 일반화 (개입 없음, 셋만 교체)
python cli.py run --batch a_v5_l2 --team v5-multitool --level 2 --exclude-web

# EXP-44  pass@k 안정성 (쿼터 여유 시간대 단독 실행 권장)
python cli.py run --batch a_v5_k3 --team v5-multitool --level 1 --attempts 3
# 429로 크래시 나면 쿼터 회복 후:  --retry-crashed 로 재개

# EXP-148  v6 검증게이트 (v1 대조)
python cli.py run --batch a_v1b --team v1-baseline    --level 1
python cli.py run --batch a_v6  --team v6-verify-gate --level 1
python cli.py compare --batches a_v1b,a_v6

# 판정 기록 — 원장 한 행 (src/agent_eval/experiments.py)
#   record_start(title, hypothesis, intervention, team_before, team_after, batch_before, batch_after)
#   record_conclude(exp_id, verdict='promoted'|'rejected'|'inconclusive', key_evidence={...}, lesson='...')
측정 위생(원장이 강제로 배운 것). ① temp=0 아니면 가짜 회귀가 생긴다(EXP-40). ② 단발 말고 --attempts k로 플래키를 걸러라(EXP-44·70). ③ 효율 개입은 정확도 가드와 함께 본다(EXP-45·60). ④ 메트릭이 가리키는 틈을 좇기 전에 그 메트릭이 맞는지부터(EXP-57).