Developer's Development
3.3.15 [LLM] 프롬프트 엔지니어링 응용: CoT 본문
Chain of Thought (CoT)
👉🏻 Chain of Thought 개요
[ CoT 등장 배경 ]
LLM은 강력한 자연어 처리 능력을 가지고 있지만, 복잡한 문제를 해결하는 데 한계를 지니고 있다. 특히, 수학 문제, 논리 퍼즐, 과학적 분석과 같은 다단계 추론이 필요한 문제에서는 오류가 많이 발생하는 경향이 있다.
👀 기존 LLM의 문제점
- 즉답형 (End-to-End) 방식으로 답을 생성 → 논리적 사고 과정 없이 단순히 답만 출력
- 문제를 이해하지 않고 학습 데이터에서 유사한 답을 찾으려는 경향
- 다단계 문제에서 오류가 누적될 확률이 높음 (ex. 수학 문제에서 실수 발생)
💡 CoT는 LLM이 복잡한 문제를 해결하기 위해 단계적 사고 과정을 명시적으로 전개하도록 설계된 프롬프트 전략이다. 이는 수학 문제, 논리 퍼즐, 과학적 추론 등 복잡한 작업에서 정확성을 향상시킨다.
CoT는 복잡한 문제를 해결하는 데 필수적인 도구로, Zero-shot 및 Few-shot CoT 전략으로 다양한 작업에 활용할 수 있다.
👉🏻 주요 원리
단계적 접근: 모델이 한 번에 답을 생성하지 않고, 단계별로 논리를 전개
정확성 강화: 사고 과정을 명시해 오류를 줄이고 신뢰도를 높임
프롬프트 설계: 명확한 지침으로 모델이 중간 단계를 출력하도록 유도
👉🏻 CoT 활용 사례
수학 문제 해결, 논리 퍼즐, 과학적 추론
👉🏻 장점과 한계
장점: 복잡한 문제 해결, 논리적 사고 강화, 결과 신뢰도 향상
한계: 속도 저하, 프롬프트 설계의 중요성
- CoT의 유형
👉🏻 Zero-shot CoT
단순한 지침(ex. "Think step by step")만으로 LLM이 단계적 사고 과정을 전개하도록 유도하는 프롬프트 설계 전략
1) 특징
- 단순 지침: 예시 없이 "Solve step by step"과 같은 명령으로 논리적 사고 유도
- 정확성 향상: 단계별 풀이로 오류 감소 및 신뢰성 증가
2) 예제
- 프롬프트: Solve step by step: What is 12 × 15?
- 출력: First, calculate 12 × 10 = 120. Then calculate 12 × 5 = 60. Add these: 120 + 60 = 180. The answer is 180.
3) 장점
- 간단한 적용, 복잡한 문제 해결, 정확성 향상
→ 단순 명령으로 복잡한 문제를 단계적으로 풀어 결과의 신뢰성과 정확성을 높이는 유용한 전략으로, 수학 문제, 논리 퍼즐, 교육 등 다양한 분야에서 활용할 수 있다.
4) 한계
- 복잡한 문제에서 부정확한 논리 전개 가능, 프롬프트 의존성
👉🏻 Few-shot CoT
예시를 포함한 프롬프트로 LLM이 논리적 사고와 단계적 문제 해결 방식을 학습하도록 설계된 전략
1) 특징
- 예시 기반 학습: 프롬프트에 문제와 풀이 과정을 포함해 모델이 논리 전개 방식을 학습
- 복잡한 문제 해결: 단계별 풀이를 통해 정확한 결과 도출
- 사용자 정의 가능: 예시의 수와 복잡성을 조정해 응답 품질 제어
2) 예제
- 프롬프트:
Q: What is 12 × 15?
A: First, calculate 12 × 10 = 120. Then calculate 12 × 5 = 60. Add these: 120 + 60 = 180.
Q: What is 8 × 7?
A:
- 출력:
First, calculate 8 × 5 = 40. Then calculate 8 × 2 = 16. Add these: 40 + 16 = 56. The answer is 56.
3) 장점
- 정확성 향상, 복잡한 문제에서 유리, 결과의 신뢰성과 투명성 강화
→ 복잡한 문제 해결에서 높은 정확도를 제공하며, 수학 문제 풀이, 논리 퍼즐, 교육 등 다양한 분야에서 활용할 수 있다.
4) 한계
- 프롬프트 길이 제한, 설계 복잡성 증가
- 전략 비교
| 전략 | 설명 | 예시 포함 여부 | 장점 | 한계 |
| Zero-shot CoT | "Think step by step." 지침만 제공하여 논리적 사고 유도 |
❌ | 간단한 적용, 빠른 실행 | 복잡한 문제 해결력 부족 |
| Few-shot CoT | 문제 해결 예시 포함하여 논리적 사고 방식 학습 | ✅ | 높은 정확성, 복잡한 문제 해결 가능 | 프롬프트 길이 제한 |
실습 (CoT)
from dotenv import load_dotenv
import openai
load_dotenv()
client = openai.OpenAI()
- 일반 프롬프트 vs Zero-shot CoT
# 일반 프롬프트
prompt = '123 x 31 + 0.123 x 0.0012는 얼마인가요?'
response = client.chat.completions.create(
model='gpt-4',
messages=[{'role':'user', 'content':prompt}]
)
print(response.choices[0].message.content)
# 3813.0000001476 입니다.
# CoT 프롬프트
prompt = '단계별로 계산하세요.: 123 x 31 + 0.123 x 0.0012는 얼마인가요?'
cot_response = client.chat.completions.create(
model='gpt-4',
messages=[{'role':'user', 'content':prompt}]
)
print(cot_response.choices[0].message.content)
"""
우선, 각각의 곱셈을 계산합니다:
123 x 31 = 3813
0.123 x 0.0012 = 0.0001476
그런 다음, 두 결과를 더합니다:
3813 + 0.0001476 = 3813.0001476
따라서, 123 x 31 + 0.123 x 0.0012 = 3813.0001476입니다.
"""
- Few-shot CoT
# 일반 프롬프트
prompt = '123 x 31은 얼마인가요?'
response = client.chat.completions.create(
model='gpt-4',
messages=[{'role': 'user', 'content': prompt}]
)
print(response.choices[0].message.content) # 123 x 31 = 3813
# Few-shot CoT
few_shot_cot = '''
Q: 123 x 31은 얼마인가요?
A:
1. 123을 분해합니다: 123 = 100 + 20 + 3
2. 각 항을 31과 곱합니다:
- 100 x 31 = 3100
- 20 x 31 = 620
- 3 x 31 = 93
3. 이제 이 결과들을 더합니다:
- 3100 + 620 + 93
4. 계산을 진행하면:
- 3100 + 620 = 3720
- 3720 + 93 = 3813
따라서 123 x 31 = 3813 입니다.
Q: 789 x 56 은 얼마인가요?
A:
'''
cot_response = client.chat.completions.create(
model='gpt-4',
messages=[{'role': 'user', 'content': few_shot_cot}]
)
print(cot_response.choices[0].message.content)
"""
1. 789을 분해합니다: 789 = 700 + 80 + 9
2. 각 항을 56과 곱합니다:
- 700 x 56 = 39200
- 80 x 56 = 4480
- 9 x 56 = 504
3. 이제 이 결과들을 더합니다:
- 39200 + 4480 + 504
4. 계산을 진행하면:
- 39200 + 4480 = 43680
- 43680 + 504 = 44184
따라서 789 x 56 = 44184 입니다.
"""
- 논리 문제 해결
prompt = '''
단계적으로 생각해서 대답해주세요.:
엘리스(Alice)는 밥(Bob)보다 나이가 많다.
밥(Bob)은 찰리(Charlie)보다 나이가 많다.
데이비드(David)는 엘리스(Alice)보다 어리지만, 에밀리(Emily) 보다는 많다.
찰리(Charlie)는 프랭크(Frank)보다 많다.
에밀리(Emily)는 찰리(Charlie)보다 나이가 많지만, 밥(Bob)보다는 어리다.
프랭크(Frank)는 데이비드(David)보다 어리다.
그렇다면 가장 어린 사람은 누구인가요?
'''
response = client.chat.completions.create(
model='gpt-4',
messages=[{'role':'user', 'content':prompt}]
)
print(response.choices[0].message.content)
"""
먼저, 밥이 찰리보다 많다고 했고, 찰리는 프랭크보다 많다고 했으므로 밥은 프랭크보다 나이가 많다. 그리고 데이비드는 엘리스보다 어리지만, 프랭크보다는 많다고 했으니 엘리스는 데이비드보다 많고, 데이비드는 프랭크보다 많다.
또한, 에밀리는 찰리보다 많지만 밥보다 어리다고 했으니, 찰리와 프랭크는 에밀리보다 어리다. 따라서 밥은 에밀리보다 많다.
그럼 이제, 엘리스는 밥보다 많고, 따라서 에밀리보다도 많다.
그러므로, 제일 어린 순서대로 이렇게 정리할 수 있다: 프랭크, 찰리, 데이비드, 에밀리, 밥, 엘리스.
따라서 가장 어린 사람은 프랭크입니다.
"""
'LLM' 카테고리의 다른 글
| 3.3.17 [LLM] 파인튜닝 기법: PEFT (0) | 2025.09.14 |
|---|---|
| 3.3.16 [LLM] 파인튜닝 (0) | 2025.09.14 |
| 3.3.14 [LLM] 프롬프트 엔지니어링 응용: RAG (1) | 2025.09.13 |
| 3.3.13 [LLM] 프롬프트 엔지니어링 응용: LangChain (2) | 2025.09.13 |
| 3.3.12 [LLM] 프롬프트 엔지니어링: 벡터 데이터베이스 (3) | 2025.09.13 |