Гибридный поиск с использованием StructArray
Используйте эту страницу, чтобы объединить векторный поиск StructArray с другими видами векторного поиска в одном гибридном запросе. Гибридный поиск StructArray может возвращать результаты как на уровне сущностей, так и на уровне элементов, в зависимости от объектов коллекции « AnnSearchRequest », которые вы объединяете.
На этой странице используется коллекция tech_articles из раздела «Создание поля StructArray». Коллекция содержит векторное поле верхнего уровня с именем title_vector и поле StructArray с именем chunks. Поле chunks[emb_list_vector] индексируется для поиска по EmbeddingList, а поле chunks[emb] — для поиска на уровне элементов.
Как гибридный поиск применяется к StructArray
AnnSearchRequest комбинации | Окончательная область кандидатов | Поведение результата | element_scope |
|---|---|---|---|
| Векторное поле на уровне коллекции + подполе EmbeddingList структуры StructArray | Уровень сущности | Окончательные кандидаты индексируются по первичному ключу. | Не использовать. |
| Векторное поле на уровне коллекции + подполе на уровне элемента StructArray | Уровень сущности | Соответствия на уровне элементов сводятся к кандидатам на уровне сущностей перед гибридным переранжированием. | Дополнительная настройка сворачивания на уровне элементов StructArray: AnnSearchRequest. |
| Несколько подполей на уровне элементов в рамках одного поля StructArray | Уровень элемента | Окончательные кандидаты индексируются по первичному ключу плюс смещению элемента Struct. | Не использовать. |
| По podpolu на уровне элемента в разных полях StructArray | Уровень сущности | Смещения элементов не имеют общей идентичности, поэтому каждый подполе на уровне элемента StructArray AnnSearchRequest сворачивается перед переранжированием. | Дополнительная настройка сворачивания для каждого « AnnSearchRequest » на уровне элементов StructArray. |
Предупреждение
Используйте параметр ` element_scope ` только для настройки сворачивания объектов ` AnnSearchRequest ` на уровне элементов StructArray при гибридном поиске на уровне элементов с разными структурами. Не используйте его для запросов EmbeddingList, векторных запросов на уровне коллекций или гибридного поиска на уровне элементов с одинаковыми StructArray.
Перед началом
Перед запуском гибридного поиска подготовьте коллекцию, данные и индексы.
| Требования | Подробности |
|---|---|
| Поле StructArray | Коллекция содержит поле StructArray, например chunks. |
| Поподполя вектора | Используйте отдельные подполя вектора для поиска по EmbeddingList и поиска на уровне элементов. |
| Индексы | chunks[emb_list_vector] использует метрику MAX_SIM*. Функция « chunks[emb] » использует обычную векторную метрику, например COSINE, IP или L2. |
| Реранкер | Выберите гибридный реранкер, например RRFRanker или другой реранкер, поддерживаемый вашим приложением. |
Информацию о настройке индекса см. в разделе «Поля StructArray индекса».
Запустите гибридный поиск с помощью запроса EmbeddingList
Поиск EmbeddingList по подполю вектора StructArray в гибридном поиске осуществляется на уровне сущностей. Он ведет себя как запрос векторного поиска на уровне сущностей и не возвращает одно совпадающее смещение элемента Struct.
from pymilvus import AnnSearchRequest, MilvusClient, RRFRanker
from pymilvus.client.embedding_list import EmbeddingList
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
query_vector = [0.19, 0.24, 0.30, 0.37]
query_list = EmbeddingList()
query_list.add([0.12, 0.21, 0.32, 0.44])
query_list.add([0.18, 0.23, 0.29, 0.36])
title_req = AnnSearchRequest(
data=[query_vector],
anns_field="title_vector",
limit=10,
)
chunk_list_req = AnnSearchRequest(
data=[query_list],
anns_field="chunks[emb_list_vector]",
limit=10,
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[title_req, chunk_list_req],
ranker=RRFRanker(),
limit=5,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
],
)
В данном примере оба объекта AnnSearchRequest генерируют кандидаты на уровне сущностей. Окончательный результат индексируется по первичному ключу родительской сущности. Не добавляйте element_scope в запрос EmbeddingList.
Запуск гибридного поиска на уровне элементов одного и того же StructArray
Когда все объекты ` AnnSearchRequest ` нацелены на векторные подполя на уровне элементов в рамках одного и того же поля `StructArray`, гибридный поиск может сохранить кандидаты на уровне элементов посредством переранжирования. Это единственный гибридный режим для `StructArray`, при котором окончательные результаты остаются на уровне элементов.
В следующем примере предполагается, что поле StructArray типа chunks имеет два векторных подполя на уровне элементов: chunks[emb] и chunks[code_emb], и оба используют обычные векторные метрики.
index_chunk_req = AnnSearchRequest(
data=[query_vector],
anns_field="chunks[emb]",
limit=10,
expr='element_filter(chunks, $[section] == "index")',
)
code_chunk_req = AnnSearchRequest(
data=[code_query_vector],
anns_field="chunks[code_emb]",
limit=10,
expr='element_filter(chunks, $[has_code] == true)',
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[index_chunk_req, code_chunk_req],
ranker=RRFRanker(),
limit=5,
output_fields=[
"doc_id",
"title",
"chunks[text]",
"chunks[section]",
"chunks[quality_score]",
],
)
for hits in results:
for hit in hits:
print(
"doc_id:", hit["id"],
"distance:", hit["distance"],
"offset:", hit.get("offset"),
"entity:", hit["entity"],
)
Оба объекта AnnSearchRequest выполняют поиск по векторным подполям в рамках chunks. Одно и то же смещение с нулевой базой относится к одному и тому же элементу Struct, поэтому гибридный реранкер может ранжировать кандидаты на уровне элементов напрямую. Не устанавливайте element_scope в этом режиме, поскольку сворачивание на уровне сущностей не выполняется.
Сворачивание совпадений на уровне элементов для гибридного поиска на уровне сущностей
Если гибридный поиск сочетает запрос на уровне элементов StructArray AnnSearchRequest с векторным запросом на уровне коллекции, запросом EmbeddingList или запросом на уровне элементов в рамках другого поля StructArray, окончательная область кандидатов находится на уровне сущностей. В этом случае каждый запрос на уровне элементов StructArray AnnSearchRequest сводится к кандидатам на уровне сущностей перед гибридным переранжированием.
Используйте element_scope внутри params элемента StructArray уровня AnnSearchRequest, когда необходимо контролировать, как сворачиваются несколько совпавших элементов из одного и того же объекта.
title_req = AnnSearchRequest(
data=[query_vector],
anns_field="title_vector",
limit=10,
)
chunk_req = AnnSearchRequest(
data=[query_vector],
anns_field="chunks[emb]",
param={
"params": {
"element_scope": {
"collapse": {
"strategy": "topk_sum",
"topk": 3,
},
},
},
},
limit=30,
expr='element_filter(chunks, $[quality_score] > 0.8)',
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[title_req, chunk_req],
ranker=RRFRanker(),
limit=5,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
"chunks[quality_score]",
],
)
В данном примере параметр « title_req » (Сводка на уровне сущности) установлен, поэтому итоговый гибридный результат также будет на уровне сущности. Запрос « chunk_req » сначала возвращает совпадения элементов из « chunks[emb] », а затем сворачивает возвращенные элементы из одной и той же сущности путем суммирования трех лучших оценок элементов. Если параметр « element_scope » (Сводка на уровне сущности) опущен при необходимости сворачивания на уровне сущности, по умолчанию используется стратегия сворачивания « max » (Сводка на уровне элемента).
Выбор стратегии сворачивания
| Стратегия | Поведение | topk | Требования к метрике |
|---|---|---|---|
max | Сохранить наилучший балл возвращённого элемента для сущности. | Не допускается. | Любая поддерживаемая метрика векторного типа. |
sum | Суммировать оценки всех возвращаемых элементов для сущности. | Не допускается. | Только метрики с положительной корреляцией, такие как IP или COSINE. |
avg | Среднее значение всех возвращаемых оценок элементов для сущности. | Не допускается. | Любая поддерживаемая метрика регулярного вектора. |
topk_sum | Суммируйте лучшие оценки возвращённых элементов по метрике K для сущности. | Обязательно и должно быть положительным. | Только метрики с положительной корреляцией, такие как « IP » или « COSINE ». |
topk_avg | Среднее значение лучших оценок элементов, возвращаемых по методу « K » для данного объекта. | Обязательный параметр, значение должно быть положительным. | Любая поддерживаемая метрика регулярного вектора. |
Функция «Сворачивание» использует только совпадения элементов, возвращаемые этой метрикой на уровне элементов StructArray ( AnnSearchRequest). Она не сканирует каждый элемент Struct в объекте после поиска ANN. Установите значение параметра запроса limit достаточно высоким, чтобы обеспечить доступность нужных элементов для сворачивания.
Добавление фильтров, поиска по диапазону и группировки
Вы можете привязать element_filter к AnnSearchRequest на уровне элементов StructArray, когда скалярные условия должны применяться к тем же элементам Struct, которые участвуют в векторном поиске. Вы также можете использовать filter верхнего уровня на hybrid_search() для условий, относящихся к родительскому объекту.
Векторные поля на уровне элементов StructArray поддерживают поиск по диапазону в гибридном поиске. Добавьте radius и, при желании, range_filter к AnnSearchRequest на уровне элементов. Запросы StructArray на уровне EmbeddingList не поддерживают поиск по диапазону.
Гибридная группировка на уровне элементов поддерживается только в том случае, если все объекты AnnSearchRequest относятся к векторным полям на уровне элементов в рамках одного и того же поля StructArray, при этом group_by_field должен быть первичным ключом. Гибридная группировка не поддерживается, если запрос сочетает векторные поля на уровне коллекций, различные поля StructArray или запросы на уровне EmbeddingList. Не следует сочетать поиск по диапазону с группировкой.
Интерпретация гибридных результатов
| Окончательная область кандидатов | Ключ результата | Поведение смещения | Когда это происходит |
|---|---|---|---|
| Уровень сущности | Первичный ключ. | В окончательном результате смещение элементов отсутствует. | Гибридный запрос включает векторное поле на уровне коллекции, запрос EmbeddingList или запросы на уровне элементов в рамках различных полей StructArray. |
| Уровень элемента | Первичный ключ плюс родительское поле StructArray плюс смещение элемента. | Смещение выбранного элемента может быть возвращено при предоставлении доступа через API или SDK. | Все объекты « AnnSearchRequest » относятся к уровню элементов и находятся в одном поле StructArray. |
Ограничения
Используйте
element_scopeтолько для объектовAnnSearchRequestна уровне элементов StructArray, которые должны быть сведены к кандидатам на уровне сущностей при гибридном поиске.Не используйте
element_scopeдля запросов EmbeddingList, векторных запросов на уровне коллекции или гибридного поиска на уровне элементов одного и того же StructArray.sumСтратегии сворачивания «topk_sum» и «and» требуют метрик положительной корреляции, таких какIPилиCOSINE. Не используйте их сL2.topk_sumа такжеtopk_avgтребуют положительного значенияtopk. Другие стратегии сворачивания не должны включатьtopk.Запросы StructArray на уровне EmbeddingList не поддерживают поиск по диапазону или группировку.
Гибридное группирование поддерживается только для гибридного поиска на уровне элементов одного и того же StructArray и только по первичному ключу.
Не следует сочетать поиск по диапазону с группировкой.
Распространенные ошибки
Добавление параметра
element_scopeв гибридный запрос на уровне элементов одного и того же StructArray. Такой запрос остаётся на уровне элементов и не выполняет сворачивание на уровне сущностей.Добавление параметра «
element_scope» к запросу «chunks[emb_list_vector]». Поиск по EmbeddingList уже осуществляется на уровне сущностей.Предположение о том, что два поля StructArray имеют общие смещения элементов. Элемент с офсетом
3в полеchunksи элемент с офсетом3в другом поле StructArray относятся к разным элементам, поэтому гибридный запрос становится запросом на уровне сущностей.Используйте
topk_sumсL2. Для отрицательных метрик расстояния используйтеmax,avgилиtopk_avg.Ожидается, что гибридные результаты на уровне сущностей будут включать выбранное смещение элемента Struct после сворачивания.
Следующие шаги
Чтобы узнать о двух основных режимах векторного поиска с использованием StructArray, ознакомьтесь со статьёй «Базовый векторный поиск с StructArray».
Чтобы добавить скалярные фильтры в гибридный поиск, ознакомьтесь со статьёй «Фильтрованный поиск с использованием StructArray».
Чтобы использовать границы оценки или расстояния в гибридном поиске, ознакомьтесь со статьей «Поиск по диапазону с использованием StructArray».
Чтобы сгруппировать гибридные результаты на уровне элементов по родительскому объекту, ознакомьтесь со статьей «Групповой поиск с помощью StructArray».
Чтобы ознакомиться с ограничениями поиска с помощью StructArray, прочитайте раздел «Ограничения StructArray».