⚡ 중급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쌍 이상은 수익 체감
좋은 예시의 조건:
- 실제 입력과 같은 도메인·길이
- 출력이 원하는 형식을 완벽히 준수
- 예시끼리 서로 다른 케이스를 커버
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% 이하인가? - [ ] 실제 입력값과 예시의 도메인·길이가 유사한가?