모델은 그대로 두고 '틀(하네스)'만 자연선택으로 진화시켜 AI 에이전트 성능을 끌어올렸다
모델은 그대로 두고 '틀(하네스)'만 자연선택으로 진화시켜 AI 에이전트 성능을 끌어올렸다
DarwinX는 LLM 모델 가중치는 전혀 바꾸지 않고, 프롬프트·도구·기술 문서·제어 흐름 같은 '하네스'만 여러 변형(variant)의 집단으로 놓고 자연선택처럼 골라낸다. 기존 성과를 해치지 않으면서 새로운 과제를 풀 수 있는 변형만 살리고, 서로 다른 장점을 가진 계열들을 교배(재조합)시켜 합친다. 터미널 작업, 웹 자동화, 코드 수정 등 네 가지 벤치마크에서 평균 17점 정도의 향상을 보였다고 보고한다.
METAL MEDIA 해설 도표
DarwinX 선택 루프 구조
증거 상태측정 결과가 보고됨
- 고정된 모델GPT-5.5, GPT-5.6, Opus 4.8 등 모델 가중치는 전혀 바꾸지 않고 그대로 둔다
- 하네스 변형 생성실패 분석, 교사 시연, 자기 대조 신호로 프롬프트·도구·제어 흐름을 조금씩 편집한 변형을 만든다
- 보존-확장 심사기존에 풀던 과제를 크게 해치지 않고 새 과제를 풀 때만 변형을 승격시키는 규칙으로 걸러낸다
- 보관소와 재조합승격되지 않은 변형도 보관소에 남겨 서로 다른 강점을 가진 계보를 합쳐 더 나은 자식 변형을 만든다
- 네 가지 벤치마크 검증Terminal-Bench 2.1, TerminalWorld, WebArena-Infinity, SWE-bench Verified로 옮겨졌을 때도 성능이 유지되는지 측정한다
무엇을 했나
- 기존 자기개선 에이전트들은 한 줄기(단일 계보)로만 수정을 이어가다 초반 선택에 갇히거나, 한 과제를 고치면 다른 과제 성능이 몰래 떨어지는 문제가 있었다.
- DarwinX는 하네스 변형들을 하나의 집단(population)으로 관리하는 '보관소(archive)'를 두고, 새 변형은 기존에 풀던 문제를 깨지 않으면서 새 문제를 풀 때만 승격시키는 '보존-확장 규약'을 적용한다.
- 실패 사례 분석, 정답 시연(교사 신호), 자기 성공/실패 대조라는 세 가지 학습 신호를 하나의 편집 인터페이스로 통합해 하네스를 고친다.
- 정답지나 사람이 고른 승자 없이, 각 벤치마크 자체의 채점기(verifier)로 측정한 성공률만으로 우열을 가린다.
- Terminal-Bench 2.1에서 기본 83.2%로 +7.7점, 더 강한 모델에서는 검증된 최고 기록 84.7%까지 올랐고, TerminalWorld의 미학습 과제에서도 68.3%로 다른 모든 상용 에이전트를 앞섰다.

| Edits | Search | Selection | Signal | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Method | tools & control flow | tools & | control flow | population archive | population | archive | cross-lineage merge | cross-lineage | merge | bounded regression | bounded | regression | noise-aware avg@k | noise-aware | avg@k | teacher & self signals | teacher & | self signals |
| tools & | ||||||||||||||||||
| control flow | ||||||||||||||||||
| population | ||||||||||||||||||
| archive | ||||||||||||||||||
| cross-lineage | ||||||||||||||||||
| merge | ||||||||||||||||||
| bounded | ||||||||||||||||||
| regression | ||||||||||||||||||
| noise-aware | ||||||||||||||||||
| avg@k | ||||||||||||||||||
| teacher & | ||||||||||||||||||
| self signals | ||||||||||||||||||
| Optimizers over one designated artifact | ||||||||||||||||||
| OPRO/PromptBreeder/TextGrad | ✗ | ∼ | ∼† | ✗ | ✗ | ✗ | ||||||||||||
| ADAS/AFlow/GPTSwarm | ∼ | ✓ | ✗ | ✗ | ∼ | ✗ | ||||||||||||
| SkillOpt | ✗ | ✗ | ✗ | ∼ | ∼ | ✗ | ||||||||||||
| Agents that edit their own scaffold | ||||||||||||||||||
| SICA | ✓ | ∼ | ✗ | ✗ | ✗ | ✗ | ||||||||||||
| DGM | ✓ | ✓ | ✗ | ∼ | ∼ | ✗ | ||||||||||||
| HarnessX | ✓ | ∼ | ✗ | ✓ | ∼ | ✗ | ||||||||||||
| DarwinX (ours) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |

