10/23/2025

제로샷 학습 (Zero-Shot Learning)

본 글은 제로샷 학습(Zero-Shot Learning)의 개념을 이해하고, 실제 예제 코드를 통해 이를 구현하는 방법을 설명합니다. 제로샷 학습이 무엇이고, 왜 중요한지를 Hugging Face를 이용해 얼마나 쉽게 활용할 수 있는지 다루도록 하겠습니다.


제로샷 학습이란 무엇인가?

전통적인 머신러닝 모델을 훈련시키는 방식으로 "암기 과목" 공부와 비슷합니다. 예를 들어 모델에게 "고양이"와 "개" 사진 1000장을 보여주며 "이건 고양이야, 이건 강아지야"라고 정답(Label)을 알려줍니다. 학습이 끝난 모델은 "고양이"와 "강아지"는 잘 구분하지만, 한 번도 본 적 없는 "코끼리" 사진을 주면 혼란에 빠집니다.


제로샷 학습은 이와는 정반대입니다. 이름 그대로, 0(Zero)개의 예시(Shot)만 보고도 문제를 푸는 방식입니다. 예를 들어 모델에게 "고양이"나 "강아지"라는 정답(Label) 자체를 가르친 적이 없습니다. 대신, 모델은 "언어"와 "이미지" 사이의 "관계"와 "개념"을 미리 학습합니다.


마치 우리가 "얼룩말"을 한 번도 본적이 없어도, "말이랑 비슷한데 몸에 검은 줄무늬가 있어"라는 설명만 듣고도 얼룩말을 알아볼 수 있는 것과 같습니다.


위에서 언급한 개념을 더 쉽게 이해하기 위해 "도서관 사서"로 비유해보겠습니다.


전통적인 사서 (훈련 필요)

  • 이 사서는 "역사", "과학" 코너만 압니다.

  • 새롭게 "경제" 책이 들어오면, 이 사서는 이 책을 어디에 둬야 할지 모릅니다. "경제" 코너를 새로 만들고, 어떤 책이 경제 책인지 수백 권의 예시를 보여주며 "다시 훈련(Fine-tuning)" 해야 합니다.


제로샷 사서 (훈련 불필요)

  • 이 사서는 "역사", "과학" 코너를 암기한 것이 아니라, "책의 내용"과 "코너 이름(Label)"의  의미를 모두 이해하고 있습니다.

  • 새로운 "경제" 책이 들어오면, 사서는 이 책을 읽어봅니다.

  • 그리고 우리가 제시한 새로운 코너 이름(Lable)인 "경제"의 의미도 생각해봅니다.

  • 사서는 이 책의 내용은 "경제"라는 단어의 의미와 매우 가깝다고 추론하고 책을 분류합니다.


이제 제로샷 학습에 대해서 이해가 되셨나요?


왜 이 학습법이 혁신적일까?

전통적인 AI 모델 구축의 가장 큰 병목은 "데이터 라벨링" 입니다. 수만, 수십만 개의 데이터에 일일이 정답을 매핑하는 작업은 시간과 비용이 엄청나게 듭니다.


제로샷은 이 문제를 해결합니다.

  • 비용 절감: 데이터 라벨링 비용이 절감됩니다.

  • 유연성: "정치", "사회"로 분류하던 모델을 "IT", "예술"로 분류하고 싶을 때, 모델을 재훈련할 필요 없이 Label 이름만 바꿔주면 됩니다.

  • 신속성: 아이디어가 떠오른 즉시 프로토타입을 만들 수 있습니다.


제로샷 구현 예시

텍스트 분류

가장 기본적인 제로샷 텍스트 분류 예제를 살펴보겠습니다.

먼저 Hugging Face의 transformers 라이브러리를 설치합니다.


!pip install transformers


다음은 텍스트(sequence)와 후보 라벨(candidate_labels)만으로 분류를 수행하는 코드입니다.


from transformers import pipeline


classifier = pipeline("zero-shot-classification", model="MoritzLaurer/mDeBERTa-v3-base-mnli-xnli")

sequence_to_classify = "내일 중요한 축구 경기가 열린다고 한다."

