On-Device 임베딩: Qdrant Edge & FastEmbed

On-Device 임베딩: Qdrant Edge & FastEmbed (edge-edge-fastembed-embeddings)

Python을 쓴다면 FastEmbed 라이브러리로 Qdrant Edge에서 쓸 임베딩을 만들 수 있어요. FastEmbed는 엣지 기기에서 효율적으로 동작하는 멀티모달 모델을 제공해서, 텍스트와 이미지로부터 벡터 임베딩을 생성해 줘요.

키워드 검색용 BM25 희소 임베딩을 만들려면 Qdrant Edge의 BM25 Embeddings 문서를 참고하세요.

출처: Qdrant 공식 문서 — edge/edge-fastembed-embeddings

기기 준비하기 (Provision the Device)

Qdrant Edge를 실행할 기기가 간헐적이거나 아예 없는 인터넷 연결을 가진다고 가정해 볼게요. 그렇다면 필요한 의존성과 모델 파일을 미리 준비해 둬야 해요. 먼저 FastEmbed와 Qdrant Edge Python 바인딩을 설치해요.

pip install fastembed qdrant-edge-py

그다음 임베딩 모델을 내려받아 기기에 로컬로 저장해요. ImageEmbeddingTextEmbedding 인스턴스를 만들 때 cache_dir 파라미터를 로컬 디렉터리로 지정하면 돼요.

from fastembed import ImageEmbedding, TextEmbedding

TEXT_MODEL_NAME = 'Qdrant/clip-ViT-B-32-text'
VISION_MODEL_NAME = 'Qdrant/clip-ViT-B-32-vision'
MODELS_DIR = "./qdrant-edge-directory/models"

ImageEmbedding(
    model_name=VISION_MODEL_NAME,
    cache_dir=MODELS_DIR
)

TextEmbedding(
    model_name=TEXT_MODEL_NAME,
    cache_dir=MODELS_DIR
)

모델은 지정한 MODELS_DIR에 내려받아 캐시돼요. 여기에서 임베딩 생성에 그대로 사용하면 돼요.

이미지 임베딩 생성하기 (Generate Image Embeddings)

먼저 Qdrant Edge Quickstart 가이드에서 설명한 대로 Edge Shard를 초기화해요.

temp.jpg 이미지 파일이 있다고 가정하면, FastEmbed의 ImageEmbedding 클래스로 이미지 임베딩을 만들어 Edge Shard에 저장할 수 있어요.

from pathlib import Path
from qdrant_edge import Point, UpdateOperation
import uuid

IMAGES_DIR = "images"

image_model = ImageEmbedding(
    model_name=VISION_MODEL_NAME,
    cache_dir=MODELS_DIR,
    local_files_only=True
)

embeddings = list(image_model.embed([Path(IMAGES_DIR) / "temp.jpg"]))[0]

point = Point(
    id=str(uuid.uuid4()),
    vector={VECTOR_NAME: embeddings.tolist()}
)

edge_shard.update(UpdateOperation.upsert_points([point]))

여기서 cache_dir=MODELS_DIRlocal_files_only=True둘 다 써서, 이미지 임베딩 모델을 이전에 내려받은 로컬 디렉터리에서 불러온다는 점을 눈여겨보세요.

텍스트 임베딩 생성하기 (Generate Text Embeddings)

쿼리 시점에는 FastEmbed의 TextEmbedding 클래스로 텍스트 임베딩을 만들 수 있어요. 예를 들어 Edge Shard를 쿼리한다면 이렇게 해요.

from qdrant_edge import Query, QueryRequest

text_model = TextEmbedding(
    model_name=TEXT_MODEL_NAME,
    cache_dir=MODELS_DIR,
    local_files_only=True
)

embeddings = list(text_model.embed(["<search terms>"]))[0]

results = edge_shard.query(
    QueryRequest(
        query=Query.Nearest(embeddings.tolist(), using=VECTOR_NAME),
        limit=10,
        with_vector=False,
        with_payload=True
    )
)

역시 cache_dir=MODELS_DIRlocal_files_only=True를 사용해서 텍스트 임베딩 모델을 로컬 디렉터리에서 불러와요.

더 알아보기 (Learn more)