• О Милвусе
  • Начать
  • Концепции
  • Руководство пользователя
  • Импорт данных
  • Инструменты искусственного интеллекта
  • Руководство по администрированию
  • Инструменты
  • Интеграции
  • Учебники
  • Вопросы и ответы
  • API Reference

RRF Ranker

Reciprocal Rank Fusion (RRF) Ranker - это стратегия ранжирования для гибридного поиска Milvus, которая уравновешивает результаты из нескольких векторных путей поиска на основе их рейтинговых позиций, а не сырых оценок сходства. Подобно спортивному турниру, в котором учитывается рейтинг игроков, а не их индивидуальная статистика, RRF Ranker объединяет результаты поиска на основе того, насколько высоко каждый элемент занимает позиции в разных путях поиска, создавая справедливый и сбалансированный итоговый рейтинг.

Когда использовать RRF Ranker

RRF Ranker специально разработан для гибридных сценариев поиска, в которых необходимо сбалансировать результаты, полученные по нескольким векторным путям поиска, без присвоения явных весов важности. Он особенно эффективен для:

Пример использования

Пример

Почему RRF Ranker хорошо работает

Мультимодальный поиск с равной важностью

Поиск изображений и текстов, где обе модальности имеют одинаковое значение

Балансирует результаты, не требуя произвольных весовых коэффициентов

Ансамблевый векторный поиск

Объединение результатов различных моделей встраивания

Демократическое объединение рейтингов без предпочтения распределения баллов какой-либо конкретной модели

Межъязыковой поиск

Поиск документов на нескольких языках

Справедливое ранжирование результатов независимо от языковых особенностей встраивания

Экспертные рекомендации

Объединение рекомендаций от нескольких экспертных систем

Создает консенсусные рейтинги, когда различные системы используют несравнимые методы оценки

Если в вашем приложении для гибридного поиска требуется сбалансировать несколько путей поиска демократическим путем без присвоения явных весов, RRF Ranker - ваш идеальный выбор.

Механизм работы RRF Ranker

Основной рабочий процесс стратегии RRFRanker выглядит следующим образом:

  1. Сбор поисковых рейтингов: Собираем ранги результатов из каждого пути векторного поиска (rank_1, rank_2).

  2. Слияние рангов: Преобразование рангов из каждого пути (rank_rrf_1, rank_rrf_2) в соответствии с формулой.

    Формула расчета включает N, представляющее собой количество поисковых запросов. ranki(d) - ранговая позиция документа d, полученная i-м ретривером. k - параметр сглаживания, обычно устанавливаемый на 60.

  3. Агрегированное ранжирование: Повторное ранжирование результатов поиска на основе объединенных рейтингов для получения окончательных результатов.

Rrf Ranker Ранжировщик 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

Параметр

Требуемый?

Описание

Значение/пример

name

Да

Уникальный идентификатор для данной функции

"rrf"

input_field_names

Да

Список векторных полей, к которым следует применить функцию (должен быть пустым для RRF Ranker)

[]

function_type

Да

Тип вызываемой функции; используйте RERANK для указания стратегии ранжирования.

FunctionType.RERANK

params.reranker

Да

Указывает используемый метод ранжирования.

Должно быть установлено значение rrf, чтобы использовать RRF Ranker.

"weighted"

params.k

Нет

Параметр сглаживания, который контролирует влияние рангов документов; более высокий k снижает чувствительность к верхним рангам. Диапазон: (0, 16384); по умолчанию: 60.

Подробности см. в разделе Механизм работы RRF Ranker.

100

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

Более подробную информацию о гибридном поиске см. в разделе Многовекторный гибридный поиск.

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?