Few-shot 학습 (Few-shot Learning)

Few-shot 학습은 몇 개의 예제를 제공하여 AI 모델이 패턴을 파악하고 유사한 작업을 수행하도록 유도하는 기법입니다. 명시적인 지시보다 예제가 더 효과적일 때 사용합니다.

처음 시작하기

🎓 Few-shot 학습이란?

"예제로 가르치기" - 설명 대신 예시를 보여주면 모델이 패턴을 파악합니다.

3가지 핵심:

  1. Zero-shot - 예제 0개 (지시만) → 간단한 작업용
  2. One-shot - 예제 1개 → 형식 명확할 때
  3. Few-shot - 예제 2-10개 → 복잡한 패턴, 높은 정확도

💡 언제 사용? "말로 설명하기 어렵지만 예시는 있을 때" - 스타일 복제, 형식 변환, 분류 등

Few-shot이란?

Few-shot 학습은 In-Context Learning의 일종으로, 모델을 재학습시키지 않고 프롬프트 내 예제만으로 새로운 작업을 수행하게 합니다.

방식 설명 예제 수 적합한 경우
Zero-shot 예제 없이 지시만 0개 간단하고 명확한 작업
One-shot 예제 1개 제공 1개 형식이 명확한 경우
Few-shot 예제 여러 개 제공 2~10개 복잡한 패턴, 애매한 작업
Zero-shot vs Few-shot 학습 비교 Zero-shot: 예제 없이 지시만 프롬프트 "다음 리뷰의 감정을 분류하세요: positive/negative/neutral" 입력: "이 제품 마음에 들어요!" LLM 패턴 추론 (예제 없음) 출력 positive ⚠️ 정확도: 보통 (70-80%) Few-shot: 예제로 패턴 학습 프롬프트 + 예제들 예제 1: "정말 좋아요!" → positive 예제 2: "실망이에요." → negative 예제 3: "보통입니다." → neutral 입력: "이 제품 마음에 들어요!" LLM 예제로부터 패턴 학습 ✓ 3개 예제 참조 출력 positive ✅ 정확도: 높음 (85-95%) 예제 패턴과 일치 Zero-shot 장단점 ✓ 빠름 (예제 준비 불필요) ✗ 낮은 정확도 (복잡한 작업) Few-shot 장단점 ✓ 높은 정확도 (패턴 학습) ✗ 예제 준비 필요 (토큰 사용 증가)
그림 1: Zero-shot vs Few-shot 학습 방식 비교 - 예제 제공 시 정확도가 15-25% 향상

기본 구조

Few-shot 프롬프트는 다음 구조를 따릅니다:

Few-shot 프롬프트 템플릿
[작업 설명]

예시:

입력: [예제 입력 1]
출력: [예제 출력 1]

입력: [예제 입력 2]
출력: [예제 출력 2]

입력: [예제 입력 3]
출력: [예제 출력 3]

이제 다음 입력을 처리하세요:

입력: [실제 입력]
출력:
Few-shot 프롬프트 구조 ① 작업 설명 "다음 리뷰의 감정을 positive / negative / neutral로 분류하세요" ② 예제 (Examples) 입력: "정말 좋아요!" → positive 입력: "실망이에요." → negative 입력: "보통입니다." → neutral 핵심 원리 예제는 다양한 패턴을 포함해야 합니다 형식은 모든 예제에서 일관되어야 합니다 3~5개가 일반적 권장량입니다 (Anthropic 공식 권장) 입력: "디자인은 예쁜데 내구성..." 출력: mixed (예제 패턴 기반 분류) 지시/정의 학습 예제 사용자 입력 모델 출력
그림 2: Few-shot 프롬프트의 3단계 구조 — 작업 설명 → 예제 → 실제 입력/출력

실전 예시

예시 1: 감정 분석

Few-shot 감정 분석
다음 리뷰의 감정을 positive/negative/neutral로 분류하세요:

예시:

입력: "이 제품 정말 마음에 들어요! 품질이 최고네요."
출력: positive

입력: "배송은 빨랐지만 제품이 설명과 달라요."
출력: negative

입력: "보통입니다. 가격대비 무난해요."
출력: neutral

