단일 에이전트가 틀리는 이유
하나의 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라운드에서 포화하므로 그 이상은 비용만 늘린다. 셋째, 토론 과정 전체를 로깅해 어느 근거가 답을 뒤집었는지 추적해야 한다. 그래야 실패 사례를 재현하고 프롬프트를 개선할 수 있다. 토론은 만능이 아니라, 정답이 명확한 추론 과제에 한해 검증 축을 하나 더 추가하는 도구다.