Базовый векторный поиск с использованием StructArray
Используйте эту страницу для выполнения векторного поиска по подполям вектора внутри поля StructArray. StructArray поддерживает два основных режима векторного поиска: поиск по списку вложений (EmbeddingList), при котором оценивается список вложений, хранящийся в каждой сущности, и поиск на уровне элементов, при котором каждый элемент Struct просматривается независимо.
На этой странице используется коллекция « tech_articles » из раздела «Создание поля StructArray». В коллекции имеется поле StructArray с именем « chunks ». Каждый фрагмент содержит текст, скалярные метаданные, векторное подполе с именем « emb_list_vector » с индексом для поиска по списку вложений, а также векторное подполе с именем « emb » с индексом для поиска на уровне элементов.
Перед началом работы
Убедитесь, что схема коллекции, данные и индексы уже подготовлены.
| Требования | Где это подготовить |
|---|---|
Создайте поле StructArray, например chunks. | Создание поля StructArray |
Вставьте сущности, поле « chunks » которых содержит объекты Struct. | Вставка данных в поля StructArray |
Создайте индекс MAX_SIM* на chunks[emb_list_vector] для поиска по EmbeddingList. | Индексирование полей StructArray |
Создайте обычный векторно-метрический индекс на поле « chunks[emb] » для поиска на уровне элементов. | Индексирование полей StructArray |
Предупреждение
Векторное поле или векторное подполе допускает только один индекс. Если вам нужен как поиск по EmbeddingList, так и поиск на уровне элементов, создайте два отдельных векторных подполя. На этой странице поле chunks[emb_list_vector] индексируется для поиска по EmbeddingList, а поле chunks[emb] — для поиска на уровне элементов.
Выберите режим поиска
| Аспект | Поиск по EmbeddingList | Поиск на уровне элементов |
|---|---|---|
| Целевое подполе | chunks[emb_list_vector] | chunks[emb] |
| Данные запроса | Список вложений, содержащий один или несколько векторов. | Обычный вектор. |
| Семейство метрик | MAX_SIM*, например MAX_SIM_COSINE. | Обычные векторные метрики, такие как COSINE, IP или L2. |
| Что представляет собой один результат | Соответствующий объект, подполе вектора StructArray которого схоже со списком вложений запроса. | Соответствующий элемент Struct внутри поля StructArray. |
| Детализация результатов | Уровень сущности. | Уровень элемента Struct. |
| Смещение | Не применимо. | Определяет позицию сопоставленного элемента структуры с нулевым индексом при возвращении. |
| Типичное использование | ColBERT, ColPali и другие шаблоны поиска с поздним взаимодействием. | Поиск на уровне фрагментов, абзацев, клипов, патчей или фактов. |
Запуск поиска EmbeddingList
Используйте поиск EmbeddingList, если сам запрос содержит несколько векторов, а целевое подполе вектора StructArray индексируется с помощью метрики « MAX_SIM* ». Результатом является совпадение на уровне сущностей.
from pymilvus import MilvusClient
from pymilvus.client.embedding_list import EmbeddingList
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
query = EmbeddingList()
query.add([0.12, 0.21, 0.32, 0.44])
query.add([0.18, 0.23, 0.29, 0.36])
results = client.search(
collection_name="tech_articles",
data=[query],
anns_field="chunks[emb_list_vector]",
limit=3,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
],
)
for hits in results:
for hit in hits:
print(hit["id"], hit["distance"], hit["entity"])
В этом режиме поиска параметр « limit » определяет, сколько сущностей будет возвращено по каждому запросу. Результат может включать подполя StructArray, однако само совпадение представляет собой найденную родительскую сущность, а не какой-то конкретный элемент Struct.
Полное руководство по работе с ColBERT или ColPali см. в разделе «Поиск с использованием списков вложений». На этой странице рассматриваются только основные особенности поиска по StructArray.
Запуск поиска на уровне элементов
Используйте поиск на уровне элементов, когда каждый элемент Struct должен участвовать в векторном поиске независимо. Запрос представляет собой обычный вектор, а целевое подполе вектора должно индексироваться с помощью обычной векторной метрики.
query_vector = [0.19, 0.24, 0.30, 0.37]
results = client.search(
collection_name="tech_articles",
data=[query_vector],
anns_field="chunks[emb]",
limit=5,
output_fields=[
"doc_id",
"title",
"chunks[text]",
"chunks[section]",
"chunks[page]",
"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"],
)
При поиске на уровне элементов каждый результат соответствует найденному элементу Struct. Значение « offset » представляет собой позицию этого элемента в поле StructArray, начиная с нуля. Один и тот же объект может появиться более одного раза, если запросу соответствует более одного элемента Struct. Значение « limit » применяется к найденным элементам, а не к уникальным родительским объектам.
Интерпретация результатов
| Элемент результата | Поиск по списку вложений (EmbeddingList) | Поиск на уровне элементов |
|---|---|---|
id | Первичный ключ найденного объекта. | Первичный ключ сущности, содержащей найденный элемент Struct. |
distance или оценка | Оценка или расстояние между списком вложений запроса и сохраненным списком вложений. | Оценка или расстояние между вектором запроса и вектором найденного элемента Struct. |
offset | Не применимо. | Позиция соревнования элемента Struct с нулевым индексом при возвращении. |
| Повторяющиеся первичные ключи | Не ожидается для отдельного запроса, поскольку результаты предоставляются на уровне сущности. | Возможно, поскольку могут совпадать несколько элементов Struct в одной сущности. |
| Запрашиваемые поля вывода StructArray | Возвращаются из найденной сущности. | Возвращаются с формой совпадения на уровне элементов, поддерживаемой целевым API и SDK. |
Распространенные ошибки
Использование
chunks.embвместо требуемого синтаксиса пути к подполюchunks[emb].Использование запроса EmbeddingList для векторного подполя, индексированного с помощью обычной векторной метрики.
Использование обычного векторного запроса к векторному подполю, индексированному с помощью метрики
MAX_SIM*.Ожидание того, что поиск на уровне элементов
limitвернет столько же уникальных родительских сущностей. Он возвращает совпадения на уровне элементов.Ожидается, что поиск EmbeddingList вернет одно конкретное смещение элемента. Вместо этого возвращаются совпадения на уровне сущностей.
Повторное использование одного векторного подполя для обоих режимов поиска. Используйте отдельные векторные подполя, поскольку каждое векторное подполе допускает только один индекс.
Следующие шаги
Чтобы ограничить поиск на уровне элементов с помощью скалярных условий, ознакомьтесь с разделом «Фильтрованный поиск с использованием StructArray».
Чтобы выполнить поиск по границам оценки или расстояния, ознакомьтесь с разделом «Поиск по диапазону с использованием StructArray».
Чтобы после поиска на уровне элементов возвращалось не более одного результата на родительский объект, ознакомьтесь с разделом «Групповой поиск с использованием StructArray».
Чтобы объединить поиск с использованием StructArray с другими векторными поисками, ознакомьтесь с разделом «Гибридный поиск с использованием StructArray».
Чтобы ознакомиться с поддерживаемыми типами данных, метриками, фильтрами и ограничениями для конкретных версий, ознакомьтесь с разделом «Ограничения StructArray».