candidate_labels = ["정치", "경제", "스포츠", "IT/기술"]

output = classifier(sequence_to_classify, candidate_labels, multi_label=False)

print(output)


위 코드를 실행하면 아래와 같은 결과가 나오게됩니다.


{'sequence': '내일 중요한 축구 경기가 열린다고 한다.', 

'labels': ['스포츠', 'IT/기술', '정치', '경제'], 

'scores': [0.9846686720848083, 0.008273092098534107,0.0036497144028544426, 0.003408558899536729]}


  • sequence: 원본 텍스트

  • labels: 점수가 높은 순서대로 정렬된 라벨 리스트

  • scores: 각 라벨 대한 신뢰도 점수(0~1)


"축구 경기"라는 텍스트가 "스포츠" 라벨과 가장 관련성(0.98)이 높다고 나옵니다. 위 모델은 정확하게 추론해냈습니다.


만약, 하나의 텍스트가 여러 개의 라벨에 속할 수 있다면, multi_label=True 옵션을 사용합니다.


from transformers import pipeline


classifier = pipeline("zero-shot-classification", model="MoritzLaurer/mDeBERTa-v3-base-mnli-xnli")

sequence_to_classify = "이 레스토랑은 음악은 훌륭하지만, 음식 맛은 평범했다."

candidate_labels = ["음식", "서비스", "음악", "가격"]

output = classifier(sequence_to_classify, candidate_labels, multi_label=True)

print(output)


위 코드를 실행하면 아래의 결과가 나오게됩니다.


{'sequence': '이 레스토랑은 음악은 훌륭하지만, 음식 맛은 평범했다.', 'labels': ['음악', '음식', '서비스', '가격'], 'scores': [0.9990034103393555, 0.9980430006980896, 0.9746165871620178, 0.48950350284576416]}


multi_label=True로 설정하면, 점수(scores)의 총합이 1이 되지 않습니다. 따라서 각 라벨이 독립적으로 "참일 확률"을 계산할 수 있습니다. 위 결과는 "음악"과 "음식" 모두에 관한 내용임을 추론한 것입니다.


이미지 분류

제로샷 개념은 텍스트에만 국한되지 않습니다. "개념"을 이해하는 모델이라면 이미지 분류나 객체 탐지에도 적용할 수 있습니다.

텍스트 분류가 NLI 모델을 기반으로 한다면, 이미지 분류는 CLIP(Contrastive Language Image Pre-training) 모델을 기반으로 합니다.


CLIP 모델은

  • 인터넷에서 수집한(이미지, 이미지 설명 텍스트) 쌍 정보를 엄청나게 많이 학습한 모델입니다.

  • CLIP은 "고양이 사진"과 "고양이라는 텍스트"가 서로 "가까운" 개념임을 압니다.


from transformers import pipeline

from PIL import Image

import requests # URL에서 이미지를 불러오기 위해


# 1. 제로샷 '이미지' 분류 파이프라인 로드

#    CLIP 모델을 명시적으로 지정해줍니다.

image_classifier = pipeline(

    "zero-shot-image-classification", 

    model="openai/clip-vit-large-patch14"

)


# 2. 분류할 이미지 준비 (인터넷에서 고양이 사진 불러오기)

url = "https://images.unsplash.com/photo-1514888286974-6c03e2ca1dba"

image = Image.open(requests.get(url, stream=True).raw)


# 3. 후보 레이블 (텍스트로)

#    모델은 이 텍스트와 이미지의 '유사도'를 계산합니다.

labels = ["a photo of a cat", "a photo of a dog", "a photo of a car"]


# 4. 분류 실행

result = image_classifier(image, candidate_labels=labels)

pprint.pprint(result)


위 코드를 실행하면 아래의 결과가 나옵니다.

[{'score': 0.9979252815246582, 'label': 'a photo of a cat'}, {'score': 0.0012550547253340483, 'label': 'a photo of a dog'}, {'score': 0.0008196595590561628, 'label': 'a photo of a car'}]


