k
korAI
중급 전체
중급2026-05-096분

예시 3개로 Claude 출력 형식을 완전히 고정하는 Few-Shot 패턴

프롬프트에 잘 만든 예시를 심으면 긴 지시문 없이도 Claude가 원하는 형식·톤·구조를 그대로 따라온다. Few-Shot의 원리와 실전 배치 전략을 정리한다.

few-shotprompt-engineeringstructured-output

왜 Few-Shot인가

system 프롬프트에 규칙을 장황하게 써도 Claude가 형식을 벗어날 때가 있다. 이때 예시(shot)를 직접 보여주는 Few-Shot 방식이 훨씬 강력하다. 모델은 규칙을 읽는 것보다 패턴을 보는 것에 더 잘 반응하기 때문이다.

Few-Shot의 핵심 구조

Few-Shot은 user → assistant 쌍을 여러 번 반복해 원하는 입출력 패턴을 심는 기법이다.

  • 0-shot: 예시 없이 지시만
  • 1-shot: 예시 1쌍
  • 3-shot: 예시 3쌍 ← 대부분의 실전 케이스에서 최적
  • 예시가 많을수록 토큰 소비↑, 4~5쌍 이상은 수익 체감

좋은 예시의 조건:

  1. 실제 입력과 같은 도메인·길이
  2. 출력이 원하는 형식을 완벽히 준수
  3. 예시끼리 서로 다른 케이스를 커버

TypeScript 실전 코드

아래는 고객 리뷰를 JSON으로 구조화하는 예시다. Few-Shot 쌍을 messages 배열에 직접 삽입한다.

import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

const FEW_SHOT_EXAMPLES: Anthropic.MessageParam[] = [
  {
    role: "user",
    content: "리뷰: 배송이 너무 느렸어요. 상품 자체는 괜찮습니다.",
  },
  {
    role: "assistant",
    content: JSON.stringify({
      sentiment: "mixed",
      issues: ["배송 지연"],
      positives: ["상품 품질"],
      score: 3,
    }),
  },
  {
    role: "user",
    content: "리뷰: 완전 최고예요! 포장도 꼼꼼하고 빠르게 왔어요.",
  },
  {
    role: "assistant",
    content: JSON.stringify({
      sentiment: "positive",
      issues: [],
      positives: ["포장", "배송 속도"],
      score: 5,
    }),
  },
  {
    role: "user",
    content: "리뷰: 색상이 사진이랑 달라요. 환불 요청했습니다.",
  },
  {
    role: "assistant",
    content: JSON.stringify({
      sentiment: "negative",
      issues: ["색상 불일치", "환불 요청"],
      positives: [],
      score: 1,
    }),
  },
];

async function analyzeReview(review: string) {
  const response = await client.messages.create({
    model: "claude-haiku-4-5",
    max_tokens: 256,
    system:
      "고객 리뷰를 분석해 JSON으로만 응답하라. 추가 설명 없이 JSON만 출력.",
    messages: [
      ...FEW_SHOT_EXAMPLES,
      {
        role: "user",
        content: `리뷰: ${review}`,
      },
    ],
  });

  const text =
    response.content[0].type === "text" ? response.content[0].text : "";
  return JSON.parse(text);
}

// 실행
const result = await analyzeReview(
  "가격 대비 품질이 좋은데 사이즈가 좀 작아요."
);
console.log(result);
// { sentiment: 'mixed', issues: ['사이즈'], positives: ['가성비'], score: 3 }

자주 하는 실수와 해결법

| 실수 | 원인 | 해결 | |------|------|------| | 모델이 예시 형식을 무시 | 예시가 너무 단순하거나 1개뿐 | 3쌍 이상, 엣지 케이스 포함 | | JSON 파싱 오류 | assistant 예시에 설명문 혼입 | 예시 출력을 순수 JSON만으로 | | 응답이 예시와 달리 길어짐 | system 지시와 예시가 충돌 | system에 "JSON만 출력" 명시 |


✅ Few-Shot 적용 체크리스트

  • [ ] 예시가 3쌍 이상인가?
  • [ ] 각 예시의 assistant 출력이 원하는 형식을 100% 준수하는가?
  • [ ] 예시끼리 서로 다른 입력 유형을 커버하는가?
  • [ ] system 프롬프트와 예시가 서로 충돌하지 않는가?
  • [ ] 예시 토큰 수가 전체 max_tokens의 40% 이하인가?
  • [ ] 실제 입력값과 예시의 도메인·길이가 유사한가?