콘텐츠로 이동

Qdrant 검색 쿼리와 스코어링 (Query)

Qdrant의 핵심 일은 "질문 벡터와 가장 가까운 벡터를 빠르게 찾는" 일이에요. 신경망은 현실에서 가까운 대상(비슷한 뜻의 문장, 비슷한 그림)이 벡터 공간에서도 가까이 오도록 객체를 벡터로 변환하도록 학습돼요. 그래서 벡터의 가까움을 재어 검색하는 게 곧 의미 검색의 본질입니다. 이 페이지는 소스 문서 Qdrant Search 를 바탕으로 설명해요.

개요

Qdrant는 모든 검색·탐색 요청을 Query API 라는 하나의 인터페이스로 제공합니다. 유사 벡터 검색(k-NN), 저장된 벡터 id로 검색, 추천(긍정·부정 예시), 하이브리드·다단계 검색, 랜덤 샘플링 등이 모두 이 하나로 이뤄져요. 질문 벡터와의 거리를 어떻게 재는지(거리 척도)와, 어떤 실행 전략을 고를지(쿼리 플래닝)가 성능·정확도를 좌우합니다.

핵심 개념

거리 척도와 코사인 계산

두 벡터의 가까움을 재는 방법(metric)은 임베딩 모델의 학습 방식에 맞춰 선택해요. Dot(내적), Cosine(코사인), Euclid(유클리드), Manhattan(맨해튼)이 있고, 유사도 학습 모델에서 가장 흔히 쓰는 건 코사인입니다.

Qdrant는 코사인을 두 단계로 나눠 계산해 속도를 높여요. 벡터를 컬렉션에 넣을 때 한 번만 정규화하고(벡터당 한 번), 그 뒤 비교는 내적(dot product) 과 같아져 SIMD 덕분에 아주 빨라집니다.

Query API로 하는 최근접 이웃 검색

가장 기본인 유사 벡터 검색은 조밀 벡터를 그대로 query로 넣으면 됩니다.

POST /collections/{collection_name}/points/query
{
  "query": [0.2, 0.1, 0.9, 0.7]
}

이미 저장된 점의 id로 검색하면 임베딩 추론을 건너뛸 수 있어요.

필터·파라미터·limit

검색 요청에는 필터, 검색 파라미터, 결과 개수를 함께 담을 수 있습니다.

POST /collections/{collection_name}/points/query
{
  "query": [0.2, 0.1, 0.9, 0.79],
  "filter": { "must": [ { "key": "city", "match": { "value": "London" } } ] },
  "params": { "hnsw_ef": 128, "exact": false },
  "limit": 3
}
  • filter — 벡터 계산 전에 페이로드 조건으로 후보를 좁힙니다.
  • paramshnsw_ef(HNSW 탐색 폭)와 exact(정확 vs 근사) 등 검색 전략을 조정합니다.
  • limit — 반환할 상위 점 개수.

쿼리 플래닝(Query Planning)

Qdrant는 실행 전략을 쿼리 플래닝이라는 과정으로 자동 고릅니다. 점 수가 임계값 아래면 전체 스캔(full scan)을 선호하고, 필터 결과의 카디널리티를 추정한 뒤 페이로드 인덱스(카디널리티 낮음)나 필터 가능한 벡터 인덱스(높음)를 선택해요. 선택성(비율)은 낮지만 카디널리티(양)는 높을 때는 ACORN을 씁니다. 이 임계값들은 설정 파일과 컬렉션별로 조정할 수 있어요.

실제 적용 (데이터스케쳐스)

  • 의미 검색 — 질문을 임베딩해 query 벡터로 만들고, 컬렉션에서 상위 K개를 찾습니다.
  • 하이브리드 검색 — 조밀(query)과 희소 벡터를 각각 prefetch로 실행하고 rrf로 순위를 합칩니다.
  • 메타데이터 필터링 — 검색 전에 테넌트·문서 종류·날짜 필터를 걸어 후보를 줄이고 비용을 낮춥니다.
  • Top-K 후보 전달 — 검색 결과 상위 K개를 재순위화·생성 단계로 넘겨 근거를 만듭니다.

더 알아보기