본문으로 건너뛰기
SuanLab

[논문 리뷰] Scaling Test-Time Compute for Agentic Coding

Test-time scaling has become a powerful way to improve large language models. However, existing methods are best suited to short, bounded outputs that can be directly compared, ranked or refined. Long...

공유하기
[논문 리뷰] Scaling Test-Time Compute for Agentic Coding

[논문 리뷰] Scaling Test-Time Compute for Agentic Coding

TL;DR

대규모 언어 모델(LLM)을 활용한 에이전트 코딩은 복잡한 소프트웨어 엔지니어링 문제를 해결하는 새로운 패러다임입니다. 하지만 여러 단계에 걸친 긴 추론이 필요한 문제에서는 성능 한계에 부딪힙니다. 본 논문은 에이전트의 여러 시도(롤아웃 경로)를 구조화된 **요약(summary)**으로 압축하고, 이를 효과적으로 재사용하여 성능을 극대화하는 테스트 시간 스케일링 프레임워크를 제안합니다. 이 프레임워크는 여러 시도를 토너먼트 방식으로 비교하여 최선을 뽑는 병렬 기법 **RTV(Recursive Tournament Voting)**와, 최선의 시도에서 얻은 교훈으로 새로운 시도를 개선하는 순차 기법 **PDR(Parallel-Distill-Refine)**을 통해 SWE-Bench, Terminal-Bench와 같은 고난도 벤치마크에서 기존 대비 성능을 크게 향상시켰습니다.

연구 배경 및 동기

**에이전트 코딩(Agentic Coding)**이란 LLM이 단순히 코드를 생성하는 것을 넘어, 스스로 계획을 세우고, 코드를 작성하며, 실행 결과를 보고 오류를 수정하는 등 자율적인 문제 해결 과정을 수행하는 것을 의미합니다. 마치 인간 개발자처럼 생각하고 행동하는 것이죠.

하지만 복잡한 문제일수록 에이전트는 여러 번의 시행착오를 거치게 됩니다. 이때 중요한 것은 '과거의 경험으로부터 얼마나 잘 배우는가'입니다. 기존의 테스트 시간 스케일링(Test-Time Scaling) 기법들은 모델을 재학습시키지 않고, 추론(테스트) 시에 더 많은 연산을 투입해 더 나은 결과를 얻는 방법입니다. 예를 들어, 같은 질문에 여러 번 답하게 한 뒤 가장 좋은 답을 고르는 방식(Self-Consistency)이 있습니다. 그러나 이러한 기법들은 주로 단일 답변 생성에 최적화되어 있어, 에이전트 코딩처럼 길고 복잡한 상호작용 기록(롤아웃 경로)을 다루기에는 비효율적입니다.

본 연구는 바로 이 지점에서 출발합니다. 에이전트의 길고 복잡한 시도들을 어떻게 하면 정보 손실 없이 압축하고, 그 경험을 다음 시도에 효과적으로 활용할 수 있을지에 대한 해답을 제시합니다.

관련 연구

기존의 테스트 시간 스케일링 연구들은 주로 다음과 같은 방향으로 진행되었습니다.

  • Self-Consistency: 동일한 프롬프트로 여러 번 추론을 실행하여 다수결로 가장 일관된 결과를 선택하는 방식입니다. 주로 코드 생성이나 수학 문제 풀이에 효과적입니다.
  • Tree of Thoughts (ToT): 문제 해결 과정을 트리 형태로 탐색하며, 각 단계에서 여러 가능한 다음 단계를 평가하고 유망한 경로를 확장해 나가는 방식입니다.
  • Reflection: 에이전트가 자신의 이전 행동을 스스로 평가하고, 그 피드백을 바탕으로 다음 계획을 수정하는 방식입니다.

