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

Взвешенный ранжировщик

Weighted Ranker интеллектуально объединяет и приоритизирует результаты из нескольких путей поиска, присваивая каждому из них различные веса важности. Подобно тому, как опытный повар смешивает несколько ингредиентов для создания идеального блюда, Weighted Ranker уравновешивает различные результаты поиска для получения наиболее релевантных результатов. Такой подход идеален при поиске по нескольким векторным полям или модальностям, когда некоторые поля должны вносить более существенный вклад в итоговое ранжирование, чем другие.

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

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

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

Пример

Почему взвешенный ранжировщик хорошо работает

Поиск в электронной коммерции

Поиск товаров, сочетающий сходство изображений и текстовых описаний

Позволяет ритейлерам отдавать предпочтение визуальному сходству для модных товаров, в то время как текстовые описания для технических товаров имеют особое значение

Поиск медиаконтента

Поиск видео с использованием как визуальных характеристик, так и аудио-транскриптов

Балансирует важность визуального контента по сравнению с разговорным диалогом на основе намерения запроса

Поиск документов

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

Придает больший вес вкраплениям заголовка и аннотации, но при этом учитывает полнотекстовые вкрапления

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

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

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

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

  2. Нормализация баллов: В каждом поиске могут использоваться различные метрики сходства, что приводит к различным распределениям баллов. Например, использование внутреннего продукта (IP) в качестве типа сходства может привести к оценкам в диапазоне [-∞,+∞], в то время как использование евклидова расстояния (L2) приводит к оценкам в диапазоне [0,+∞]. Поскольку диапазоны оценок при разных поисках отличаются и не могут быть напрямую сравнены, необходимо нормализовать оценки для каждого пути поиска. Обычно применяется функция arctan для преобразования оценок в диапазон между [0, 1] (score_1_normalized, score_2_normalized). Оценки, близкие к 1, указывают на большую схожесть.

  3. Присвоение весов: На основе важности, придаваемой различным векторным полям, нормализованным оценкам (score_1_normalized, score_2_normalized) присваиваются веса(wi). Веса каждого пути должны находиться в диапазоне [0,1]. Результирующими взвешенными оценками являются score_1_weighted и score_2_weighted.

  4. Слияние оценок: Взвешенные оценки (score_1_weighted, score_2_weighted) ранжируются от наибольшей к наименьшей, чтобы получить итоговый набор оценок (score_final).

Weighted Ranker Взвешенный ранжировщик

Пример взвешенного ранжировщика

Этот пример демонстрирует мультимодальный гибридный поиск (topK=5) с использованием изображений и текста и показывает, как стратегия WeightedRanker ранжирует результаты двух ANN-поисков.

  • Результаты поиска ANN по изображениям (topK=5)::

    ID

    Оценка (изображение)

    101

    0.92

    203

    0.88

    150

    0.85

    198

    0.83

    175

    0.8

  • Результаты поиска ANN по текстам (topK=5):

    ID

    Оценка (текст)

    198

    0.91

    101

    0.87

    110

    0.85

    175

    0.82

    250

    0.78

  • С помощью WeightedRanker присвойте веса результатам поиска изображений и текста. Предположим, что вес для поиска изображений ANN равен 0,6, а вес для поиска текста - 0,4.

    ID

    Оценка (изображение)

    Оценка (текст)

    Взвешенный балл

    101

    0.92

    0.87

    0.6×0.92+0.4×0.87=0.90

    203

    0.88

    N/A

    0.6×0.88+0.4×0=0.528

    150

    0.85

    Н/Д

    0.6×0.85+0.4×0=0.51

    198

    0.83

    0.91

    0.6×0.83+0.4×0.91=0.86

    175

    0.80

    0.82

    0.6×0.80+0.4×0.82=0.81

    110

    Нет на изображении

    0.85

    0.6×0+0.4×0.85=0.34

    250

    Нет на изображении

    0.78

    0.6×0+0.4×0.78=0.312

  • Итоговые результаты после повторного ранжирования(topK=5):

    Ранг

    ID

    Итоговый балл

    1

    101

    0.90

    2

    198

    0.86

    3

    175

    0.81

    4

    203

    0.528

    5

    150

    0.51

Использование взвешенного ранжировщика

При использовании стратегии WeightedRanker необходимо ввести значения весов. Количество вводимых весовых значений должно соответствовать количеству базовых поисковых запросов ANN в гибридном поиске. Вводимые значения веса должны находиться в диапазоне [0,1], при этом значения ближе к 1 означают большую важность.

Создание взвешенного ранжировщика

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

Milvus 2.6.x и более поздние версии позволяют настраивать стратегии ранжирования непосредственно через Function API. Если вы используете более раннюю версию (до v2.6.0), обратитесь к документации по реранжированию за инструкциями по настройке.

from pymilvus import Function, FunctionType

rerank = Function(
    name="weight",
    input_field_names=[], # Must be an empty list
    function_type=FunctionType.RERANK,
    params={
        "reranker": "weighted", 
        "weights": [0.1, 0.9],
        "norm_score": True  # Optional
    }
)
import io.milvus.common.clientenum.FunctionType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;

CreateCollectionReq.Function rerank = CreateCollectionReq.Function.builder()
                .name("weight")
                .functionType(FunctionType.RERANK)
                .param("reranker", "weighted")
                .param("weights", "[0.1, 0.9]")
                .param("norm_score", "true")
                .build();
import { FunctionType } from '@zilliz/milvus2-sdk-node';

const rerank = {
    name: "weight",
    input_field_names: [],
    function_type: FunctionType.RERANK,
    params: {
        reranker: "weighted",
        weights: [0.1, 0.9],
        norm_score: true
    }
};
// Go
# Restful

Параметр

Требуемый?

Описание

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

name

Да

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

"weight"

input_field_names

Да

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

[]

function_type

Да

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

FunctionType.RERANK

params.reranker

Да

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

Должно быть установлено значение weighted, чтобы использовать взвешенный ранжир.

"weighted"

params.weights

Да

Массив весов, соответствующих каждому пути поиска; значения ∈ [0,1].

Подробности см. в разделе Механизм взвешенного ранжирования.

[0.1, 0.9]

params.norm_score

Нет

Нужно ли нормализовать сырые баллы (с помощью arctan) перед взвешиванием.

Подробнее см. в разделе Механизм взвешенного ранжирования.

True

Weighted 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 Weighted Ranker to product hybrid search
# Text search has 0.8 weight, image search has 0.3 weight
hybrid_results = milvus_client.hybrid_search(
    collection_name,
    [text_search, image_search],  # Multiple search requests
    ranker=rerank,  # Apply the weighted 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 rerank = {
  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,
  limit: 10,
  data: [text_search, image_search],
  rerank: rerank,
  output_fields = ["product_name", "price", "category"],
});
// go
# restful

Дополнительные сведения о гибридном поиске см. в разделе Многовекторный гибридный поиск.

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

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

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

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