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 |
나머지 블로그 포스트 |