| Application | Kimi | Qwen | Gemini+BU | GPT-5.5+BU | Monet (base) | Monet (DarwinX) | Δ |
|---|---|---|---|---|---|---|---|
| Elation clinical records | 50.0 | 54.2 | 81.7 | 92.5 | 95.8 | 96.7 | +0.9 |
| Elation prescriptions | 23.3 | 41.7 | 80.8 | 90.8 | 20.0 | 95.0 | +75.0 |
| GitLab plan and track | 39.3 | 37.1 | 63.6 | 77.9 | 63.6 | 97.9 | +34.3 |
| Gmail | 70.0 | 56.7 | 75.0 | 85.0 | 25.0 | 98.3 | +73.3 |
| Gmail accounts and contacts | 40.0 | 33.3 | 61.7 | 87.5 | 21.7 | 91.7 | +70.0 |
| Handshake career exploration | 50.0 | 50.5 | 50.5 | 83.5 | 36.5 | 84.0 | +47.5 |
| Linear account settings | 54.2 | 65.8 | 73.3 | 81.7 | 43.3 | 94.2 | +50.9 |
| PayPal wallet | 70.7 | 71.4 | 88.6 | 90.0 | 49.3 | 95.7 | +46.4 |
| Superhuman general | 15.0 | 25.8 | 50.0 | 80.8 | 31.7 | 87.5 | +55.8 |
| Xero invoicing | 52.5 | 55.8 | 80.8 | 93.3 | 39.2 | 96.7 | +57.5 |
| Overall | 43.3 | 48.3 | 69.3 | 86.1 | 43.5 | 93.0 | +49.5 |