모델은 이미지를 보고, 우리가 제시한 라벨 중 "a photo of a cat"이라는 설명과 이미지의 개념이 99.7% 일치한다고 판단했습니다.


객체 분류

이미지 전체를 분류하는 것을 넘어, 이미지 안의 특정 객체들을 텍스트로 찾아내는 것도 가능합니다.

from transformers import pipeline

from PIL import Image

import requests # URL에서 이미지를 불러오기 위해


# 1. 제로샷 '객체 탐지' 파이프라인 로드

object_detector = pipeline(

"zero-shot-object-detection",

model="google/owlvit-large-patch14"

)


# 2. (위와 동일한 고양이 이미지 사용)

url = "https://images.unsplash.com/photo-1514888286974-6c03e2ca1dba"

image = Image.open(requests.get(url, stream=True).raw)


# 3. 찾아내고 싶은 객체들의 이름 (텍스트)

labels_to_find = ["cat nose", "cat eyes", "remote control"]


# 4. 탐지 실행

result = object_detector(image, candidate_labels=labels_to_find)

print(result)


위 코드를 실행하면 아래의 결과나 나옵니다.

[{'score': 0.5476904511451721, 'label': 'cat nose', 'box': {'xmin': 2350, 'ymin': 1570, 'xmax': 2640, 'ymax': 1818}}, 

{'score': 0.3316132128238678, 'label': 'cat eyes', 'box': {'xmin': 2021, 'ymin': 1199, 'xmax': 2931, 'ymax': 1442}}, {'score': 0.31051504611968994, 'label': 'cat eyes', 'box': {'xmin': 2027, 'ymin': 1200, 'xmax': 2940, 'ymax': 1449}}, 

{'score': 0.29117435216903687, 'label': 'cat eyes', 'box': {'xmin': 2680, 'ymin': 1215, 'xmax': 2952, 'ymax': 1438}}, {'score': 0.24599002301692963, 'label': 'cat eyes', 'box': {'xmin': 2046, 'ymin': 1199, 'xmax': 2328, 'ymax': 1417}}, 

{'score': 0.17471081018447876, 'label': 'cat nose', 'box': {'xmin': 2336, 'ymin': 1601, 'xmax': 2644, 'ymax': 1821}}, {'score': 0.14712969958782196, 'label': 'cat eyes', 'box': {'xmin': 2679, 'ymin': 1215, 'xmax': 2953, 'ymax': 1450}}, 

{'score': 0.14246635138988495, 'label': 'cat eyes', 'box': {'xmin': 2018, 'ymin': 1200, 'xmax': 2332, 'ymax': 1435}}, {'score': 0.14067652821540833, 'label': 'cat eyes', 'box': {'xmin': 1985, 'ymin': 1186, 'xmax': 2983, 'ymax': 1478}}, 

{'score': 0.13866569101810455, 'label': 'cat eyes', 'box': {'xmin': 1765, 'ymin': 1098, 'xmax': 3168, 'ymax': 1572}}]

 

결론

이제까지 제로샷에 대해서 알아보았고, 장점과 한계에 대해서 다시 한번 살펴보겠습니다.


제로샷의 장점

  • 데이터가 필요 없음

  • 유연성: 비즈니스 요구사항이 변경되어 분류 카테고리를 늘려야 할 때, 재훈련없이 candidate_labels만 수정하면 됩니다.

  • 프로토타이핑: "이런 분류가 어떨까?" 라는 아이디어를 검증하기 위해 간단히 테스트할 수 있습니다.


제로샷의 한계

  • 정확도: 모든 것을 적당히 알지만, 한 분야의 "전문가" 보다는 못합니다. 만약 "고객 리뷰"에 대해 "긍정/부정"으로 분류하는 단 하나의 작업만 수행해야 한다면, 해당 작업에 특화된 데이터로 "파인 튜닝"한 모델이 제로샷 모델보다 좋습니다.

  • 모호성: NLI 기반 모델은 라벨의 "단어 의미"에 크게 의존합니다. "IT, 기술" 처럼 의미가 비슷한 라벨이 함께 있으면 모델이 혼동합니다. 따라서 복잡한 분류는 어려울 수 있습니다.

  • 속도 및 크기: 제로샷을 수행하는 NLI 모델이나 CLIP 모델은 크기가 매우 큽니다. 특화 모델보다 추론 속도가 느릴 수 있습니다.