입력: "예상보다 훨씬 좋습니다. 강력 추천!"
출력: positive

이제 다음 리뷰를 분류하세요:

입력: "디자인은 예쁜데 내구성이 걱정되네요."
출력:

예시 2: 구조화된 데이터 추출

이메일에서 정보 추출
이메일에서 이름, 전화번호, 문의 유형을 JSON으로 추출하세요:

예시:

입력: "안녕하세요, 김철수입니다. 제품 A에 대해 문의드립니다. 연락처는 010-1234-5678입니다."
출력:
{
  "name": "김철수",
  "phone": "010-1234-5678",
  "inquiry_type": "제품 문의"
}

입력: "이영희입니다. 환불 요청합니다. 010-9876-5432로 연락 주세요."
출력:
{
  "name": "이영희",
  "phone": "010-9876-5432",
  "inquiry_type": "환불"
}

입력: "배송 관련 문의입니다. 박민수, 010-5555-7777"
출력:
{
  "name": "박민수",
  "phone": "010-5555-7777",
  "inquiry_type": "배송 문의"
}

이제 다음 이메일을 처리하세요:

입력: "최지영입니다. 주문 번호 12345의 배송 상태가 궁금합니다. 010-1111-2222"
출력:

예시 3: 코드 생성

자연어 → SQL 변환
자연어 질문을 SQL 쿼리로 변환하세요.

테이블 스키마:
- users(id, name, email, created_at)
- orders(id, user_id, amount, order_date)

예시:

입력: "2024년에 가입한 모든 사용자 조회"
출력:
```sql
SELECT * FROM users
WHERE YEAR(created_at) = 2024;
```

입력: "주문 금액이 10만원 이상인 고객 이름과 이메일"
출력:
```sql
SELECT DISTINCT u.name, u.email
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.amount >= 100000;
```

입력: "각 사용자의 총 주문 금액과 주문 건수"
출력:
```sql
SELECT u.id, u.name,
       COUNT(o.id) AS order_count,
       SUM(o.amount) AS total_amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;
```

이제 다음 질문을 SQL로 변환하세요:

입력: "최근 30일간 주문이 없는 사용자 목록"
출력:

베스트 프랙티스

1. 다양한 예제 제공

예제는 다양한 패턴과 엣지 케이스를 포함해야 합니다.

❌ 나쁜 예시 (유사한 예제)
입력: "좋아요"
출력: positive

입력: "최고예요"
출력: positive

입력: "훌륭합니다"
출력: positive

# 모두 긍정 → 패턴 학습 부족
✅ 좋은 예시 (다양한 예제)
입력: "좋아요"
출력: positive

입력: "별로예요"
출력: negative

입력: "그냥 그래요"
출력: neutral

입력: "디자인은 좋은데 가격이 비싸요"
출력: mixed

# 다양한 감정 + 복합 감정 포함

2. 일관된 형식 유지

모든 예제는 동일한 형식을 따라야 합니다.

❌ 나쁜 예시 (형식 불일치)
예시 1:
Q: 파이썬으로 리스트 정렬하는 법?
A: list.sort() 사용

예시 2:
리스트 길이는? → len(list)

예시 3:
딕셔너리에서 키 가져오기: dict.keys()

# 형식이 제각각
✅ 좋은 예시 (일관된 형식)
질문: 파이썬으로 리스트 정렬하는 법?
답변: list.sort() 또는 sorted(list) 사용

질문: 리스트 길이 구하는 법?
답변: len(list) 사용

질문: 딕셔너리에서 모든 키 가져오는 법?
답변: dict.keys() 사용

# 모든 예제가 "질문: ... 답변: ..." 형식

3. 예제 순서 고려

간단한 예제부터 복잡한 예제 순으로 배치하세요.

예제 순서 최적화
# 1. 기본 케이스
입력: "안녕하세요"
출력: "반갑습니다!"

# 2. 약간 복잡한 케이스
입력: "주문 취소하고 싶어요"
출력: "주문 취소를 도와드리겠습니다. 주문번호를 알려주시겠어요?"