| Evolved skills | Role |
|---|---|
| verifier-contract contract-candidate | Derive the task’s acceptance contract and check the solution against it before finalizing. |
| graded-artifact-final-check artifact-verification-loop | Verify the graded artifact (output file, format, and values) and iterate a fix-and-recheck loop. |
| real-tool-artifact tool-grounded-artifact | Ground outputs in real tool execution rather than asserted or simulated results. |
| security-contract-repair | Repair the solution against security and contract checks. |
| Method | Editable surface | Search structure | Promotion rule | Cross-task interference |
|---|---|---|---|---|
| Optimizers over one designated artifact | ||||
| OPRO, PromptBreeder, TextGrad | Instruction text; tools and control flow stay fixed. | Iterative keep-best, or a genetic population with prompt crossover. | Scalar score on a fixed development set, or a textual gradient from failures. | Not addressed; the search targets a single task or few-shot pool. |
| ADAS, AFlow, GPTSwarm | The composition graph over otherwise-fixed components. | Archive of past workflows, or MCTS over graph edits. | Mean accuracy on the target benchmark. | One benchmark per search; no per-task preservation check. |
| SkillOpt | An external skill document. | Single-lineage keep-best, framed as a gradient-descent analogy. | A held-out validation point estimate gates each edit. | One domain at a time. |
| Agents that edit their own scaffold | ||||
| SICA | The agent’s own source code. | A single lineage of self-modification. | Benchmark reward on the current coding suite. | One coding domain; the authors report an early-edit plateau. |
| DGM | Agent source code. | Open-ended archive, stochastic single-parent mutation, no merge operator. | Score against the parent on a task subset that grows with confidence. | Staged subsets, but no explicit preservation contract. |
| HarnessX‡ | A typed harness: prompts, tools, and control flow. | Staged single-lineage pipeline; variants are kept isolated from each other. | Per-edit gate on the average score plus a seesaw test. | Isolation keeps task families apart, so sub-threshold regressions still accumulate. |
| DarwinX (ours) | The full harness: a skill layer (prompts, memory, distilled knowledge) and a code layer (tools, control flow, agent loop). | Population archive of typed nodes; parents sampled by cumulative lineage gain; complementary specialists merged into inherited children. | Fitness enabler (g>0, R≤δ) adjudicated by a verifier, then avg@k confirmation and a preservation probe before a node may steer search. | Specialists are retained and recombined rather than isolated, and the preservation probe bounds what any promotion may cost. |
| Benchmark | Frozen base | Evolution data | Report data | Selection signal | Report metric |
|---|---|---|---|---|---|
| TB2.1 | GPT-5.5∘ | 89 verifier tasks | same 89 tasks | avg@3 screen, avg@5 confirm | avg@5 |
| TerminalWorld | Opus 4.8* | 94 train tasks | 41 held-out tasks | adaptive avg@k subsets | pass@1 |
| WAI | GPT-5.5 | 300 synthetic intents | 1,260 real tasks | LLM judge, avg@3/avg@5 | deterministic pass@1 |
| SWE-V (transfer) | Opus 4.8 | none (transfer target) | 500 issues | n/a (frozen) | official pass@1 |
| Stage | Intents | Operation |
|---|---|---|
| Seeds | 1,080 | Two models propose intents from each application’s description document |
| Raw synthesis | 11,279 | Dual-model expansion of the seeds under per-application quotas (18 applications) |
| Filtered | 8,013 | Quality heuristics, Jaccard near-duplicate removal, TF–IDF uniqueness pruning |
| Served apps | 5,332 | Restricted to the 12 applications with a served instance |
| Evolution split | 300 | Balanced draw of 25 intents per served application |
| # | Regex (paraphrased) | Catches |
|---|---|---|
| 1 | /apistate/ | Any read or write of the /api/state scoring endpoint |
| 2 | _pushStateToServer | getSerializableState | resetToSeedData | __APP_STATE__ | window.state= | State-sync internals |
| 3 | localStorage/sessionStorage setItem/removeItem/clear | Direct storage writes |
| Operation | Classification | Reason |
|---|---|---|
| Admissible | ||
| Click through the UI to add a patient tag | VALID_UI | Normal product operation |
| Inspect /js/state.js after the app loads or references it | VALID | Client-exposed app knowledge |
| Read AppState.patients in the browser runtime | VALID | Runtime application observation |
| POST /patients/123/tags with the current user’s session | VALID_PRODUCT_API | Domain-level app API |
| AppState.addPatientTag(123, "Flu-Season") | VALID_INTERNAL_APP_COMMAND | App-defined semantic mutator |
| AppState.currentSection = "patients" to navigate | VALID | Internal navigation; no scored-state fabrication |
| Inadmissible | ||
| cat <apps>/.../js/state.js via the filesystem | INVALID_PRIVILEGED_KNOWLEDGE | Learns from the co-located source tree |
| Read .../server.py to discover hidden endpoints | INVALID_PRIVILEGED_KNOWLEDGE | Host-only server details |
| Fetch server source through path traversal or unintended static exposure | INVALID_EXPLOIT_OR_PRIVILEGE_ESCALATION | Browser use does not legitimize an unintended disclosure |
| patient.tags.push("Flu-Season"); AppState.notify() | INVALID_RAW_STATE_MUTATION | Directly edits the scored representation |
| Replace local storage with hand-edited serialized state | INVALID_RAW_STATE_MUTATION | Bypasses application semantics |
| Send a fabricated full state to /api/state | INVALID_EVALUATION_PLANE_ACCESS | Uses benchmark synchronization as a control channel |
| sqlite3 app.db ’UPDATE patients ...’ | INVALID_DIRECT_DATABASE_MANIPULATION | Host access plus a direct database edit |
| Inject SQL through a request to bypass authorization or alter rows | INVALID_EXPLOIT_OR_PRIVILEGE_ESCALATION | Exploit rather than authorized semantics |
| Forge an admin token and call an otherwise valid API | INVALID_EXPLOIT_OR_PRIVILEGE_ESCALATION | Exceeds the current user’s authority |
| Skill | When to use | Core procedure |
|---|---|---|
| web_task_contract | General browser/web-UI tasks; durable state change or exact filtered/sorted/read answer | Derive an explicit acceptance contract (target, operation, exact final observable state, forbidden substitutions, persistence) → find a valid path, UI first → execute the smallest change → verify both rendered UI and backing state, and reload to confirm persistence → if a target seems missing, prove “not found” from ≥2 independent app surfaces before declaring a no-op. |
| filtered_list_report_contract | Count / latest / oldest / value questions over lists and tables | Preserve the active collection scope (tab, status, search, project, date range) while applying the requested filter; count across the whole scoped set (not just the rendered page); answer with only the requested value. |
| browser_spa_state_contract | Durable state changes where visible controls are missing/ambiguous | Derive the exact field-level contract; inspect app-owned stores/reducers/action helpers; mutate through the app’s own action/persistence path; then read back both state and UI. |
| browser_config_contract | Durable configuration records (filters, rules, reminders, routing) | Prove every field (condition, action, enabled, timing, channel, persistence), not a partial visible match. |
| Aspect | Base prompt (before) | Evolved prompt (after) |
|---|---|---|
| Interaction policy | “Interact ONLY through the UI…Do NOT write application state directly or touch /api/state.” | “Prefer real UI controls first…If a bounded audit proves no visible UI path can satisfy a durable state-changing task, you may inspect app-owned stores, reducers, loaded modules, public helper methods, and readback paths, then use the app’s own exposed action/update helper for the smallest targeted mutation. Do NOT touch /api/state, write local/session storage, use seed/reset helpers, or call state-sync internals.” |
| Finishing (verification) | “For a state-changing task, make the change in the UI, screenshot to confirm, then stop.” | “For a state-changing task, verify both app-owned state/readback and the rendered UI; reload or navigate away/back to confirm persistence, then stop.” |
실제로 확인된 결과
- Terminal-Bench 2.1(89개 과제)에서 GPT-5.5 기반 base Monet 75.5%에서 DarwinX 진화 후 83.2%로 +7.7점 상승했고, 더 강한 GPT-5.6 기반에서는 84.7%로 공개 검증 리더보드 최상위권과 동등하거나 앞섰다.
- TerminalWorld의 94개 학습 과제 이외의 41개 미학습(held-out) 과제에서 Opus 4.8 기반 Monet(DarwinX)이 28/41(68.3%)을 풀어, 평가에 포함된 모든 기성 에이전트보다 높았고 진화 전(25/41) 대비 +7.3점이었다.
- WebArena-Infinity에서는 합성 의도 300개로만 진화시켰음에도 실제 1,260개 실과제 pass@1이 검증 이후 기준 43.5%에서 93.0%로 상승했다.
- Terminal-Bench 2.1에서 진화시킨 하네스를 그대로 SWE-bench Verified(500개 이슈)에 적용해도 성능이 이전되었다.
- 제출물 감사 결과 하네스 자체가 채점기를 속이는 사례는 발견되지 않았고, 무효 궤적 수가 진화 전후 293건에서 17건으로 줄었다.
어디에 쓸 수 있나
- 코드/터미널 작업 에이전트나 웹 자동화 에이전트의 프롬프트·도구·제어 흐름을 개선하는 파이프라인 설계에 참고할 수 있다.
- 모델 가중치를 재학습하지 않고 평가용 컴퓨팅 자원을 활용해 에이전트 성능을 끌어올리려는 조직에 적용 가능성이 있다.
- 자체 검증기(verifier)가 있는 과제 도메인에서 정답 라벨 없이 에이전트 개선 루프를 구축하는 데 참고할 수 있다.
한계와 남은 검증
- 평가에는 자체 채점기가 있는 벤치마크가 필요하며, 실제 배포 환경에는 이런 검증기가 흔히 없다는 점을 저자들도 인정한다.
- avg@k 방식은 후보마다 여러 번 반복 실행이 필요해 오프라인 정기 작업으로는 가능하지만 요청 단위 실시간 진화에는 비용이 크다.
- 모델과 하네스를 동시에 바꾸는 co-evolution, 규정 준수(compliance) 제약을 보존 대상으로 쓰는 일반화된 적용 등은 아직 검증되지 않았고 향후 실험으로 남겨두었다.
- 서로 다른 모델 세대 간 하네스가 얼마나 유지되는지, 웜 아카이브에서 재선택에 몇 세대가 필요한지는 아직 측정되지 않았다.
- Terminal-Bench 2.1의 스킬 묶음 기여도 분석은 스킬들이 함께 선택되었기 때문에 개별 스킬의 인과 효과가 아닌 조합 전체의 기여로만 해석해야 한다.
왜 중요한가
모델 가중치를 새로 학습시키지 않고도 프롬프트와 도구 구성만 자연선택식으로 개선해 실질적인 성능 향상을 얻을 수 있다는 것을 보여준다. 모델 교체 주기와 무관하게 재사용 가능한 '하네스'라는 자산을 축적할 수 있다는 뜻이어서, 모델 업그레이드 비용을 줄이는 실무적 함의가 있다.
이 논문의 용어
- 하네스(harness) · LLM을 감싸는 프롬프트, 도구, 기술 문서, 제어 흐름 등 에이전트의 운영 틀
- avg@k · 같은 과제를 k번 반복 시도해 평균 성공률을 매기는 측정 방식
- 보존-확장 규약(preserve-and-extend contract) · 기존에 풀던 과제 성능을 크게 해치지 않으면서 새로운 과제를 풀 때만 변형을 승격시키는 규칙
- 재조합(recombination) · 서로 다른 장점을 가진 하네스 계보를 합쳐 두 계보의 강점을 모두 가진 자식 변형을 만드는 연산
- pass@1 · 한 번의 시도로 과제를 성공시켰는지를 보는 지표
최신 논문
- AI 코딩 에이전트에게 과학 소프트웨어 수리를 시켜보니, 절반도 제대로 못 고쳤다AI 코딩 에이전트에게 과학 소프트웨어 수리를 시켜보니, 절반도 제대로 못 고쳤다
- 논문 속 시연이 아니라 실제 서비스에 넣을 수 있는 희소 어텐션 만들기논문 속 시연이 아니라 실제 서비스에 넣을 수 있는 희소 어텐션 만들기
- 고객상담 AI 상담원이 규정을 '한 번의 행동'이 아니라 '전체 절차'로 지키게 만드는 방법고객상담 AI 상담원이 규정을 '한 번의 행동'이 아니라 '전체 절차'로 지키게 만드는 방법
- 로봇 팔에게 사람의 시연 없이 새 일 시키기, 말 잘하는 AI가 대신 가르친다로봇 팔에게 사람의 시연 없이 새 일 시키기, 말 잘하는 AI가 대신 가르친다
- 에이전트 학습용 환경을 새로 만드는 대신, 기존 환경에 '패치 부품'을 씌워 그 에이전트의 약점에 맞게 바꾸는 방법에이전트 학습용 환경을 새로 만드는 대신, 기존 환경에 '패치 부품'을 씌워 그 에이전트의 약점에 맞게 바꾸는 방법
- AI 모델을 '소유'하지 못한 조직은 안전 통제도 절반밖에 못 한다AI 모델을 '소유'하지 못한 조직은 안전 통제도 절반밖에 못 한다
- AI가 선생님 모델을 따라 배우다가, 정답에 다가가는 '좋은 생각'까지 억누르는 문제를 잡아낸다AI가 선생님 모델을 따라 배우다가, 정답에 다가가는 '좋은 생각'까지 억누르는 문제를 잡아낸다
- AI가 특정 사람 말투를 흉내내도록 시켜봤더니, 결국 AI 자신의 말투에서 못 벗어난다AI가 특정 사람 말투를 흉내내도록 시켜봤더니, 결국 AI 자신의 말투에서 못 벗어난다
METAL MEDIA 최신 기사
그림 출처: Yifan Zhang et al., arXiv:2608.07545, CC BY 4.0