Ускорение поиска сходства на действительно больших данных с помощью векторной индексации
От компьютерного зрения до поиска новых лекарств — поисковые системы векторной схожести лежат в основе многих популярных приложений искусственного интеллекта (AI). Огромная составляющая того, что делает возможным эффективный запрос к наборам данных из миллионов, миллиардов или даже триллионов векторов, на которые полагаются поисковые системы схожести, — это индексирование, процесс организации данных, который радикально ускоряет поиск в больших данных. В этой статье рассматривается роль индексирования в повышении эффективности поиска векторной схожести, различные типы индексов vector inverted file (IVF), а также рекомендации о том, какой индекс использовать в разных сценариях.
Перейти к:
- Как векторное индексирование ускоряет поиск схожести и машинное обучение?
- Какие существуют разные типы индексов IVF и для каких сценариев они лучше всего подходят?
- FLAT: Подходит для поиска в относительно небольших наборах данных (масштаба миллионов), когда требуется 100% полнота.
- IVF_FLAT: Повышает скорость в ущерб точности (и наоборот).
- IVF_SQ8: Быстрее и менее требователен к ресурсам, чем IVF_FLAT, но также менее точен.
- IVF_SQ8H: Новый гибридный подход GPU/CPU, который еще быстрее, чем IVF_SQ8.
- Узнайте больше о Milvus, платформе управления векторными данными сверхбольшого масштаба.
Как векторное индексирование ускоряет поиск схожести и машинное обучение?
Поисковые системы схожести работают, сравнивая входные данные с базой данных, чтобы найти объекты, наиболее похожие на входные данные. Индексирование — это процесс эффективной организации данных, и оно играет важную роль в том, чтобы сделать поиск схожести полезным, резко ускоряя трудоемкие запросы к большим наборам данных. После индексирования огромного векторного набора данных запросы могут направляться в кластеры, или подмножества данных, которые с наибольшей вероятностью содержат векторы, похожие на входной запрос. На практике это означает, что определенной степенью точности жертвуют ради ускорения запросов к действительно большим векторным данным.
Можно провести аналогию со словарем, где слова отсортированы в алфавитном порядке. При поиске слова можно быстро перейти к разделу, который содержит только слова с той же начальной буквой, — что радикально ускоряет поиск определения входного слова.
Какие существуют разные типы индексов IVF и для каких сценариев они лучше всего подходят?
Существует множество индексов, предназначенных для поиска схожести многомерных векторов, и каждый из них имеет компромиссы в производительности, точности и требованиях к хранению. В этой статье рассматриваются несколько распространенных типов индексов IVF, их сильные и слабые стороны, а также результаты тестирования производительности для каждого типа индекса. Тестирование производительности количественно оценивает время запроса и показатели полноты для каждого типа индекса в Milvus, платформе управления векторными данными с открытым исходным кодом. Для получения дополнительной информации о тестовой среде см. раздел методологии внизу этой статьи.
FLAT: Подходит для поиска в относительно небольших наборах данных (масштаба миллионов), когда требуется 100% полнота.
Для приложений поиска векторной схожести, которым требуется идеальная точность и которые зависят от относительно небольших наборов данных (масштаба миллионов), индекс FLAT является хорошим выбором. FLAT не сжимает векторы и является единственным индексом, который может гарантировать точные результаты поиска. Результаты FLAT также можно использовать как точку сравнения для результатов, полученных другими индексами, у которых полнота меньше 100%.
FLAT точен, поскольку использует исчерпывающий подход к поиску, что означает, что для каждого запроса целевой входной вектор сравнивается с каждым вектором в наборе данных. Это делает FLAT самым медленным индексом в нашем списке и плохо подходящим для запросов к массивным векторным данным. В Milvus у индекса FLAT нет параметров, и его использование не требует обучения данных или дополнительного хранилища.
Результаты тестирования производительности FLAT:
Тестирование производительности времени запросов FLAT проводилось в Milvus с использованием набора данных, состоящего из 2 миллионов 128-мерных векторов.
Результаты теста времени запросов для индекса FLAT в Milvus.
Основные выводы:
- По мере увеличения nq (количества целевых векторов для запроса) время запроса увеличивается.
- Используя индекс FLAT в Milvus, мы видим, что время запроса резко возрастает, как только nq превышает 200.
- В целом индекс FLAT быстрее и стабильнее при запуске Milvus на GPU по сравнению с CPU. Однако запросы FLAT на CPU быстрее, когда nq меньше 20.
IVF_FLAT: повышает скорость за счет точности (и наоборот).
Распространенный способ ускорить процесс поиска по сходству за счет точности — выполнять поиск приближенных ближайших соседей (ANN). Алгоритмы ANN уменьшают требования к хранилищу и вычислительную нагрузку, кластеризуя похожие векторы вместе, что приводит к более быстрому векторному поиску. IVF_FLAT — это самый базовый тип индекса инвертированного файла, основанный на одной из форм поиска ANN.
IVF_FLAT делит векторные данные на некоторое количество кластерных единиц (nlist), а затем сравнивает расстояния между целевым входным вектором и центром каждого кластера. В зависимости от количества кластеров, которое система настроена запрашивать (nprobe), результаты поиска по сходству возвращаются на основе сравнений между целевым входным вектором и векторами только в наиболее похожем(их) кластере(ах) — что резко сокращает время запроса.
Регулируя nprobe, для конкретного сценария можно найти идеальный баланс между точностью и скоростью. Результаты нашего теста производительности IVF_FLAT показывают, что время запроса резко увеличивается по мере роста как количества целевых входных векторов (nq), так и количества кластеров для поиска (nprobe). Однако IVF_FLAT не сжимает векторные данные; индексные файлы включают метаданные, которые незначительно увеличивают требования к хранилищу по сравнению с исходным неиндексированным набором векторных данных.
Результаты тестирования производительности IVF_FLAT:
Тестирование производительности времени запросов IVF_FLAT проводилось в Milvus с использованием публичного набора данных 1B SIFT, который содержит 1 миллиард 128-мерных векторов.
Результаты теста времени запросов для индекса IVF_FLAT в Milvus.
Основные выводы:
- При запуске на CPU время запроса для индекса IVF_FLAT в Milvus увеличивается как с nprobe, так и с nq. Это означает, что чем больше входных векторов содержит запрос или чем больше кластеров обрабатывает запрос, тем дольше будет время запроса.
- На GPU индекс показывает меньший разброс времени при изменениях nq и nprobe. Это связано с тем, что данные индекса велики, а копирование данных из памяти CPU в память GPU составляет большую часть общего времени запроса.
- Во всех сценариях, кроме случая, когда nq = 1,000 и nprobe = 32, индекс IVF_FLAT эффективнее при запуске на CPU.
Тестирование производительности полноты IVF_FLAT проводилось в Milvus с использованием как публичного набора данных 1M SIFT, который содержит 1 миллион 128-мерных векторов, так и набора данных glove-200-angular, который содержит более 1 миллиона 200-мерных векторов, для построения индекса (nlist = 16,384).
Результаты теста полноты для индекса IVF_FLAT в Milvus.
Основные выводы:
- Индекс IVF_FLAT можно оптимизировать для точности, достигая показателя полноты выше 0.99 на наборе данных 1M SIFT при nprobe = 256.
IVF_SQ8: быстрее и менее ресурсоемкий, чем IVF_FLAT, но также менее точный.
IVF_FLAT не выполняет никакого сжатия, поэтому создаваемые им индексные файлы примерно такого же размера, как исходные необработанные неиндексированные векторные данные. Например, если исходный датасет 1B SIFT занимает 476 ГБ, его индексные файлы IVF_FLAT будут немного больше (~470 ГБ). Загрузка всех индексных файлов в память потребует 470 ГБ хранилища.
Когда ресурсы диска, CPU или памяти GPU ограничены, IVF_SQ8 является лучшим вариантом, чем IVF_FLAT. Этот тип индекса может преобразовывать каждый FLOAT (4 байта) в UINT8 (1 байт), выполняя скалярное квантование. Это снижает потребление дискового пространства, CPU и памяти GPU на 70–75%. Для датасета 1B SIFT индексные файлы IVF_SQ8 требуют всего 140 ГБ хранилища.
Результаты тестирования производительности IVF_SQ8:
Тестирование времени запросов IVF_SQ8 проводилось в Milvus с использованием публичного датасета 1B SIFT, который содержит 1 миллиард 128-мерных векторов, для построения индекса.
Результаты тестирования времени запросов для индекса IVF_SQ8 в Milvus.
Ключевые выводы:
- За счет уменьшения размера индексного файла IVF_SQ8 обеспечивает заметное повышение производительности по сравнению с IVF_FLAT. IVF_SQ8 следует схожей с IVF_FLAT кривой производительности: время запроса увеличивается с ростом nq и nprobe.
- Как и IVF_FLAT, IVF_SQ8 показывает более высокую производительность при работе на CPU и при меньших значениях nq и nprobe.
Тестирование полноты поиска IVF_SQ8 проводилось в Milvus с использованием как публичного датасета 1M SIFT, который содержит 1 миллион 128-мерных векторов, так и датасета glove-200-angular, который содержит более 1 миллиона 200-мерных векторов, для построения индекса (nlist = 16,384).
Результаты тестирования показателя полноты поиска для индекса IVF_SQ8 в Milvus.
Ключевые выводы:
- Несмотря на сжатие исходных данных, IVF_SQ8 не демонстрирует значительного снижения точности запросов. При различных настройках nprobe показатель полноты поиска IVF_SQ8 максимум на 1% ниже, чем у IVF_FLAT.
IVF_SQ8H: новый гибридный подход GPU/CPU, который еще быстрее, чем IVF_SQ8.
IVF_SQ8H — это новый тип индекса, который повышает производительность запросов по сравнению с IVF_SQ8. Когда выполняется запрос к индексу IVF_SQ8, работающему на CPU, большая часть общего времени запроса тратится на поиск nprobe кластеров, ближайших к целевому входному вектору. Чтобы сократить время запроса, IVF_SQ8 копирует данные для операций грубого квантователя, которые меньше индексных файлов, в память GPU — значительно ускоряя операции грубого квантователя. Затем gpu_search_threshold определяет, какое устройство выполняет запрос. Когда nq >= gpu_search_threshold, запрос выполняет GPU; в противном случае запрос выполняет CPU.
IVF_SQ8H — это гибридный тип индекса, который требует совместной работы CPU и GPU. Его можно использовать только с Milvus с поддержкой GPU.
Результаты тестирования производительности IVF_SQ8H:
Тестирование производительности времени запросов IVF_SQ8H проводилось в Milvus с использованием публичного датасета 1B SIFT, который содержит 1 миллиард 128-мерных векторов, для построения индекса.
Результаты тестирования времени запросов для индекса IVF_SQ8H в Milvus.
Ключевые выводы:
- Когда nq меньше или равно 1,000, IVF_SQ8H показывает время запросов почти в два раза быстрее, чем IVFSQ8.
- Когда nq = 2000, время запросов для IVFSQ8H и IVF_SQ8 одинаково. Однако если параметр gpu_search_threshold ниже 2000, IVF_SQ8H будет превосходить IVF_SQ8.
- Показатель полноты поиска запросов IVF_SQ8H идентичен показателю IVF_SQ8, что означает сокращение времени запросов без потери точности поиска.
Узнайте больше о Milvus, платформе управления векторными данными огромного масштаба.
Milvus — это платформа управления векторными данными, которая может обеспечивать работу приложений поиска по сходству в областях, охватывающих искусственный интеллект, глубокое обучение, традиционные векторные вычисления и многое другое. Для получения дополнительной информации о Milvus ознакомьтесь со следующими ресурсами:
- Milvus доступен по лицензии с открытым исходным кодом на GitHub.
- В Milvus поддерживаются дополнительные типы индексов, включая индексы на основе графов и деревьев. Полный список поддерживаемых типов индексов см. в документации по векторным индексам в Milvus.
- Чтобы узнать больше о компании, запустившей Milvus, посетите Zilliz.com.
- Общайтесь с сообществом Milvus или получите помощь в решении проблемы в Slack.
Методология
Среда тестирования производительности
Конфигурация сервера, использованная во всех тестах производительности, упомянутых в этой статье, следующая:
- Intel (R) Xeon (R) Platinum 8163 @ 2.50GHz, 24 cores
- GeForce GTX 2080Ti x 4
- 768 GB memory
Соответствующие технические концепции
Хотя для понимания этой статьи это не обязательно, ниже приведены несколько технических концепций, которые полезны для интерпретации результатов наших тестов производительности индексов:
Blog_Accelerating Similarity Search on Really Big Data with Vector Indexing_8.png
Ресурсы
Для этой статьи были использованы следующие источники:
- «Encyclopedia of database systems», Ling Liu and M. Tamer Özsu.
Что дальше
Продолжайте читать Ускорение поиска по сходству на действительно больших данных с помощью векторного индексирования: часть II.
Читать далее

A Few Notes from Databricks Data + AI Summit 2026: Why the Data Layer Matters Again
James Luan shares notes from Databricks Data + AI Summit 2026 on why production AI is pushing the data layer back to the center of infrastructure.

Zilliz Cloud On-Demand Compute: Pay Only for What You Use
The customer case behind Zilliz Cloud On-Demand: how a $10K vector search bill came down to under $500, and the engineering changes that made it possible.

How to Choose the Best Embedding Model for RAG in 2026: 10 Models Benchmarked
We benchmarked 10 embedding models on cross-modal, cross-lingual, long-document, and dimension compression tasks. See which one fits your RAG pipeline.



