Tan Kim

Qdrant

Qdrant는 Rust로 구현된 오픈소스 벡터 데이터베이스다. 고성능 ANN(Approximate Nearest Neighbor) 검색과 강력한 페이로드 필터링 기능을 제공하며, 자체 호스팅과 Qdrant Cloud 모두 지원한다.

개요

항목 내용
언어 Rust
라이선스 Apache 2.0
배포 방식 자체 호스팅 (Docker), Qdrant Cloud
클라이언트 Python, JavaScript/TypeScript, Rust, Go 등

핵심 개념

컬렉션 (Collection)

컬렉션은 RDBMS의 테이블에 해당하는 개념으로, 동일한 차원(dimension)의 벡터를 저장하는 단위다.

from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams
 
client = QdrantClient("localhost", port=6333)
 
client.create_collection(
    collection_name="blog_posts",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
)

포인트 (Point)

컬렉션에 저장되는 개별 데이터 단위다.

요소 설명 예시
id 포인트 식별자 UUID 또는 정수
vector 임베딩 벡터 [0.23, -0.41, ...]
payload 메타데이터 {"text": "...", "source": "blog"}
from qdrant_client.models import PointStruct
 
client.upsert(
    collection_name="blog_posts",
    points=[
        PointStruct(
            id=1,
            vector=[0.23, -0.41, 0.87],
            payload={
                "text": "원본 텍스트 내용",
                "source": "blog",
                "category": "ai",
            }
        )
    ]
)

검색

기본 유사도 검색

results = client.search(
    collection_name="blog_posts",
    query_vector=[0.19, -0.38, 0.91],
    limit=5
)

페이로드 필터링

벡터 유사도 검색과 페이로드 조건을 결합하여 검색 범위를 제한할 수 있다. 이것이 Qdrant의 핵심 강점 중 하나다.

from qdrant_client.models import Filter, FieldCondition, MatchValue
 
results = client.search(
    collection_name="blog_posts",
    query_vector=[0.19, -0.38, 0.91],
    query_filter=Filter(
        must=[
            FieldCondition(key="category", match=MatchValue(value="ai"))
        ]
    ),
    limit=5
)

유사도 측정 방식

방식 설명 권장 용도
COSINE 코사인 유사도 텍스트 임베딩 (일반적)
EUCLID 유클리드 거리 좌표 기반 데이터
DOT 내적 정규화된 임베딩

Docker로 자체 호스팅

services:
  qdrant:
    image: qdrant/qdrant
    ports:
      - "6333:6333"
      - "6334:6334"
    volumes:
      - ./qdrant_storage:/qdrant/storage
  • HTTP API: http://localhost:6333
  • 웹 대시보드: http://localhost:6333/dashboard

RAG 파이프라인에서의 활용

tan-kim.com의 RAG 파이프라인에서 Qdrant는 블로그 콘텐츠의 임베딩을 저장하는 벡터 DB로 활용된다.

콘텐츠 마크다운 파일
  → 청크 분할
  → 임베딩 모델로 벡터화
  → Qdrant 컬렉션에 저장

사용자 질문
  → 쿼리 임베딩
  → Qdrant 유사도 검색 (top-K)
  → 검색된 청크를 LLM 컨텍스트로 전달
  → 최종 답변 생성

컬렉션 분리 전략

컬렉션 대상 파일
projects Projects/ 디렉토리 파일
about me.md
blog 나머지 블로그 포스트