# 3. 엣지 케이스
입력: "ㅁㄴㅇㄹ"
출력: "죄송합니다. 이해하지 못했습니다. 다시 말씀해 주시겠어요?"

4. 최적 예제 수 찾기

일반적으로 3~5개가 적당하지만, 작업의 복잡도에 따라 조정하세요.

작업 복잡도 권장 예제 수 예시
매우 간단 1~2개 단순 분류, 형식 변환
중간 3~5개 감정 분석, 데이터 추출
복잡 5~10개 코드 생성, 복잡한 추론
매우 복잡 10개+ 도메인 특화 작업

예제 수별 성능/비용 비교 (감정 분석 작업 기준)

예제 수 정확도 입력 토큰 응답 속도 비용 (상대) 권장 사용
0 (Zero-shot) 70-75% ~50 0.5초 1x 빠른 프로토타입
1 (One-shot) 75-80% ~100 0.6초 2x 형식 명확화
3 85-88% ~200 0.8초 4x 일반적 권장 ✅
5 90-92% ~350 1.0초 7x 높은 정확도 필요
10 93-94% ~700 1.5초 14x 도메인 특화
20 94-95% ~1400 2.5초 28x 거의 불필요 ⚠️
핵심 인사이트:
  • 3개 예제: 가성비 최고 (정확도 85-88%, 비용 4배)
  • 5개 이상: 정확도 개선 폭 감소 (수익 체감의 법칙)
  • 10개 이상: 비용 대비 효과 낮음 (1% 개선에 2배 비용)
  • 최적 전략: 3개로 시작 → 정확도 부족 시 5개로 증가
⚠️ 예제가 많다고 항상 좋은 것은 아닙니다

예제가 너무 많으면:

  • 입력 토큰 증가 → 비용 상승
  • 응답 지연 시간 증가
  • 중요한 예제가 묻힐 수 있음

핵심은 대표성다양성입니다.

5. 명시적 레이블 사용

입력과 출력을 명확히 구분하세요.

명시적 레이블 예시
<example>
<input>배송이 너무 느려요</input>
<output>negative</output>
</example>

<example>
<input>품질이 좋네요</input>
<output>positive</output>
</example>

# XML 태그로 명확히 구분

고급 기법

1. 예제 체이닝

여러 단계의 작업을 예제로 보여줄 수 있습니다.

다단계 예제
텍스트를 분석하고 단계별로 처리하세요:

예시:

입력: "김철수 고객님의 주문 #12345가 배송 중입니다."

1단계 (개체 인식):
- 이름: 김철수
- 주문번호: 12345
- 상태: 배송 중

2단계 (의도 파악):
- 의도: 배송 상태 알림

3단계 (응답 생성):
"고객님, 주문 #12345가 현재 배송 중입니다. 곧 도착할 예정입니다."

---

이제 다음 텍스트를 처리하세요:

입력: "이영희 고객님의 환불 요청 #67890이 승인되었습니다."

1단계 (개체 인식):
2단계 (의도 파악):
3단계 (응답 생성):

2. 부정적 예제 (Negative Examples)

잘못된 예제도 함께 보여주면 모델이 피해야 할 것을 파악하는 데 도움이 됩니다.

부정적 예제 포함
이메일 제목을 전문적으로 작성하세요.

✅ 좋은 예시:

입력: 회의 일정 변경 건
출력: "[일정 변경] 2월 15일 마케팅 회의 → 2월 20일로 조정"

입력: 프로젝트 완료 보고
출력: "[완료 보고] Q1 웹사이트 리뉴얼 프로젝트 최종 결과"

❌ 피해야 할 예시:

입력: 급함!!!
출력: "급한 거 있어요!!" (X)
올바른 출력: "[긴급] 즉시 확인 필요 사항"

입력: 문의드려요~
출력: "질문 있어요~~" (X)
올바른 출력: "[문의] 제품 사양 관련 질문"

이제 다음 입력을 처리하세요:

입력: 버그 발견됨
출력:

3. 설명 포함 예제

복잡한 작업은 예제에 설명을 추가하세요.

설명 포함 예제
코드 리뷰를 수행하세요.

예시:

코드:
```python
def div(a, b):
    return a / b
```

