RRF 랭커
상호 순위 융합(RRF) 랭커는 원시 유사도 점수가 아닌 순위 순위에 따라 여러 벡터 검색 경로의 결과를 균형 있게 재조정하는 Milvus 하이브리드 검색의 순위 재조정 전략입니다. 개별 통계가 아닌 선수들의 순위를 고려하는 스포츠 토너먼트처럼, RRF Ranker는 각 항목이 여러 검색 경로에서 얼마나 높은 순위를 차지하는지에 따라 검색 결과를 결합하여 공정하고 균형 잡힌 최종 순위를 생성합니다.
RRF 랭커 사용 시기
RRF Ranker는 명시적인 중요도 가중치를 할당하지 않고 여러 벡터 검색 경로의 결과를 균형 있게 조정하려는 하이브리드 검색 시나리오를 위해 특별히 설계되었습니다. 특히 다음과 같은 경우에 효과적입니다:
사용 사례 |
예시 |
RRF 랭커가 잘 작동하는 이유 |
|---|---|---|
중요도가 동일한 다중 모달 검색 |
두 모달리티가 동등하게 중요한 이미지-텍스트 검색 |
임의의 가중치를 할당할 필요 없이 결과의 균형 유지 |
앙상블 벡터 검색 |
서로 다른 임베딩 모델의 결과 결합 |
특정 모델의 점수 분포에 치우치지 않고 민주적으로 순위를 병합합니다. |
교차 언어 검색 |
여러 언어로 된 문서 찾기 |
언어별 임베딩 특성에 관계없이 공정하게 결과 순위 지정 |
전문가 추천 |
여러 전문가 시스템의 추천을 결합 |
서로 다른 시스템이 비교할 수 없는 채점 방법을 사용할 때 합의된 순위 생성 |
하이브리드 검색 애플리케이션에서 명시적인 가중치를 할당하지 않고 여러 검색 경로의 균형을 민주적으로 조정해야 하는 경우, RRF Ranker가 이상적인 선택입니다.
RRF Ranker의 메커니즘
RRF랭커 전략의 주요 워크플로는 다음과 같습니다:
검색 랭킹을 수집합니다: 벡터 검색의 각 경로(rank_1, rank_2)에서 결과의 순위를 수집합니다.
순위 병합: 공식에 따라 각 경로(rank_rrf_1, rank_rrf_2)의 순위를 변환합니다.
계산 공식에는 검색 횟수를 나타내는 N이 포함되며, ranki(d)는 i(세 번째) 리트리버가 생성한 문서 d의 순위 위치입니다. k는 일반적으로 60으로 설정되는 평활화 매개변수입니다.
집계 순위: 합산된 순위를 기준으로 검색 결과의 순위를 다시 매겨 최종 결과를 생성합니다.
RRF 랭커
RRF 랭커의 예
이 예는 희소 밀도 벡터에 대한 하이브리드 검색(topK=5)을 보여 주며, RRFRanker 전략이 두 개의 ANN 검색 결과를 어떻게 재순위를 매기는지 설명합니다.
텍스트의 희소 벡터에 대한 ANN 검색 결과(topK=5): 다음과 같습니다.
ID
순위(스파스)
101
1
203
2
150
3
198
4
175
5
텍스트 밀집 벡터에 대한 ANN 검색 결과(topK=5):: 텍스트 밀집 벡터에 대한 ANN 검색 결과
ID
순위(밀도)
198
1
101
2
110
3
175
4
250
5
RRF를 사용하여 두 검색 결과 세트의 순위를 재정렬합니다. 평활화 매개변수
k가 60으로 설정되어 있다고 가정합니다.ID
점수(스파스)
점수(밀도)
최종 점수
101
1
2
1/(60+1)+1/(60+2) = 0.03252247
198
4
1
1/(60+4)+1/(60+1) = 0.03201844
175
5
4
1/(60+5)+1/(60+4) = 0.03100962
203
2
N/A
1/(60+2) = 0.01612903
150
3
N/A
1/(60+3) = 0.01587302
110
N/A
3
1/(60+3) = 0.01587302
250
N/A
5
1/(60+5) = 0.01538462
재랭크 후 최종 결과(상위 K=5): 다음과 같습니다.
Rank
ID
최종 점수
1
101
0.03252247
2
198
0.03201844
3
175
0.03100962
4
203
0.01612903
5
150
0.01587302
5
110
0.01587302
RRF 랭커 사용
RRF 재랭킹 전략을 사용할 때는 k 파라미터를 구성해야 합니다. 이 파라미터는 전체 텍스트 검색과 벡터 검색의 상대적 가중치를 효과적으로 변경할 수 있는 평활화 파라미터입니다. 이 매개변수의 기본값은 60이며, (0, 16384) 범위 내에서 조정할 수 있습니다. 값은 부동 소수점 숫자여야 합니다. 권장 값은 [10, 100] 사이입니다. k=60 값이 일반적으로 사용되지만, 최적의 k 값은 특정 애플리케이션과 데이터 세트에 따라 달라질 수 있습니다. 최상의 성능을 얻으려면 특정 사용 사례에 따라 이 매개변수를 테스트하고 조정하는 것이 좋습니다.
RRF 랭킹 생성
여러 벡터 필드로 컬렉션을 설정한 후 적절한 평활화 파라미터를 사용하여 RRF 랭커를 생성합니다:
Milvus 2.6.x 이상에서는 Function API를 통해 직접 리랭킹 전략을 구성할 수 있습니다. 이전 릴리스(v2.6.0 이전)를 사용하는 경우 재랭킹 문서를 참조하여 설정 지침을 확인하세요.
from pymilvus import Function, FunctionType
ranker = Function(
name="rrf",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "rrf",
"k": 100 # Optional
}
)
import io.milvus.common.clientenum.FunctionType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq.Function rerank = CreateCollectionReq.Function.builder()
.name("rrf")
.functionType(FunctionType.RERANK)
.param("reranker", "rrf")
.param("k", "100")
.build();
import { FunctionType } from "@zilliz/milvus2-sdk-node";
const ranker = {
name: "weight",
input_field_names: [],
function_type: FunctionType.RERANK,
params: {
reranker: "weighted",
weights: [0.1, 0.9],
norm_score: true,
},
};
// Go
# Restful
파라미터 |
필수? |
설명 |
값/예시 |
|---|---|---|---|
|
예 |
이 함수에 대한 고유 식별자 |
|
|
예 |
함수를 적용할 벡터 필드 목록(RRF 랭커의 경우 비워둬야 합니다). |
[] |
|
Yes |
호출할 함수의 유형( |
|
|
Yes |
사용할 재랭킹 방법을 지정합니다. RRF 랭커를 사용하려면 |
|
|
No |
문서 순위의 영향을 제어하는 평활화 매개변수로, 자세한 내용은 RRF 랭커의 메커니즘을 참조하세요. |
|
하이브리드 검색에 적용
RRF Ranker는 여러 벡터 필드를 결합하는 하이브리드 검색 작업을 위해 특별히 설계되었습니다. 하이브리드 검색에 사용하는 방법은 다음과 같습니다:
from pymilvus import MilvusClient, AnnSearchRequest
# Connect to Milvus server
milvus_client = MilvusClient(uri="http://localhost:19530")
# Assume you have a collection setup
# Define text vector search request
text_search = AnnSearchRequest(
data=["modern dining table"],
anns_field="text_vector",
param={},
limit=10
)
# Define image vector search request
image_search = AnnSearchRequest(
data=[image_embedding], # Image embedding vector
anns_field="image_vector",
param={},
limit=10
)
# Apply RRF Ranker to product hybrid search
# The smoothing parameter k controls the balance
hybrid_results = milvus_client.hybrid_search(
collection_name,
[text_search, image_search], # Multiple search requests
ranker=ranker, # Apply the RRF ranker
limit=10,
output_fields=["product_name", "price", "category"]
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.AnnSearchReq;
import io.milvus.v2.service.vector.request.HybridSearchReq;
import io.milvus.v2.service.vector.response.SearchResp;
import io.milvus.v2.service.vector.request.data.EmbeddedText;
import io.milvus.v2.service.vector.request.data.FloatVec;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.build());
List<AnnSearchReq> searchRequests = new ArrayList<>();
searchRequests.add(AnnSearchReq.builder()
.vectorFieldName("text_vector")
.vectors(Collections.singletonList(new EmbeddedText("\"modern dining table\"")))
.limit(10)
.build());
searchRequests.add(AnnSearchReq.builder()
.vectorFieldName("image_vector")
.vectors(Collections.singletonList(new FloatVec(imageEmbedding)))
.limit(10)
.build());
HybridSearchReq hybridSearchReq = HybridSearchReq.builder()
.collectionName(COLLECTION_NAME)
.searchRequests(searchRequests)
.ranker(ranker)
.limit(10)
.outputFields(Arrays.asList("product_name", "price", "category"))
.build();
SearchResp searchResp = client.hybridSearch(hybridSearchReq);
import { MilvusClient, FunctionType } from "@zilliz/milvus2-sdk-node";
const milvusClient = new MilvusClient({ address: "http://localhost:19530" });
const text_search = {
data: ["modern dining table"],
anns_field: "text_vector",
param: {},
limit: 10,
};
const image_search = {
data: [image_embedding],
anns_field: "image_vector",
param: {},
limit: 10,
};
const ranker = {
name: "weight",
input_field_names: [],
function_type: FunctionType.RERANK,
params: {
reranker: "weighted",
weights: [0.1, 0.9],
norm_score: true,
},
};
const search = await milvusClient.search({
collection_name: collection_name,
data: [text_search, image_search],
output_fields: ["product_name", "price", "category"],
limit: 10,
rerank: ranker,
});
// go
# restful
하이브리드 검색에 대한 자세한 내용은 다중 벡터 하이브리드 검색을 참조하세요.