OpenAI 임베딩 연동

OpenAI 임베딩 연동 (openai)

Qdrant는 OpenAI 임베딩과 함께 쓰는 것을 지원해요. OpenAI에서 임베딩을 쉽게 얻을 수 있는 공식 Python 패키지가 있고, pip로 설치하면 돼요.

pip install openai

출처: Qdrant 공식 문서 — openai

OpenAI와 Qdrant 클라이언트 설정하기

import openai
import qdrant_client

openai_client = openai.Client(api_key="<YOUR_API_KEY>")
client = qdrant_client.QdrantClient(":memory:")
texts = [
    "Qdrant is the best vector search engine!",
    "Loved by Enterprises and everyone building for low latency, high performance, and scale.",
]

아래 예시는 1536 크기의 문장 임베딩을 생성하는 text-embedding-3-small 모델로 문서를 임베딩해요. 지원되는 모든 모델 목록은 여기에서 확인할 수 있어요.

문서 임베딩 (Embedding a document)

embedding_model = "text-embedding-3-small"
result = openai_client.embeddings.create(
    input=texts,
    model=embedding_model,
)

모델 출력을 Qdrant 포인트로 변환하기

from qdrant_client.models import PointStruct

points = [
    PointStruct(
        id=idx,
        vector=data.embedding,
        payload={"text": text},
    )
    for idx, (data, text) in enumerate(zip(result.data, texts))
]

문서를 넣을 컬렉션 만들기

임베딩 크기(1536)에 맞춰 컬렉션을 만들고 포인트를 upsert해요.

from qdrant_client.models import VectorParams, Distance

collection_name = "example_collection"
client.create_collection(
    collection_name,
    vectors_config=VectorParams(
        size=1536,
        distance=Distance.COSINE,
    ),
)
client.upsert(collection_name, points)

Qdrant로 문서 검색하기

문서가 인덱싱되면 같은 모델을 사용해 가장 관련성 높은 문서를 검색할 수 있어요. 쿼리 문장을 임베딩한 뒤 그 벡터로 검색해요.

client.search(
    collection_name=collection_name,
    query_vector=openai_client.embeddings.create(
        input=["What is the best to use for vector search scaling?"],
        model=embedding_model,
    ).data[0].embedding,
)

OpenAI 임베딩 모델과 Qdrant의 Binary Quantization 사용하기

OpenAI 임베딩 모델은 Binary Quantization과 함께 쓸 수 있어요. 이 기법은 검색 결과의 품질을 크게 떨어뜨리지 않으면서 임베딩 크기를 32배 줄여주는 방식이에요.

Method Dimensionality Test Dataset Recall Oversampling
OpenAI text-embedding-3-large 3072 DBpedia 1M 0.9966 3x
OpenAI text-embedding-3-small 1536 DBpedia 100K 0.9847 3x
OpenAI text-embedding-3-large 1536 DBpedia 1M 0.9826 3x
OpenAI text-embedding-ada-002 1536 DbPedia 1M 0.98 4x

표의 Recall은 해당 테스트 데이터셋에서 Binary Quantization을 적용했을 때 측정된 재현율이에요. Oversampling은 품질을 보완하기 위한 오버샘플링 배수예요.

더 알아보기 (Learn more)