Few-shot 학습 (Few-shot Learning)

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

업데이트 안내: 모델/요금/버전/정책 등 시점에 민감한 정보는 변동될 수 있습니다. 최신 내용은 공식 문서를 확인하세요.

처음 시작하기

🎓 Few-shot 학습이란?

"예제로 가르치기" - 설명 대신 예시를 보여주면 Claude가 패턴을 학습합니다.

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" 입력: "이 제품 마음에 들어요!" Claude 패턴 추론 (예제 없음) 출력 positive ⚠️ 정확도: 보통 (70-80%) Few-shot: 예제로 패턴 학습 프롬프트 + 예제들 예제 1: "정말 좋아요!" → positive 예제 2: "실망이에요." → negative 예제 3: "보통입니다." → neutral 입력: "이 제품 마음에 들어요!" Claude 예제로부터 패턴 학습 ✓ 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]

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

입력: [실제 입력]
출력:

실전 예시

예시 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개+ 도메인 특화 작업
⚠️ 예제가 많다고 항상 좋은 것은 아닙니다

예제가 너무 많으면:

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

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

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)

잘못된 예제도 함께 보여주면 Claude가 피해야 할 것을 학습합니다.

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

✅ 좋은 예시:

입력: 회의 일정 변경 건
출력: "[일정 변경] 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-",
    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: 예제를 그대로 복사함

증상: Claude가 새로운 입력에도 예제의 출력을 그대로 반환

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

해결:

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

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

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

해결:

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

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

해결:

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

다음 단계

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

핵심 정리

  • Few-shot 학습 (Few-shot Learning)의 핵심 개념과 흐름을 정리합니다.
  • 처음 시작하기를 단계별로 이해합니다.
  • 실전 적용 시 기준과 주의점을 확인합니다.

실무 팁

  • 입력/출력 예시를 고정해 재현성을 확보하세요.
  • Few-shot 학습 (Few-shot Learning) 범위를 작게 잡고 단계적으로 확장하세요.
  • 처음 시작하기 조건을 문서화해 대응 시간을 줄이세요.