검색 관련성
검색 관련성 (Search Relevance)
기본적으로 Qdrant는 벡터 유사도 점수로 검색 결과를 정렬해요. 하지만 실제 애플리케이션에서는 점수 외에 비즈니스 로직을 고려하고 싶을 때가 많아요. Qdrant는 이런 추가 요소를 반영해 결과 순서를 바꿀 수 있는 여러 도구를 제공해요.
Score Boosting (스코어 부스팅)
v1.14.0부터
벡터 검색을 특정 애플리케이션에 도입할 때, 최종 결과 순서에 비즈니스 로직이 개입해야 하는 경우가 있어요. 대표적인 예가 Qdrant 문서 사이트의 검색창인데, 문서의 모든 부분에 벡터가 있어서 벡터만으로 검색하면 모든 요소가 동등하게 좋은 결과로 취급돼요. 그래서 title > content > snippets 같은 중요도 계층을 만들고, 제목과 내용에 더 높은 가중치를 주는 방식으로 해결해요.
의사코드로는 이렇게 표현돼요:
score = score + (is_title * 0.5) + (is_content * 0.25)
Query API는 다음을 기반으로 포인트를 재스코어링(rescore)할 수 있어요:
- 동적 payload 값
- 조건 (conditions)
- prefetch의 점수
공식(formula)을 표현할 때는 객체로 각 요소를 식별하는 문법을 써요. 사용 가능한 표현식은 다양해요:
- constant - 부동소수점 수. 예:
0.5 "$score"- prefetch에서 포인트의 점수 참조."$score[0]"과 동일해요."$score[0]","$score[1]", ... - 여러 prefetch를 쓸 때 배열 인덱스로 특정 prefetch 참조- payload key - 평범한 문자열은 payload 키를 참조해요.
key나key.subkey형태의 jsonpath를 쓰며, 해당 키에서 숫자를 추출하려 시도해요. - condition - 필터링 조건. 충족되면
1.0, 아니면0.0 - mult - 표현식 배열의 곱
- sum - 표현식 배열의 합
- div - 한 표현식을 다른 표현식으로 나눔
- abs - 표현식의 절댓값
- pow - 한 표현식을 다른 표현식의 거듭제곱으로
- sqrt - 표현식의 제곱근
- log10 - 표현식의 밑 10 로그
- ln - 표현식의 자연로그
- exp - 표현식의 지수 함수 (
e^x) - geo distance - 두 지리 포인트 사이의 Haversine 거리. 값은
{ "lat": 0.0, "lon": 0.0 }객체여야 해요. - decay - 표현식에 decay 함수 적용, 출력을 0과 1 사이로 제한. linear, exponential, gaussian 중 선택
- datetime - datetime 문자열을 파싱해 POSIX 타임스탬프(초)로 사용
- datetime key - payload 키가 datetime 문자열을 담고 있어 POSIX 초로 파싱하도록 지정
변수(payload나 prefetch 점수)가 없을 때 쓸 기본값을 정의할 수도 있어요. 변수와 기본값이 모두 없으면 기본값 0.0이 사용돼요.
공식 쿼리를 쓸 때 주의할 점이 몇 가지 있어요:
- 공식 쿼리는 rescoring 단계로만 사용할 수 있어요.
- 공식 결과는 항상 내림차순 정렬(클수록 좋음)돼요. Euclidean 점수라면 부호를 뒤집어 가까운 순으로 정렬되게 하세요.
- 점수나 변수가 없고 기본값도 없으면 에러를 반환해요.
- 값이 숫자가 아니거나 예상 타입이 아니면 에러를 반환해요.
- 곱셈·나눗셈은 지연 평가(lazy evaluation)돼서 0을 만나면 나머지 연산을 실행하지 않아요 (예:
0.0 * condition은 condition을 확인하지 않음). - 공식에 쓰는 변수도 payload 인덱스의 혜택을 받으니, 성능을 위해 변수 필드에 payload 인덱스를 설정해두는 게 좋아요.
Decay 함수
Decay 함수는 값이 target에서 얼마나 멀어졌는지에 따라 선형·지수·가우시안 decay로 점수를 수정하게 해줘요. 모든 decay 함수에 공통인 파라미터는 다음과 같아요:
| 파라미터 | 기본값 | 설명 |
|---|---|---|
x |
N/A | decay할 값 |
target |
0.0 | decay가 최고점에 도달하는 값. 거리에서는 보통 0.0으로 설정하지만 임의 값 가능 |
scale |
1.0 | decay 함수가 midpoint와 같아지는 지점. x 단위로 표현 (예: x가 미터면 scale 5000은 5km). 0이 아닌 양수여야 함 |
midpoint |
0.5 | x가 target ± scale일 때의 출력. 범위 (0.0, 1.0)에서 배타적 |
각 decay 함수의 공식은 다음과 같아요:
| Decay 함수 | 범위 | 공식 |
|---|---|---|
lin_decay |
[0, 1] |
lin_decay(x) = max(0, -(1-midpoint)/scale * abs(x-target) + 1) |
exp_decay |
(0, 1] |
exp_decay(x) = exp(ln(midpoint)/scale * abs(x-target)) |
gauss_decay |
(0, 1] |
gauss_decay(x) = exp(ln(midpoint)/scale^2 * (x-target)^2) |
사용자와 가까운 포인트 부스팅 — 각 포인트에 지리 위치가 있다면, 요청 위치와의 거리를 decay 함수로 0~1 사이로 제한한 뒤 원래 점수에 더할 수 있어요. 의사코드: score = score + gauss_decay(distance).
시간 기반 스코어 부스팅 — 각 포인트의 payload에 업로드·마지막 수정 시각 같은 datetime 필드를 두고, 현재 시각과의 차이를 초 단위로 계산해 exponential decay로 0~1 사이 값으로 바꾼 뒤 원래 점수에 더해 최신 결과를 우선시할 수 있어요. 의사코드: score = score + exp_decay(current_time - point_time).
Maximal Marginal Relevance (MMR)
v1.15.0부터
MMR은 결과의 다양성을 높이는 알고리즘이에요. 데이터셋에 쿼리에 대해 중복되거나 매우 유사한 포인트가 많을 때 특히 효과적이에요. MMR은 가장 관련성 높은 포인트(쿼리와 유사도가 가장 높은 것)부터 시작해, 아직 선택되지 않은 포인트 중 "관련성 + 이미 선택된 포인트와의 분리도"를 가장 잘 조합한 것을 반복적으로 선택해요.
Qdrant에서는 최근접 이웃 쿼리의 파라미터로 구현돼요. 쿼리 벡터와 diversity 파라미터를 정의하는데, diversity는 관련성(0.0)과 다양성(1.0) 사이의 균형을 조절해요.
주의사항: MMR은 포인트를 한 번에 하나씩 순위를 매기므로, MMR이 만들어내는 점수는 쿼리 벡터에 대한 유사도를 나타내요. 즉 응답이 점수 순서가 아니라 MMR의 선택 순서로 정렬돼요.
Relevance Feedback (관련성 피드백)
1.17부터 사용 가능
관련성 피드백은 현재 검색 결과의 신호를 다음 검색 반복으로 증류해 더 관련성 높은 문서를 표면화하는 기법이에요. Qdrant는 어떤 모델(관련성 오라클)이 세밀하게 피드백을 주는 방식의 검색을 제공해요. 관련성 피드백 기반 검색에는 두 가지 구성 요소가 필요해요:
- 검색할 벡터 컬렉션
- 검색 결과의 관련성을 판단할 오라클
동작 방식은 이렇습니다:
- 기본 최근접 이웃 검색을 실행 — 그 결과를 Retriever Similarity, 알고리즘을 retriever라 불러요.
- 어떤 feedback model로 상위 X개 결과(3~5개면 충분)에 관련성 점수를 매겨요 — 이 점수를 Feedback Score라 불러요.
- 상위 결과의 Feedback Score를 분석해 feedback 모델이 retriever와 동의하는지, 검색 개선 여지가 있는지 판단해요.
- 개선 가능하다면 feedback을 이용해 retriever와 feedback 모델의 차이를 반영하도록 검색(벡터 공간 탐색)을 수정해요.
전체 컬렉션에 걸쳐 검색에 피드백을 활용하려면 쿼리 인터페이스에 다음이 필요해요:
- 원래 쿼리(
target) — 포인트 ID, inference 객체, 또는 raw 벡터 - 초기 검색 결과와 관련성 점수의 짧은 목록(
feedback) — 각 항목은 retriever가 쓰는example(포인트 ID, inference 객체, raw 벡터)과score로 구성 - 피드백 기반으로 검색을 수정하는 공식 정의(
strategy)
내부적으로 Qdrant는 피드백 목록을 관련성 점수에 따라 쌍으로 결합하고, 이 쌍들을 검색 중 벡터 공간 탐색을 수정하는 공식에 사용해요. target이나 example에 포인트 ID를 쓰면 그 포인트들은 검색 결과에서 제외돼요. 포함하려면 raw 벡터로 변환해 쿼리에 쓰세요.
naive 전략의 파라미터 — naive 전략은 retriever·feedback 모델·컬렉션 각 조합에 맞게 a, b, c 파라미터를 커스터마이즈해야 해요. 자기 환경에 맞는 이 3개 가중치를 얻으려면 오픈소스 파이썬 패키지 qdrant-relevance-feedback을 사용하세요.
더 알아보기 (Learn more)
- 공식 쿼리와 decay 함수의 전체 문법이 담긴 검색 관련성 레퍼런스
- RRF·DBSF로 여러 쿼리를 융합하고 공식 쿼리로 재스코어링하는 하이브리드 쿼리
- 지리·시간 기반 부스팅을 설정하는 검색