Few-shot learning은 가장 강력한 프롬프팅 기법 중 하나입니다. 원하는 것의 예시를 제공함으로써 파인튜닝 없이도 모델에게 복잡한 작업을 가르칠 수 있습니다.

<Callout type="info" title="예시를 통한 학습">
인간이 예시를 보고 학습하는 것처럼, AI 모델도 프롬프트에서 제공하는 예시로부터 패턴을 학습할 수 있습니다.
</Callout>

## Few-Shot Learning이란?

Few-shot learning은 작업을 수행하도록 요청하기 전에 모델에게 입력-출력 쌍의 예시를 보여줍니다. 모델은 예시에서 패턴을 학습하고 새로운 입력에 적용합니다.

<Compare 
  before={{ 
    label: "Zero-Shot (예시 없음)", 
    content: `이 리뷰를 긍정 또는 부정으로 분류하세요:

"배터리는 오래가지만 화면이 너무 어둡습니다."

→ 모델이 경계 사례에서 일관성이 없을 수 있음` 
  }}
  after={{ 
    label: "Few-Shot (예시 포함)", 
    content: `"정말 좋아요!" → 긍정
"품질이 별로예요" → 부정  
"좋지만 비싸요" → 혼합

이제 분류하세요:
"배터리는 오래가지만 화면이 너무 어둡습니다."

→ 모델이 정확한 카테고리를 학습함` 
  }}
/>

<div className="my-4 grid grid-cols-2 md:grid-cols-4 gap-2">
  <div className="p-3 bg-muted/50 rounded-lg text-center">
    <div className="text-2xl font-bold">0</div>
    <div className="text-xs text-muted-foreground">Zero-shot</div>
  </div>
  <div className="p-3 bg-muted/50 rounded-lg text-center">
    <div className="text-2xl font-bold">1</div>
    <div className="text-xs text-muted-foreground">One-shot</div>
  </div>
  <div className="p-3 bg-primary/10 rounded-lg text-center border-2 border-primary">
    <div className="text-2xl font-bold">2-5</div>
    <div className="text-xs text-muted-foreground">Few-shot</div>
  </div>
  <div className="p-3 bg-muted/50 rounded-lg text-center">
    <div className="text-2xl font-bold">5+</div>
    <div className="text-xs text-muted-foreground">Many-shot</div>
  </div>
</div>

## 예시가 효과적인 이유

<FewShotDemo />

예시는 다음을 전달합니다:
- **형식**: 출력의 구조
- **스타일**: 어조, 길이, 어휘
- **논리**: 따라야 할 추론 패턴
- **경계 사례**: 특수 상황 처리 방법

## 기본 Few-Shot 패턴

Few-shot 프롬프팅의 기본 구조는 간단한 패턴을 따릅니다: 예시를 보여준 다음 새로운 작업을 요청합니다. 예시 간 형식의 일관성이 중요합니다. 모델은 여러분이 설정한 패턴에서 학습합니다.

```
[예시 1]
입력: [입력 1]
출력: [출력 1]

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

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

이제 이것을 수행하세요:
입력: [새로운 입력]
출력:
```

## 분류를 위한 Few-Shot

분류는 few-shot learning의 가장 강력한 사용 사례 중 하나입니다. 각 카테고리의 예시를 보여줌으로써 지시문만으로는 달성할 수 없는 수준으로 클래스 간 경계를 정확하게 정의할 수 있습니다.

### 감정 분석

<Callout type="info" title="감정 분석이란?">
감정 분석은 텍스트를 감정적 어조에 따라 분류합니다: 긍정, 부정, 중립 또는 혼합. 고객 피드백, 소셜 미디어 모니터링, 브랜드 인식 추적에 널리 사용됩니다.
</Callout>

감정 분류는 각 감정 유형의 예시를 보여주는 것이 도움이 되며, 특히 모호할 수 있는 "혼합" 감정과 같은 경계 사례에 효과적입니다.

<TryIt compact prompt={`고객 리뷰의 감정을 분류하세요.

리뷰: "이 제품은 기대 이상이었습니다! 다시 구매할게요."
감정: 긍정

리뷰: "파손된 채로 도착했고 고객 서비스도 도움이 안 됐어요."
감정: 부정

리뷰: "잘 작동해요, 특별한 건 없지만 제 역할은 합니다."
감정: 중립

리뷰: "품질은 훌륭하지만 배송이 너무 오래 걸렸어요."
감정: 혼합

이제 분류하세요:
리뷰: "디자인은 마음에 들지만 배터리 수명이 아쉬워요."
감정:`} />

