콘텐츠로 이동

Self-Consistency Prompting

개념

Self-Consistency는 Wang et al. (2022)가 제안한 기법으로, 하나의 추론 경로가 아닌 여러 개의 추론 경로를 샘플링한 후, 가장 많이 나온 답변을 최종 답으로 선택하는 방식입니다. 복잡한 추론 작업에서 정확도를 획기적으로 향상시킵니다.

Wang et al. (2022) 연구

핵심 아이디어

Chain-of-Thought의 문제점: - CoT도 인간처럼 때로 틀린 추론을 할 수 있음 - 단일 경로만 시도하면 잘못된 길로 갈 수 있음

Self-Consistency의 해결책: - 여러 추론 경로 샘플링 (예: 5~10개) - 각 경로의 최종 답 수집 - 투표 메커니즘: 가장 많이 나온 답을 선택

작동 원리

입력 문제
[경로 1] → 추론 과정 → 답변 A
[경로 2] → 추론 과정 → 답변 A
[경로 3] → 추론 과정 → 답변 B
[경로 4] → 추론 과정 → 답변 A
[경로 5] → 추론 과정 → 답변 C
투표: A(3표) > B(1표), C(1표)
최종 답변: A

실전 예제

1. 수학 문제 - 기본 예제

프롬프트:
다음 문제를 5번 독립적으로 풀어주세요.
각 풀이는 다른 방식으로 접근해도 좋습니다.

문제: 한 상자에 사탕이 48개 들어있습니다.
3명이 같은 양을 나누어 가지면, 
1명이 가지는 사탕의 개수는 몇 개입니까?

시도 1 (단계별로 풀이):
...

시도 2 (다른 방식으로):
...

시도 3:
...

시도 4:
...

시도 5:
...

각 시도의 최종 답변을 정리해주세요.

2. 논리 추론 문제

프롬프트:
다음 추론 문제를 여러 방식으로 풀어주세요.
최종 답을 먼저 쓰지 말고 과정을 설명한 후 답을 제시하세요.

문제:
- 김철수는 의사이거나 변호사이다.
- 박영미는 변호사이거나 교사이다.
- 김철수와 박영미는 모두 다른 직업이다.
- 만약 김철수가 의사라면, 박영미는 무엇입니까?

풀이 방법 1:
귀납법으로 접근...

풀이 방법 2:
배제법으로 접근...

풀이 방법 3:
표를 만들어 접근...

3. 한국어 수학 문제 예제

프롬프트:
다음 문제를 3가지 다른 방식으로 풀어주세요.

문제: 어떤 수에 3을 곱한 후 5를 더하면 20입니다. 
이 수는 무엇입니까?

풀이 1 (역산 방식):
20에서 5를 빼면: 20 - 5 = 15
15를 3으로 나누면: 15 ÷ 3 = 5
답: 5

풀이 2 (방정식 방식):
미지수를 x라 하면: 3x + 5 = 20
양변에서 5를 빼면: 3x = 15
양변을 3으로 나누면: x = 5
답: 5

풀이 3 (검증 방식):
x = 5라고 가정
3 × 5 + 5 = 15 + 5 = 20 ✓
답: 5

결과: 모든 풀이가 5를 제시 → 최종 답: 5

성능 개선 예시

데이터로 본 효과

Wang et al. (2022)의 실험 결과:

벤치마크: GSM8K (초등학교 수학 문제)

CoT (1개 경로):         78.7%
Self-Consistency (5개):  88.3%
Self-Consistency (10개): 91.3%

벤치마크: SVAMP (단어 문제)

CoT (1개 경로):         68.5%
Self-Consistency (5개):  81.2%
Self-Consistency (10개): 84.7%

안정성 향상

단일 경로와 다중 경로 비교:

개별 시도 정확도: 70%
(우연에 의존하는 경우 많음)

Self-Consistency (5 시도): 92%
(우연의 영향 최소화)

구현 방식

프롬프트 기반 (권장)

프롬프트:
다음 문제를 여러 방식으로 풀어주세요.
각 풀이마다 다른 접근 방식을 사용해주세요.

문제: [문제]

풀이 1: [첫 번째 방식 설명 및 풀이]
최종 답: [답]

풀이 2: [두 번째 방식 설명 및 풀이]
최종 답: [답]

풀이 3: [세 번째 방식 설명 및 풀이]
최종 답: [답]

가장 많은 풀이가 같은 답을 제시했으므로, 
최종 답은: [가장 많은 답]

프로그래밍 기반 (API 사용 시)

def self_consistency_sampling(problem, num_samples=5):
    answers = []
    reasoning_paths = []

    for i in range(num_samples):
        response = call_llm(
            prompt=f"다음 문제를 풀어주세요: {problem}",
            temperature=0.7  # 다양한 샘플링을 위해 높은 온도
        )
        answers.append(extract_final_answer(response))
        reasoning_paths.append(response)

    # 투표 메커니즘
    final_answer = max(set(answers), key=answers.count)

    return final_answer, reasoning_paths

비용 vs 성능 분석

샘플 수에 따른 성능

샘플 수 | 정확도 | 토큰 소비 | 비용 | 속도
--------|--------|----------|------|-----
  1개   | 78.7%  | 100%     | 1x   | 빠름
  3개   | 85.2%  | 300%     | 3x   | 중간
  5개   | 88.3%  | 500%     | 5x   | 느림
  10개  | 91.3%  | 1000%    | 10x  | 매우 느림

권장 샘플 수

  • 고정확도 필요: 5-10개 샘플
  • 균형잡힌 선택: 3-5개 샘플
  • 빠른 응답 중요: 2-3개 샘플

💡 실전 팁

효과적인 Self-Consistency

  1. 온도 높이기: sampling_temperature = 0.7~0.9 (다양성 증가)
  2. 충분한 샘플: 최소 3개, 권장 5-10개
  3. 다양한 접근: 각 시도가 다른 방식을 사용하도록 명시
  4. 명확한 형식: "최종 답:" 같은 명확한 표시
  5. 투표 방식: 동점 시 처리 방법 미리 정하기

Self-Consistency 프롬프트 템플릿

다음 문제를 5가지 다른 방식으로 풀어주세요.
각 풀이마다 새로운 관점으로 접근하세요.

문제: [문제]

풀이 1 (방식 A):
[풀이 과정]
최종 답: [답]

... (풀이 2~5 반복)

가장 많이 나온 답을 최종 답으로 선택하세요.

주의사항

  • 토큰 비용이 샘플 수에 비례해 증가
  • 매우 어려운 문제는 모두 틀릴 수도 있음
  • 동점 시 처리 방법이 미리 명확해야 함

CoT와 Self-Consistency 비교

측면 Chain-of-Thought Self-Consistency
정확도 중간~높음 매우 높음
토큰 사용 중간 높음 (샘플 수배)
속도 빠름 느림
비용 낮음 높음
구현 복잡도 낮음 중간
안정성 중간 높음

📝 핵심 정리

  • Self-Consistency는 여러 추론 경로를 샘플링하고 투표로 최적 답 선택
  • Wang et al. (2022)가 제안하여 대폭적인 성능 향상 입증
  • Chain-of-Thought와 함께 사용하면 최고의 결과 달성
  • 3-5개 샘플이 비용 대비 성능이 최적
  • 수학 문제와 논리 추론에 특히 효과적
  • 높은 정확도가 필수적인 경우에 권장
  • 토큰 비용과 성능 사이의 균형 고려 필요