Few-shot 학습 (Few-shot Learning)
Few-shot 학습은 몇 개의 예제를 제공하여 Claude가 패턴을 학습하고 유사한 작업을 수행하도록 하는 기법입니다. 명시적인 지시보다 예제가 더 효과적일 때 사용합니다.
처음 시작하기
"예제로 가르치기" - 설명 대신 예시를 보여주면 Claude가 패턴을 학습합니다.
3가지 핵심:
- Zero-shot - 예제 0개 (지시만) → 간단한 작업용
- One-shot - 예제 1개 → 형식 명확할 때
- Few-shot - 예제 2-10개 → 복잡한 패턴, 높은 정확도
💡 언제 사용? "말로 설명하기 어렵지만 예시는 있을 때" - 스타일 복제, 형식 변환, 분류 등
Few-shot이란?
Few-shot 학습은 In-Context Learning의 일종으로, 모델을 재학습시키지 않고 프롬프트 내 예제만으로 새로운 작업을 수행하게 합니다.
| 방식 | 설명 | 예제 수 | 적합한 경우 |
|---|---|---|---|
| Zero-shot | 예제 없이 지시만 | 0개 | 간단하고 명확한 작업 |
| One-shot | 예제 1개 제공 | 1개 | 형식이 명확한 경우 |
| Few-shot | 예제 여러 개 제공 | 2~10개 | 복잡한 패턴, 애매한 작업 |
기본 구조
Few-shot 프롬프트는 다음 구조를 따릅니다:
[작업 설명]
예시:
입력: [예제 입력 1]
출력: [예제 출력 1]
입력: [예제 입력 2]
출력: [예제 출력 2]
입력: [예제 입력 3]
출력: [예제 출력 3]
이제 다음 입력을 처리하세요:
입력: [실제 입력]
출력:
실전 예시
예시 1: 감정 분석
다음 리뷰의 감정을 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 쿼리로 변환하세요.
테이블 스키마:
- 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으로 구체적 패턴을 학습시키세요.
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 학습을 마스터했다면 더 고급 기법을 탐색하세요:
- Chain-of-Thought - Few-shot + 추론 과정 표시
- 프롬프트 패턴 - 다양한 패턴과 Few-shot 조합
- Tool Use - Few-shot으로 도구 사용 패턴 학습
핵심 정리
- Few-shot 학습 (Few-shot Learning)의 핵심 개념과 흐름을 정리합니다.
- 처음 시작하기를 단계별로 이해합니다.
- 실전 적용 시 기준과 주의점을 확인합니다.
실무 팁
- 입력/출력 예시를 고정해 재현성을 확보하세요.
- Few-shot 학습 (Few-shot Learning) 범위를 작게 잡고 단계적으로 확장하세요.
- 처음 시작하기 조건을 문서화해 대응 시간을 줄이세요.