logo

토론과 합의

여러 에이전트가 서로의 답을 보고 고치는 멀티 에이전트 토론과 ChatEval·Corex의 협업 방식을 이해하고, 수학 문제로 단일 답변·다수결·토론의 정답률을 비교한다.

  • 멀티 에이전트 토론(multiagent debate): 여러 에이전트가 각자 답한 뒤 서로의 답과 근거를 보고 자기 답을 고치는 과정을 반복해 합의에 이르는 방법.
  • 멀티 에이전트 시스템의 토론 유형, 무 환경. 8주 추론 전략의 자기 일관성(여러 답 + 다수결)에 "서로 보고 고치기"를 더한 것.

Multiagent Debate

  • 절차: ① 각자 독립적으로 답함 → ② 답이 다르면 다른 에이전트들의 답을 보여 주고 자기 답을 개선하게 함 → ③ 합의하거나 정한 라운드가 끝나면 중단.
  • 같은 모델의 인스턴스 여럿을 API로만 써도 됨. 실험은 에이전트 3개, 2라운드(gpt-3.5-turbo).
  • 결과: 산술 67.0% → 81.8%, GSM8K 77.0% → 85.0%(단일 → 토론). 인물 약력 생성의 환각도 줄어듦.

Mermaid 다이어그램 원문

flowchart LR
    Q[질문] --> A1[에이전트 1 답]
    Q --> A2[에이전트 2 답]
    Q --> A3[에이전트 3 답]
    A1 & A2 & A3 --> R["라운드 2: 서로의 답을 보고 수정"]
    R --> C{합의?}
    C -->|예| F[최종 답]
    C -->|아니오| R

대화형 다이어그램을 불러오기 전에는 원문으로 표시됩니다.

출처: Du 외(2023), Improving Factuality and Reasoning in Language Models through Multiagent Debate

ChatEval과 Corex

  • ChatEval: 3주 LLM 심판이 순서 등 내용과 무관한 요인에 흔들리는 문제를 여러 심판의 토론으로 보완. 심판마다 다른 역할(일반 대중, 비평가, 심리학자 등)을 주고 토론 후 다수결·평균. 단일 심판보다 사람의 판단과 잘 일치하고, 같은 역할을 반복하면 효과가 줄어듦 → 역할의 다양성이 중요.
  • Corex: 다수결은 다수가 틀리면 오답이 이기고, 참여자가 많을수록 비싸다는 문제를 지적. 세 가지 방식을 제안.
    • 토론(Discuss): 두 팀으로 나눠 토론, 답이 다르면 심판이 결론.
    • 리뷰(Review): 한 에이전트가 풀이(코드)를 내면 다른 에이전트들이 차례로 검토하고 고침.
    • 검색(Retrieve): 각자 푼 풀이 중 풀이와 답이 가장 충실하게 맞는 것을 고름.
    • 출처: Sun 외(2023), Corex

토론의 위험

  • 같은 모델끼리는 같은 편향을 공유 → 모두 같은 오답을 내면 다수결로도 토론으로도 못 고침.
  • 동조(conformity): 맞는 답을 낸 에이전트가 다수의 오답에 설득될 수 있음.
  • 비용: 에이전트 수 × 라운드 수만큼 호출. 같은 예산으로 단일 에이전트 다수결과 비교해야 공정.
  • 그래서 다른 모델·다른 역할을 섞거나, 코드 실행 같은 외부 근거로 검증함.

실습: 에이전트 셋의 수학 토론

  • 같은 모델이 가끔 틀리는 수학 문장제 3개. 에이전트 3개, 2라운드.
  • 비교: 단일 답변(라운드 1의 답 각각), 다수결(라운드 1 다수), 토론(라운드 2 다수).
!pip install -q openai
from pathlib import Path
from openai import OpenAI

