메뉴
HN
Hacker News 11일 전

최신 AI 모델 NP-난제 풀이 대결: /goal 모드는 효과가 있을까?

IMP
7/10
핵심 요약

해커톤 출신의 NP-난제인 광섬유 네트워크 설계 문제를 바탕으로 Claude 'Fable 5'와 GPT-5.6 'Sol' 모델의 성능을 비교 테스트했습니다. 그 결과 Fable 5가 전반적으로 가장 뛰어난 성능과 일관성을 보였으며, AI에게 목표를 부여하는 '/goal' 모드는 단순히 '더 열심히' 풀게 만드는 마법의 스위치가 아니라 검색 경로를 바꿀 뿐인 기능으로 확인되었습니다. 이는 최신 AI 모델들의 복잡한 수학적 최적화 문제 해결 능력과 프롬프트 제어 기법의 실질적 효과를 보여줍니다.

번역된 본문

블로그 요약: 출시되지 않은 동일한 NP-난제(NP-hard) 최적화 문제를 Claude Fable 5와 GPT-5.6 Sol에 각각 고유의 /goal 모드를 켜거나 끈 상태로 풀어보게 했습니다. Fable 5는 그야말로 괴물 같은 성능을 보여주었고, /goal 모드는 결정적인 게임 체인저가 아니었습니다.

배경: 이 문제는 원래 해커톤에 참가한 학생들에게 출제되었던 운용 과학(Operations Research) 문제입니다. 저는 몇 년 전 이 문제를 풀기 위해 C++ 코드를 작성하는 데 일주일을 보냈기 때문에, 유용한 인간 베이스라인(기준점)을 가지고 있습니다. Fable 5는 이 벤치마크에서 그야말로 괴물 같은 성능을 보여주었습니다. 전반적으로 가장 훌륭한 해결책을 제시했으며, 이 문제에서 모델이 보여준 일관성은 제가 지금까지 본 어떤 것과도 달랐습니다. 순수한 천재성(raw intelligence) 그 자체입니다. 놀랍습니다.

나머지 결과를 말씀드리자면, /goal 모드는 범용적인 '더 열심히 시도하기' 스위치가 아닙니다. 이는 모델의 제어 루프(Control loop)와 검색 경로(Search path)를 변경할 뿐입니다. 때로는 이 기능이 더 나은 해답의 영역(basin)을 찾아내기도 합니다. 하지만 때로는 그저 나쁜 아이디어가 성숙해지는 데 더 많은 시간을 할애하게 만들기도 합니다. 모든 코드, 프롬프트, 결과 표, 예외 항목 및 궤적 기록은 CLIArena에 있습니다. 이 글은 제 벤치마크에 대한 첫 번째 글의 후속 편입니다.

문제 설명 KIRO는 제가 2018년 공학도였을 때 작업했던 광섬유 네트워크 설계 문제입니다. 그르노블, 니스, 파리의 유향 거리 행렬(directed distance matrices)이 주어지면, 해결사(solver)는 여러 구조적 제약 조건을 준수하면서 루프(Loops)와 짧은 체인(short chains)을 사용하여 분배점과 터미널을 연결해야 합니다. 목표는 케이블의 총 길이를 최소화하는 것입니다. 값이 낮을수록 좋습니다.

유효한 네트워크는 분배 허브에 뿌리를 둔 중복 루프와 해당 루프의 타워에 매달린 짧은 가지(branch)로 구성됩니다. 모든 타워는 정확히 한 번씩만 나타나야 하며, 케이블 세그먼트를 반전시키면 비용이 변경될 수 있습니다.

검색 공간은 얼마나 큽니까? 하나의 솔루션이 임의의 개수의 루프, 가변적인 루프 크기, 다르게 고정되고 정렬된 가지들을 사용할 수 있기 때문에 정확한 공식으로 계산된 개수는 없습니다. 하지만 파리 데이터만으로도 유용한 하한선(lower bound)을 얻을 수 있습니다. 순서와 가지를 무시하고 532개의 터미널 각각을 11개의 분배 허브 중 하나에 단순히 할당한다고 가정해도 11^532개의 가능한 조합이 존재합니다.

더 강력한 하한선은 유효한 솔루션의 제한된 패밀리 하나에서 나옵니다. 가지가 없는 28개 터미널로 이루어진 정확히 19개의 루프입니다. 루프당 터미널이 30개 제한 이하이면서 19 x 28 = 532이므로 모든 532개 터미널을 커버합니다. 532개의 터미널을 정렬하고, 해당 순서를 19개의 연속된 그룹으로 분할한 뒤, 루프의 집합이 순서가 없으므로 19!로 나누고, 각 루프에 대해 11개의 허브 중 하나를 선택합니다. (532! / 19!) x 11^19 ~= 10^1223

