Skip to content

Load and Search Hugging Face Datasets

Hugging Face는 모델뿐 아니라 다양한 공개 데이터셋을 제공한다. Qdrant 팀 역시 임베딩이 미리 계산된 데이터셋을 업로드해 두었다. 이를 활용하면 임베딩 생성 과정을 생략하고 즉시 벡터 데이터베이스 실습을 시작할 수 있다.

예시 데이터셋 ― arxiv-titles-instructorxl-embeddings

  • 내용: ArXiv 논문 _제목_만을 INSTRUCTOR-XL(768차원)로 임베딩

  • 크기: 약 225만 개 벡터, 16 GB 이상

  • 페이로드:

    {
      "title": "Nash Social Welfare for Indivisible Items under ...",
      "DOI": "1612.05191"
    }
    

1. Hugging Face에서 데이터 불러오기

from datasets import load_dataset

dataset = load_dataset("Qdrant/arxiv-titles-instructorxl-embeddings")
# → 디스크 전체 다운로드 (시간 소요)
스트리밍으로 메모리 절약
dataset = load_dataset(
    "Qdrant/arxiv-titles-instructorxl-embeddings",
    split="train",
    streaming=True,      # 다운로드 없이 스트림
)

2. Qdrant 컬렉션 생성

from qdrant_client import QdrantClient, models

client = QdrantClient("http://localhost:6333")   # 필요 시 URL 변경

client.create_collection(
    collection_name="arxiv-titles-instructorxl-embeddings",
    vectors_config=models.VectorParams(
        size=768,
        distance=models.Distance.COSINE
    ),
)

3. 대용량 배치 업로드

대규모 데이터는 배치로 나누어 upsert 해야 효율적이다.

from itertools import islice

def batched(iterable, n: int):
    iterator = iter(iterable)
    while (batch := list(islice(iterator, n))):
        yield batch

batch_size = 100

for batch in batched(dataset, batch_size):
    ids     = [row.pop("id")     for row in batch]   # id 분리
    vectors = [row.pop("vector") for row in batch]   # 벡터 분리

    client.upsert(
        collection_name="arxiv-titles-instructorxl-embeddings",
        points=models.Batch(
            ids=ids,
            vectors=vectors,
            payloads=batch,     # title·DOI 등 메타데이터
        ),
    )
  • Python 3.12 이상이면 itertools.batched 를 바로 사용해도 된다.

업로드가 끝나면 벡터 검색 즉시 가능하다.

4. 간단한 검색 예시

result = client.query_points(
    collection_name="arxiv-titles-instructorxl-embeddings",
    query=[768차원 쿼리 벡터],
    limit=5,
).points

for p in result:
    print(p.payload["title"], p.score)

더 많은 실습용 데이터

Qdrant Hub·Hugging Face에 계속 추가 중이다. 필요한 데이터셋이 있다면 Discord 채널로 요청하면 된다.