### 주제 분류

다중 클래스 분류의 경우 카테고리당 최소 하나의 예시를 포함하세요. 이렇게 하면 모델의 기본 이해와 다를 수 있는 여러분의 특정 분류 체계를 모델이 이해하는 데 도움이 됩니다.

<TryIt compact prompt={`지원 티켓을 분류하세요.

티켓: "계정에 로그인할 수 없고, 비밀번호 재설정도 작동하지 않아요"
카테고리: 인증

티켓: "프리미엄 플랜으로 어떻게 업그레이드하나요?"
카테고리: 결제

티켓: "데이터를 내보내려고 하면 앱이 충돌해요"
카테고리: 버그 리포트

티켓: "모바일 앱에 다크 모드를 추가해 주실 수 있나요?"
카테고리: 기능 요청

이제 분류하세요:
티켓: "결제가 거절됐는데 카드에는 청구가 보여요"
카테고리:`} />

## 변환을 위한 Few-Shot

변환 작업은 의미를 유지하면서 입력을 한 형태에서 다른 형태로 변환합니다. 예시가 필수적인 이유는 여러분의 사용 사례에서 "변환"이 정확히 무엇을 의미하는지 정의하기 때문입니다.

### 텍스트 다시 쓰기

스타일 변환은 원하는 정확한 어조 변화를 보여주는 예시가 필요합니다. "전문적으로 만들어 주세요"와 같은 추상적인 지시는 다르게 해석됩니다. 예시가 구체적으로 만들어 줍니다.

<TryIt compact prompt={`이 문장들을 전문적인 어조로 다시 작성하세요.

비격식: "안녕하세요, 제 이메일 받으셨는지 확인하려고요?"
격식: "이전에 보낸 이메일에 대해 후속 확인을 드리고자 합니다."

비격식: "이거 진짜 중요하고 빨리 처리해야 해요!"
격식: "이 건은 긴급한 주의와 신속한 조치가 필요합니다."

비격식: "답장 늦어서 죄송해요, 너무 바빴어요!"
격식: "답변이 지연된 점 사과드립니다. 특히 바쁜 일정이 있었습니다."

이제 다시 작성하세요:
비격식: "회의에 못 가요, 급한 일이 생겼어요."
격식:`} />

### 형식 변환

형식 변환 작업은 경계 사례와 모호한 입력을 보여주는 예시가 도움이 됩니다. 모델은 까다로운 경우를 처리하기 위한 여러분의 특정 규칙을 학습합니다.

<TryIt compact prompt={`자연어 날짜를 ISO 형식으로 변환하세요.

입력: "다음 주 화요일"
출력: 2024-01-16 (오늘이 2024-01-11 목요일이라고 가정)

입력: "모레"
출력: 2024-01-13

입력: "이번 달 마지막 날"
출력: 2024-01-31

입력: "2주 후"
출력: 2024-01-25

이제 변환하세요:
입력: "다음 달 첫 번째 월요일"
출력:`} />

## 생성을 위한 Few-Shot

생성 작업은 학습된 패턴을 따라 새로운 콘텐츠를 만듭니다. 예시는 길이, 구조, 어조, 강조할 세부 사항을 설정합니다. 이것들은 지시문만으로는 명시하기 어렵습니다.

### 제품 설명

마케팅 카피는 예시의 혜택을 크게 받습니다. 브랜드 목소리, 기능 강조, 설득 기법을 추상적으로 설명하기 어렵기 때문입니다.

