임베딩 시작하기 – Hugging Face 튜토리얼

TL;DR

Hugging Face는 Inference API를 통해 sentence-transformers/all-MiniLM-L6-v2 모델로 텍스트 임베딩을 생성하고, 결과 벡터를 Hub에 무료로 호스팅하며, 의미 검색을 수행해 가장 관련성 높은 FAQ 항목을 검색하는 실용적인 튜토리얼을 공개했습니다.


임베딩 이해하기

임베딩은 텍스트, 이미지, 오디오와 같은 데이터의 의미를 포착하는 조밀한 수치 벡터입니다. 예를 들어, 문장 "What is the main benefit of voting?"[0.84, 0.42, …, 0.02]와 같은 384차원 벡터로 표현될 수 있습니다. 벡터가 의미를 인코딩하기 때문에 벡터 간 거리(예: 코사인 유사도)는 두 정보가 얼마나 유사한지를 보여줍니다.

임베딩은 텍스트에만 국한되지 않으며, 이미지 임베딩을 텍스트 임베딩과 비교하여 크로스모달 검색 및 분류를 가능하게 합니다. 오픈소스 Sentence Transformers 라이브러리는 이러한 임베딩을 무료로 생성할 수 있는 최신 모델들을 제공합니다.

임베딩이 가능하게 하는 것

"이 ML 다목적 도구(임베딩)를 이해하면 검색 엔진부터 추천 시스템, 챗봇 및 그 외 다양한 것을 만들 수 있습니다. 이를 사용하기 위해 ML 전문 지식을 가진 데이터 과학자일 필요도 없고, 방대한 라벨링된 데이터셋도 필요하지 않습니다." – Dale Markowitz, Google Cloud

주요 제품들은 임베딩에 의존합니다: Google Search는 텍스트‑대‑텍스트 및 텍스트‑대‑이미지 매칭을 수행하고, Snapchat은 광고 순위에 이를 사용하며, Meta는 소셜 검색에 활용합니다. 데이터셋을 임베딩하면 원시 콘텐츠를 검색 가능한 벡터 공간으로 변환하지만, 이는 기술적으로 까다롭고 비용이 많이 들 수 있습니다. 이 튜토리얼은 이러한 장벽을 피할 수 있는 가볍고 오픈소스인 워크플로우를 보여줍니다.

엔드‑투‑엔드 FAQ 엔진 예시

가이드는 미국 사회보장 메디케어 FAQ 데이터셋을 사용해 간단한 FAQ 검색 시스템을 구축합니다. 워크플로우는 세 단계로 구성됩니다:

  1. FAQ 질문을 임베딩 하려면 Hugging Face Inference API를 사용합니다.
  2. 임베딩 매트릭스를 업로드 하여 Hugging Face Hub에 무료로 호스팅합니다.
  3. 임베딩을 쿼리 하여 사용자의 질문과 가장 의미적으로 유사한 FAQ를 찾습니다.

1. 데이터셋 임베딩

모델 선택

튜토리얼은 Sentence Transformers 라이브러리의 컴팩트하면서도 강력한 모델인 sentence-transformers/all-MiniLM-L6-v2를 선택합니다.

model_id = "sentence-transformers/all-MiniLM-L6-v2"

인증

Hugging Face 계정 설정에서 쓰기 토큰을 생성하고 이를 hf_token에 저장합니다.

hf_token = "<your token>"

API 호출

feature‑extraction 엔드포인트를 사용해 임베딩을 얻습니다. 첫 번째 요청은 모델이 서버에 다운로드되기 때문에 약 20초 정도 걸릴 수 있으며, 이후 호출은 빠릅니다.

import requests
api_url = f"https://api-inference.huggingface.co/pipeline/feature-extraction/{model_id}"
headers = {"Authorization": f"Bearer {hf_token}"}

def query(texts):
    response = requests.post(
        api_url,
        headers=headers,
        json={"inputs": texts, "options": {"wait_for_model": True}}
    )
    return response.json()

입력 예시

texts = [
    "How do I get a replacement Medicare card?",
    "What is the monthly premium for Medicare Part B?",
    # … (additional 11 questions) …
]
output = query(texts)

