단일 에이전트가 틀리는 이유

하나의 LLM 호출은 첫 토큰부터 마지막 토큰까지 자기 자신의 초반 판단에 갇힌다. 초기 추론이 어긋나면 뒤 문장은 그 오류를 정당화하는 방향으로 이어진다. 온도를 낮추거나 프롬프트를 다듬어도 이 편향은 사라지지 않는다. 근본 원인은 "검증 주체가 생성 주체와 동일"하다는 점이다. 사람이 초안을 쓰고 다른 사람이 검토하듯, 생성과 반박을 분리하면 이 고착을 깰 수 있다.

멀티 에이전트 토론의 핵심 아이디어

같은 질문을 서로 다른 에이전트 N개에게 독립적으로 풀게 한 뒤, 각자의 답과 근거를 다른 에이전트들에게 보여주고 재검토하게 한다. 이를 라운드로 반복하면 명백한 오답은 다수 근거에 의해 교정되고, 옳은 답은 라운드가 지나도 유지되어 수렴한다. 단순 다수결(self-consistency)과 달리, 토론은 근거를 주고받으므로 소수라도 논리가 탄탄한 답이 살아남을 수 있다.

기본 토론 루프 구현

import anthropic

client = anthropic.Anthropic()
MODEL = "claude-opus-4-8"

def ask(question, peers=None):
    ctx = ""
    if peers:
        ctx = "다른 에이전트들의 답변:\n" + "\n---\n".join(peers)
        ctx += "\n\n위 근거를 비판적으로 검토하고, 필요하면 답을 수정하라."
    msg = client.messages.create(
        model=MODEL, max_tokens=1024,
        messages=[{"role": "user",
                   "content": f"{question}\n\n{ctx}\n최종답과 근거를 제시하라."}],
    )
    return msg.content[0].text

def debate(question, n_agents=3, rounds=2):
    answers = [ask(question) for _ in range(n_agents)]
    for _ in range(rounds - 1):
        answers = [ask(question, peers=answers[:i] + answers[i+1:])
                   for i in range(n_agents)]
    return answers  # 이후 집계 단계로 전달

답 집계: 다수결보다 판정자

수렴한 답이 완전히 일치하지 않을 때가 많다. 문자열 매칭 대신 별도의 판정(judge) 에이전트에게 최종 답들을 넘겨 결정하게 하면 형식 차이에 강해진다.

def judge(question, answers):
    joined = "\n---\n".join(f"[{i}] {a}" for i, a in enumerate(answers))
    verdict = client.messages.create(
        model=MODEL, max_tokens=512,
        messages=[{"role": "user", "content":
            f"질문:\n{question}\n\n후보 답변:\n{joined}\n\n"
            "가장 근거가 타당한 최종 답 하나만 출력하라."}],
    )
    return verdict.content[0].text

언제 이득이고 언제 낭비인가

토론은 공짜가 아니다. N개 에이전트 × R라운드만큼 호출 비용과 지연이 곱으로 늘어난다. 아래처럼 과제 유형에 따라 취사선택해야 한다.

과제 유형단일 호출다수결토론
단순 조회·번역적합과잉과잉
수학·논리 추론불안정개선가장 효과적
사실 검증·코드 리뷰편향 위험보통효과적
창작·요약적합모호수렴 어려움

정답이 하나로 정의되는 과제일수록 이득이 크고, 열린 생성 과제에서는 오히려 답이 밋밋한 평균으로 수렴한다.

비용을 통제하는 실전 설정

무조건 3~5개를 돌리기보다, 초기 답의 불일치도가 높을 때만 라운드를 추가하는 조기 종료가 효율적이다. 모든 에이전트가 첫 라운드에서 동일 결론에 도달하면 즉시 종료한다.

# config.yaml
debate:
  n_agents: 3
  max_rounds: 3
  early_stop:
    # 첫 라운드 답이 모두 일치하면 라운드 생략
    on_unanimous: true
    # 일치도가 이 값 이상이면 판정 없이 채택
    agreement_threshold: 0.8
  judge_model: claude-opus-4-8
  worker_model: claude-haiku-4-5-20251001  # 워커는 저비용 모델로

워커에 저비용 모델, 판정에 고성능 모델을 섞으면 정확도 손실 없이 비용을 절반 가까이 줄일 수 있다.

주의점

세 가지를 조심한다. 첫째, 에이전트에게 같은 프롬프트·같은 모델을 그대로 쓰면 오답이 서로를 강화하는 집단 편향이 생긴다. 온도, 역할(반론자·검증자), 관점을 의도적으로 다르게 부여해야 한다. 둘째, 라운드를 늘려도 정확도는 대개 2~3라운드에서 포화하므로 그 이상은 비용만 늘린다. 셋째, 토론 과정 전체를 로깅해 어느 근거가 답을 뒤집었는지 추적해야 한다. 그래야 실패 사례를 재현하고 프롬프트를 개선할 수 있다. 토론은 만능이 아니라, 정답이 명확한 추론 과제에 한해 검증 축을 하나 더 추가하는 도구다.