<TryIt compact prompt={`이 스타일로 제품 설명을 작성하세요:

제품: 무선 블루투스 헤드폰
설명: 가벼운 무선 헤드폰으로 수정처럼 맑은 사운드에 빠져보세요. 40시간 배터리 수명, 액티브 노이즈 캔슬링, 하루 종일 편안함을 위한 푹신한 메모리폼 이어 쿠션을 특징으로 합니다.

제품: 스테인리스 스틸 물병
설명: 이중벽 단열 물병으로 스타일리시하게 수분을 유지하세요. 음료를 24시간 차갑게 또는 12시간 따뜻하게 유지합니다. 누수 방지 뚜껑을 갖추고 표준 컵 홀더에 맞습니다.

제품: 인체공학적 사무용 의자
설명: 조절 가능한 인체공학적 의자로 작업 공간을 변화시키세요. 통기성 메시 등받이, 허리 지지대, 360° 회전이 결합되어 긴 근무 시간 동안 편안함을 유지합니다.

이제 작성하세요:
제품: 휴대용 폰 충전기
설명:`} />

### 코드 문서화

<Callout type="info" title="왜 코드를 문서화하나요?">
좋은 문서는 코드가 무엇을 하는지, 매개변수, 반환 값, 사용 예시를 설명합니다. 일관된 docstring은 자동 생성 API 문서를 가능하게 하고 IDE가 더 나은 코드 완성을 제공하도록 돕습니다.
</Callout>

문서화 스타일은 프로젝트마다 크게 다릅니다. 예시는 여러분의 특정 형식, 포함할 내용(인자, 반환값, 예시), 기대되는 세부 수준을 가르칩니다.

<TryIt compact prompt={`이 함수들에 대한 문서 주석을 작성하세요:

함수:
def calculate_bmi(weight_kg, height_m):
    return weight_kg / (height_m ** 2)

문서:
"""
체중과 신장으로 체질량지수(BMI)를 계산합니다.

Args:
    weight_kg (float): 킬로그램 단위의 체중
    height_m (float): 미터 단위의 신장

Returns:
    float: BMI 값 (체중/신장²)

Example:
    >>> calculate_bmi(70, 1.75)
    22.86
"""

이제 문서화하세요:
함수:
def is_palindrome(text):
    cleaned = ''.join(c.lower() for c in text if c.isalnum())
    return cleaned == cleaned[::-1]

문서:`} />

## 추출을 위한 Few-Shot

추출 작업은 비정형 텍스트에서 정형 정보를 추출합니다. 예시는 어떤 엔티티가 중요한지, 출력 형식을 어떻게 지정하는지, 정보가 누락되거나 모호한 경우를 어떻게 처리하는지 정의합니다.

### 엔티티 추출

<Callout type="info" title="Named Entity Recognition이란?">
Named Entity Recognition(NER)은 텍스트에서 명명된 엔티티를 식별하고 인물, 조직, 장소, 날짜, 제품과 같은 카테고리로 분류합니다. 정보 검색과 지식 그래프의 기본입니다.
</Callout>

NER은 여러분의 특정 엔티티 유형과 여러 카테고리에 해당할 수 있는 엔티티를 처리하는 방법을 보여주는 예시가 도움이 됩니다.

<TryIt compact prompt={`이 문장들에서 명명된 엔티티를 추출하세요.

텍스트: "애플 CEO 팀 쿡이 쿠퍼티노에서 아이폰 15를 발표했습니다."
엔티티:
- 회사: 애플
- 인물: 팀 쿡
- 제품: 아이폰 15
- 장소: 쿠퍼티노

텍스트: "유럽연합은 2018년에 구글에 43억 4천만 유로의 벌금을 부과했습니다."
엔티티:
- 조직: 유럽연합
- 회사: 구글
- 금액: 43억 4천만 유로
- 날짜: 2018년

이제 추출하세요:
텍스트: "일론 머스크의 SpaceX가 12월 3일 케이프 커내버럴에서 23개의 스타링크 위성을 발사했습니다."
엔티티:`} />

### 정형 데이터 추출

자연어에서 정형 데이터를 추출하려면 누락된 필드, 암시적 정보, 다양한 입력 형식을 처리하는 방법을 보여주는 예시가 필요합니다.

<TryIt compact prompt={`이메일에서 회의 세부 정보를 정형 형식으로 추출하세요.

이메일: "내일 오후 3시에 회의실 B에서 만나 4분기 예산을 논의합시다. 노트북을 가져오세요."

회의:
- 날짜: [내일 날짜]
- 시간: 오후 3:00
- 장소: 회의실 B
- 주제: 4분기 예산 논의
- 요구사항: 노트북 지참

이메일: "팀 동기화가 금요일 오전 10시로 변경됐어요, 대신 Zoom을 사용할 거예요. 링크는 캘린더 초대에 있어요. 최대 30분이에요."

회의:
- 날짜: 금요일
- 시간: 오전 10:00
- 장소: Zoom (가상)
- 주제: 팀 동기화
- 소요 시간: 30분

이제 추출하세요:
이메일: "월요일 오전 9시 30분쯤에 빠르게 통화해서 고객 프레젠테이션 검토할 수 있을까요? Teams 링크 보내드릴게요."

회의:`} />

