LLM에게 단계적 사고를 유도하는 Chain-of-Thought 프롬프팅의 원리, 변형 기법, 그리고 최신 추론 모델에서의 활용 전략을 다룹니다.
2022년 Google Research의 Jason Wei 등이 발표한 논문 "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models"는 프롬프트 엔지니어링의 전환점이 되었습니다. 이 연구는 모델에게 최종 답만 요구하는 대신 중간 추론 과정을 함께 생성하도록 유도하면 복잡한 추론 작업의 정확도가 크게 향상된다는 것을 입증했습니다.
Chain-of-Thought(CoT, 사고의 연쇄) 프롬프팅의 핵심 아이디어는 단순합니다. 사람이 복잡한 문제를 풀 때 머릿속으로 단계를 나누어 생각하듯, 모델에게도 같은 과정을 텍스트로 명시적으로 수행하게 하는 것입니다.
차이를 직접 비교해 보겠습니다.
# 표준 프롬프팅
Q: 카페에서 아메리카노 3잔(4,500원)과 라떼 2잔(5,000원)을 주문하고
20,000원을 냈습니다. 거스름돈은 얼마입니까?
A:표준 방식에서 모델은 바로 답을 내놓으려 하며, 계산 오류가 발생할 확률이 있습니다.
# CoT 프롬프팅
Q: 카페에서 아메리카노 3잔(4,500원)과 라떼 2잔(5,000원)을 주문하고
20,000원을 냈습니다. 거스름돈은 얼마입니까?
단계별로 풀어 주세요.
A: 단계적으로 계산하겠습니다.
1단계: 아메리카노 총 금액 = 4,500원 x 3 = 13,500원
2단계: 라떼 총 금액 = 5,000원 x 2 = 10,000원
3단계: 전체 주문 금액 = 13,500원 + 10,000원 = 23,500원
4단계: 거스름돈 = 20,000원 - 23,500원 = -3,500원
금액이 부족합니다. 20,000원으로는 3,500원이 모자랍니다.CoT를 통해 모델은 중간 계산을 명시적으로 수행하므로, 각 단계에서 오류를 쉽게 발견할 수 있고 최종 답의 정확도도 높아집니다.
예시를 제공하지 않고도 CoT를 유도할 수 있습니다. 가장 간단한 방법은 "단계별로 생각해 주세요(Let's think step by step)"라는 문구를 추가하는 것입니다.
다음 논리 문제를 풀어 주세요. 단계별로 생각해 주세요.
A는 B보다 키가 크고, C는 A보다 키가 큽니다.
D는 B보다 키가 작습니다.
키가 가장 큰 사람부터 순서대로 나열하세요.이 간단한 문구 하나로 모델은 각 관계를 정리하고, 논리적 순서를 도출하는 과정을 명시적으로 수행합니다.
더 복잡한 작업에서는 추론 과정의 예시를 함께 제공합니다.
Q: 회사에 5명의 직원이 있고, 각각 프로젝트 A, B, C 중 하나에 배정됩니다.
프로젝트 A에는 최소 2명, 프로젝트 B에는 최소 1명이 필요합니다.
가능한 배정 방법은 몇 가지입니까?
A: 단계별로 풀어 보겠습니다.
1단계: 전체 인원과 제약 조건을 정리합니다.
- 총 5명, 프로젝트 3개 (A, B, C)
- A >= 2명, B >= 1명, C >= 0명
2단계: 가능한 (A, B, C) 인원 조합을 나열합니다.
- (2, 1, 2), (2, 2, 1), (2, 3, 0)
- (3, 1, 1), (3, 2, 0)
- (4, 1, 0)
- (5, 0, 0)은 B >= 1 위반으로 불가
3단계: 각 조합에 대해 배정 방법의 수를 계산합니다.
- (2,1,2): C(5,2) x C(3,1) x C(2,2) = 10 x 3 x 1 = 30
- (2,2,1): C(5,2) x C(3,2) x C(1,1) = 10 x 3 x 1 = 30
- (2,3,0): C(5,2) x C(3,3) = 10 x 1 = 10
- (3,1,1): C(5,3) x C(2,1) x C(1,1) = 10 x 2 x 1 = 20
- (3,2,0): C(5,3) x C(2,2) = 10 x 1 = 10
- (4,1,0): C(5,4) x C(1,1) = 5 x 1 = 5
4단계: 전체 합산 = 30 + 30 + 10 + 20 + 10 + 5 = 105
답: 105가지
Q: [새로운 문제]
A:자기 일관성은 CoT의 확장 기법으로, 동일한 문제에 대해 여러 번의 추론 경로를 생성한 후 가장 빈번하게 등장하는 답을 최종 답으로 선택합니다. 이것은 다수결(majority voting)의 원리와 유사합니다.
프로그래밍으로 구현하면 다음과 같습니다.
import anthropic
from collections import Counter
client = anthropic.Anthropic()
def self_consistency(prompt, n_samples=5, temperature=0.7):
"""자기 일관성 기법으로 가장 신뢰할 수 있는 답을 선택합니다."""
answers = []
for _ in range(n_samples):
response = client.messages.create(
model="claude-sonnet-4-5-20250514",
max_tokens=1024,
temperature=temperature,
messages=[{"role": "user", "content": prompt}]
)
# 답에서 최종 결론 추출
answer = extract_final_answer(response.content[0].text)
answers.append(answer)
# 다수결로 최종 답 선택
counter = Counter(answers)
best_answer, count = counter.most_common(1)[0]
confidence = count / n_samples
return {
"answer": best_answer,
"confidence": confidence,
"all_answers": answers
}
def extract_final_answer(text):
"""응답에서 최종 답을 추출하는 로직"""
lines = text.strip().split("\n")
for line in reversed(lines):
if line.strip().startswith("답:"):
return line.strip()
return lines[-1].strip()자기 일관성 기법은 API 호출 횟수가 늘어나므로 비용이 증가합니다. 높은 정확도가 비즈니스 가치에 직접적인 영향을 미치는 경우에 선별적으로 적용하는 것이 좋습니다.
모델에게 자신의 추론 과정을 검증하도록 요청하는 기법입니다.
다음 문제를 풀고, 풀이가 끝나면 각 단계를 역으로 검증하세요.
문제: 어떤 수에 3을 곱하고 7을 더한 결과가 22입니다.
그 수에 5를 곱하면 얼마입니까?
[풀이]
1단계: 방정식 세우기: 3x + 7 = 22
2단계: 3x = 22 - 7 = 15
3단계: x = 15 / 3 = 5
4단계: 5x = 5 x 5 = 25
[검증]
- 3단계 검증: x = 5일 때, 3 x 5 = 15 (맞음)
- 2단계 검증: 15 + 7 = 22 (맞음)
- 1단계 검증: 원래 조건 "3을 곱하고 7을 더한 결과가 22" 충족 (맞음)
최종 답: 25복잡한 문제를 더 작은 하위 문제로 분해하여 각각을 독립적으로 해결하는 방식입니다.
다음 질문에 답하기 위해 하위 질문으로 분해하세요.
질문: "한국에서 가장 인구가 많은 도시의 면적은 서울의 몇 배입니까?"
하위 질문 1: 한국에서 가장 인구가 많은 도시는 어디입니까?
답: 서울특별시입니다.
하위 질문 2: 그렇다면 질문은 "서울의 면적은 서울의 몇 배인가"가 됩니다.
답: 1배입니다. 같은 도시이기 때문입니다.
이 예시에서 보듯, 분해 과정에서 질문 자체의 모순이나 함정을 발견할 수 있습니다.2024년 이후 등장한 추론 모델(Reasoning Model)들은 CoT를 모델 내부에 내장하고 있습니다. OpenAI의 o-시리즈, Anthropic의 Claude Extended Thinking, Google의 Gemini Thinking Mode가 대표적입니다.
추론 모델을 사용할 때는 "단계별로 생각하세요"와 같은 명시적 CoT 지시를 생략하는 것이 좋습니다. 모델이 이미 내부적으로 추론을 수행하므로, 중복된 지시는 오히려 성능을 저하시킬 수 있습니다. 대신 원하는 결과의 형식과 제약 조건에 집중하세요.
| 모델 유형 | CoT 전략 | 예시 |
|---|---|---|
| 표준 모델 (Claude Sonnet, GPT-4o) | 명시적 CoT 지시 필수 | "단계별로 분석하세요" |
| 추론 모델 (Claude Extended Thinking) | CoT 지시 생략, 결과에 집중 | "최종 결과를 JSON으로 반환하세요" |
| 소형 모델 (Haiku, GPT-4o mini) | 퓨샷 CoT 권장 | 추론 과정 예시를 포함 |
CoT가 모든 작업에 도움이 되는 것은 아닙니다. 다음과 같은 유형에서 가장 큰 효과를 보입니다.
# CoT가 필요한 경우
"서버 로그를 분석하여 장애 원인을 찾아 주세요.
각 로그 항목의 타임스탬프를 기준으로 이벤트 순서를 정리하고,
정상 동작과 비교하여 이상 패턴을 식별하세요."
# CoT가 불필요한 경우
"다음 영어 문장을 한국어로 번역하세요: Hello, how are you?"CoT를 활용한 체계적인 코드 리뷰 프롬프트 예시입니다.
다음 코드를 리뷰하세요. 아래 단계를 순서대로 수행해 주세요.
1단계 - 코드 이해: 이 코드가 무엇을 하는지 한 문단으로 설명하세요.
2단계 - 정확성 검증: 로직의 정확성을 검토하고, 버그가 있다면 지적하세요.
3단계 - 성능 분석: 시간/공간 복잡도를 분석하고, 개선 가능한 부분을 찾으세요.
4단계 - 보안 검토: 잠재적 보안 취약점이 있는지 확인하세요.
5단계 - 종합 평가: 위 분석을 바탕으로 전체 평가와 우선순위별 개선 사항을 정리하세요.
<code>
def process_user_input(data):
query = "SELECT * FROM users WHERE name = '" + data["name"] + "'"
result = db.execute(query)
return result
</code>이렇게 단계를 명시하면 모델은 각 관점에서 체계적으로 코드를 분석하고, SQL 인젝션(SQL Injection) 취약점과 같은 중요한 문제를 놓치지 않습니다.
이 장에서는 Chain-of-Thought 프롬프팅의 원리와 다양한 변형 기법을 다루었습니다.
다음 장에서는 역할 지정과 페르소나 설계를 다루겠습니다. 모델에게 특정 전문가의 역할을 부여하여 도메인에 특화된 고품질 응답을 이끌어내는 전략을 살펴보겠습니다.
이 글이 도움이 되셨나요?