⚡ 중급2026-09-046분
AI가 논리를 건너뛸 때: Chain-of-Thought로 추론 과정 강제하기
복잡한 문제에서 Claude가 결론만 툭 던질 때, CoT 프롬프트를 적용하면 단계별 추론을 유도해 정확도와 검증 가능성을 동시에 높일 수 있습니다.
prompt-engineeringchain-of-thoughtreasoning
왜 CoT가 필요한가?
Claude 같은 LLM은 단순 질문엔 잘 답하지만, 다단계 계산·논리·인과 추론이 필요한 문제에서는 중간 과정을 생략하고 틀린 결론을 자신 있게 내놓는 경향이 있습니다. Chain-of-Thought(CoT) 기법은 모델에게 '답 전에 생각을 펼쳐라' 라고 명시적으로 요청해 이 문제를 완화합니다.
Few-shot CoT vs. Zero-shot CoT
| 방식 | 프롬프트 형태 | 적합한 상황 |
|---|---|---|
| Zero-shot CoT | "단계별로 생각해 보세요." 한 줄 추가 | 빠른 실험, 범용 질문 |
| Few-shot CoT | 예시 Q→추론→A 2~3개 삽입 | 도메인 특화, 출력 포맷 고정 필요 시 |
아래는 Anthropic TypeScript SDK로 Zero-shot CoT를 적용하는 최소 예제입니다.
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
async function solveWithCoT(problem: string): Promise<void> {
const response = await client.messages.create({
model: "claude-haiku-4-5",
max_tokens: 1024,
system:
"당신은 꼼꼼한 분석가입니다. " +
"문제를 풀기 전에 반드시 단계별 추론(Step-by-step reasoning)을 먼저 작성하고, " +
"마지막 줄에 '최종 답:' 으로 결론을 명시하세요.",
messages: [
{
role: "user",
content: problem,
},
],
});
const content = response.content[0];
if (content.type === "text") {
console.log(content.text);
// 최종 답만 파싱
const finalAnswer = content.text
.split("\n")
.find((line) => line.startsWith("최종 답:"));
console.log("\n--- 파싱된 결론 ---");
console.log(finalAnswer ?? "최종 답 줄을 찾지 못했습니다.");
}
}
const problem = `
어떤 창고에 박스가 3층으로 쌓여 있습니다.
1층: 박스 12개, 2층: 1층의 절반, 3층: 2층보다 3개 적음.
전체 박스 수는?
`;
solveWithCoT(problem);
실전 적용 팁
출력 파싱을 안정적으로 만들려면 시스템 프롬프트에서 구분자(예: <reasoning>, <answer> XML 태그)를 강제하세요. Claude는 지시한 태그를 잘 따르므로 정규식 파싱보다 훨씬 견고합니다.
<reasoning> ... </reasoning>
<answer> ... </answer>
temperature 조정: CoT는 결정론적 추론이 목적이므로 temperature: 0 ~ 0.3 범위를 권장합니다. 창의적 브레인스토밍이 아님을 명심하세요.
체크리스트
- [ ] 시스템 프롬프트에 "단계별로" 또는 "추론 후 결론" 표현을 명시했는가?
- [ ] Few-shot 예시가 필요한 도메인이라면 Q→추론→A 예시를 2개 이상 삽입했는가?
- [ ] 출력 파싱을 위해 XML 태그 또는 고정 접두사("최종 답:")를 지정했는가?
- [ ]
temperature를 0.3 이하로 설정해 추론 일관성을 확보했는가? - [ ] 긴 추론 체인이 예상된다면
max_tokens를 충분히(1024+) 늘렸는가?