## 고급 Few-Shot 기법

기본 few-shot 외에도 복잡한 작업의 결과를 개선할 수 있는 여러 기법이 있습니다.

### 다양한 예시

예시의 다양성은 양보다 더 가치가 있습니다. 비슷한 예시를 반복해서 보여주기보다 다른 시나리오, 경계 사례, 잠재적 모호성을 다루세요.

<TryIt compact prompt={`고객 불만에 응답하세요.

예시 1 (제품 문제):
고객: "주문한 제품이 파손된 채로 도착했어요."
응답: "파손된 배송에 대해 진심으로 사과드립니다. 즉시 무료로 교체품을 보내드리겠습니다. 파손된 제품은 반품하실 필요 없습니다. 배송 주소를 확인해 주시겠습니까?"

예시 2 (서비스 문제):
고객: "2시간이나 대기했어요!"
응답: "긴 대기 시간에 대해 정말 죄송합니다. 용납할 수 없는 일입니다. 지금 제가 여기 있으며 개인적으로 문제가 해결될 때까지 도와드리겠습니다. 오늘 무엇을 도와드릴까요?"

예시 3 (결제 문제):
고객: "같은 주문에 두 번 청구하셨어요!"
응답: "결제 오류에 대해 사과드립니다. 중복 청구를 확인했고 원래 결제 수단으로 XX달러 환불을 시작했습니다. 3-5 영업일 내에 확인하실 수 있습니다."

이제 응답하세요:
고객: "제품이 웹사이트에 보이는 것과 다르네요."
응답:`} />

### 부정 예시

<Callout type="tip" title="대조 학습">
"좋은" 예시 대 "나쁜" 예시를 보여주는 것을 대조 학습이라고 합니다. 이는 모델이 원하는 것뿐만 아니라 피해야 할 것도 이해하도록 돕습니다. 스타일과 품질 판단에 특히 유용합니다.
</Callout>

때로는 하지 *말아야* 할 것을 보여주는 것이 올바른 예시를 보여주는 것만큼 가치가 있습니다. 부정 예시는 모델이 경계를 이해하고 흔한 실수를 피하도록 돕습니다.

<TryIt compact prompt={`간결한 이메일 제목을 작성하세요.

좋음: "3분기 보고서 검토 준비 완료"
나쁨: "저기요, 우리가 얘기했던 그 보고서 끝냈어요"

좋음: "조치 필요: 금요일까지 휴가 승인"
나쁨: "부탁 좀 들어주세요 이거 읽어보세요"

좋음: "회의 일정 변경: 프로젝트 동기화 → 목요일 오후 2시"
나쁨: "계획 변경이요!!!!!"

이제 제목을 작성하세요:
내용: 제안서 초안에 대한 피드백 요청
제목:`} />

### 경계 사례 예시

경계 사례는 종종 솔루션이 실제 환경에서 작동하는지 여부를 결정합니다. 예시에 비정상적인 입력을 포함하면 모델이 "정상 경로"에 맞지 않는 실제 데이터에서 실패하는 것을 방지합니다.

<TryIt compact prompt={`이름을 정형 형식으로 파싱하세요.

입력: "John Smith"
출력: {"first": "John", "last": "Smith", "middle": null, "suffix": null}

입력: "Mary Jane Watson-Parker"
출력: {"first": "Mary", "middle": "Jane", "last": "Watson-Parker", "suffix": null}

입력: "Dr. Martin Luther King Jr."
출력: {"prefix": "Dr.", "first": "Martin", "middle": "Luther", "last": "King", "suffix": "Jr."}

입력: "Madonna"
출력: {"first": "Madonna", "last": null, "middle": null, "suffix": null, "mononym": true}

이제 파싱하세요:
입력: "Sir Patrick Stewart III"
출력:`} />

