"let's think step by step" 기법을 사용해 AI에게 아래 문제를 풀게 하세요:
레벨 1: Zero-Shot CoT 적용하기문제: 어떤 팀에 8명이 있고 각자 하루 6시간씩 일합니다. 프로젝트에는 240 인시의 작업이 필요합니다. 팀이 12명으로 늘어나면 며칠 더 일찍 끝낼 수 있을까요?
전체 프롬프트("let's think step by step" 포함)를 작성하고, AI가 어떤 중간 단계를 보여줄지 예측하세요.
학습 목표:
- Chain-of-thought이 어떻게 동작하고 왜 효과가 있는지 이해하기
- "let's think step by step"으로 AI의 추론을 유도하는 법 익히기
- 어떤 작업 유형이 CoT에 잘 맞는지 판별하기
전제: << 레슨 3: Few-Shot 학습 | 다음: 레슨 5 >>
AI에게 수학 문장제를 물었더니 '42'라고 답합니다. 확인해 보니 답은 맞습니다. 그런데 비슷한 문제로 바꿔 넣으면 답이 틀리게 나옵니다. 무슨 일이 벌어진 걸까요? 모델이 찍었을 수도 있고, 망가진 추론 경로를 따라갔는데 우연히 맞는 숫자에 도착했을 수도 있습니다.
여러 단계의 추론이 필요한 작업(수학 문제, 논리 퍼즐, 복잡한 분석)에서는 AI에게 추론 단계를 보여주게 하는 편이 답을 곧장 물어보는 것보다 신뢰할 만합니다1 2. 이것이 chain-of-thought(CoT) 프롬프팅의 핵심 아이디어입니다. 결론을 실제로 검증할 수 있는 중간 단계로 쪼개는 것입니다.
Chain-of-thought(CoT) 프롬프팅은 모델이 최종 답을 내놓기 전에 중간 추론 단계를 펼쳐 놓게 하는 기법입니다1. 연구의 표현을 빌리면, chain-of-thought 프롬프팅은 "enables complex reasoning capabilities through intermediate reasoning steps"(중간 추론 단계를 통해 복잡한 추론 능력을 이끌어냅니다)1. 직관은 단순합니다. "Chain of Thought prompting encourages the model to think through the problem in a step-by-step manner, which is supposed to mimic how humans break down complex problems"(Chain of Thought 프롬프팅은 사람이 복잡한 문제를 쪼개는 방식을 흉내 내도록, 모델이 문제를 단계별로 사고하게 이끕니다)2. 수학 문제를 풀려고 연습장에 식과 중간 결과를 적어 나가는 것과 똑같은 일입니다.
두 접근을 비교해 봅시다:
❌ CoT 없이:
AI는 이렇게만 출력할 수 있습니다:
답이 틀렸을 때 어느 단계에서 어긋났는지 알 길이 없습니다.
✅ CoT 적용:
AI 출력:
모든 단계가 눈에 보이므로, 하나가 틀렸다면 바로 짚어내 프롬프트를 고칠 수 있습니다.
연구에 따르면 여러 단계의 추론이 필요한 작업에서 CoT는 정확도를 상당히 끌어올립니다1. 어떤 작업에서는 CoT에 풀이가 담긴 시연을 곁들이면 정확도가 최대 28.2% 더 올라갑니다2.
프롬프트 끝에 한 줄을 덧붙입니다. "let's think step by step"1 2.
이 한 줄이 모델의 단계별 추론 모드를 켭니다. 예시를 하나도 주지 않아도 모델이 알아서 문제를 쪼갭니다.
추론 과정 전체가 담긴 예시를 한두 개 제공합니다1 2.
예시가 추론 형식과 단계를 얼마나 자세히 적어야 하는지를 보여 주고, 모델은 그 스타일을 따라 합니다.
CoT는 여러 단계의 추론이 필요한 작업에 가장 잘 맞습니다2:
✅ 수학·논리 추론
✅ 인과 분석
✅ 계획과 의사결정
✅ 코드 디버깅
맞지 않는 경우:
❌ 단순 사실 조회: '파이썬은 언제 처음 공개되었나요?' — 추론이 필요 없습니다 ❌ 창작 글쓰기: 시, 소설 — 추론 단계가 창작의 흐름을 끊습니다 ❌ 형식 변환: JSON → CSV — 기계적인 작업이라 추론이 필요 없습니다
경험칙: 그 작업을 직접 할 때 연습장을 꺼내 단계를 적어 나갈 것 같다면, CoT에 잘 맞는 작업입니다.
CoT 없이(믿을 수 없는 결론):
결론만 있고 왜 그런지는 없습니다.
CoT 적용(명확한 추론):
AI가 보여주는 것:
모든 추론 단계를 검증할 수 있으므로, 하나가 틀렸다면 즉시 눈에 띕니다.
문제:
AI 출력:
이렇게 단계별 소거 과정을 펼쳐 놓으면 논리에 빈틈이 없는지 훨씬 쉽게 확인할 수 있습니다.
복잡한 문제를 몇 개의 하위 문제로 쪼갭니다.
가설을 나열한 뒤 하나씩 확인합니다.
찬성과 반대 근거를 나열한 뒤 결론에 이릅니다.
CoT는 만병통치약이 아닙니다. 몇 가지 한계가 있습니다.
1. 길이와 시간이 늘어납니다
추론 단계를 보여주면 출력이 길어지고, 토큰을 더 쓰고, 응답도 더 오래 걸립니다.
들일 만할 때: 복잡한 작업이라면 토큰을 2~3배 더 써서 정확도를 얻는 편이 좋은 거래입니다. 그렇지 않을 때: 단순한 작업('오늘이 무슨 요일이지')에서는 추론 단계가 순전히 낭비입니다.
2. 추론 단계 자체가 틀릴 수 있습니다
AI가 보여주는 단계는 그럴듯해 보여도 논리에 구멍이 있을 수 있습니다. 추론이 옳은지는 여전히 직접 확인해야 합니다.
CoT의 가치는 오류를 눈에 보이게 만든다는 데 있습니다. AI가 곧장 답할 때 오류는 블랙박스 안에 숨지만, 단계를 드러내면 오류가 어느 단계에서 모습을 드러내 찾아내고 고치기 쉬워집니다.
3. 직관에 기대는 작업에는 맞지 않습니다
어떤 작업(창작 글쓰기, 예술 평가)은 전체적인 감각에 기대기 때문에, 억지로 단계로 쪼개면 전체가 무너집니다.
Chain-of-thought 프롬프팅은 AI가 곧장 답으로 건너뛰는 대신 추론 단계를 보여주게 한다. 프롬프트에 "let's think step by step"을 덧붙이거나 추론이 담긴 예시를 제공하면, 여러 단계의 추론이 필요한 작업에서 정확도를 크게 끌어올릴 수 있다.
CoT는 수학 추론, 논리 분석, 인과 추론, 복잡한 의사결정 — 여러 단계의 사고가 필요한 모든 것에 잘 맞는다. 추론을 눈에 보이고 검증 가능하게 만든다. 출력 길이가 늘어나기는 하지만, 복잡한 작업에서는 얻는 것이 비용을 훨씬 앞선다.
다음 레슨에서는 프롬프트를 디버깅하고 개선하는 법을 다룹니다. AI의 출력이 기대와 맞지 않을 때 문제를 체계적으로 찾아내 고치는 방법입니다.
다음 레슨 프롬프트 디버깅과 개선 >>
문제: 어떤 팀에 8명이 있고 각자 하루 6시간씩 일합니다. 프로젝트에는 240 인시의 작업이 필요합니다. 팀이 12명으로 늘어나면 며칠 더 일찍 끝낼 수 있을까요?
전체 프롬프트("let's think step by step" 포함)를 작성하고, AI가 어떤 중간 단계를 보여줄지 예측하세요.
전체 추론 단계를 보여주는 예시 2개(하나는 O(n), 하나는 O(n²))로 few-shot CoT 프롬프트를 설계하세요.
문제: 어느 카페가 오전에 커피 23잔, 정오에 17잔, 오후에는 오전의 두 배를 팔았습니다. 하루 전체로는 몇 잔을 팔았을까요?
답:86잔문제: 어느 카페가 오전에 커피 23잔, 정오에 17잔, 오후에는 오전의 두 배를 팔았습니다. 하루 전체로는 몇 잔을 팔았을까요?
Let's think step by step:Let's think step by step:
1. 오전 판매량: 23잔2. 정오 판매량: 17잔3. 오후는 오전의 두 배: 23 × 2 = 46잔4. 하루 합계: 23 + 17 + 46 = 86잔
답: 86잔문제: 5명이 5일 걸려 끝내는 프로젝트가 있다면, 10명은 며칠이 걸릴까요?
Let's think step by step:예시:문제: 자동차가 시속 60km로 달립니다. 3시간 동안 얼마나 갈까요?추론:- 속도 = 60km/h- 시간 = 3시간- 거리 = 속도 × 시간 = 60 × 3 = 180km답: 180km
이제 이 문제를 풀어 보세요:문제: 자동차가 시속 80km로 2.5시간을 달리고, 이어서 시속 60km로 1시간을 더 달립니다. 전체 이동 거리는 얼마일까요?추론:이 코드에 성능 문제가 있나요?
```pythondef find_duplicates(items): duplicates = [] for i in range(len(items)): for j in range(i + 1, len(items)): if items[i] == items[j] and items[i] not in duplicates: duplicates.append(items[i]) return duplicates```
답: 네, 성능 문제가 있습니다이 코드의 성능 문제를 분석하세요. 단계별로 설명하세요:1. 반복문 구조 파악2. 시간 복잡도 계산3. 구체적인 병목 지점 지적4. 최적화 방안 제안
```pythondef find_duplicates(items): duplicates = [] for i in range(len(items)): for j in range(i + 1, len(items)): if items[i] == items[j] and items[i] not in duplicates: duplicates.append(items[i]) return duplicates```성능 분석:
1. 반복문 구조: - 바깥 반복문: 각 원소를 순회, O(n) - 안쪽 반복문: 각 원소마다 남은 원소를 순회, O(n) - 전체: 중첩 반복문, O(n²)
2. 시간 복잡도: - 주 반복문: O(n²) - `items[i] not in duplicates` 검사: 최악의 경우 O(m), 여기서 m은 지금까지 찾아낸 중복 원소의 개수 - 총 복잡도: O(n² × m)
3. 성능 병목: - 중첩 반복문은 입력이 커지면(n > 1000) 매우 느려짐 - 리스트를 훑는 `not in` 선형 탐색이 속도를 더 떨어뜨림
4. 최적화: - 중복 원소를 담을 때 리스트 대신 set을 쓰면 검사 비용이 O(m)에서 O(1)로 떨어짐 - 또는 Counter로 두 번 이상 등장하는 원소를 한 번에 모두 찾으면 O(n)으로 떨어짐A, B, C 세 사람이 대회에 나갔습니다. 알려진 사실은 다음과 같습니다:- A는 1등이 아니다- B는 꼴찌가 아니다- C는 1등도 꼴찌도 아니다
각자의 등수는 어떻게 될까요?
Let's reason step by step:Let's reason step by step:
1. C의 조건에서 출발합니다: - C는 1등도 아니고 꼴찌도 아니다 - 따라서 C는 2등이어야 한다
2. A와 B를 확정합니다: - A는 1등이 아니다 - B는 꼴찌가 아니다 - C가 이미 2등이므로 A와 B에게는 1등과 3등이 남는다
3. 남은 등수를 배정합니다: - A는 1등이 아니므로 A는 3등이다 - B는 꼴찌(3등)가 아니므로 B는 1등이다
답: B가 1등, C가 2등, A가 3등문제: 어떤 소프트웨어 프로젝트에 엔지니어가 5명 있고 각자 하루 6시간씩 일하며, 120 인일의 작업이 필요합니다. 엔지니어를 8명으로 늘리면 며칠 더 일찍 끝낼 수 있을까요?
단계별로 계산해 봅시다:1. 현재 구성으로는 며칠이 걸리는가?2. 인원을 늘리면 며칠이 걸리는가?3. 며칠 더 빨라지는가?이 코드에서 "TypeError: unsupported operand type(s)"가 발생합니다. 가능한 원인은 무엇일까요?
가능한 원인을 하나씩 확인해 봅시다:1. 연산자 양쪽 변수의 타입을 확인2. 연산에 None 값이 끼어들지 않았는지 확인3. 문자열과 숫자를 섞어 쓰고 있지는 않은지 확인마이크로서비스 아키텍처를 써야 할까요, 모놀리스를 써야 할까요?
두 관점에서 분석해 봅시다:
마이크로서비스를 택할 이유:1. ...2. ...
모놀리스를 택할 이유:1. ...2. ...
종합 판단:현재 팀 규모와 프로젝트 복잡도를 고려하면, ...를 권합니다.