제로샷 학습은 "모든 것을 대체하는" 만병 통치약은 아닙니다. 하지만 AI 개발의 패러다임을 바꾸는 강력한 도구이기에 아래의 상황에서 사용 하시기를 추천 드립니다.

  • 초기 탐색 및 프로토타이핑: 어떤 종류의 데이터가 유입되는지, 어떤 분류가 의미 있을지 빠르게 탐색할 때 활용

  • 데이터가 절대적으로 부족할 때: 라벨링된 데이터가 아예 없을 때 유일한 선택지

  • 동적인 분류가 필요할 때: 분류 카테고리가 매일같이 바뀌는 환경일 때 (e.g. 실시간 뉴스 토픽 분류)


여기서 사용된 코드는
https://github.com/monocleface/huggingface-tutorials/blob/main/natural-language-processing/sample_zeroshot_classification.ipynb 에서 보시면 됩니다.

10/22/2025

텍스트 감정 분석 (Sentiment Analysis)

텍스트 분류(Text Classification)는 주어진 텍스트(e.g. 문장이나 문서)를 미리 정해진 카테고리(범주) 중 하나로 분류하는 작업을 의미합니다.

그 중 가장 대표적인 유즈 케이스가 감정 분석(Sentiment Analysis)입니다.

본 글에서는 Huggingface에 존재하는 모델 2가지로 테스트를 진행했습니다.

  • Copycats/koelectra-base-v3-generalized-sentiment-analysis
  • yangheng/deberta-v3-base-absa-v1.1

테스트를 위해 복합적인 감정이 섞인 문장을 작성했습니다.

  • 음식 맛은 정말 훌륭한데, 가게가 너무 시끄럽고 직원이 불친절해요.
  • 분위기나 인테리어는 정말 예쁜데, 가격에 비해 양이 너무 적었어요.
  • 기능은 다양한데, 사용법이 너무 복잡해서 오히려 불편해요.
  • 배우들 연기는 정말 최고였어요.
  • 한번입었는데 옆에 봉제선 다 풀리고 실밥도 계속 나옵니다. 마감 처리 너무 엉망 아닌가요?
  • 오랜만에 친구들을 만나서 반가웠지만, 헤어질 때는 너무 아쉬웠어요.
  • 영상미는 화려하고 좋았지만, 결말이 너무 허무했습니다.

위 문장의 의미를 조금 더 자세히 살펴보면,

문장의 구조 (A-but-B)

A-but-B의 의미는 A(긍정)이지만 B(부정)이다라는 구조이고, 이런 문장에서 사람들은 보통 B에 더 강한 강조점이나 최종 결론을 둡니다.

  • A(긍정): 음식 맛은 정말 훌륭한데
  • B(부정): 가게가 너무 시끄럽고 직원이 불친절해요.

위 문장은 "맛은 좋았으나, 시끄럽고 불친절해서 (전반적으로) 별로였다." 라는 뉘앙스를 풍깁니다. (저만 그런가요?)

부정적인 요소의 "양"

단순하게 키워드만 보면,

  • 긍정 키워드: 훌륭한데 (1개)
  • 부정 키워드: 시끄럽고, 불친절해요. (2개)

일반적인 감정 분석 모델은 문장 전체를 보고 하나의 레이블(긍정/부정)을 결정해야 할 때, 부정적인 요소가 2가지나 명확하게 언급되면 부정으로 판단할 가능성이 큽니다.

감정 분석 모델의 한계

문장을 어떻게 분석하는지는 모델의 수준에 따라 다릅니다.

일반적인 감정 분석(Sentence-level)에서는 문장 전체의 "종합적인" 분위기를 판단하도록 학습됩니다.
이 경우, 긍정적인 면(맛)이 언급되었음에도 부정적인 면(소음, 불친절)이 경험을 망쳤다고 해석하여 "부정"으로 분류할 것입니다.

