⚡ 중급2026-06-076분
AI가 틀린 답을 낼 때 — Chain-of-Thought로 추론 과정을 강제하는 법
모델이 결론만 툭 던져서 신뢰하기 어려울 때, CoT 프롬프트로 '생각의 흔적'을 남기게 만들면 오류를 잡아내고 품질이 눈에 띄게 올라갑니다.
prompt-engineeringchain-of-thoughtreasoning
왜 CoT가 필요한가
LLM은 복잡한 추론 문제에서 단답으로 끊어버리면 오류율이 급격히 높아집니다. 수학 계산, 법률 해석, 다단계 디버깅처럼 중간 논리가 중요한 태스크에서 특히 그렇습니다. Chain-of-Thought(CoT)는 모델이 답을 내기 전에 추론 단계를 명시적으로 서술하도록 유도하는 프롬프트 기법입니다.
CoT의 3가지 패턴
| 패턴 | 프롬프트 예시 | 적합한 상황 |
|------|--------------|------------|
| Zero-shot CoT | "단계별로 생각해 보세요." | 빠른 실험, 간단한 추론 |
| Few-shot CoT | 예시 문제 + 풀이 단계를 2~3개 제공 | 특정 포맷 강제 |
| Self-consistency | 동일 질문을 여러 번 → 다수결 | 높은 정확도가 필요한 경우 |
TypeScript로 Few-shot CoT 구현하기
아래 코드는 Anthropic SDK로 few-shot CoT 프롬프트를 구성하고, 모델의 추론 단계와 최종 답을 분리해서 파싱하는 예시입니다.
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const FEW_SHOT_EXAMPLES = `
문제: 사과 12개를 4명이 나누면 각각 몇 개?
풀이:
1단계: 전체 사과 = 12개
2단계: 나누는 인원 = 4명
3단계: 12 ÷ 4 = 3
답: 3개
문제: 버스가 시속 60km로 2시간 30분 달리면 총 거리는?
풀이:
1단계: 속도 = 60 km/h
2단계: 시간 = 2.5시간 (30분 = 0.5시간)
3단계: 거리 = 60 × 2.5 = 150
답: 150 km
`;
async function solveWithCoT(userQuestion: string): Promise<{
reasoning: string;
answer: string;
}> {
const response = await client.messages.create({
model: "claude-haiku-4-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: `다음 예시처럼 단계별 풀이 후 '답:'으로 마무리하세요.\n\n${FEW_SHOT_EXAMPLES}\n문제: ${userQuestion}\n풀이:`,
},
],
});
const raw =
response.content[0].type === "text" ? response.content[0].text : "";
// '답:' 기준으로 추론 과정과 최종 답 분리
const [reasoningPart, answerPart] = raw.split(/^답:/m);
return {
reasoning: reasoningPart?.trim() ?? raw,
answer: answerPart?.trim() ?? "파싱 실패",
};
}
// 사용 예
(async () => {
const result = await solveWithCoT(
"기차가 시속 90km로 1시간 20분 달리면 총 거리는?"
);
console.log("[추론 과정]\n", result.reasoning);
console.log("\n[최종 답]", result.answer);
})()
포인트:
풀이:로 프롬프트를 끝내면 모델이 자연스럽게 중간 단계를 채워 넣습니다. 이 패턴을 '접두사 유도(prefix forcing)' 라고 부릅니다.
CoT 결과 품질 체크 방법
추론 과정이 생겼다고 끝이 아닙니다. 아래 기준으로 CoT 출력을 검증하세요.
- [ ] 각 단계가 이전 단계의 결과를 실제로 사용하고 있는가?
- [ ] 단계 수가 문제 복잡도에 비례하는가? (너무 짧으면 스킵 의심)
- [ ] 최종 답이 풀이 마지막 단계와 일치하는가?
- [ ] Zero-shot CoT와 Few-shot CoT 결과가 일치하는가? (불일치 시 self-consistency 적용)
- [ ]
temperature를 0으로 낮춰 재현성을 확인했는가?