제로샷 분류(Zero-Shot Classification)는 특정 작업에 맞게 별도로 학습시키지 않아도, 자연어 레이블 목록만 제시하면 텍스트를 즉시 분류할 수 있는 NLP 기법이다. 고객 지원 티켓 라우팅, 기사 태깅, 사용자 의도 감지 등 레이블이 자주 바뀌거나 학습 데이터가 부족한 상황에서 특히 유용하다.
작동 원리
기존 분류 모델은 레이블을 숫자 ID로 학습한다. 반면 제로샷 분류는 레이블 자체를 자연어 문장으로 바꿔 추론 문제로 접근한다.
입력 텍스트 "회사가 엔터프라이즈 고객을 위한 AI 플랫폼을 출시했다." 에 대해 ["기술", "스포츠", "금융"] 레이블이 주어지면, 모델 내부적으로 다음과 같이 처리한다:
이 텍스트는 기술에 관한 것이다. → 점수: 0.96
이 텍스트는 스포츠에 관한 것이다. → 점수: 0.02
이 텍스트는 금융에 관한 것이다. → 점수: 0.02이 추론 방식 덕분에 레이블 의미가 분류 정확도에 직접 영향을 미친다. money보다 billing issue처럼 구체적인 레이블이 더 높은 정확도를 낸다.
주요 활용 케이스
| 케이스 | 예시 레이블 |
|---|---|
| 고객 지원 티켓 분류 | billing issue, technical support, refund request |
| 뉴스 기사 태깅 | 정치, 경제, 스포츠, 기술 |
| 콘텐츠 모더레이션 | spam, harassment, safe |
| 사용자 의도 감지 | 구매 의향, 정보 탐색, 불만 표출 |
빠른 시작
from transformers import pipeline
classifier = pipeline(
"zero-shot-classification",
model="facebook/bart-large-mnli"
)
text = "이 튜토리얼은 NLP에서 트랜스포머 모델이 어떻게 활용되는지 설명한다."
candidate_labels = ["기술", "건강", "스포츠", "금융"]
result = classifier(text, candidate_labels)
print(f"최상위 예측: {result['labels'][0]} ({result['scores'][0]:.2%})")
# 최상위 예측: 기술 (96.52%)멀티레이블 분류
하나의 텍스트가 여러 카테고리에 속할 경우 multi_label=True를 사용한다:
text = "회사가 건강 앱을 출시하고 강한 사업 성장을 발표했다."
result = classifier(
text,
["기술", "헬스케어", "비즈니스", "여행"],
multi_label=True
)
# 헬스케어 (99.41%), 기술 (99.06%), 비즈니스 (98.15%)가설 템플릿 커스터마이징
기본 가설 템플릿을 변경하면 특정 도메인에서 정확도가 올라간다:
result = classifier(
text,
candidate_labels,
hypothesis_template="이 텍스트는 {}에 관한 것이다."
)모델 선택
| 모델 | 특징 | 권장 용도 |
|---|---|---|
facebook/bart-large-mnli | 정확도 높음, 영어 강점 | 기본 사용 |
cross-encoder/nli-deberta-v3-large | 더 높은 정확도 | 프로덕션 |
joeddav/xlm-roberta-large-xnli | 다국어 지원 | 한국어 포함 멀티링궐 |
한계
- 레이블이 너무 추상적이거나 모호하면 성능 저하
- 도메인 특화 용어에서는 파인튜닝 모델에 뒤처질 수 있음
- 레이블 수가 많아질수록 추론 시간 증가