테스트 내용 주요 실험은 의도적으로 좁게 설정되었습니다:

  • 모델: Claude Fable 5, Opus 4.8, Sonnet 5; GPT-5.6 Sol, Terra, Luna
  • 모드: Plain(일반); native /goal(고유 /goal 모드)
  • 최적화 예산: 30분
  • 외부 에이전트 시간 초과: 1,900초
  • 추론(Reasoning): 모든 모델에 대해 사용 가능한 최대 설정
  • 실행 환경: Harbor 0.1.43, Docker, 구독 인증

결과 플래그십 쌍(Fable 5와 GPT-5.6 Sol)에 대한 테스트를 반복하기 전에, 모든 모델에 대해 힌트가 없는 30분짜리 1쌍의 테스트를 실행했습니다. Fable과 Sol의 경우, 차트는 복제된 헤드라인 세트 중 '1번 쌍(Pair 1)'을 사용하며, 나머지 4개 모델은 각각 1쌍씩 가집니다. 그런 다음 Fable 5와 Sol에 대해 각각 3개의 일치하는 실행 결과를 얻을 때까지 플래그십 비교를 반복했습니다.

모델 / 실행 / Plain / /goal / Goal과 Plain의 차이

  • Fable 5 / 1 / 32,197 / 31,934 / -263
  • Fable 5 / 2 / 32,516 / 32,324 / -192
  • Fable 5 / 3 / 32,446 / 35,178 / +2,732
  • GPT-5.6 Sol / 1 / 33,581 / 39,371 / +5,790
  • GPT-5.6 Sol / 2 / 35,539 / 32,703 / -2,836
  • GPT-5.6 Sol / 3 / 33,663 / 33,313 / -350

(참고: 음수는 /goal 모드가 더 좋았음을 의미합니다.)

/goal 모드는 6번의 테스트 중 4번에서 승리했으므로, 승률만 놓고 보면 이 기능이 유용해 보입니다. 하지만 평균값은 다른 반쪽의 이야기를 들려줍니다:

  • 모델 / Plain 평균 / /goal 평균 / 평균 효과 / 중앙값 효과
  • Fable 5 / 32,386 / 33,145 / +759 (악화) / -192 (개선)
  • GPT-5.6 Sol / 34,261 / 35,129 / +868 (악화) / -350 (개선)

두 모델 모두 대체로 작은 이득을 얻었지만, 간혹 큰 성능 저하(regression)를 겪었습니다. 그렇기 때문에 /goal 모드가 대부분의 실행에서 승리했음에도 불구하고 두 모델의 평균 점수는 모두 안 좋아졌습니다.

Fable 5는 또한 확실히 더 강력했습니다. Plain 모드 평균이 Sol보다 1,875점이나 높았고, /goal 모드 평균도 1,984점이 더 높았습니다. 더 중요한 것은, Fable 5의 Plain 모드가 고작 319점 차이의 매우 좁은 범위 내에 머물렀던 반면, Sol의 Plain 모드는 1,958점의 편차를 보였다는 점입니다. Fable 5의 /goal 모드는 가장 낮은(우수한) 깨끗한 점수인 31,934점을 기록했습니다.