하지만 이러한 접근법들은 에이전트 코딩의 긴 컨텍스트를 처리할 때 한계가 있습니다. 수십, 수백 번의 도구 사용과 관찰로 이루어진 전체 롤아웃 기록을 컨텍스트 창에 모두 넣는 것은 비효율적이며, 핵심적인 교훈을 추출하기도 어렵습니다. 본 논문은 롤아웃 경로를 구조화된 요약으로 압축하여 이 문제를 해결하고, 이를 바탕으로 더 정교한 병렬/순차적 개선을 수행한다는 점에서 기존 연구들과 차별화됩니다.

핵심 기여

  1. 롤아웃 경로의 압축 표현: 에이전트의 긴 행동-관찰 시퀀스를 LLM을 통해 정보 손실을 최소화한 구조적 요약으로 압축하는 방법을 제안합니다.
  2. 병렬 스케일링 기법 (RTV): 여러 독립적인 시도(롤아웃)들의 요약을 토너먼트 방식으로 비교하여 가장 성공적인 해결책을 효율적으로 선별합니다.
  3. 순차 스케일링 기법 (PDR): 여러 병렬 시도에서 얻은 최상의 교훈을 다음 시도의 프롬프트에 반영하여 점진적으로 해결책을 개선합니다.
  4. SOTA 성능 달성: SWE-Bench 및 Terminal-Bench와 같은 고난도 벤치마크에서 GPT-4o, Claude 3 Opus 등 최신 LLM의 성능을 크게 향상시켰습니다.

제안 방법론

본 논문의 핵심 아이디어는 에이전트의 복잡한 시도 기록을 '요약'하여 재사용하는 것입니다. 이를 위해 두 가지 주요 기법, RTV와 PDR을 제안합니다.

1. 롤아웃 요약 생성 (Rollout Summarization)

에이전트의 한 번의 시도(롤아웃)는 (행동, 관찰, 생각)의 긴 시퀀스로 구성됩니다. 이는 LLM의 컨텍스트 길이를 초과하기 쉽고, 핵심 정보를 파악하기 어렵습니다. 따라서 이 전체 롤아웃 기록을 LLM을 이용해 간결한 요약으로 압축합니다.

Si=ΠLM[Psum(Ri)]S_i = \Pi_{LM}[P_{sum}(R_i)]
  • RiR_i: ii번째 에이전트의 전체 롤아웃 기록 (모든 행동과 관찰 로그)
  • Psum(Ri)P_{sum}(R_i): 롤아웃 기록을 요약하도록 지시하는 프롬프트
  • ΠLM[]\Pi_{LM}[\cdot]: 요약을 생성하는 언어 모델
  • SiS_i: 생성된 구조화된 요약 (예: 사용한 접근법, 주요 발견, 최종 결과 등)

이 요약은 이후 RTV와 PDR에서 에이전트의 '경험'을 나타내는 핵심 단위로 사용됩니다.

2. RTV (Recursive Tournament Voting)를 통한 병렬 선택

RTV는 여러 개의 독립적인 시도(롤아웃) 중에서 가장 좋은 것을 효율적으로 골라내는 방법입니다. 마치 스포츠 토너먼트처럼, 요약들을 1:1로 비교하여 승자를 가리고, 이 과정을 최종 우승자가 남을 때까지 반복합니다.

def RTV(summaries: list) -> str:
  """요약 리스트를 받아 토너먼트 방식으로 최상의 요약을 선택합니다."""
  if len(summaries) == 1:
    return summaries[0]

  winners = []
  # 요약들을 두 개씩 짝지어 비교
  for i in range(0, len(summaries), 2):
    # 마지막 요약이 홀로 남는 경우, 부전승으로 올림
    if i + 1 >= len(summaries):
        winners.append(summaries[i])
        continue
        
    summary_A = summaries[i]
    summary_B = summaries[i+1]
    
    # LLM에게 어떤 요약이 더 나은 해결책인지 평가하도록 요청
    prompt = f"""
다음 두 가지 해결책 요약 A와 B가 있습니다.
문제 해결에 더 효과적이고 유망한 접근법을 사용한 쪽을 선택해주세요.
'A' 또는 'B' 중 하나로만 답변해주세요.

### 요약 A
{summary_A}

### 요약 B
{summary_B}
"""
    # LLM 호출을 통해 승자 결정 (예: 'A' 또는 'B' 반환)
    winner_choice = LLM(prompt) 
    winner_summary = summary_A if winner_choice == 'A' else summary_B
    winners.append(winner_summary)

  # 승자들을 대상으로 재귀적으로 토너먼트 진행
  return RTV(winners)

