🧠 Qdrant 실무 스터디 가이드

데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
⚡ vector-db 🦀 rust 🔓 open-source 📅 2026.03

📋 목차

  1. Qdrant란?
  2. 왜 써야 하는가?
  3. 핵심 개념
  4. 퀵스타트
  5. 핵심 설정 레퍼런스
  6. 실무 팁 & 트러블슈팅
  7. 참고 자료

1. Qdrant란?

Qdrant는 Rust로 작성된 고성능 벡터 데이터베이스입니다. 임베딩 벡터를 기반으로 유사도 검색, 필터링, 실시간 업데이트를 제공하며, MLOps 파이프라인에서 RAG, 추천 시스템, 이상 탐지 등에 널리 사용됩니다.

⚡ 고속 ANN

HNSW 그래프 기반 Approximate Nearest Neighbor 검색, 수백만 벡터를 밀리초 단위로 탐색.

🔍 필터링 + 검색

스칼라 필터와 벡터 유사도를 동시에 적용, 정밀한 결과 집합 반환.

🔄 실시간 스트리밍

벡터 추가/삭제/업데이트가 즉시 반영, 배치 없이 실시간 서비스 가능.

2. 왜 써야 하는가?

기존 벡터 DB(Pinecone, Milvus, Weaviate)와 비교한 Qdrant의 강점:

기능QdrantPineconeMilvus
오픈소스✅ Apache 2.0❌ 클로즈드✅ Apache 2.0
코어 언어RustGoGo/C++
필터링 성능✅ 탁월 (payload 인덱스)✅ 우수⚠️ 설정 필요
임베딩 온보드❌ (외부 모델)✅ 내장❌
분산 모드✅ 클러스터 (raft)✅ 매니지드✅ 복잡

💡 실무 포인트: Qdrant는 Rust의 메모리 안전성과 동시성을 활용해 단일 노드에서도 높은 처리량을 보장합니다. MLOps 파이프라인에 가볍게 임베딩하기 좋습니다.

3. 핵심 개념

Qdrant의 주요 구성 요소: Collection (벡터+payload 집합), Point (벡터+ID+payload), Payload (메타데이터 JSON), HNSW 인덱스.

┌─────────────────────────────────────────────────────────┐ │ Qdrant Node │ │ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Collection │ │ Collection │ │ Collection │ │ │ │ "products" │ │ "docs" │ │ "images" │ │ │ │ ┌─────────┐ │ │ ┌──────────┐ │ │ ┌──────────┐ │ │ │ │ │ Point 1 │ │ │ │ Point A │ │ │ │ Point X │ │ │ │ │ │ vec[128]│ │ │ │ vec[384] │ │ │ │ vec[512] │ │ │ │ │ │ payload │ │ │ │ payload │ │ │ │ payload │ │ │ │ │ └─────────┘ │ │ └──────────┘ │ │ └──────────┘ │ │ │ │ HNSW index │ │ HNSW index │ │ HNSW index │ │ │ └─────────────┘ └──────────────┘ └──────────────┘ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ Storage: segment (Rust + mmap) │ │ │ └──────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘

Payload 인덱스는 keyword, integer, float, geo 등 타입별로 생성 가능하며, 필터 검색 성능을 극대화합니다.

4. 퀵스타트

🔧 설치 (Docker)

docker pull qdrant/qdrant:latest
docker run -p 6333:6333 -p 6334:6334 \
    -v $(pwd)/qdrant_storage:/qdrant/storage \
    qdrant/qdrant

또는 pip install qdrant-client로 Python 클라이언트 설치.

⚙️ 설정 (config.yaml)

storage:
  optimizers:
    default_segment_number: 2
    memmap_threshold_kb: 20000
  wal:
    wal_capacity_mb: 32

🐍 첫 예제 (Python)

from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance

client = QdrantClient("localhost", port=6333)

# 컬렉션 생성
client.create_collection(
    collection_name="my_vectors",
    vectors_config=VectorParams(size=128, distance=Distance.COSINE)
)

# 포인트 추가
client.upsert(
    collection_name="my_vectors",
    points=[
        {"id": 1, "vector": [0.1]*128, "payload": {"label": "cat"}},
        {"id": 2, "vector": [0.3]*128, "payload": {"label": "dog"}},
    ]
)

# 검색
result = client.search(
    collection_name="my_vectors",
    query_vector=[0.15]*128,
    limit=2
)
print(result)

⚠️ 주의: 첫 실행 시 storage 디렉토리 권한을 확인하세요. Docker 볼륨 마운트가 없으면 컨테이너 재시작 시 데이터가 사라집니다.

5. 핵심 설정 레퍼런스

파라미터기본값설명
storage.optimizers.default_segment_number2세그먼트 병렬 최적화 수, 쓰기 많은 경우 증가
storage.optimizers.memmap_threshold_kb20000memmap 전환 임계값 (KB), 대용량에서 메모리 절약
hnsw.m16HNSW 그래프 연결 수 (높을수록 정확도↑, 메모리↑)
hnsw.ef_construct100인덱스 구축 시 탐색 범위
wal.wal_capacity_mb32WAL 버퍼 크기, 쓰기 폭주 시 증가

자세한 옵션은 공식 설정 문서 참고.

6. 실무 팁 & 트러블슈팅

✅ 팁: payload 인덱스

자주 필터링하는 필드는 create_payload_index로 인덱싱하세요. 검색 속도가 10배 이상 차이납니다.

⚠️ 문제: OOM

너무 큰 HNSW m 값은 메모리 폭주를 유발합니다. m=8로 낮추고 ef_construct를 조정하세요.

❌ 문제: 쓰기 지연

WAL 용량 부족 시 쓰기가 블로킹됩니다. wal_capacity_mb를 128 이상으로 늘리세요.

🔧 CLI 진단: curl http://localhost:6333/collections 로 컬렉션 상태 확인. qdrant_client의 get_collection() 메서드로 세그먼트 수를 모니터링하세요.

7. 참고 자료