리뷰:
**문제:** ZeroDivisionError 가능성
**심각도:** HIGH
**설명:** b가 0일 때 예외 발생
**수정:**
```python
def div(a, b):
    if b == 0:
        raise ValueError("Division by zero")
    return a / b
```

---

코드:
```python
password = input("Password: ")
print(f"Your password is {password}")
```

리뷰:
**문제:** 보안 - 비밀번호 평문 출력
**심각도:** CRITICAL
**설명:** 비밀번호를 로그에 노출하면 안 됨
**수정:**
```python
password = getpass.getpass("Password: ")
# 비밀번호는 절대 출력하지 않음
```

시스템 프롬프트와 조합

시스템 프롬프트로 역할을 정의하고, Few-shot으로 구체적 패턴을 학습시키세요.

Python 예시
from anthropic import Anthropic

client = Anthropic()

system_prompt = """당신은 고객 지원 AI입니다.
항상 공손하고, 간결하며, 해결 중심적으로 답변하세요."""

few_shot_examples = """예시:

고객: "배송이 안 왔어요"
AI: "불편을 드려 죄송합니다. 주문번호를 알려주시면 배송 상태를 확인해드리겠습니다."

고객: "환불해주세요"
AI: "환불 도와드리겠습니다. 주문번호와 환불 사유를 말씀해 주시겠어요?"

고객: "이거 어떻게 쓰는 거예요?"
AI: "사용법을 안내해드리겠습니다. 어떤 기능이 궁금하신가요?"
"""

user_input = "제품이 고장났어요"

message = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=512,
    system=system_prompt,
    messages=[
        {
            "role": "user",
            "content": few_shot_examples + f"\n\n고객: \"{user_input}\"\nAI:"
        }
    ]
)

print(message.content[0].text)

언제 Few-shot을 사용하나요?

상황 Zero-shot (예제 없음) Few-shot (예제 있음)
작업이 명확함 ✅ 권장 불필요
복잡한 형식 요구 불확실 ✅ 권장
도메인 특화 작업 어려움 ✅ 필수
일관성 중요 변동 가능 ✅ 권장
빠른 응답 필요 ✅ 권장 느림 (예제 처리 시간)
비용 민감 ✅ 권장 비쌈 (입력 토큰 증가)

문제 해결

문제 1: 예제를 그대로 복사함

증상: 모델이 새로운 입력에도 예제의 출력을 그대로 반환

원인: 예제가 너무 유사하거나, 지시사항이 불명확

해결:

  • 더 다양한 예제 제공
  • "위 예시를 참고하여 새로운 입력을 처리하세요" 명시

문제 2: 형식이 일관되지 않음

증상: 출력 형식이 예제와 다름

해결:

  • 예제 형식을 완벽히 일치시키기
  • "반드시 위 예시와 동일한 형식으로 출력하세요" 추가

문제 3: 성능이 기대에 못 미침

해결:

  • 예제 품질 점검 (오타, 논리 오류 등)
  • 예제 수 조정 (너무 적거나 많을 수 있음)
  • Chain-of-Thought와 조합 (다음 섹션 참조)

다음 단계

Few-shot 학습을 마스터했다면 더 고급 기법을 탐색하세요:

핵심 정리

Few-shot 학습 한 장 요약

Few-shot은 모델을 재학습시키지 않고 프롬프트 내 예제만으로 새로운 작업을 수행하게 하는 기법입니다.

핵심 원리

  • In-Context Learning: Few-shot은 모델 파라미터 변경 없이 컨텍스트(예제)만으로 학습합니다. Brown et al. (2020)이 GPT-3에서 처음 실증한 이후 모든 주요 LLM의 표준 기법이 되었습니다.
  • 예제가 지시보다 강합니다: Min et al. (2022) 연구에 따르면, 레이블이 올바르지 않더라도 예제의 형식과 레이블 분포만 일관되면 모델이 올바른 패턴을 학습합니다.
  • 정확도 향상: Zero-shot 대비 Few-shot(3~5개) 적용 시 감정 분석 등 분류 작업에서 정확도가 15~25% 포인트 향상됩니다.