원문 보기
원문 보기 (영어)
Blog TL;DR: I gave Claude Fable 5 and GPT-5.6 Sol the same unpublished NP-hard optimization problem, with and without their native /goal mode. Fable 5 is an absolute beast; /goal is not a game changer. Context: This is an operations research problem originally submitted to students at a hackathon. I spent a week years ago writing C++ to solve it, so I have a useful human baseline. Fable 5 was an absolute beast on this benchmark. It produced the best solution overall, and its consistency is unlike anything I have seen from a model on this problem. This is pure raw intelligence. Incredible. The other result is that /goal is not a generic “try harder” switch. It changes the control loop and the search path. Sometimes that finds a better basin. Sometimes it gives a bad idea more time to mature. All code, prompts, result tables, exclusions, and trajectory notes are in CLIArena . This is a follow-up to my first article about this benchmark . The problem KIRO is a fiber-network design problem I worked on as an engineering student in 2018. Given directed distance matrices for Grenoble, Nice, and Paris, the solver has to connect distribution points and terminals using loops and short chains while respecting several structural constraints. The objective is total cable length. Lower is better. A valid network consists of redundant loops rooted at distribution hubs, with short branches hanging from towers on those loops. Every tower must appear exactly once, and reversing a cable segment can change its cost. How large is the search space? There is no single closed-form count because a solution can use any number of loops, variable loop sizes, and differently anchored and ordered branches. But Paris alone gives a useful lower bound. Even if we ignore ordering and branches and only assign each of the 532 terminals to one of 11 distribution hubs, there are 11^532 possible assignments. A stronger lower bound comes from one deliberately restricted family of valid solutions: exactly 19 loops of 28 terminals each, with no branches. This covers all 532 terminals because 19 x 28 = 532 , while staying below the 30-terminal limit for a loop. Order the 532 terminals, split that ordering into 19 consecutive groups, divide by 19! because the set of loops is unordered, and choose one of the 11 hubs for each loop: (532! / 19!) x 11^19 ~= 10^1223 What I tested The primary experiment was intentionally narrow: Setting Value Models Claude Fable 5, Opus 4.8, Sonnet 5; GPT-5.6 Sol, Terra, Luna Modes Plain; native /goal Optimization budget 30 minutes Outer agent timeout 1,900 seconds Reasoning Maximum available setting for every model Execution Harbor 0.1.43, Docker, subscription authentication Results Before concentrating repetitions on the flagship pair, I ran one matched 30-minute no-hint pair for every model in the sweep. For Fable and Sol, the chart uses Pair 1 from the replicated headline set; the other four models have one pair each. I then repeated the flagship comparison until I had three matched runs for Fable 5 and three for Sol. Model Run Plain /goal Goal minus plain Fable 5 1 32,197 31,934 -263 Fable 5 2 32,516 32,324 -192 Fable 5 3 32,446 35,178 +2,732 GPT-5.6 Sol 1 33,581 39,371 +5,790 GPT-5.6 Sol 2 35,539 32,703 -2,836 GPT-5.6 Sol 3 33,663 33,313 -350 Negative means /goal was better. Goal won four of six trials, so win rate alone makes the feature look useful. The means tell the other half: Model Plain mean /goal mean Mean effect Median effect Fable 5 32,386 33,145 +759 worse -192 better GPT-5.6 Sol 34,261 35,129 +868 worse -350 better Both models usually got a small benefit and occasionally suffered a large regression. That is why /goal won most runs but made both means worse. Fable was also clearly stronger. Its plain mean beat Sol’s by 1,875 points, and its goal mean beat Sol’s by 1,984. More importantly, Fable plain stayed inside a tiny 319-point range while Sol plain spanned 1,958 points. Fable goal produced the best clean score, 31,934; Fable plain was the safest configuration. Deep dive into the goal command The same command hides two different systems Claude Code and Codex both expose /goal , but the implementations are fundamentally different. Claude Code: a separate evaluator Claude Code implements /goal as a session-scoped Stop hook. After each main-model turn, a small evaluator model, Haiku by default, reads the condition and conversation. It returns yes or no with a reason. A no starts another turn; a yes clears the goal. The evaluator cannot use tools or inspect files. It can only judge evidence that appeared in the transcript. That can catch an early exit, but it cannot know whether another ten million solver iterations are worthwhile. Anthropic’s goal documentation Keep in mind that claude code is not open source, so we rely solely on what Anthropic tells us. Codex: persisted state and lifecycle tools I also read the source for the benchmarked release, Codex CLI 0.144.4 . Codex treats a goal as persisted thread state: The TUI saves the objective for the active thread, and SQLite stores its status and budget accounting. TUI , schema The working model receives create_goal , get_goal , and update_goal tools. Tool specification If the thread becomes idle while the goal is active, Codex injects a continuation turn with the objective and a completion audit. Runtime , prompt Claude delegates completion to another model. Codex lets the working model declare completion, then resumes it while the persisted goal remains active. Claude’s evaluator is independent but sees only the transcript; Codex sees the files and tools but effectively grades its own work. Why /goal can win most runs and still be a bad default On a normal coding task, progress is often legible: another turn can fix a test or complete a migration. Optimization is different. Once an agent chooses a solver, extra time can amplify either a good decision or a bad one. That is exactly what happened here. Goal helped when it sustained Fable’s fast compiled portfolio or Sol’s successful chain repartition. It hurt when Fable built a slow solver or Sol committed to an exhaustive anchor sweep. The median moved slightly in the right direction; the bad tail moved much farther in the wrong one. Limitations This is one unpublished NP-hard task, not a general coding leaderboard. Only Fable and Sol have three clean matched pairs. Other comparisons mix prompts, wrapper versions, and time limits, and the trials ran sequentially through subscription services that may have drifted. The containers exposed eight CPUs despite task metadata declaring one, which favored Fable’s parallel portfolios. Every scored Fable and Sol output was valid, partly because the wrapper required early checkpoints and final verification. The benchmark measures the complete system: model, CLI, prompt, subscription service, and harness. Reproducing this The benchmark task, wrappers, analysis scripts, figure generator, and full evidence memo are in CLIArena . Raw job directories are excluded from Git because of their size, but the memo records every publishable score, city breakdown, elapsed time, strategy, exclusion, and run ID. The primary commands are: RUN_ID = article-kiro-YYYYMMDD-clean \ PHASE=nohint-all \ ./scripts/run_subscription_article_matrix.sh uv run python scripts/summarize_subscription_article_results.py RUN_ID... uv run python scripts/analyze_subscription_article_results.py RUN_ID... The result I would put in the headline is not that goal helps or hurts. It is that a persistence feature can win most individual trials while making observed average performance worse. On a hard optimization problem, the quality of the loop matters less than the quality of what the loop keeps doing.