3. PDR (Parallel-Distill-Refine)을 통한 순차적 재사용

PDR은 "여러 번 시도해보고, 가장 좋았던 방법에서 배워서 다시 시도하는" 인간의 문제 해결 방식을 모방한 순차적 개선 기법입니다.

1단계: Parallel-Distill (병렬 실행 및 정제)

  • NN개의 에이전트를 독립적으로 병렬 실행하여 NN개의 롤아웃과 요약을 얻습니다.
  • RTV를 사용해 NN개의 요약 중 최상의 요약(best_summary)을 선별합니다.

2단계: Refine (개선)

  • 1단계에서 얻은 best_summary를 "가장 유망했던 이전 시도"라는 형태로 프롬프트에 포함시켜 새로운 에이전트를 실행합니다.
  • 이 새로운 에이전트는 이전의 성공적인 경험을 바탕으로 더 나은 해결책을 탐색하게 됩니다.
# Step 1: Parallel-Distill
num_agents = 10
rollouts = run_agents_in_parallel(num_agents)
summaries = [summarize(r) for r in rollouts]
best_summary = RTV(summaries)

# Step 2: Refine
refine_prompt = f"""
당신은 소프트웨어 엔지니어링 문제를 해결해야 합니다.
이전 시도에서 다음과 같은 접근법이 가장 유망하다는 결론을 얻었습니다.

--- 이전 시도의 교훈 ---
{best_summary}
-------------------------

이 교훈을 바탕으로 문제를 다시 한번 해결해주세요. 이전 시도의 실수를 반복하지 말고, 성공적인 전략을 발전시키세요.
"""
final_rollout = run_agent(refine_prompt)

실험 설정

  • 벤치마크:
    • SWE-Bench Verified: 실제 GitHub 리포지토리의 이슈를 해결하는 현실적인 코드 수정 과제
    • Terminal-Bench v2.0: 터미널 환경에서 파일 시스템 조작, 프로그램 설치 등 복잡한 명령어를 수행하는 과제
  • 모델: GPT-4o, Claude 3 Opus, Gemini 1.5 Pro 등 최신 SOTA LLM 사용
  • 평가 지표: 과제 성공률 (pass@1)
  • 하이퍼파라미터:
    • 병렬 에이전트 수 (NN): 10
    • RTV 비교 그룹 크기: 2 (1:1 비교)

실험 결과 분석

제안된 방법론(PDR)은 모든 벤치마크와 모델에서 기본 에이전트(Baseline) 대비 상당한 성능 향상을 보였습니다.

벤치마크 (GPT-4o 기준) Baseline 성능 PDR 성능 성능 향상률
SWE-Bench Verified 70.9% 77.6% +9.5%
Terminal-Bench v2.0 46.9% 59.1% +25.9%

특히 복잡한 탐색과 여러 단계의 추론이 필요한 Terminal-Bench에서 25%가 넘는 큰 폭의 성능 향상을 보인 점이 인상적입니다. 이는 PDR이 단순한 문제뿐만 아니라 깊은 사고가 필요한 문제 해결에 매우 효과적임을 시사합니다.