API는 질문당 하나씩 384차원 벡터 리스트를 반환합니다. 이를 Pandas DataFrame으로 변환하면 (13, 384) 형태의 매트릭스가 됩니다.

import pandas as pd
embeddings = pd.DataFrame(output)

2. Hugging Face Hub에 임베딩을 무료로 호스팅하기

datasets 라이브러리를 사용하면 임베딩이 포함된 CSV 파일을 공유할 수 있습니다. 내보낸 후:

embeddings.to_csv("embeddings.csv", index=False)

embeddings.csv를 Hub UI(새 데이터셋 → 파일 업로드) 또는 CLI를 통해 업로드합니다. 결과 리포지토리, 예를 들어 datasets/ITESM/embedded_faqs_medicare는 한 명령으로 로드할 수 있습니다:

from datasets import load_dataset
faqs = load_dataset("ITESM/embedded_faqs_medicare")

3. 쿼리에 가장 유사한 FAQ 검색

임베딩을 텐서로 로드

import torch
faqs_embeddings = load_dataset('ITESM/embedded_faqs_medicare')
corpus = torch.from_numpy(
    faqs_embeddings["train"].to_pandas().to_numpy()
).float()

사용자 쿼리 임베딩

question = ["How can Medicare help me?"]
query_vec = torch.FloatTensor(query(question))

의미 검색

Sentence Transformers의 semantic_search 유틸리티는 코사인 유사도를 계산하고 상위 k개의 가장 가까운 벡터를 반환합니다.

from sentence_transformers.util import semantic_search
hits = semantic_search(query_vec, corpus, top_k=5)

샘플 출력:

[{'corpus_id': 8, 'score': 0.7565},
 {'corpus_id': 7, 'score': 0.7419},
 {'corpus_id': 3, 'score': 0.7253},
 {'corpus_id': 9, 'score': 0.6736},
 {'corpus_id': 10, 'score': 0.6505}]

corpus_id를 원래 texts 리스트에 매핑하면 가장 관련성 높은 다섯 개 FAQ를 얻을 수 있습니다:

print([texts[h['corpus_id']] for h in hits[0]])

결과:

  • Medicare Part A 및 Part B 보험료에 대한 도움을 어떻게 받을 수 있나요?
  • Medicare란 무엇이며, 누가 받을 수 있나요?
  • Medicare에 어떻게 가입하나요?
  • Medicare의 다양한 파트는 무엇인가요?
  • 소득이 높아져서 Medicare 보험료가 더 높아질까요?

같은 워크플로우를 다른 도메인, 더 큰 코퍼스, 혹은 멀티모달 데이터에 적용할 수 있습니다.

추가 학습 자료

  • Sentence Transformers Hub – 모델 및 사용법 모음.
  • Comparative tweet by Nils Reimers highlighting Sentence Transformers vs. GPT‑3 embeddings. – Nils Reimers가 작성한 비교 트윗으로, Sentence Transformers와 GPT‑3 임베딩을 비교합니다.
  • Official documentation at sbert.net. – sbert.net에 있는 공식 문서.
  • Research threads on recent embedding advances (e.g., Nima Boscarino’s Twitter thread). – 최근 임베딩 발전에 관한 연구 스레드(예: Nima Boscarino의 트위터 스레드).

학습 및 고급 기법

추론에 익숙해지면 다음을 탐색해 보세요:

  • 임베딩 모델 파인튜닝 (train-sentence-transformers).
  • 재정렬기(크로스‑인코더) 학습 (train-reranker).
  • SPLADE와 같은 희소 임베딩 모델 (train-sparse-encoder).
  • 텍스트, 이미지, 오디오, 비디오용 멀티모달 임베딩 (multimodal-sentence-transformers).
  • 최소 손실로 차원 축소를 가능하게 하는 Matryoshka 임베딩.
  • CPU에 최적화된 정적 임베딩 (static-embeddings).
  • 저장 공간을 줄이고 검색 속도를 높이는 양자화 방법.

이러한 확장은 높은 정확도, 낮은 지연 시간, 비용 효율적인 배포를 가능하게 하여 프로덕션 수준의 의미 검색 시스템을 구현합니다.


튜토리얼은 모든 단계를 재현하는 Colab 노트북과 함께 제공됩니다.

Sources