속성 기반 감정 분석(ABSA - Aspect-Based Sentiment Analysis)에서는 문장을 "주제" 별로 분리하여 각각의 감정을 분석합니다. 만약 위에 언급된 문장을 ABSA 모델로 분석한다면 아래의 결과가 나올 것 입니다.

  • 음식 맛: 긍정
  • 가게 분위기/소음: 부정
  • 직원/서비스: 부정

위 관점에서 2개의 모델을 테스트 해보겠습니다.

Copycats/koelectra-base-v3-generalized-sentiment-analysis 모델 테스트

# import library
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification, TextClassificationPipeline

# load model
tokenizer = AutoTokenizer.from_pretrained("Copycats/koelectra-base-v3-generalized-sentiment-analysis")
model = AutoModelForSequenceClassification.from_pretrained("Copycats/koelectra-base-v3-generalized-sentiment-analysis")
sentiment_classifier = TextClassificationPipeline(tokenizer=tokenizer, model=model)

# target reviews
review_list = [
    "음식 맛은 정말 훌륭한데, 가게가 너무 시끄럽고 직원이 불친절해요.",
    "분위기나 인테리어는 정말 예쁜데, 가격에 비해 양이 너무 적었어요.",
    "기능은 다양한데, 사용법이 너무 복잡해서 오히려 불편해요.",
    "배우들 연기는 정말 최고였어요.",
    '한번입었는데 옆에 봉제선 다 풀리고 실밥도 계속 나옵니다. 마감 처리 너무 엉망 아닌가요?',
    "오랜만에 친구들을 만나서 반가웠지만, 헤어질 때는 너무 아쉬웠어요.",
    "영상미는 화려하고 좋았지만, 결말이 너무 허무했습니다."
]

# predict
for idx, review in enumerate(review_list):
  pred = sentiment_classifier(review)
  print(f'{review}\n>> {pred[0]}')

수행 결과는 아래와 같습니다.

음식 맛은 정말 훌륭한데, 가게가 너무 시끄럽고 직원이 불친절해요.
>> {'label': '0', 'score': 0.9508960247039795}

분위기나 인테리어는 정말 예쁜데, 가격에 비해 양이 너무 적었어요.
>> {'label': '0', 'score': 0.6903115510940552}

기능은 다양한데, 사용법이 너무 복잡해서 오히려 불편해요.
>> {'label': '0', 'score': 0.9847258925437927}

배우들 연기는 정말 최고였어요.
>> {'label': '1', 'score': 0.9640251994132996}

한번입었는데 옆에 봉제선 다 풀리고 실밥도 계속 나옵니다. 마감 처리 너무 엉망 아닌가요?
>> {'label': '0', 'score': 0.9988909363746643}

오랜만에 친구들을 만나서 반가웠지만, 헤어질 때는 너무 아쉬웠어요.
>> {'label': '1', 'score': 0.9475674629211426}

영상미는 화려하고 좋았지만, 결말이 너무 허무했습니다.
>> {'label': '0', 'score': 0.9037595987319946}

yangheng/deberta-v3-base-absa-v1.1 모델 테스트

# import library
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification, TextClassificationPipeline

# load model
tokenizer = AutoTokenizer.from_pretrained("yangheng/deberta-v3-base-absa-v1.1")
model = AutoModelForSequenceClassification.from_pretrained("yangheng/deberta-v3-base-absa-v1.1")
sentiment_classifier = TextClassificationPipeline(tokenizer=tokenizer, model=model)

# target reviews
review_list = [
    "음식 맛은 정말 훌륭한데, 가게가 너무 시끄럽고 직원이 불친절해요.",
    "분위기나 인테리어는 정말 예쁜데, 가격에 비해 양이 너무 적었어요.",
    "기능은 다양한데, 사용법이 너무 복잡해서 오히려 불편해요.",
    "배우들 연기는 정말 최고였어요.",
    '한번입었는데 옆에 봉제선 다 풀리고 실밥도 계속 나옵니다. 마감 처리 너무 엉망 아닌가요?',
    "오랜만에 친구들을 만나서 반가웠지만, 헤어질 때는 너무 아쉬웠어요.",
    "영상미는 화려하고 좋았지만, 결말이 너무 허무했습니다."
]

