OpenAI 임베딩 연동
OpenAI 임베딩 연동 (openai)
Qdrant는 OpenAI 임베딩과 함께 쓰는 것을 지원해요. OpenAI에서 임베딩을 쉽게 얻을 수 있는 공식 Python 패키지가 있고, pip로 설치하면 돼요.
pip install 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은 품질을 보완하기 위한 오버샘플링 배수예요.