Взвешенный ранжировщик
Weighted Ranker интеллектуально объединяет и приоритизирует результаты из нескольких путей поиска, присваивая каждому из них различные веса важности. Подобно тому, как опытный повар смешивает несколько ингредиентов для создания идеального блюда, Weighted Ranker уравновешивает различные результаты поиска для получения наиболее релевантных результатов. Такой подход идеален при поиске по нескольким векторным полям или модальностям, когда некоторые поля должны вносить более существенный вклад в итоговое ранжирование, чем другие.
Когда использовать Weighted Ranker
Weighted Ranker специально разработан для гибридных сценариев поиска, в которых необходимо объединить результаты нескольких векторных путей поиска. Он особенно эффективен для:
Пример использования |
Пример |
Почему взвешенный ранжировщик хорошо работает |
|---|---|---|
Поиск в электронной коммерции |
Поиск товаров, сочетающий сходство изображений и текстовых описаний |
Позволяет ритейлерам отдавать предпочтение визуальному сходству для модных товаров, в то время как текстовые описания для технических товаров имеют особое значение |
Поиск медиаконтента |
Поиск видео с использованием как визуальных характеристик, так и аудио-транскриптов |
Балансирует важность визуального контента по сравнению с разговорным диалогом на основе намерения запроса |
Поиск документов |
Корпоративный поиск документов с несколькими вложениями для различных разделов |
Придает больший вес вкраплениям заголовка и аннотации, но при этом учитывает полнотекстовые вкрапления |
Если в вашем приложении для гибридного поиска требуется объединить несколько путей поиска, контролируя их относительную важность, Weighted Ranker - ваш идеальный выбор.
Механизм работы Weighted Ranker
Основной рабочий процесс стратегии WeightedRanker выглядит следующим образом:
Сбор результатов поиска: Собираем результаты и баллы по каждому пути векторного поиска (score_1, score_2).
Нормализация баллов: В каждом поиске могут использоваться различные метрики сходства, что приводит к различным распределениям баллов. Например, использование внутреннего продукта (IP) в качестве типа сходства может привести к оценкам в диапазоне [-∞,+∞], в то время как использование евклидова расстояния (L2) приводит к оценкам в диапазоне [0,+∞]. Поскольку диапазоны оценок при разных поисках отличаются и не могут быть напрямую сравнены, необходимо нормализовать оценки для каждого пути поиска. Обычно применяется функция
arctanдля преобразования оценок в диапазон между [0, 1] (score_1_normalized, score_2_normalized). Оценки, близкие к 1, указывают на большую схожесть.Присвоение весов: На основе важности, придаваемой различным векторным полям, нормализованным оценкам (score_1_normalized, score_2_normalized) присваиваются веса(wi). Веса каждого пути должны находиться в диапазоне [0,1]. Результирующими взвешенными оценками являются score_1_weighted и score_2_weighted.
Слияние оценок: Взвешенные оценки (score_1_weighted, score_2_weighted) ранжируются от наибольшей к наименьшей, чтобы получить итоговый набор оценок (score_final).
Взвешенный ранжировщик
Пример взвешенного ранжировщика
Этот пример демонстрирует мультимодальный гибридный поиск (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
Параметр |
Требуемый? |
Описание |
Значение/пример |
|---|---|---|---|
|
Да |
Уникальный идентификатор для данной функции |
|
|
Да |
Список векторных полей, к которым следует применить функцию (должен быть пустым для взвешенного ранжира) |
[] |
|
Да |
Тип вызываемой функции; используйте |
|
|
Да |
Указывает используемый метод ранжирования. Должно быть установлено значение |
|
|
Да |
Массив весов, соответствующих каждому пути поиска; значения ∈ [0,1]. Подробности см. в разделе Механизм взвешенного ранжирования. |
|
|
Нет |
Нужно ли нормализовать сырые баллы (с помощью arctan) перед взвешиванием. Подробнее см. в разделе Механизм взвешенного ранжирования. |
|
Применение к гибридному поиску
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
Дополнительные сведения о гибридном поиске см. в разделе Многовекторный гибридный поиск.