7일간 29억 토큰을 처리하고도 371등: 자가개선 에이전트의 국소 최적점
결론부터: 자가개선은 올바른 방향을 보장하지 않는다
AI 에이전트에게 Kaggle 대회를 맡기면 어디까지 갈 수 있을까?
이번에는 문제 몇 개를 대신 풀게 하는 수준이 아니라, 대회 분석부터 전략 수립, 구현, 검증, 제출, 회고까지 장기 실행하는 에이전트 하네스를 만들었다. 목표는 명확했다. NeuroGolf 2026에서 1등을 하는 것.
후반에는 Codex Goal을 중심으로 약 7일 동안 작업을 거의 계속 돌렸다. 에이전트는 공개 자료를 찾고, 400개 모델을 분석하고, 후보를 구현하고, 제출 결과를 읽고, 실패 원인을 다음 규칙에 반영했다. 내가 자리를 비운 사이에도 다음 작업을 선택하고 결과를 기록했다.
결과는 이랬다.
| 항목 | 최종 결과 |
|---|---|
| 실행 기간 | 약 7일 |
| 처리한 토큰 | 2,908,485,828 |
| 공개 점수 | 7374.21 |
| 공개 순위 | 371 / 3034 |
| 1위 점수 | 8179.99 |
| 1위와의 격차 | 805.78 |
토큰 수는 마지막 7일 동안 남은 로컬 Codex 실행 기록에서 token_count의 증가분을 합산한 값이다. 메인 에이전트와 하위 에이전트의 사용량을 모두 포함했다. 입력 토큰은 약 28.99억이었고, 그중 96.3%인 약 27.91억이 캐시에서 재사용됐다. 캐시되지 않은 입력은 약 1.08억, 출력은 약 919만 토큰이었다.
29억 토큰은 성과가 아니다. 오히려 에이전트가 같은 맥락을 반복해서 읽고 비슷한 검증을 되풀이한 흔적에 가깝다. 이 글에서는 이 숫자를 시스템에 걸린 부하와 탐색 효율을 살펴보는 지표로 사용한다.
최종 점수의 상당 부분은 공개된 모델 묶음에서 왔다. 따라서 “점수 1점을 올리는 데 몇 토큰을 썼는가” 같은 값을 계산해도 우리 하네스의 효율을 정확히 설명할 수 없다. 이 숫자는 API 청구량이나 비용도 아니다. 캐시에서 읽은 토큰까지 포함해 시스템이 처리한 전체 사용량이다.
실행 지속성은 성공했고, 대회 목표는 실패했다. 더 중요한 사실은 하네스가 실패를 겪을 때마다 실제로 개선됐는데도 1등과 가까워지지 않았다는 점이다.
검증에 실패하면 검증기를 강화했고, 같은 작업이 반복되면 자동 점검 도구를 만들었다. 잘못된 과제를 선택한 뒤에는 작업 우선순위 규칙도 고쳤다. 그런데 시스템이 개선될수록 위험한 가설은 더 빨리 제거됐고, 측정하기 쉬운 작은 최적화가 더 높은 순위를 차지했다.
자가개선도 국소 최적점에 빠진다. 무엇을 개선할지 정하는 평가 기준이 잘못되어 있으면, 에이전트는 최종 목표가 아니라 현재 하네스가 보상하는 행동에 점점 더 능숙해진다.
여기서 자가개선은 모델의 가중치를 다시 학습했다는 뜻이 아니다. 에이전트가 실험 결과를 근거로 프롬프트, 작업 지침, 기억, 자동화 도구, 검증기, 작업 순위 같은 주변 작업 체계를 계속 고쳤다는 뜻이다. 최근 연구에서는 이를 harness self-evolution 또는 agentic harness engineering이라고 부른다.
Agentic Harness Engineering은 하네스를 바꾸기 전에 기대 효과를 적고, 다음 평가에서 실제 효과를 확인하도록 제안한다. 하네스의 변경을 막연한 개선이 아니라 검증 가능한 약속으로 다루는 셈이다.
국소 최적점이라는 표현도 수학적으로 최적점임을 증명했다는 뜻은 아니다. 최종 목표인 순위 격차는 거의 줄지 않는데 중간 지표와 작업량만 계속 좋아진 상태를 설명하기 위한 운영상의 진단이다.
이것이 이번 프로젝트의 핵심이다. 에이전트가 오래 일하게 만드는 것과, 오래 일한 결과가 목표에 수렴하게 만드는 것은 전혀 다른 문제였다.
무엇을 맡겼나
NeuroGolf 2026은 ARC-AGI의 400개 grid 변환 문제를 각각 ONNX 모델로 구현하는 대회다. 정답뿐 아니라 실행 중 사용하는 메모리와 파라미터가 작아야 높은 점수를 받는다.
처음에는 400개 문제를 에이전트가 하나씩 풀면 된다고 생각했다. 하지만 실제 경쟁은 다음에 더 가까웠다.
- 공개된 고득점 모델 묶음을 계속 추적한다.
- 400개 모델 중 개선 여지가 큰 대상을 찾는다.
- ONNX 그래프를 역공학해 비용이 더 낮은 표현을 설계한다.
- 로컬 정답 여부, 숨은 문제에 대한 위험, 실행 환경 호환성을 따로 검증한다.
- 실제 제출을 통해 모델 교체가 점수를 높이는지 확인한다.
- 실패를 다음 탐색의 입력으로 바꾼다.
즉, 이 프로젝트의 핵심은 ONNX 모델 한 개가 아니라 장기간 경쟁 상태를 관찰하고 스스로 작업을 이어가는 시스템이었다.
7일 동안 실제로 돌아간 하네스
대화 맥락만으로 장기 작업을 이어갈 수는 없었다. 세션이 바뀌면 같은 문제를 다시 분석했고, 이미 실패한 접근을 반복했으며, 오래된 순위표를 기준으로 엉뚱한 최적화를 시작했다.
그래서 기억을 문서 하나가 아니라 실행 가능한 여러 층으로 나눴다.
Goal: 무엇을 달성해야 하는지와 완료 조건AGENTS.md: 프로젝트 전체의 운영 원칙과 금지선- 저장소 전용 작업 지침: 분석, ONNX 설계, 검증, 제출 기록, 회고 절차
- 자동화 도구: 작업 순위, 비용 계산, 압축 파일 검증, 반복 검사
- wiki와 실험 기록: 근거, 실패, 점수, 출처
- 하위 에이전트: 규칙 추론, 그래프 검토, 숨은 위험 검토
한 번의 작업 주기는 최소 하나의 구체적인 결과물을 남기도록 했다. 분석만 하다가 끝나는 세션을 막기 위해서였다.
진행 상황을 파일에 기록하고 다음 세션이 바로 이어받게 하는 방식은 장기 실행 에이전트에서 널리 쓰이는 설계다. Anthropic의 Effective harnesses for long-running agents도 각 세션이 일을 조금씩 진전시키고, 다음 세션을 위한 상태를 명시적으로 남기도록 구성한다.
이 구조는 실제로 효과가 있었다. 에이전트는 세션이 바뀌어도 기준 제출 파일을 보호했고, 이전 실험의 해시와 점수를 찾았으며, 실패한 연산자 조합을 다시 제출하지 않도록 검증기와 작업 순위 규칙을 수정했다.
하지만 결과물이 남았다고 목표에 가까워진 것은 아니다. 에이전트를 평가할 때는 **작업 과정(trace)**과 **최종 결과(outcome)**를 나눠 봐야 한다. Anthropic의 Demystifying evals for AI agents도 에이전트가 무엇을 했는지와 실제 환경이 어떻게 바뀌었는지를 따로 평가한다. 이 프로젝트는 한동안 만들어진 파일의 수를 성과 개선의 대리 지표로 잘못 사용했다.
무엇보다 쉬지 않고 다음 일을 찾는 시스템은 만들 수 있었다.
자가개선도 국소 최적점에 빠진다
실패를 목적 함수 관점에서 다시 쓰면 다음과 같다.
| 하네스 계층 | 측정한 신호 | 본래 역할 | 실제로 생긴 편향 |
|---|---|---|---|
| Goal | 공개 순위 1위 | 최종 목표 | 너무 먼 목표라 매 작업의 선택에는 약하게 작용 |
| 작업 순위 | 공식 비용 절감, 성공 가능성 | 중간 성과 | 작고 확실한 개선을 과대평가 |
| 검증기 | 정답 일치, 실행 호환성, 기준 제출 보호 | 안전 제약 | 결과가 불확실한 탐색을 조기에 제거 |
| 진행 규칙 | 작업 주기당 결과물 1개 | 작업량 확인 | 목표 기여보다 결과물 생성에 보상 |
이 중간 지표들은 모두 필요했다. 문제는 지표 자체가 아니라, 이 지표가 최종 목표인 순위 상승으로 이어지는지 주기적으로 다시 확인하지 않았다는 데 있었다. 다시 말해 하네스 전체의 방향을 점검하는 상위 평가 루프가 없었다.
1. Goal보다 하네스의 평가 함수가 더 강했다
나는 Goal에 “1등을 하라”고 썼다. 그러나 에이전트의 실제 행동을 결정한 것은 그 문장이 아니라 작업 순위와 통과 조건이었다.
하네스는 다음을 잘 보상했다.
- 공식 비용이 얼마나 줄었는가
- 로컬 예제를 정확히 맞히고 무작위 입력에서도 기준 모델과 같은가
- 현재 기준 제출을 망가뜨릴 위험이 낮은가
- 이번 작업에서 검증 가능한 결과물을 남겼는가
반대로 새로운 표현 방식이나 학습형 모델처럼 성공 가능성은 낮지만 성공했을 때 이익이 큰 시도는 계속 뒤로 밀렸다.
Goal은 공격적이었지만 평가 함수는 보수적이었다. 에이전트는 자연스럽게 “1등에 필요한 큰 변화”보다 “증명 가능한 작은 개선”을 선택했다.
2. 하네스가 점점 잘못된 일을 잘하게 됐다
초기에는 로컬 예제를 모두 맞히는 모델을 많이 만드는 데 집중했다. 공개 기준 모델보다 비용이 큰 모델이라는 사실을 뒤늦게 반영하자, 다음에는 기준보다 저렴한 대상만 찾도록 작업 순위를 고쳤다.
검증에 실패하면 통과 조건을 추가했고, 실행 오류가 나오면 호환성 점검 도구를 추가했다. 이 과정은 합리적이었다. 문제는 실패를 막는 장치가 늘어날수록 탐색 공간도 함께 줄었다는 점이다.
후반의 하네스는 아주 안정적이었다. 기준 제출 파일을 보호했고, 잘못된 제출을 줄였으며, 작은 그래프 최적화를 정확히 누적했다. 하지만 800점이 넘는 격차 앞에서 +0.01, +0.02를 안전하게 쌓는 시스템은 1등 전략이 아니었다.
3. 탐색을 의지가 아니라 예산으로 만들지 않았다
중간에 여러 번 “학습형 ONNX를 더 시도하자”, “탐색 비중을 높이자”고 Goal을 수정했다. 하지만 탐색 작업에 최소 시간, 별도 하위 에이전트, 허용할 실패 횟수를 따로 배정하지 않았다.
그 결과 급한 제출이나 확실한 비용 절감 후보가 생기면 탐색은 다시 밀렸다. 시간이 남으면 탐색한다는 규칙은 탐색하지 않겠다는 규칙과 거의 같았다.
4. 공개 기준 모델이 너무 강력한 국소 최적점이었다
공개된 고득점 제출 파일을 기준 모델로 삼은 것은 좋은 안전장치였다. 하지만 동시에 모든 생각을 “이 모델 하나를 어떻게 조금 더 줄일까?”로 제한했다.
400개 모델 전체를 새로 만드는 방법, 여러 문제에 재사용할 수 있는 생성기, 학습형 표현처럼 판을 바꿀 가능성이 있는 작업보다 기존 모델을 하나씩 교체하는 작은 최적화가 계속 우선됐다.
기준선은 지켜야 할 바닥이었는데, 어느 순간 연구의 천장이 됐다.
중간에 하네스를 어떻게 바꿨나
실패를 인식할 때마다 하네스도 수정했다.
정답과 개선 가치를 분리했다
로컬 예제를 모두 맞힌 모델도 공개 기준 모델보다 비용이 크면 교체하지 않았다. 문제별 기록에서도 정답을 맞혔는가와 기준 모델을 교체할 가치가 있는가를 따로 관리했다.
파일 크기 대신 공식 비용을 계산했다
ONNX 파일 크기가 작아도 계산 중에 큰 텐서를 만들면 점수가 나빠졌다. 이후 모든 비교를 공식 지표인 메모리 + 파라미터 기준으로 바꾸고, 문제별 비용 순위를 만들었다.
실패를 문서가 아니라 통과 조건으로 바꿨다
사람 눈에 같은 격자가 나오는 것과 대회가 검사하는 원본 출력이 완전히 같은 것은 달랐다. 한 후보는 화면에 보이는 결과 268/268개를 모두 맞혔지만, 원본 출력을 엄격하게 비교하자 0/268개가 일치했다. 실제 공개 점수도 15.90점 하락했다.
이후 검증기에 엄격한 one-hot 출력, 빈 영역의 zero-hot 처리, 최댓값 위치만 맞는 출력을 구분하는 검사를 추가했다. 로컬에서는 동작했지만 Kaggle에서 오류가 난 정수형 TopK 조합도 사용 금지 대상으로 만들었다.
학습형 모델은 전체 그래프 비용부터 검사했다
작은 신경망 분류기가 곧 작은 ONNX 프로그램을 뜻하지는 않았다. 한 QLinearConv 후보는 학습 데이터와 로컬 문제를 정확히 맞혔다. 그러나 입력 특징을 만들고 출력을 그리는 부분까지 포함하자 비용이 10665로 늘어 기준 모델의 8426보다 커졌다.
그 뒤에는 학습을 시작하기 전에 전체 그래프의 메모리, 파라미터, 입력 특징 생성 비용부터 추정하도록 바꿨다.
하위 에이전트를 역할별로 분리했다
같은 질문을 여러 모델에 던지는 대신 문제 규칙 추론, ONNX 구현 가능성, 숨은 위험, 제출 전 검토로 역할을 나눴다. 빠른 모델은 기본 정보 수집과 작업 분류에, 강한 모델은 “불가능하다”는 결론을 뒤집을 가치가 있는 어려운 판단에 배치했다.
다만 하위 에이전트 수를 늘린다고 탐색 품질까지 좋아지는 것은 아니다. Anthropic의 multi-agent research system 회고는 여러 방향을 독립적으로 조사할 때 병렬화가 효과적이라고 설명한다. 반면 서로 강하게 얽힌 코딩 작업에서는 조율 비용이 더 커질 수 있다. 우리도 독립적인 분석에는 병렬화가 유효했지만, 같은 graph를 여러 에이전트가 중복 검토할 때는 토큰만 늘어났다.
이 수정들은 하네스를 분명 더 견고하게 만들었다. 다만 견고함이 곧 목표 달성 가능성은 아니었다.
결과를 어떻게 해석해야 하나
최종 7374.21 전체가 에이전트가 처음부터 만든 400개 모델의 점수는 아니다. 공개 제출 파일을 기준 모델 묶음으로 사용했고, 공개된 문제별 모델과 그래프 최적화를 검증해 조합한 비중이 컸다.
에이전트가 직접 만든 확실한 기여는 그 위에서 동작했다.
- 400개 그래프의 연산 유형과 공식 비용 분석
- 문제별 출처와 SHA 해시를 보존하는 제출 기록
- 공개 기준 모델에서 하나씩 교체해 효과를 확인하는 실험 절차
- 원본 출력과 실행 환경 호환성 검증
- INT32 인덱스, cast sinking,
GatherND(batch_dims)같은 작은 그래프 최적화 - 실패를 작업 순위, 자동 점검, 작업 지침에 반영하는 자가개선 과정
에이전트가 직접 만든 그래프 최적화 묶음이 공개 점수를 7374.19 → 7374.21로 올리기도 했다. 작은 변화지만, 가설 수립부터 구현, 독립 검토, 제출, 기준 파일 교체까지 전 과정을 에이전트가 수행해 얻은 결과였다.
그러나 1등과의 격차는 805.78이었다. 따라서 정직한 결론은 이렇다.
에이전트는 장기간 자율적으로 운영 가능한 연구·실험 파이프라인을 만들고 개선했다. 하지만 그 파이프라인이 선택한 연구 과제들은 1등에 필요한 위험을 감수하지 못했고, 성공했을 때 큰 점수 상승을 만들 가능성도 부족했다.
이번에 얻은 인사이트
장기 실행의 병목은 기억보다 작업 선택이다
기억, 위키, 실험 기록이 잘 갖춰지면 반복 실수는 줄어든다. 하지만 과거를 잘 기억하는 시스템이 미래의 가장 좋은 행동을 고르는 것은 아니다. 기록 체계를 갖춘 뒤의 핵심 병목은 여러 후보 중 어디에 시간과 자원을 배분할 것인가로 이동한다.
Goal 문구는 운영체제가 아니다
Goal은 방향을 말할 뿐이다. 실제 행동은 작업 순위 지표, 검증기, 결과물의 정의, 중단 조건이 만든다. Goal과 하네스의 평가 기준이 다르면 결국 하네스의 기준이 이긴다.
안전성만 개선하면 탐색 능력은 줄어든다
실패할 때마다 validator를 강화하면 검증은 좋아진다. 하지만 시스템은 “더 안전한 시스템”으로만 자가 개선될 수 있다. 탐색 능력, 가설 다양성, 기대값 추정도 명시적인 개선 대상이어야 한다.
탐색에는 별도의 최소 예산이 필요하다
여기서 SLA는 엄밀한 의미의 서비스 수준 협약이 아니다. 당장 성공할 가능성이 높은 작업이 몰려도, 새로운 방법을 찾는 탐색 작업에 약속한 최소 시간과 토큰을 보장하자는 내부 운영 규칙이라는 비유다.
다시 한다면 60% 활용 / 40% 탐색 같은 고정 비율을 Goal에 적는 것으로 끝내지 않을 것이다. 이 비율은 설명을 위한 예시일 뿐, 실험으로 찾은 최적값이 아니기 때문이다.
대신 각 후보마다 다음 항목을 기록할 것이다.
- 성공했을 때 기대할 수 있는 점수
- 결과의 불확실성
- 가능성을 판단하기까지 필요한 시간
- 다른 문제에도 재사용할 수 있는지
- 현재 시도들과 얼마나 다른 접근인지
자동 스케줄러는 탐색에 쓸 최소 자원을 보장하되, 각 시도에는 시간과 토큰의 상한을 둔다. 그리고 매일 실제 점수 변화를 확인해 활용과 탐색의 비율을 다시 조정한다.
진행률과 목표 도달률은 다르다
매 작업마다 결과물이 생기면 시스템은 매우 생산적으로 보인다. 그러나 결과물의 수와 1등 가능성은 무관할 수 있다. “이번 작업이 남은 격차를 얼마나 줄일 수 있는가?”를 계속 다시 계산해야 한다.
이 회고가 증명하지 못한 것
이 글에서 내린 국소 최적점 진단은 실험 결과에 근거하지만, 인과관계를 증명한 것은 아니다.
- 하네스 버전별로 무작위 대조 실험을 하지 않았다.
- 버전을 바꾸지 않고 비교할 검증용 과제군과 실패 재현 세트가 없었다.
- 공개 순위표의 변화에는 기준 모델 교체와 외부 모델 조합의 효과가 섞여 있었다.
- 탐색 비중을 다르게 설정한 병렬 실험이 없어 다른 자원 배분 정책과 직접 비교할 수 없다.
따라서 “검증기를 강화해서 순위가 낮아졌다”거나 “탐색에 40%를 배정했으면 1등했다”고 결론 내릴 수는 없다. 증거가 뒷받침하는 주장은 더 좁다. 하네스가 측정한 중간 지표는 계속 좋아졌지만 최종 목표의 개선 속도는 충분하지 않았고, 이를 일찍 감지할 독립된 상위 평가 루프가 없었다.
다시 측정한다면 하네스를 바꿀 때마다 다음 근거를 연결할 것이다.
예상 효과 → 고정된 검증 세트 → 처음 보는 문제의 결과 → 이전 실패 재현 → 토큰과 비용 변화
SEAGym은 하네스를 자주 고쳐도 처음 보는 문제의 성능은 좋아지지 않을 수 있고, 중간에 좋아졌던 버전이 이후 다시 나빠질 수도 있음을 보여준다. 그래서 학습에 사용한 문제, 검증 문제, 처음 보는 문제, 과거 실패 재현을 나눠 평가할 것을 제안한다.
다시 한다면 이렇게 설계할 것이다
- 첫날부터 승리 경로를 세 갈래로 둔다. 안전한 그래프 최적화, 재사용 가능한 모델 생성기, 위험하지만 효과가 큰 학습형·혼합형 접근을 병렬로 운영한다.
- 탐색 예산을 강제한다. Goal에만 적어두지 않고 자동 스케줄러가 탐색 몫을 실제로 보장하게 한다.
- 매일 전략 감사를 한다. 현재 속도로 마감까지 줄일 수 있는 점수와 1위 격차를 비교하고, 불가능하면 작업 분포를 바꾼다.
- 하네스 개선의 목적을 분리한다. 안전성 개선과 탐색력 개선을 각각 측정한다.
- 공개 기준 모델은 안전장치로만 쓴다. 문제별 최적화와 별개로 400개 모델 전체를 새로 조합하는 생성기를 계속 실험한다.
- 중단 조건도 목표의 일부로 둔다. 기대 효과가 사라지면 아주 작은 최적화를 이어가는 대신 결과를 정리하고 다음 프로젝트로 이동한다.
마치며
이번 프로젝트에서 가장 놀라웠던 것은 에이전트가 약 7일간 계속 일했다는 사실 자체가 아니었다. 계속 일하는 시스템도 얼마든지 잘못된 방향으로 정교해질 수 있다는 점이었다.
강한 모델, 긴 대화 맥락, 많은 하위 에이전트, 잘 정리된 위키만으로는 충분하지 않았다. 장기 실행 에이전트의 성능은 결국 목표, 작업 선택, 평가, 실패 예산, 피드백 구조를 포함한 전체 하네스의 성능이었다.
1등은 하지 못했다. 대신 “에이전트를 오래 돌리는 방법”과 “에이전트가 목표에 수렴하게 만드는 방법” 사이에 어떤 간극이 있는지 실제 경쟁 환경에서 확인했다.
다음에는 단순히 멈추지 않는 에이전트가 아니라, 자신이 안전한 일에만 갇히고 있는지 감지하고 탐색 비중까지 스스로 재조정하는 에이전트를 만들어보고 싶다.
참고 자료
- The 2026 NeuroGolf Championship
- ARC-AGI
- ONNX
- Agentic Harness Engineering: Observability-Driven Automatic Evolution of Coding-Agent Harnesses
- SEAGym: An Evaluation Environment for Self-Evolving LLM Agents
- Effective harnesses for long-running agents
- Demystifying evals for AI agents
- How we built our multi-agent research system
ABOUT THIS ARTICLE
이 글은 실험·운영 회고입니다
7일간의 실행 기록, 토큰 로그, 공개 기준 모델, 대회 점수와 실패 사례를 함께 분석했습니다.
강준형이 작성하고 최종 사실·코드·출처를 검토했습니다. 공개 자료와 작성자의 직접 기여를 구분하는 기준은 편집 원칙에서 확인할 수 있습니다.
함께 읽을 글
나는 왜 새 Agent 서비스에 Router부터 두지 않는가
새 agent 프로젝트는 별도 Router나 Planner를 두기보다 primary agent 하나와 harness로 시작해 왔다. 반복되는 실패를 보고 agent 경계를 추가하는 기준을 정리했다.
Agent를 위한 온톨로지는 전사 데이터 모델에서 시작하지 않는다
전사 데이터를 먼저 온톨로지로 묶기보다 Agent가 실제로 답해야 할 질문에서 필요한 개념과 관계를 좁혀 간다. GraphRAG와 자동 구축을 어디까지 적용할지도 함께 정리했다.
사내 AX 전담조직이 모든 Agent를 만들면 생기는 병목
중앙 AX팀이 업무별 Agent 구현까지 전부 소유하면 초기에는 빠르지만 운영 단계에서는 변경 대기열이 길어진다. 중앙팀과 업무조직이 각각 무엇을 소유해야 하는지 정리했다.