k
korAI
중급 전체
중급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으로 낮춰 재현성을 확인했는가?