RRF Ranker
Reciprocal Rank Fusion (RRF) Ranker - это стратегия ранжирования для гибридного поиска Milvus, которая уравновешивает результаты из нескольких векторных путей поиска на основе их рейтинговых позиций, а не сырых оценок сходства. Подобно спортивному турниру, в котором учитывается рейтинг игроков, а не их индивидуальная статистика, RRF Ranker объединяет результаты поиска на основе того, насколько высоко каждый элемент занимает позиции в разных путях поиска, создавая справедливый и сбалансированный итоговый рейтинг.
Когда использовать RRF Ranker
RRF Ranker специально разработан для гибридных сценариев поиска, в которых необходимо сбалансировать результаты, полученные по нескольким векторным путям поиска, без присвоения явных весов важности. Он особенно эффективен для:
Пример использования |
Пример |
Почему RRF Ranker хорошо работает |
|---|---|---|
Мультимодальный поиск с равной важностью |
Поиск изображений и текстов, где обе модальности имеют одинаковое значение |
Балансирует результаты, не требуя произвольных весовых коэффициентов |
Ансамблевый векторный поиск |
Объединение результатов различных моделей встраивания |
Демократическое объединение рейтингов без предпочтения распределения баллов какой-либо конкретной модели |
Межъязыковой поиск |
Поиск документов на нескольких языках |
Справедливое ранжирование результатов независимо от языковых особенностей встраивания |
Экспертные рекомендации |
Объединение рекомендаций от нескольких экспертных систем |
Создает консенсусные рейтинги, когда различные системы используют несравнимые методы оценки |
Если в вашем приложении для гибридного поиска требуется сбалансировать несколько путей поиска демократическим путем без присвоения явных весов, RRF Ranker - ваш идеальный выбор.
Механизм работы RRF Ranker
Основной рабочий процесс стратегии RRFRanker выглядит следующим образом:
Сбор поисковых рейтингов: Собираем ранги результатов из каждого пути векторного поиска (rank_1, rank_2).
Слияние рангов: Преобразование рангов из каждого пути (rank_rrf_1, rank_rrf_2) в соответствии с формулой.
Формула расчета включает N, представляющее собой количество поисковых запросов. ranki(d) - ранговая позиция документа d, полученная i-м ретривером. k - параметр сглаживания, обычно устанавливаемый на 60.
Агрегированное ранжирование: Повторное ранжирование результатов поиска на основе объединенных рейтингов для получения окончательных результатов.
Ранжировщик RRF
Пример RRF Ranker
Этот пример демонстрирует гибридный поиск (topK=5) на разреженных плотных векторах и показывает, как стратегия RRFRanker ранжирует результаты двух ANN-поисков.
Результаты ANN-поиска на разреженных векторах текстов (topK=5):.
ID
Ранг (разреженный)
101
1
203
2
150
3
198
4
175
5
Результаты поиска ANN на плотных векторах текстов (topK=5):
ID
Ранг (плотный)
198
1
101
2
110
3
175
4
250
5
Используйте RRF, чтобы изменить ранжирование двух наборов результатов поиска. Предположим, что параметр сглаживания
kустановлен на 60.ИДЕНТИФИКАТОР
Оценка (разреженная)
Оценка (плотная)
Итоговый балл
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
Окончательные результаты после повторного ранжирования(topK=5):
Ранг
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 Ranker) |
[] |
|
Да |
Тип вызываемой функции; используйте |
|
|
Да |
Указывает используемый метод ранжирования. Должно быть установлено значение |
|
|
Нет |
Параметр сглаживания, который контролирует влияние рангов документов; более высокий Подробности см. в разделе Механизм работы RRF Ranker. |
|
Применение к гибридному поиску
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
Более подробную информацию о гибридном поиске см. в разделе Многовекторный гибридный поиск.