Chain of Thought
사고 연쇄 / CoT Prompting
LLM이 단계별로 추론하도록 유도하는 프롬프팅 기법. 복잡한 문제 해결력 향상.
사고 연쇄 / CoT Prompting
LLM이 단계별로 추론하도록 유도하는 프롬프팅 기법. 복잡한 문제 해결력 향상.
Chain of Thought(CoT, 사고 연쇄)는 대규모 언어 모델(LLM)이 복잡한 추론 문제를 해결할 때 중간 사고 과정을 명시적으로 생성하도록 유도하는 프롬프팅 기법입니다. 2022년 Google Research의 논문 "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models"에서 처음 제안되었습니다.
CoT의 핵심 아이디어는 간단합니다. "Let's think step by step(단계별로 생각해보자)"라는 문구를 추가하거나, 예시에 풀이 과정을 포함시키면 LLM이 바로 답을 출력하는 대신 추론 과정을 먼저 생성합니다. 이 중간 단계들이 최종 답의 정확도를 크게 향상시킵니다.
CoT는 특히 수학 문제, 논리 퍼즐, 다단계 추론이 필요한 질문에서 효과적입니다. GSM8K(수학 벤치마크)에서 PaLM 540B 모델의 정확도가 CoT 없이 17.9%에서 CoT 사용 시 56.9%로 3배 이상 향상되었습니다. 모델이 클수록 CoT의 효과가 더 두드러집니다.
실무에서 CoT는 복잡한 분석 작업, 코드 디버깅, 의사결정 설명 등에 널리 사용됩니다. Self-Consistency(다수결), Tree of Thoughts(분기 탐색) 같은 발전된 기법들도 CoT를 기반으로 합니다. GPT-4, Claude 등 최신 LLM들은 CoT 없이도 내부적으로 유사한 추론을 수행하도록 학습되어 있습니다.
# OpenAI API를 사용한 Chain of Thought 프롬프팅
from openai import OpenAI
client = OpenAI()
# 일반 프롬프트 (CoT 없음)
standard_prompt = """
Q: 농장에 닭 23마리와 소 7마리가 있습니다. 다리는 총 몇 개일까요?
A:
"""
# Chain of Thought 프롬프트
cot_prompt = """
Q: 농장에 닭 23마리와 소 7마리가 있습니다. 다리는 총 몇 개일까요?
단계별로 풀어봅시다:
1단계: 닭의 다리 수 계산
- 닭은 2개의 다리를 가지고 있습니다
- 23마리 x 2개 = 46개
2단계: 소의 다리 수 계산
- 소는 4개의 다리를 가지고 있습니다
- 7마리 x 4개 = 28개
3단계: 전체 다리 수 합산
- 46 + 28 = 74개
A: 총 74개의 다리가 있습니다.
---
Q: 가게에서 사과 15개를 샀습니다. 5개를 먹고, 친구에게 3개를 줬습니다.
남은 사과로 각각 2개씩 담은 봉지를 만들면 몇 봉지가 될까요?
단계별로 풀어봅시다:
"""
# Zero-shot CoT (가장 간단한 방법)
zero_shot_cot = """
Q: 상자에 공이 12개 있습니다. 빨간 공은 파란 공보다 4개 많습니다.
파란 공은 몇 개일까요?
Let's think step by step.
"""
def solve_with_cot(prompt):
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "수학 문제를 단계별로 풀어주세요."},
{"role": "user", "content": prompt}
],
temperature=0
)
return response.choices[0].message.content
# 실행
print("=== Zero-shot CoT 결과 ===")
print(solve_with_cot(zero_shot_cot))
# Self-Consistency: 여러 번 샘플링 후 다수결
def solve_with_self_consistency(question, n_samples=5):
answers = []
for _ in range(n_samples):
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": question + "\nLet's think step by step."}],
temperature=0.7 # 다양성을 위해 temperature 설정
)
# 최종 답변 추출 로직 (간소화)
answers.append(response.choices[0].message.content)
return answers # 실제로는 답변에서 숫자를 추출해 다수결
"고객 문의 분류 정확도가 낮은데, 시스템 프롬프트에 'First, identify the main issue. Then, categorize based on our taxonomy.' 같은 CoT 지시를 추가하면 분류 근거가 명확해지고 정확도도 올라갑니다."
"Zero-shot CoT는 'Let's think step by step'만 추가하는 방식이고, Few-shot CoT는 풀이 과정이 포함된 예시를 함께 제공합니다. 모델 크기가 100B 이상일 때 효과가 뚜렷하게 나타납니다."
"디버깅 에이전트에서 CoT 출력을 파싱해야 하는데, 'Final Answer:' 같은 구분자를 프롬프트에 명시해서 추론 과정과 최종 답변을 쉽게 분리할 수 있게 해주세요."
CoT는 중간 추론 과정을 생성하므로 출력 토큰이 2-5배 증가합니다. 대량 처리 시 API 비용과 지연 시간을 고려해야 합니다.
CoT는 약 100B 파라미터 이상의 대형 모델에서 효과가 있습니다. 작은 모델에서는 오히려 잘못된 추론 경로로 빠질 수 있습니다.
감정 분석이나 단순 분류 같은 작업에서는 CoT가 오히려 성능을 저하시킬 수 있습니다. 복잡한 추론이 필요한 작업에만 적용하세요.