[논문 리뷰] Self-Harness: 스스로를 개선하는 하네스
TL;DR
LLM(대형 언어 모델) 기반 에이전트는 복잡한 작업을 자동화할 잠재력이 크지만, 특정 환경에서 반복적인 실수를 저지릅니다. 이 문제를 해결하기 위해, 본 논문은 에이전트가 스스로의 '하네스(Harness)'를 개선하는 새로운 패러다임인 Self-Harness를 제안합니다. Self-Harness는 약점 발견 → 개선안 제안 → 제안 검증의 3단계 자동화 루프를 통해 에이전트의 성능을 점진적으로 향상시킵니다. Terminal-Bench-2.0 벤치마크 실험 결과, Self-Harness는 테스트한 모든 모델의 성능을 큰 폭으로 개선했으며, 이는 에이전트가 인간의 지속적인 개입 없이 자가 개선할 수 있는 가능성을 명확히 보여줍니다.
연구 배경 및 동기
LLM 기반 에이전트는 다양한 작업을 자동화할 수 있지만, 종종 특정 환경에서 같은 실수를 반복하는 한계를 보입니다. 지금까지는 엔지니어가 직접 프롬프트를 수정하거나 도구를 조정하는 '수동 튜닝' 방식으로 이 문제를 해결해왔습니다. 하지만 LLM이 빠르게 발전하고 다양해지면서 이러한 수동 방식은 비효율적이고 확장성이 떨어집니다.
이 연구는 "에이전트가 스스로의 실패로부터 배워 스스로를 개선할 수는 없을까?"라는 질문에서 시작합니다. Self-Harness는 에이전트가 자신의 실패 경험을 학습 데이터로 삼아, 자신을 제어하는 '하네스'를 직접 수정하고 검증하는 반복적인 루프를 통해 점진적으로 성능을 향상시키는 자동화된 방법론을 제시합니다.
관련 연구
LLM 에이전트의 성능 향상을 위한 연구는 활발히 진행되어 왔습니다. **파인튜닝(Fine-tuning)**이나 **강화학습(RL)**은 모델의 내부 파라미터를 직접 수정하여 성능을 개선하지만, 막대한 계산 비용과 데이터가 필요합니다. 프롬프트 엔지니어링 기법(예: ReAct, Self-Refine)은 모델의 추론 과정을 개선하지만, 에이전트의 근본적인 행동 지침이나 도구 사용법 자체를 바꾸지는 못합니다.
Self-Harness는 모델 자체를 변경하지 않으면서도, 에이전트의 행동을 제어하는 외부 시스템인 '하네스'를 자동으로 최적화한다는 점에서 차별화됩니다. 이는 파인튜닝보다 훨씬 비용 효율적이며, 일반적인 프롬프트 엔지니어링보다 더 근본적인 수준에서 에이전트의 행동 패턴을 교정할 수 있는 새로운 접근법입니다.
핵심 기여
- Self-Harness 프레임워크 제안: 에이전트가 실패 경험을 통해 스스로의 하네스를 자동으로 개선하는 3단계(약점 발견, 개선안 제안, 검증) 프레임워크를 최초로 제안합니다.
- 실험적 성능 검증: 다양한 오픈소스 및 상용 LLM을 대상으로 Self-Harness가 실제로 성능을 크게 향상시킴을 실험적으로 입증했습니다.
- 일반화 가능성: 특정 모델에 국한되지 않고, 다양한 LLM에 적용할 수 있는 범용적인 방법론임을 보여주었습니다.
제안 방법론
Self-Harness는 '약점 발견 → 개선안 제안 → 검증'의 3단계 사이클을 반복하며 에이전트의 하네스를 자동으로 최적화합니다.
하네스 (Harness)
하네스는 LLM 에이전트가 주어진 환경과 상호작용하는 방식을 제어하고 보조하는 외부 시스템입니다. 에이전트를 위한 일종의 '비계(scaffolding)' 또는 '보조 시스템'으로, 다음과 같은 요소들을 포함합니다.
- 시스템 프롬프트: 에이전트의 역할, 목표, 제약 조건 등을 정의하는 기본 지침. (예: "너는 리눅스 전문가이며, 모든 명령어는 신중하게 실행해야 한다.")
- 도구 (Tools): 에이전트가 사용할 수 있는 외부 함수나 API. (예: 파일 읽기/쓰기, 웹 검색, 코드 실행기)
- 런타임 메커니즘 (Runtime Mechanisms): 에이전트의 실행 흐름을 제어하는 규칙. (예: 행동 후 자체 평가, 실패 시 재시도 전략)
Self-Harness 3단계 사이클
-
약점 발견 (Weakness Mining): 먼저, 에이전트가 훈련용 태스크(
D_train)를 수행하며 실패한 기록(trace)을 수집합니다. 그 후, LLM을 이용해 이 실패 기록들을 클러스터링하여 반복적으로 나타나는 실패 패턴을 찾아냅니다.- 예시: 다수의 실패 기록에서
cat명령어로 존재하지 않는 파일을 읽으려다 오류가 발생하는 패턴을 발견.
- 예시: 다수의 실패 기록에서
-
개선안 제안 (Harness Proposal): 발견된 실패 패턴과 현재 하네스를 LLM에게 제시하고, 이 문제를 해결할 수 있는 하네스 수정안을 제안하도록 요청합니다.
- 예시: "파일을 읽기 전에
ls명령어로 파일 존재 여부를 먼저 확인하라"는 규칙을 시스템 프롬프트에 추가하자는 제안을 생성.
- 예시: "파일을 읽기 전에
-
제안 검증 (Proposal Validation): 제안된 수정안을 적용한 새로운 하네스 후보(
H')의 성능을 검증용 태스크(D_val)에서 평가합니다. 만약 기존 하네스(H_i)보다 성능이 향상되었다면, 이 수정안을 채택합니다. 이 과정은 성능 저하를 막는 안전장치 역할을 합니다.
핵심 알고리즘
Self-Harness 알고리즘은 모델 과 초기 하네스 를 입력으로 받아, 검증 데이터셋 에서의 성능 를 최대화하는 방향으로 하네스를 반복적으로 업데이트합니다.
이 과정을 의사 코드로 표현하면 다음과 같습니다.
function SelfHarness(Model M, InitialHarness H_0, Tasks D_train, Tasks D_val):
H_current = H_0
loop N times:
// 1. 약점 발견: 훈련 태스크를 실행하고 실패 패턴을 찾음
ExecutionTraces = execute(M, H_current, D_train)
FailurePatterns = find_patterns(ExecutionTraces) // LLM을 이용해 실패 기록 클러스터링
// 2. 개선안 제안: 실패 패턴을 기반으로 하네스 수정안 생성
ProposedModifications = propose_modifications(M, FailurePatterns, H_current)
// 3. 제안 검증: 각 수정안을 평가하여 최상의 하네스를 선택
H_best_candidate = H_current
P_best = evaluate(M, H_current, D_val) // 현재 성능 측정
for mod in ProposedModifications:
H_candidate = apply_modification(H_current, mod)
P_candidate = evaluate(M, H_candidate, D_val) // 후보 하네스 성능 측정
// 성능이 향상된 경우에만 후보를 채택
if P_candidate > P_best:
P_best = P_candidate
H_best_candidate = H_candidate
H_current = H_best_candidate
return H_current
실험 설정
- 벤치마크: 리눅스 터미널 환경에서 복잡한 파일 시스템 조작, 스크립팅, 데이터 처리 등을 수행하는 Terminal-Bench-2.0을 사용했습니다.
- 초기 하네스: DeepAgent 프레임워크 기반의 최소한의 정보(기본 역할, 도구 목록)만 담은 상태에서 시작했습니다.
- 언어 모델: 다양한 규모와 아키텍처의 모델들을 테스트했습니다.
- MiniMax-abab6.5-chat
- Qwen1.5-32B-Chat
- GLM-4-9B-Chat
- 평가 지표: 과제 통과율(Pass Rate, %)
실험 결과 분석
Self-Harness는 테스트된 모든 모델에서 통계적으로 유의미한 성능 향상을 보였습니다. 이는 특정 모델에 의존하지 않는 일반적인 방법론임을 시사합니다.
| 모델 (Model) | 초기 성능 (Baseline) | Self-Harness 적용 후 | 성능 향상 |
|---|---|---|---|
| MiniMax-abab6.5-chat | 40.5% | 61.9% | +21.4%p |
| Qwen1.5-32B-Chat | 23.8% | 38.1% | +14.3%p |
| GLM-4-9B-Chat | 42.9% | 57.1% | +14.2%p |
또한, Ablation Study(제거 연구)를 통해 3단계(약점 발견, 개선안 제안, 검증)가 모두 성능 향상에 필수적임을 확인했습니다. 특히 제안 검증 단계가 없을 경우, 잘못된 수정안으로 인해 오히려 성능이 저하될 수 있어 이 단계의 중요성이 부각되었습니다.
비판적 평가
Self-Harness는 에이전트 자가 개선의 새로운 방향을 제시하는 강력한 방법론이지만, 몇 가지 한계점도 존재합니다.
- 초기 하네스 의존성: 매우 부실한 초기 하네스에서 시작할 경우, 의미 있는 실패 기록을 수집하기 어려워 개선 과정이 더딜 수 있습니다.
- 계산 비용: 각 개선안을 검증 데이터셋에서 평가해야 하므로, 반복 횟수가 늘어날수록 전체 과정의 계산 비용이 증가합니다.
- 최적해 보장: 제안된 수정안이 항상 최적의 해결책이라는 보장은 없으며, 지역 최적해(local optima)에 빠질 가능성이 있습니다.
그럼에도 불구하고, Self-Harness는 인간의 개입을 최소화하며 에이전트의 성능을 자동을 끌어올릴 수 있다는 점에서 큰 의의를 가집니다.
향후 연구 방향
Self-Harness는 에이전트의 자가 개선을 위한 강력한 첫걸음이며, 다음과 같은 방향으로 확장될 수 있습니다.
- 복잡한 환경으로의 확장: 터미널 환경을 넘어, 웹 브라우징, 소프트웨어 개발, 멀티모달 환경 등 더 복잡한 태스크에 적용하는 연구가 필요합니다.
- 효율성 개선: 개선안 제안 및 검증 과정의 효율성을 높여 더 적은 비용으로 빠르게 하네스를 최적화하는 방법론 연구가 필요합니다.
- 도구 자동 생성: 시스템 프롬프트 개선을 넘어, 에이전트에게 필요한 도구를 스스로 정의하고 생성하는 방향으로의 확장을 기대할 수 있습니다.
실무 적용 가이드
Self-Harness를 실무에 적용할 때 다음 사항을 고려하면 좋습니다.
- 양질의 초기 하네스: 프로젝트의 목표와 제약 조건을 명확히 담은 합리적인 초기 하네스를 제공하는 것이 효율적입니다.
- 훈련/검증 데이터셋 분리: 에이전트가 직면할 실제 문제와 유사한 훈련 및 검증용 태스크 셋을 신중하게 구축해야 합니다. 이는 과적합을 방지하고 일반화 성능을 보장합니다.
- 하네스 버전 관리: 개선 과정을 추적하고, 성능이 저하될 경우 이전 버전으로 쉽게 롤백할 수 있도록 하네스 변경 사항을 버전 관리 시스템(예: Git)으로 관리하는 것이 중요합니다.
결론
Self-Harness는 LLM 기반 에이전트가 인간의 지속적인 개입 없이 스스로의 성능을 개선할 수 있는 강력하고 실용적인 방법을 제시합니다. 이 접근법은 에이전트 개발 패러다임을 '수동 튜닝'에서 '자동 최적화'로 전환할 잠재력을 가집니다. 앞으로 Self-Harness와 같은 자가 개선 기술이 발전함에 따라, 더욱 견고하고 자율적으로 학습하며 진화하는 AI 에이전트의 등장을 기대해 볼 수 있을 것입니다.

![[논문 리뷰] Self-Harness: Harnesses That Improve Themselves](/assets/images/blog/20260624-paper-2606-09498-self-harness-harnesses-that-im.jpg)