client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=Path("openrouter-key.txt").read_text().strip(),
)
model = "openai/gpt-4.1-mini"
problems = [
    ("달팽이가 깊이 10m인 우물 바닥에서 낮에 3m 올라가고 밤에 2m 미끄러진다. "
     "며칠째 낮에 우물을 빠져나오는가?", 8),
    ("세 자리 자연수 중 각 자리 숫자의 합이 10인 수는 몇 개인가?", 54),
    ("7로 나누면 나머지가 3이고 5로 나누면 나머지가 2인 가장 작은 두 자리 자연수는?", 17),
]
  • ask: 풀이 마지막 줄의 답: 숫자를 정규 표현식으로 꺼냄. temperature=1로 에이전트마다 다른 풀이가 나오게 함.
  • 라운드 2에서는 자기 풀이와 다른 두 에이전트의 풀이를 보여 주고 다시 답하게 함.
import re
from collections import Counter
from concurrent.futures import ThreadPoolExecutor

FORMAT = "풀이를 짧게 쓰고 마지막 줄에 '답: 숫자' 형식으로 답하라."

def ask(prompt):
    text = client.chat.completions.create(model=model, temperature=1,
        messages=[{"role": "user", "content": prompt}]).choices[0].message.content
    found = re.findall(r"답:\s*(\d+)", text)
    return text, int(found[-1]) if found else None

def debate(q, n=3):
    with ThreadPoolExecutor() as ex:
        r1 = list(ex.map(ask, [f"{q}\n{FORMAT}"] * n))  # 라운드 1: 각자 풀기
        others = lambda i: "\n\n".join(t for j, (t, _) in enumerate(r1) if j != i)
        r2 = list(ex.map(ask, [f"문제: {q}\n\n[내 풀이]\n{r1[i][0]}\n\n[다른 에이전트의 풀이]\n{others(i)}"
                               f"\n\n다른 풀이를 참고해 다시 답하라. {FORMAT}" for i in range(n)]))
    return [a for _, a in r1], [a for _, a in r2]
for q, truth in problems:
    r1, r2 = debate(q)
    vote1, vote2 = (Counter(r).most_common(1)[0][0] for r in (r1, r2))
    print(f"정답 {truth} | 라운드1 {r1} → 다수결 {vote1} | 라운드2 {r2} → 토론 {vote2}")
실행 결과
정답 8 | 라운드1 [10, 10, 8] → 다수결 10 | 라운드2 [8, 8, 10] → 토론 8
정답 54 | 라운드1 [54, 55, 54] → 다수결 54 | 라운드2 [54, 54, 55] → 토론 54
정답 17 | 라운드1 [52, 17, 17] → 다수결 17 | 라운드2 [17, 17, 17] → 토론 17
  • 위 실행(실행마다 달라짐)의 흐름
    • 달팽이 문제: 라운드 1에서 정답 8은 1명뿐이라 다수결은 10(오답). 라운드 2에서 두 에이전트가 8로 바꿔 토론은 정답 → 소수의 맞는 풀이가 다수를 설득.
    • 자릿수 합 문제: 다수결과 토론 모두 정답이지만, 라운드 1에서 54(정답)를 낸 에이전트 하나가 라운드 2에서 55로 바꿈 → 동조가 오답 쪽으로도 일어남.
    • 17 문제: 혼자 52라고 답한 에이전트가 17로 고침.
  • 다른 실행에서는 동조 때문에 토론이 다수결보다 나쁜 결과도 나옴. 문제 3개로는 어느 쪽이 낫다고 말할 수 없음.

생각해 볼 점

  • 문제 3개짜리 실험은 한 문제만 바뀌어도 정답률이 33%p 달라짐. 결론을 내리려면 문제 수와 반복 횟수를 늘려야 함.
  • 공정한 비교: 토론은 문제당 6번 호출. 같은 예산이면 단일 에이전트에게 6번 풀게 하고 다수결할 수도 있음.
  • 다른 모델이나 다른 역할을 섞으면 "다른 생각"이 생겨 토론의 효과가 커질 수 있음.

퀴즈

문제 1 / 5맞음: 0힌트: 0틀림: 0채점중: 0남음: 5

Multiagent Debate에서 두 번째 라운드부터 각 에이전트가 하는 일은?

  • ○다른 에이전트들의 답과 근거를 보고 자기 답을 고친다
  • ○다른 에이전트의 답을 무시하고 처음부터 다시 푼다
  • ○심판의 지시에 따라 답을 그대로 베낀다
  • ○모델의 가중치를 미세조정한다

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.