# predict
for idx, review in enumerate(review_list):
  pred = sentiment_classifier(review)
  print(f'{review}\n>> {pred[0]}')

수행 결과는 아래와 같습니다.

음식 맛은 정말 훌륭한데, 가게가 너무 시끄럽고 직원이 불친절해요.
>> {'label': 'Positive', 'score': 0.7525179386138916}

분위기나 인테리어는 정말 예쁜데, 가격에 비해 양이 너무 적었어요.
>> {'label': 'Positive', 'score': 0.5790202617645264}

기능은 다양한데, 사용법이 너무 복잡해서 오히려 불편해요.
>> {'label': 'Negative', 'score': 0.5635974407196045}

배우들 연기는 정말 최고였어요.
>> {'label': 'Positive', 'score': 0.9434264302253723}

한번입었는데 옆에 봉제선 다 풀리고 실밥도 계속 나옵니다. 마감 처리 너무 엉망 아닌가요?
>> {'label': 'Negative', 'score': 0.9397663474082947}

오랜만에 친구들을 만나서 반가웠지만, 헤어질 때는 너무 아쉬웠어요.
>> {'label': 'Positive', 'score': 0.8371114134788513}

영상미는 화려하고 좋았지만, 결말이 너무 허무했습니다.
>> {'label': 'Positive', 'score': 0.862045168876648}

결론

어떤 모델이 더 정확하다고 생각하시나요?

Copycats/koelectra-base-v3-generalized-sentiment-analysis 모델

이 모델이 복합 감정 문장을 훨씬 더 잘 이해한다고 생각합니다.

  • 영상미는... 좋았지만, 결말이... 허무했습니다. -> Negative (정확)
  • 음식 맛은... 훌륭한데, 직원이... 불친절해요. -> Negative (정확)
  • 분위기나... 예쁜데, 양이... 적었어요. -> Negative (정확)
  • 기능은... 다양한데, 사용법이... 불편해요. -> Negative (정확)

문장 앞부분의 긍정적인 칭찬에도 불구하고, 최종적으로 전달하려는 의도(불편함, 불친절함, 양 적음, 허무함)가 부정적이라는 것을 정확하게 포착했다고 생각합니다.

yangheng/deberta-v3-base-absa-v1.1 모델

이 모델은 "A이지만 B이다." 구조의 문맥을 잘 파악하지 못하는 것 같습니다.

  • 영상미는... 좋았지만, 결말이... 허무했습니다. -> Positive (부정확)
  • 음식 맛은... 훌륭한데, 직원이... 불친절해요. -> Positive (부정확)
  • 분위기나... 예쁜데, 양이... 적었어요. -> Positive (부정확)

이 모델은 문장 앞부분에 나오는 훌륭한데, 예쁜데, 좋았지만 등과 같은 긍정적인 단어에 너무 큰 가중치를 두어, 뒤에 오는 부정적인 결론을 놓친다고 생각합니다.

테스트 코드는 - https://github.com/monocleface/huggingface-tutorials/blob/main/natural-language-processing/sample_text_sentiment_analysis.ipynb 에 올려두었습니다.

10/20/2025

허깅페이스 트랜스포머 라이브러리 (Huggingface Transformers)

AI가 어떻게 인간 언어를 이해하거나 마치 사람이 쓴 것처럼 보이는 텍스트를 생성하는 등 놀라운 성과를 낼 수 았는지 궁금한 적이 있나요?

마법처럼 보이는 것의 상당 부분은 Transformer 라는 모델에서 비롯됩니다. 자연어 처리(NLP) 분야에 출시된 많은 프레임워크는 Transformer 모델을기반으로 하며, 그중에서도 Huggng Face Transformer Library가 중요한 역할을 합니다.

본 글에서는 이 라이브러리가 엔지니어와 연구자 모두에게 강력한 도구인 이유를 살펴봅니다.