실전 적용 체크리스트

  • 작업 설명을 명확하고 구체적으로 작성했는가?
  • 예제가 다양한 케이스(긍정/부정/중립/엣지)를 포함하는가?
  • 모든 예제가 동일한 입력/출력 형식을 따르는가?
  • 예제 수가 적절한가? (일반적 3~5개, 복잡한 작업 5~10개)
  • 시스템 프롬프트로 역할을 정의하고 Few-shot으로 구체적 패턴을 보여주는가?

한계와 주의점

  • 복잡한 추론의 한계: Few-shot만으로는 다단계 추론(수학 계산, 논리 추론)에서 오류가 발생할 수 있습니다. 이 경우 Chain-of-Thought와 조합하세요.
  • 토큰 비용: 예제 1개당 약 50~100 토큰이 추가됩니다. 예제 10개 이상은 비용 대비 효과가 급격히 줄어듭니다.
  • 컨텍스트 윈도우 제한: 긴 예제는 모델의 윈도우 한도를 초과할 수 있습니다. Anthropic에 따르면 컨텍스트가 길어질수록 모델의 정보 회상 정확도가 떨어지는 "컨텍스트 로트(context rot)" 현상이 발생합니다.

실무 팁

1. 작게 시작해서 점진적으로 확장

먼저 Zero-shot으로 시도하고, 성능이 부족하면 1개의 예제(One-shot)를 추가하세요. 여전히 부족할 때만 3~5개로 확장합니다. 예제를 추가할 때마다 성능을 측정하여 최적점을 찾으세요.

2. 대표성과 다양성 확보

Anthropic은 "다양하고 정형화된 예제(canonical examples)"를 추천합니다. 모든 예제가 비슷한 패턴이면 모델이 올바르게 일반화하지 못합니다. 예를 들어 감정 분석에서 긍정/부정/중립/복합 감정을 골고루 포함하세요.

3. 형식 일관성을 최우선으로

Min et al. (2022) 연구에서 확인된 것처럼, 예제의 레이블 정확도보다 형식의 일관성이 성능에 더 큰 영향을 미칩니다. 모든 예제에서 동일한 구분자(예: "입력:", "출력:")를 사용하세요.

4. 시스템 프롬프트와 조합 활용

시스템 프롬프트로 역할과 규칙을 정의하고, Few-shot으로 구체적 출력 패턴을 보여주세요. 이 조합은 고객 지원, 콘텐츠 생성 등 실무에서 가장 높은 성능을 보입니다.

5. 예제 자체를 평가

Anthropic은 LLM에게 예제의 관련성과 다양성을 평가하게 하거나, 초기 예제 세트를 기반으로 추가 예제를 생성하게 하는 것을 권장합니다. 프롬프트를 최적화하는 데 LLM 자체를 활용하세요.

6. 비용 의식적 설계

예제 1개는 약 50~100 토큰, 5개는 약 350 토큰을 사용합니다. 프로덕션 환경에서는 예제 수를 줄이거나 동적 선택(dynamic few-shot)을 적용하여 토큰 비용을 최적화하세요.

참고 문헌

  • Brown, T. et al. (2020). Language Models are Few-Shot Learners. NeurIPS 2020. (arXiv:2005.14165) — Few-shot learning의 원초적 연구. GPT-3에서 In-Context Learning 능력을 처음 실증.
  • Min, S. et al. (2022). Rethinking the Role of Demonstrations: What Makes In-Context Learning Work? ACL 2022. (arXiv:2202.12837) — 예제의 레이블 정확도보다 형식과 분포가 더 중요하다는 발견.
  • Anthropic. Prompting Best Practices. Claude Platform Docs. (platform.claude.com) — 3~5개 예제 권장, XML 태그 활용법 등 Claude 특화 가이드.
  • Anthropic. (2025). Effective Context Engineering for AI Agents. (anthropic.com) — 컨텍스트 윈도우의 한계, 예제 큐레이션 전략.
  • Sahoo, P. et al. (2025). A Systematic Survey of Prompt Engineering Techniques. (arXiv:2406.06608) — 58종 LLM 프롬프트 기법 분류 및 Few-shot 관련 연구 종합.