Chain-of-Thought (CoT)
Chain-of-Thought는 AI가 최종 답변에 도달하기 전에 사고 과정을 단계별로 표시하도록 하는 프롬프팅 기법입니다. 복잡한 추론, 수학 문제, 다단계 분석에서 정확도를 크게 향상시킵니다.
"단계별 사고 과정 표시" - AI가 답을 내기 전에 중간 추론 단계를 명시하도록 유도하는 기법입니다.
3가지 핵심 개념:
- Zero-shot CoT: "단계별로 생각해봅시다" 한 문장 추가
- Few-shot CoT: 예제에 추론 과정 포함
- Self-Consistency: 여러 추론 경로 생성 → 가장 일관된 답 선택
언제 사용? "복잡한 문제를 단계별로 풀어야 할 때" - 수학 문제, 다단계 분석, 코드 디버깅, 의사결정 등
마법의 문구: 단계별로 생각해봅시다 (Let's think step by step)
CoT란?
Chain-of-Thought(CoT)는 2022년 Google Research의 Jason Wei 등이 발표한 기법으로, LLM이 중간 추론 단계를 명시적으로 출력하도록 유도합니다. 원 논문은 NeurIPS 2022에 게재되었으며, PaLM 540B 모델로 GSM8K 수학 벤치마크에서 기존 SOTA(55%)를 넘어서는 58% 정확도를 달성했습니다. 이후 Self-Consistency 기법과 결합하여 74%까지 향상되었습니다.
CoT의 효과는 모델 파라미터 수에 따라 나타나는 기현 현상(emergent property)입니다. 원 논문 실험에서는 ~100B 이상의 파라미터를 가진 모델에서만 유의미한 개선이 확인되었습니다. 소규모 모델(7B, 13B 등)에서는 CoT가 오히려 성능을 저하시킬 수 있으므로, 충분히 큰 모델에서 사용하는 것이 중요합니다.
CoT 유무 비교
질문: 사과 15개를 3명이 똑같이 나눈 후, 각자 2개씩 더 받았습니다. 한 명당 몇 개인가요?
답변: 7개입니다.
# 추론 과정 없음 → 오답 가능성 높음
질문: 사과 15개를 3명이 똑같이 나눈 후, 각자 2개씩 더 받았습니다. 한 명당 몇 개인가요?
단계별 풀이:
1. 처음 15개를 3명이 나눔: 15 ÷ 3 = 5개씩
2. 각자 2개씩 더 받음: 5 + 2 = 7개
3. 최종 답: 한 명당 7개
답변: 7개입니다.
# 추론 과정 명시 → 정확도 향상
그림 1: Chain-of-Thought 적용 전후 비교 - 단계별 추론으로 정확도 향상
CoT 기법 종류
그림 2: CoT 기법 계보도 - 기본 CoT에서 파생된 주요 확장 기법들의 관계
1. Zero-shot CoT
예제 없이 간단한 프롬프트만으로 CoT를 유도합니다.
마법의 문구: "단계별로 생각해봅시다" (Let's think step by step)
문제: 한 달에 30일이 있고, 매일 3페이지씩 책을 읽으면 450페이지 책을 다 읽는 데 며칠 걸리나요?
단계별로 생각해봅시다:
# 모델이 자동으로 단계를 생성
1. 총 페이지 수: 450페이지
2. 하루에 읽는 페이지: 3페이지
3. 필요한 일수: 450 ÷ 3 = 150일
4. 따라서 150일이 걸립니다.
2. Few-shot CoT
예제에 추론 과정을 포함시켜 모델이 패턴을 파악하게 합니다.
다음 문제를 단계별로 풀어주세요:
예시 1:
문제: 연필 12자루를 4명이 나눕니다. 한 명당 몇 자루인가요?
풀이:
1. 총 연필 수: 12자루
2. 나눌 사람 수: 4명
3. 계산: 12 ÷ 4 = 3자루
답: 한 명당 3자루
예시 2:
문제: 사탕 20개를 5명이 나누고, 각자 3개씩 더 받습니다. 한 명당 몇 개인가요?
풀이:
1. 처음 나눔: 20 ÷ 5 = 4개씩
2. 추가로 받음: 4 + 3 = 7개
3. 최종 답: 한 명당 7개
답: 한 명당 7개
이제 다음 문제를 풀어주세요:
문제: 초콜릿 36개를 6명이 나누고, 각자 2개씩 덜 줍니다. 한 명당 몇 개인가요?
풀이:
3. Self-Consistency CoT
여러 추론 경로를 생성하고 가장 일관된 답을 선택합니다.
from anthropic import Anthropic
from collections import Counter
client = Anthropic()
problem = "사과 18개를 3명이 나누고, 각자 3개씩 더 받습니다. 한 명당 몇 개?"
prompt = f"{problem}\n\n단계별로 생각해봅시다:"
# 여러 번 실행하여 다양한 추론 경로 생성
answers = []
for _ in range(5):
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=512,
temperature=0.7, # 다양성 확보
messages=[{"role": "user", "content": prompt}]
)
response = message.content[0].text
# 최종 답만 추출 (예: "9개")
answer = extract_final_answer(response)
answers.append(answer)
# 가장 많이 나온 답 선택
most_common = Counter(answers).most_common(1)[0][0]
print(f"최종 답: {most_common}")
print(f"모든 답: {answers}")
Self-Consistency 실행 결과 예시
문제: 사과 18개를 3명이 나누고, 각자 3개씩 더 받습니다. 한 명당 몇 개?
═══ 실행 1 (temperature=0.7) ═══
1단계: 18 ÷ 3 = 6개씩
2단계: 6 + 3 = 9개
답: 9개 ✅
═══ 실행 2 (temperature=0.7) ═══
1단계: 처음 나눔 → 18 / 3 = 6
2단계: 추가 받음 → 6 + 3 = 9
답: 9개 ✅
═══ 실행 3 (temperature=0.7) ═══
1단계: 총 사과 = 18 + (3×3) = 27개
2단계: 27 ÷ 3 = 9개
답: 9개 ✅ (다른 경로, 같은 답)
═══ 실행 4 (temperature=0.7) ═══
1단계: 각자 받을 기본 = 18 ÷ 3 = 6
2단계: 추가 = 3개
3단계: 합계 = 6 + 3 = 9
답: 9개 ✅
═══ 실행 5 (temperature=0.7) ═══
1단계: 18 ÷ 3 = 6개
2단계: 6 + 3 = 8개 # 계산 실수
답: 8개 ❌ (소수 의견)
═══ 투표 결과 ═══
9개: ████ (4표) ← 최종 답 선택
8개: █ (1표)
최종 답: 9개 (신뢰도 80%)
═══ 효과 ═══
- 단일 실행: 20% 확률로 8개 오답 가능
- Self-Consistency: 다수결로 정답 9개 선택
- 정확도 향상: 80% → 95%+ (오답 걸러냄)
- 다양한 경로: 동일한 문제를 다르게 접근 (실행 1,2 vs 실행 3)
- 오류 감지: 소수 의견(8개)을 자동으로 제거
- 신뢰도 측정: 투표 비율로 답의 확실성 판단
- 비용 트레이드오프: 5배 비용으로 정확도 15-20% 향상
그림 3: Self-Consistency - 동일한 문제를 여러 경로로 풀고 다수결로 정답 선택
언제 CoT를 사용하나요?
| 작업 유형 | CoT 필요성 | 예시 |
|---|---|---|
| 수학/논리 문제 | ✅ 필수 | 계산, 추론, 증명 |
| 다단계 분석 | ✅ 강력 권장 | 데이터 분석, 의사결정 |
| 디버깅 | ✅ 유용 | 코드 오류 분석 |
| 복잡한 질문 | ✅ 유용 | "왜?", "어떻게?" 질문 |
| 간단한 사실 질문 | ❌ 불필요 | "수도는?" "색깔은?" |
| 분류 작업 | ⚠️ 선택적 | 감정 분석, 태깅 |
실전 예시
예시 1: 수학 문제
문제:
한 상점에서 티셔츠를 개당 15,000원에 팔고 있습니다.
오늘은 20% 할인 행사를 하고, 3개 이상 구매 시 추가로 10% 할인을 해줍니다.
5개를 구매하면 총 얼마를 지불해야 하나요?
단계별로 계산해주세요:
1단계: 원가 계산
- 개당 가격: 15,000원
- 5개 가격: 15,000 × 5 = 75,000원
2단계: 첫 번째 할인 (20%)
- 할인액: 75,000 × 0.2 = 15,000원
- 할인 후: 75,000 - 15,000 = 60,000원
3단계: 추가 할인 (3개 이상 구매 시 10%)
- 조건 충족: 5개 > 3개 ✓
- 추가 할인액: 60,000 × 0.1 = 6,000원
- 최종 가격: 60,000 - 6,000 = 54,000원
답: 54,000원
예시 2: 코드 디버깅
다음 코드의 버그를 단계별로 분석하세요:
```python
def calculate_average(numbers):
total = 0
for num in numbers:
total += num
return total / len(numbers)
data = [10, 20, 30, 40, 50]
result = calculate_average(data)
print(result) # 예상: 30, 실제: 오류
```
단계별 분석:
1단계: 함수 로직 검토
- total 초기화: 0 ✓
- 루프로 합산: ✓
- 평균 계산: total / len(numbers) ✓
→ 로직 자체는 정상
2단계: 예외 상황 확인
- numbers가 빈 리스트일 때?
- len([]) = 0
- total / 0 → ZeroDivisionError 발생 ❌
3단계: 테스트 케이스 분석
- data = [10, 20, 30, 40, 50]
- len(data) = 5 (≠ 0)
- 이 경우는 오류 없음
→ 하지만 빈 리스트 입력 시 문제 발생
4단계: 버그 정리
- **버그:** 빈 리스트 처리 부재
- **심각도:** MEDIUM
- **발생 조건:** len(numbers) == 0
5단계: 수정 방안
```python
def calculate_average(numbers):
if not numbers: # 빈 리스트 체크
return 0 # 또는 None, 또는 예외 발생
total = 0
for num in numbers:
total += num
return total / len(numbers)
```
최종 결론:
- 원래 코드는 주어진 데이터에서 작동하지만, 빈 리스트 입력 시 예외 발생
- 방어 코드 추가로 안정성 확보
예시 3: 의사결정
상황:
- 스타트업 초기 단계 (팀 3명)
- MVP 웹 애플리케이션 개발
- 개발 기간: 2개월
- 팀 기술 스택: JavaScript 능숙, Python 기본
선택지: React vs Vue vs Angular
단계별 분석:
1단계: 각 프레임워크 특징 정리
React:
- 장점: 생태계 풍부, 구인 용이, 유연성 높음
- 단점: 학습 곡선 중간, 추가 라이브러리 필요
Vue:
- 장점: 학습 곡선 낮음, 문서 훌륭, 빠른 개발
- 단점: 생태계 작음, 대기업 지원 약함
Angular:
- 장점: 완전한 프레임워크, TypeScript 기본
- 단점: 학습 곡선 높음, 무거움
2단계: 요구사항 우선순위
1) 빠른 개발 속도 (2개월 마감) - 최우선
2) 팀 학습 시간 최소화 (이미 JS 숙련) - 중요
3) 향후 확장성 및 유지보수 - 중요
3단계: 각 선택지 평가
React:
- 개발 속도: ⭐⭐⭐ (생태계 덕분에 빠름)
- 학습: ⭐⭐⭐ (JS 숙련자에게 적합)
- 확장성: ⭐⭐⭐⭐⭐ (매우 우수)
총점: 11/15
Vue:
- 개발 속도: ⭐⭐⭐⭐⭐ (가장 빠름)
- 학습: ⭐⭐⭐⭐⭐ (가장 쉬움)
- 확장성: ⭐⭐⭐ (괜찮음)
총점: 13/15
Angular:
- 개발 속도: ⭐⭐ (설정 복잡)
- 학습: ⭐⭐ (어려움)
- 확장성: ⭐⭐⭐⭐ (우수)
총점: 8/15
4단계: 리스크 평가
Vue 선택 시:
- 리스크: 나중에 대규모 팀 확장 시 구인 어려움
- 완화 방안: MVP 성공 후 React 마이그레이션 고려 가능
React 선택 시:
- 리스크: 초기 설정과 라이브러리 선택에 시간 소요
- 완화 방안: Create React App, Next.js 같은 보일러플레이트 사용
5단계: 최종 결정
**추천: Vue**
근거:
1. 2개월 마감이 최우선 → Vue가 가장 빠름
2. 팀이 작고 JS 숙련 → Vue의 간결함이 효율적
3. MVP 단계 → 대규모 생태계는 현재 불필요
4. 학습 곡선 최소 → 즉시 생산성 확보
5. 향후 마이그레이션 가능 → 리스크 관리 가능
단, 향후 팀 규모 확장 시 React 전환 검토 권장
고급 패턴
1. Least-to-Most Prompting
복잡한 문제를 작은 하위 문제로 분해한 후 순차적으로 해결합니다.
문제: 웹 애플리케이션 성능을 50% 향상시키세요.
먼저 이 문제를 작은 하위 문제들로 나누겠습니다:
하위 문제 1: 현재 성능 병목 지점 식별
→ 해결: 프로파일링 도구 사용, 네트워크 탭 분석, Lighthouse 실행
하위 문제 2: 프론트엔드 최적화
→ 해결: 코드 스플리팅, 이미지 최적화, lazy loading
하위 문제 3: 백엔드 최적화
→ 해결: 데이터베이스 인덱스, 캐싱, 쿼리 최적화
하위 문제 4: 네트워크 최적화
→ 해결: CDN 사용, HTTP/2, Gzip 압축
하위 문제 5: 측정 및 검증
→ 해결: A/B 테스트, 성능 지표 모니터링
각 하위 문제를 순차적으로 해결하면 전체 50% 향상 목표 달성 가능
2. Tree of Thoughts
CoT가 단일 추론 경로를 따르는 반면, Tree of Thoughts(ToT)는 여러 추론 경로를 트리 구조로 탐색합니다. 각 "생각(thought)"을 평가하고, 유망하지 않은 경로는 백트래킹하여 최적 경로를 찾습니다. Yao et al.(2023)이 제안한 이 기법은 퍼즐, 전략 게임, 창의적 글쓰기 등 탐색이 필요한 복잡한 문제에 효과적입니다.
문제: 숫자 [2, 7, 8, 3]을 사용하여 24를 만드세요. (+, -, ×, ÷ 사용 가능)
추론 트리 탐색 (BFS 방식, depth=3):
═══ 레벨 1: 첫 번째 연산 ═══
생각 1a: 2 + 7 = 9 → 평가: 유망 (큰 수)
생각 1b: 2 × 7 = 14 → 평가: 유망 (큰 수)
생각 1c: 7 - 2 = 5 → 평가: 보통
생각 1d: 7 ÷ 2 = 3.5 → 평가: 탈락 (소수 불리)
═══ 레벨 2: 백트래킹 - 생각 1a, 1b만 확장 ═══
생각 1a → 생각 2a: 9 × 8 = 72 → 평가: 탈락 (너무 큼)
생각 1a → 생각 2b: 9 - 8 = 1 → 평가: 탈락 (너무 작음)
생각 1b → 생각 2c: 14 - 8 = 6 → 평가: 유망
생각 1b → 생각 2d: 14 + 3 = 17 → 평가: 탈락
═══ 레벨 3: 생각 2c만 확장 ═══
생각 2c → 생각 3a: 6 × 3 = 18 → 평가: 탈락 (≠ 24)
생각 2c → 생각 3b: 6 + 3 = 9 → 평가: 탈락 (≠ 24)
═══ 백트래킹: 생각 1b에서 다른 분기 탐색 ═══
생각 1b → 생각 4a: 14 × 3 = 42 → 평가: 탈락 (너무 큼)
생각 1b → 생각 4b: 14 + 3 = 17 → 평가: 탈락
═══ 새로운 첫 번째 연산 시도 ═══
생각 5a: 8 ÷ 2 = 4 → 평가: 유망 (24의 약수)
생각 5a → 생각 6a: 4 × 7 = 28 → 평가: 유망
생각 6a → 생각 7a: 28 - 3 = 25 → 평가: 탈락 (≠ 24)
생각 5a → 생각 6b: 4 × 3 = 12 → 평가: 유망 (24의 절반)
생각 6b → 생각 7b: 12 + 7 = 19 → 평가: 탈락
생각 6b → 생각 7c: 12 × (7-3) → 불가 (이미 사용)
═══ 성공 경로 발견 ═══
생각 8a: 8 - 2 = 6 → 평가: 유망
생각 8a → 생각 9a: 6 × (7-3) = 24 → 정답!
═══ 최종 결과 ═══
정답: (8 - 2) × (7 - 3) = 24
탐색한 경로: 12개 | 백트래킹: 5회 | 최종 성공: 1개
3. ReAct (Reasoning + Acting)
ReAct(Yao et al., 2022)는 CoT의 추론(reasoning) 능력과 외부 도구 실행(acting)을 교차시킵니다. 모델이 "추론 → 도구 호출 → 관찰 → 추론" 순서로 반복하여, 실시간으로 정보를 조회하면서 문제를 해결합니다. 오늘날 대부분의 AI 에이전트(Claude Tool Use, ChatGPT Plugins 등)의 기반 기법입니다.
질문: "2024년 노벨 문학상 수상자의 첫 소설 제목은?"
═══ 반복 1: 추론 ═══
Thought: 2024년 노벨 문학상 수상자를 먼저 검색해야 한다.
Action: web_search("2024 Nobel Prize Literature winner")
Observation: 한강 (Han Kang) - 한국 작가
═══ 반복 2: 추론 ═══
Thought: 한강의 첫 번째 소설을 찾아야 한다.
Action: web_search("한강 작가 첫 소설")
Observation: 『채식주의자』(2007)
═══ 반복 3: 추론 → 답변 ═══
Thought: 첫 소설이 『채식주의자』인지 확인했다. 이제 답변을 생성한다.
Answer: 2024년 노벨 문학상 수상자 한강의 첫 소설은
『채식주의자』(2007)입니다.
베스트 프랙티스
1. 명시적 지시
"단계별로", "차근차근", "먼저...그 다음..." 같은 명확한 지시를 사용하세요.
✅ 좋은 예시
"다음 문제를 단계별로 풀어주세요. 각 단계를 명확히 표시하세요."
"먼저 A를 분석하고, 그 다음 B를 평가한 후, 마지막으로 결론을 도출하세요."
❌ 나쁜 예시
"문제를 풀어주세요." # 너무 모호
2. 구조화된 출력
단계 번호, 제목, 구분선을 사용하여 추론 과정을 명확히 하세요.
다음 형식으로 답변하세요:
## 단계 1: [단계명]
[내용]
## 단계 2: [단계명]
[내용]
## 단계 3: [단계명]
[내용]
## 최종 답변
[요약 및 결론]
3. 자가 검증 추가
모델이 자신의 추론을 검증하도록 요청하세요.
문제: [수학 문제]
단계별로 풀이한 후, 다음을 수행하세요:
1. 풀이 과정 작성
2. 답 도출
3. 답을 문제에 대입하여 검증
4. 검증 결과 명시
예시:
## 풀이
...
## 답
x = 5
## 검증
문제에 x = 5를 대입:
2x + 3 = 13
2(5) + 3 = 10 + 3 = 13 ✓
검증 성공
CoT 성능 개선 팁
1. temperature 조정
복잡한 추론에는 낮은 temperature(0.2~0.5)를 사용하여 일관성을 높이세요.
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=2048,
temperature=0.3, # 낮은 온도 → 일관된 추론
messages=[{"role": "user", "content": cot_prompt}]
)
2. 충분한 max_tokens
CoT는 출력이 길므로 max_tokens를 충분히 설정하세요 (최소 1024, 권장 2048+).
3. Few-shot + CoT 조합
예제에 추론 과정을 포함시켜 패턴을 학습시키면 더욱 효과적입니다.
한계와 주의사항
1. 비용 증가
CoT는 출력 토큰이 많아 비용이 증가합니다. 예를 들어, 수학 한 문제에 대해 CoT를 적용하면 200~500 토큰의 추가 출력이 발생합니다. Self-Consistency는 동일한 문제를 5~40번 반복 실행하므로 비용이 5~40배로 늘어납니다. 간단한 질문에는 Zero-shot CoT("단계별로 생각해봅시다")만으로 충분합니다.
2. 지연 시간
단계별 추론으로 응답 시간이 길어집니다. 복잡한 문제는 수십 초 이상 걸릴 수 있어, 실시간 대화에는 부적합할 수 있습니다. 응답 속도가 중요한 서비스에서는 CoT를 백그라운드 작업으로 분리하거나, 간단한 작업에는 CoT 없이 바로 답변하도록 유도하는 것이 효과적입니다.
3. 환각 위험
CoT가 항상 정확한 것은 아닙니다. 모델이 그럴듯하지만 잘못된 중간 단계를 생성하면, 최종 답변도 틀릴 수 있습니다("오류 전파" 문제). 특히 수학적 계산이나 사실 기반 추론에서는 중간 단계를 반드시 검증해야 합니다. 자가 검증(best-practices의 "자가 검증 CoT")을 추가하면 오류 전파를 줄일 수 있습니다.
4. 모델 스케일 의존
원 논문(Wei et al., 2022)에서 확인된 바와 같이, CoT의 효과는 기현 현상(emergent property)으로 ~100B 이상 파라미터를 가진 대규모 모델에서만 뚜렷하게 나타납니다. 소규모 모델(7B, 13B 등)에서는 CoT가 오히려 성능을 저하시킬 수 있으므로, 사용하는 모델의 규모를 반드시 고려해야 합니다.
다음 단계
CoT를 마스터했다면 실전에 적용해보세요:
핵심 정리
- CoT란? LLM이 최종 답변 전에 중간 추론 단계를 명시적으로 출력하도록 유도하는 프롬프팅 기법
- 핵심 원리: 인간의 "단계별 사고"를 모방하여 복잡한 문제의 정확도를 크게 향상
- 기법 계보: Zero-shot CoT → Few-shot CoT → Self-Consistency → Tree of Thoughts → ReAct로 확장
- 검증된 효과: PaLM 540B + CoT로 GSM8K 58% 달성(기존 SOTA 55% 경신), Self-Consistency 결합 시 74%
- 핵심 제약: ~100B+ 파라미터 모델에서만 효과, 비용/지연 시간 증가, 오류 전파 리스크
- 활용 범위: 수학 추론, 코드 디버깅, 의사결정, 다단계 분석에 필수적
실무 팁
- 간단한 작업에는 기본 CoT 사용: "단계별로 생각해봅시다" 한 문장만 추가해도 수학/논리 문제 정확도가 크게 향상됩니다.
- Few-shot + CoT 조합이 최강: 예제에 추론 과정을 포함시키면 Zero-shot CoT보다 안정적인 결과를 얻습니다.
- Self-Consistency로 신뢰도 확보: 중요한 결정에는 temperature=0.7로 5회 이상 실행하여 다수결로 검증하세요.
- temperature 전략: 정확한 추론에는 0.2~0.3, Self-Consistency 다양성 확보에는 0.5~0.8을 사용하세요.
- 자가 검증 추가: "풀이 후 답을 문제에 대입하여 검증하세요"를 추가하면 오류 전파를 줄일 수 있습니다.
- 도구와 결합: 계산이 필요한 경우 ReAct 패턴으로 Calculator/Search 도구를 연동하면 환각 없이 정확한 결과를 얻습니다.