## 몇 개의 예시가 필요할까요?

<div className="my-4 grid gap-2">
  <div className="flex gap-3 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-40">단순 분류</span>
    <span className="text-primary font-mono">2-3</span>
    <span className="text-muted-foreground">카테고리당 최소 1개</span>
  </div>
  <div className="flex gap-3 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-40">복잡한 형식</span>
    <span className="text-primary font-mono">3-5</span>
    <span className="text-muted-foreground">변형 보여주기</span>
  </div>
  <div className="flex gap-3 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-40">미묘한 스타일</span>
    <span className="text-primary font-mono">4-6</span>
    <span className="text-muted-foreground">전체 범위 포착</span>
  </div>
  <div className="flex gap-3 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-40">경계 사례</span>
    <span className="text-primary font-mono">1-2</span>
    <span className="text-muted-foreground">일반 예시와 함께</span>
  </div>
</div>

## 예시 품질이 중요합니다

<Compare 
  before={{ 
    label: "나쁜 예시", 
    content: `"좋은 제품" → 좋음
"좋은 서비스" → 좋음
"좋은 가격" → 좋음

✗ 모두 너무 비슷함
✗ 같은 단어 반복
✗ 경계 사례 없음` 
  }}
  after={{ 
    label: "좋은 예시", 
    content: `"기대 이상이에요!" → 긍정
"파손된 채로 도착" → 부정
"잘 작동해요, 특별한 건 없음" → 중립
"품질은 좋지만 너무 비쌈" → 혼합

✓ 다양한 시나리오
✓ 명확한 경계
✓ 경계 사례 포함` 
  }}
/>

## Few-Shot과 다른 기법의 결합

Few-shot learning은 다른 프롬프팅 기법과 강력하게 결합됩니다. 예시는 "무엇을"을 제공하고 다른 기법은 맥락, 추론 또는 구조를 추가할 수 있습니다.

### Few-Shot + 역할

역할을 추가하면 모델에게 작업을 *왜* 수행하는지에 대한 맥락을 제공하여 품질과 일관성을 향상시킬 수 있습니다.

```
당신은 법률 계약 검토자입니다.

[계약 조항 분석 예시]

이제 분석하세요: [새로운 조항]
```

### Few-Shot + CoT

Few-shot을 Chain of Thought와 결합하면 *어떤* 답변을 제공할지뿐만 아니라 그 답변에 도달하기 위해 *어떻게* 추론하는지도 보여줍니다. 이는 판단이 필요한 작업에 강력합니다.

```
분류하고 추론 과정을 설명하세요.

리뷰: "훌륭한 기능이지만 가격이 너무 비싸요"
생각: 리뷰에서 긍정적인 측면("훌륭한 기능")을 언급하지만 
중요한 부정적 측면("가격이 너무 비쌈")도 있습니다. "~지만" 
접속사를 기반으로 부정적인 면이 긍정적인 면보다 더 큰 것 같습니다.
분류: 혼합-부정

[추론이 포함된 더 많은 예시]

이제 추론과 함께 분류하세요:
리뷰: "딱 필요했던 거예요, 예상보다 빨리 도착했어요"
```

## 요약

<Callout type="tip" title="핵심 요점">
Few-shot learning은 시연을 통해 가르치며 종종 지시문만으로는 더 효과적입니다. 2-5개의 다양하고 정확한 예시를 사용하고 최상의 결과를 위해 다른 기법과 결합하세요.
</Callout>

<Quiz 
  question="Few-shot learning에서 일반적으로 몇 개의 예시를 제공해야 하나요?"
  options={[
    "가능한 한 많이 (10개 이상)",
    "1개의 예시면 항상 충분함",
    "2-5개의 다양하고 정확한 예시",
    "지시가 명확하면 예시는 필요 없음"
  ]}
  correctIndex={2}
  explanation="2-5개의 다양하고 정확한 예시가 일반적으로 가장 잘 작동합니다. 너무 적으면 패턴을 포착하지 못할 수 있고, 너무 많으면 토큰을 낭비하고 모델을 혼란시킬 수 있습니다. 양보다 품질과 다양성이 더 중요합니다."
/>

다음 장에서는 반복적 개선에 대해 알아봅니다: 연속적인 시도를 통해 프롬프트를 개선하는 기술입니다.
