LLM도 '급하게 풀면' 틀린다
LLM에게 복잡한 수학 문제나 논리 추론을 던지면 즉답으로 틀리는 경우가 많습니다.
질문: "A 마트에서 사과 3개와 배 2개를 샀습니다. 사과는 개당 800원,
배는 개당 1,500원입니다. 10,000원을 냈을 때 거스름돈은?"
❌ 즉답 방식
→ "1,600원입니다" (계산 오류)
✅ 단계별 사고 방식
→ 사과 합계: 800 × 3 = 2,400원
배 합계: 1,500 × 2 = 3,000원
총합: 2,400 + 3,000 = 5,400원
거스름돈: 10,000 - 5,400 = 4,600원
"단계별로 생각해줘" — 이 한 마디가 정확도를 크게 높입니다.
Chain-of-Thought(CoT)란?
LLM이 최종 답변을 내기 전에 중간 추론 과정을 명시적으로 거치게 만드는 기법입니다.
flowchart LR
subgraph STANDARD["일반 프롬프팅"]
Q1["질문"] --> A1["즉시 답변\n(추론 생략)"]
end
subgraph COT["Chain-of-Thought"]
Q2["질문\n+ '단계별로 생각해줘'"]
Q2 --> S1["1단계 추론"]
S1 --> S2["2단계 추론"]
S2 --> S3["3단계 추론"]
S3 --> A2["최종 답변\n(신뢰도 높음)"]
end
CoT 활성화 방법
방법 1: 마법의 주문
문제: [복잡한 문제]
단계별로 생각해서 풀어줘.
또는 영어로:
Let's think step by step.
Think through this carefully.
Show your reasoning.
이 짧은 문구만으로 LLM의 추론 품질이 크게 향상됩니다.
방법 2: Few-shot CoT
예시를 통해 추론 방식 자체를 가르칩니다.
flowchart TB
subgraph FEWSHOT_COT["Few-shot CoT 구조"]
direction LR
E1["예시 1\n문제 + 단계별 풀이 + 답"]
E2["예시 2\n문제 + 단계별 풀이 + 답"]
Q["실제 문제"]
end
FEWSHOT_COT -->|"패턴 학습"| LLM["LLM"]
LLM --> OUT["단계별 풀이 + 정확한 답"]
[예시]
질문: 상품 원가가 5,000원이고 30% 마진을 붙이면 판매가는?
풀이:
- 마진 금액 = 5,000 × 0.3 = 1,500원
- 판매가 = 5,000 + 1,500 = 6,500원
답: 6,500원
[실제 문제]
질문: 월급 350만 원에서 소득세 3.3%를 공제하면 실수령액은?
CoT가 효과적인 상황
flowchart TD
Q["이 문제에 CoT가 필요한가?"]
Q -->|"수학·계산"| Y1["✅ 효과 큼"]
Q -->|"논리 추론·분석"| Y2["✅ 효과 큼"]
Q -->|"복잡한 의사결정"| Y3["✅ 효과 큼"]
Q -->|"단순 번역·요약"| N1["⚠️ 불필요"]
Q -->|"단순 사실 조회"| N2["⚠️ 오히려 느려짐"]
| 상황 | CoT 효과 | 이유 |
|---|---|---|
| 수학 계산 | ⭐⭐⭐⭐⭐ | 중간 계산 검증 가능 |
| 논리 퍼즐 | ⭐⭐⭐⭐⭐ | 전제→결론 과정 명시 |
| 코드 디버깅 | ⭐⭐⭐⭐ | 오류 원인 단계적 추적 |
| 단순 번역 | ⭐ | 추론 과정 불필요 |
실전 예시: 비즈니스 의사결정
CoT는 수학 문제만이 아니라 복잡한 판단 문제에도 효과적입니다.
상황: 스타트업 A가 Series A 투자를 검토 중입니다.
- 현재 ARR: 5억 원 (전년 대비 200% 성장)
- 팀: 15명, 소진율 월 5,000만 원
- 현금: 3억 원 남음
- 밸류에이션 요구: 100억 원
투자 여부를 단계별로 분석해줘.
단계 1: 재무 건전성 확인
단계 2: 성장률 평가
단계 3: 런웨이 계산
단계 4: 밸류에이션 적정성
단계 5: 종합 판단
자기 검증 CoT: 답을 스스로 확인하게 만들기
flowchart LR
Q["질문"] --> R["풀이"]
R --> CHECK["'답이 맞는지\n검증해줘'"]
CHECK -->|"오류 발견"| FIX["수정된 답변"]
CHECK -->|"검증 통과"| CONFIRM["✅ 확인된 답변"]
문제를 풀고, 풀이가 끝나면 답이 올바른지 검증하는 단계를 추가해줘.
검증 단계에서 오류가 발견되면 수정해줘.
이 패턴은 LLM이 자신의 실수를 스스로 잡아내게 만듭니다.
Zero-shot CoT vs Few-shot CoT
flowchart LR
subgraph ZERO["Zero-shot CoT"]
Z["문제\n+ '단계별로 생각해줘'"]
Z --> ZR["LLM이 자체 추론\n방식으로 풀이"]
end
subgraph FEW["Few-shot CoT"]
F1["예시 + 풀이 방식"]
F2["문제"]
F1 --> F2 --> FR["동일한 추론\n방식으로 풀이"]
end
ZERO -->|"장점"| ZP["구현 간단\n예시 불필요"]
FEW -->|"장점"| FP["원하는 추론\n방식 통제 가능"]
실무에서는 보통 Zero-shot CoT(단계별로 생각해줘)로 시작하고, 결과가 마음에 안 들 때 Few-shot CoT로 전환합니다.
CoT 활용 시 주의사항
flowchart TD
subgraph CAUTION["주의사항"]
C1["추론이 그럴듯해 보여도\n결론이 틀릴 수 있음"]
C2["단계가 많아질수록\n초기 오류가 증폭됨"]
C3["간단한 문제에 사용하면\n불필요하게 복잡해짐"]
end
- 추론 과정을 반드시 검토하세요. 그럴듯한 과정이 잘못된 결론으로 이어질 수 있습니다.
- 중요한 계산은 별도로 검증하세요.
- CoT는 추론 과정을 투명하게 만들 뿐, 정확성을 보장하지 않습니다.
정리
| 개념 | 내용 |
|---|---|
| Chain-of-Thought | 중간 추론 과정을 명시하는 프롬프팅 기법 |
| Zero-shot CoT | "단계별로 생각해줘" 문구만으로 활성화 |
| Few-shot CoT | 추론 예시를 함께 제공해 방식 통제 |
| 자기 검증 | 풀이 후 스스로 답 확인하게 유도 |
| 적합한 상황 | 수학·논리·복잡한 의사결정 |
다음 편에서는 시스템 프롬프트 설계 — LLM의 전반적인 행동 방식을 제어하는 시스템 레벨 프롬프트를 설계하는 방법을 배웁니다.