Transformers 라이브러리란?


이 라이브러리는 자연어 처리(NLP) 관련하여 사전에 학습된 다양한 모델을 제공하는 오픈 소스 라이브러리입니다. PyTorch, TensorFlow를 기반으로 구축되어 매우 다재다능하고 강력합니다.

이 라이브러리가 사람들에게 각광을 받고 있는 이유는 매우 쉽기 때문입니다. 딥러닝 전문가가 아니어도 쉽게 사용할 수 있습니다. (제가 사용하는걸 보면 말 다했죠?)

몇 줄의 코드만으로 복잡한 모델을 구현할 수 있습니다. 단순하고 쉬운 사용성으로 인해 다양한 개발자와 연구자들이 AI를 활용할 수 있습니다.

오늘날 우리가 사용하는 딥러닝 모델의 장점은 처음부터 학습시킬 필요가 없다는 것입니다. 대부분의 모델은 사전 학습되어 있으며, 엔지니어는 맞춤형 데이터를 사용하여 모델을 학습시키는 역할을 하게 됩니다.

텍스트 분류, 질의응답 등 어떤 작업이든 바로 사용 할 수 있는 모델이 준비되어 있습니다. 처음부터 시작할 필요가 없기에 시간과 리소스를 크게 절약할 수 있습니다.

사전 학습된 모델은 특정 요구에 적합하지 않을 수 있습니다. 이런 상황에서 허깅페이스가 힘을 발휘합니다. 이 라이브러리를 사용하면 데이터 세트에서 모델을 미세 조정 할 수 있기에 특정 요건에 맞게 모델을 커스텀 할 수 있습니다.


커뮤니티의 힘

허깅페이스를 특별하게 만드는 것은 기술력외에 활발한 커뮤니티입니다. 커뮤니티에 참여하면 풍부한 지식과 자원을 얻을 수 있습니다.

사용자들은 라이브러리에 지속적으로 기여하고 새로운 모델, 기능을 추가하면서 점점 진화하는 생태계를 만들어갑니다. 이런 점 때문에 라이브러리는 AI 연구 및 응용 분야에서 트렌드를 유지할 수 있습니다.


라이브러리 사용법

Trnasformers 라이브러리를 사용하는 것이 얼마나 쉬운 것인지 살펴보도록 하겠습니다. 긴 텍스트를 입력 받아서 요약본을 반환하는 간단한 요약 스크립트를 만들어 보겠습니다.

먼저 transformers 라이브러리에서 데이터를 가져옵니다.허허깅페이스에서 “pipeline”은 데이터를 원하는 형태로 변경하기 위한 단계를 수행하는데 도움이 되는 도구 입니다.

from transformers import pipeline

파이프라인을 사용하면 내부 작동 방식에 대한 복잡한 것을 알 필요 없이 다양한 작업에 간편하게 사용할 수 있습니다. 이번 예시에는 요약을 위한 파이프라인을 사용하겠습니다.

summarizer = pipeline(“summarization”)

요약 파이프라인을 사용할 준비가 되었네요. 긴 텍스트를 전달하고 응답이 나오는지 확인해보도록 합니다.

text = “When I find myself in times of trouble,  (이하 생략)"
summary = summarizer(text)
print(summary[0][‘summary_text’])

아래는 응답 결과입니다.

When I find myself in times of trouble, Mother Mary comes to me. She speaks words of wisdom, let it be. When the broken hearted people living in the world agree. There will be an answer. There is still a chance that they will see each other again.

Hugging Face Transformers 라이브러리를 이용하는 것이 얼마나 쉬운지 알 수 있습니다.

허깅페이스 트랜스포머 라이브러리는 단순한 AI 모델 모음 그 이상입니다. 일반 수준의 사용자도 고급진 AI를 활용할 수 있도록 해주는 관문입니다.

본 글에서 작성된 샘플 코드는 https://github.com/monocleface/docs/blob/main/codes/transformers-text-summerization-sample.py 에서 확인할 수 있습니다. 

다음에는 Transformers 라이브러리에 대해서 자세하게 살펴보도록 하겠습니다.