Ablation Study (요소별 기여도 분석) 결과, RTV만 사용했을 때도 성능 향상이 있었지만, PDR(RTV + Refine)을 함께 사용했을 때 성능이 가장 크게 향상되었습니다. 이는 여러 시도 중 최선을 고르는 것(RTV)을 넘어, 그 경험을 바탕으로 다시 시도하는(Refine) 과정이 성능 향상에 결정적인 역할을 했음을 의미합니다.

비판적 평가

본 연구는 에이전트 코딩의 성능을 한 단계 끌어올린 중요한 기여를 했지만, 다음과 같은 한계점도 고려해야 합니다.

  • 요약의 품질 의존성: 전체 방법론의 성능은 롤아웃 요약의 품질에 크게 좌우됩니다. 만약 LLM이 롤아웃의 핵심을 제대로 요약하지 못한다면, RTV의 선택이나 PDR의 개선 방향이 잘못될 수 있습니다.
  • 연산 비용 증가: 여러 에이전트를 병렬로 실행하고, 요약 생성 및 RTV를 위한 추가적인 LLM 호출이 필요하므로 상당한 연산 비용과 시간이 소요됩니다. 이는 실시간 적용에 제약이 될 수 있습니다.
  • RTV의 평가 한계: 두 요약 중 어느 것이 더 나은지를 LLM이 항상 정확하게 판단한다고 보장할 수 없습니다. 특히 두 해결책의 장단점이 뚜렷할 경우 평가가 편향될 수 있습니다.

재현성 측면에서는 제안된 알고리즘이 명확하여, 동일한 모델과 환경이 주어진다면 충분히 재현 가능할 것으로 보입니다.

향후 연구 방향

  • 요약 품질 향상: 롤아웃의 핵심적인 성공/실패 요인을 더 정확하게 추출할 수 있는 정교한 요약 프롬프팅 기법이나 파인튜닝 모델 개발이 필요합니다.
  • 비용 효율화: 전체 프로세스의 연산 비용을 줄이기 위해, 불필요한 롤아웃을 조기에 중단하는 가지치기(pruning) 전략이나 더 가벼운 모델을 요약/평가에 활용하는 방안을 연구할 수 있습니다.
  • 다양한 에이전트 태스크 적용: 코드 및 터미널 환경을 넘어, 웹 브라우징, 과학 연구, 게임 등 더 다양한 분야의 에이전트 문제에 제안된 프레임워크를 적용하여 일반화 가능성을 검증할 필요가 있습니다.

실무 적용 가이드

  • 고난도 문제 해결: 해결책의 품질이 매우 중요하고, 약간의 추가 비용을 감수할 수 있는 복잡한 문제(예: 치명적인 버그 수정, 시스템 마이그레이션 자동화)에 PDR을 적용하면 큰 효과를 볼 수 있습니다.
  • 요약 프롬프트 최적화: 좋은 요약을 얻기 위해서는 "어떤 접근법을 사용했는가?", "가장 어려웠던 점은 무엇인가?", "핵심적인 성공 요인은 무엇인가?"와 같이 구조화된 질문을 포함하는 요약 프롬프트를 설계하는 것이 중요합니다.
  • 비용-성능 트레이드오프: 병렬 에이전트 수(NN)를 늘리면 더 다양한 해결책을 탐색할 수 있어 성능이 오를 수 있지만, 비용도 함께 증가합니다. 해결하려는 문제의 중요도와 가용 자원에 맞춰 NN을 조절해야 합니다.

결론

본 연구는 에이전트 코딩에서 발생하는 긴 추론 경로 문제를 '요약'과 '재사용'이라는 직관적이면서도 강력한 아이디어로 해결했습니다. 병렬 탐색의 폭(RTV)과 순차적 개선의 깊이(PDR)를 결합한 이 프레임워크는 LLM 에이전트의 성능을 한계까지 끌어올리는 효과적인 방법을 제시했으며, 앞으로 더 지능적이고 유능한 AI 에이전트를 개발하는 데 중요한 밑거름이 될 것입니다.

참고 자료

댓글