Наблюдайте за прохождением поиска по многослойному графу — от разреженного верхнего слоя (автомагистрали) до плотного нижнего слоя (местные дороги). Перетащите точку запроса на слое 0 и настройте M / ef , чтобы увидеть, как меняется граф.
M ». Высшие слои являются разреженными (немного узлов, длинные ребра = «магистрали»). Слой 0 является плотным (все узлы, короткие ребра = «местные дороги»).ef »: на нижнем уровне, вместо того чтобы останавливаться на первом локальном минимуме, метод « HNSW » поддерживает пул ef лучших кандидатов и расширяет их окрестности. Более крупный ef → более точно, но медленнее.Почему это быстро: верхние слои действуют как индекс над индексом — вы преодолеваете огромные расстояния всего за несколько шагов, а затем увеличиваете масштаб. Для N точек поиск посещает примерно O(log N) узлов вместо N.
HNSW (Hierarchical Navigable Small World) — это основанный на графах алгоритм приближённого поиска ближайших соседей. Он организует векторы в стопку навигабельных графов «малого мира»: разреженные верхние слои с ребрами большого радиуса действия для грубой маршрутизации и плотный нижний слой с короткими ребрами для окончательного тонкого прохождения. Поиск жадно перескакивает к запросу на каждом слое, а затем спускается вниз — посещая примерно O(log N) узлов вместо сканирования всех N.
HNSW — это наиболее широко используемый векторный индекс в памяти и индекс графов по умолчанию в Milvus. Milvus также предлагает HNSW_SQ и HNSW_PQ варианты, которые квантуют хранящиеся векторы для сокращения объёма памяти за счёт небольшого снижения коэффициента восстановления.
M (время построения): максимальное количество ребер на узел; этот регулятор соответствует ползунку, показанному выше. Типичные значения — 8–64. Более высокое значение M улучшает коэффициент восстановления и связность графа, но линейно увеличивает потребление памяти и замедляет построение.efConstruction (время построения): размер пула кандидатов, используемый при вставке узлов. Более высокие значения позволяют построить граф лучшего качества (достигается более высокий показатель recall) за счёт более медленного построения индекса. Типичные значения составляют 100–500.ef / ef_search (время запроса): пул кандидатов, сохраняемый во время прохода по слою 0 — основной регулятор точности извлечения и задержки во время поиска. Его значение должно быть не меньше вашего top-K. Увеличивайте его до тех пор, пока точность извлечения не перестанет расти; задержка при этом растёт примерно линейно.HNSW обычно обеспечивает наилучшую задержку запроса при высокой точности поиска для поиска в памяти — именно поэтому он является выбором по умолчанию, когда набор данных (плюс накладные расходы графа) помещается в RAM. Его издержки — это память и время построения: граф добавляет заметные накладные расходы на каждый вектор, а вставки выполняются медленнее, чем при назначении методом k-средних в IVF. Выбирайте IVF, если вам требуется быстрое построение индекса или агрессивная квантизация, и DiskANN, если набор данных слишком велик для RAM, но вам по-прежнему требуется высокий коэффициент восстановления.
M ограничивает количество ребер, которые каждый узел сохраняет на каждом слое. Увеличение M улучшает связность графа — повышается точность извлечения и надежность маршрутизации — но объем памяти растёт линейно с M, а построение индекса замедляется. Значения от 8 до 64 покрывают большинство рабочих нагрузок; 16–32 — это типичный оптимальный диапазон.
Оба параметра определяют размер пула кандидатов, но применяются в разное время. Параметр « efConstruction » используется при построении индекса: он определяет, насколько тщательно каждый вставляемый узел ищет соседей, тем самым контролируя качество графа. Параметр « ef » (ef_search) используется во время запроса: он контролирует широту поиска на уровне Layer-0, жертвуя задержкой ради точности поиска при каждом запросе.
Приблизительно исходные векторы плюс граф: около d × 4 байт на вектор для данных типа float32, плюс порядка M × 2 × 8 байт ребер на узел. Для развертываний с ограниченным объёмом памяти Milvus предлагает HNSW_SQ и HNSW_PQ, которые квантуют хранящиеся векторы, или DiskANN, который перемещает полные векторы в SSD.
Используйте « HNSW », когда приоритетом является задержка запроса при высокой точности извлечения, а индекс помещается в памяти — обычно этот вариант выигрывает в этой гонке. Отдавайте предпочтение « IVF », если вы часто перестраиваете индексы (гораздо более быстрое построение) или в сочетании с квантованием « SQ8 » / «PQ » для соответствия ограниченному объему памяти.
Узнайте больше: ознакомьтесь с документацией по «HNSW » для получения точных параметров индекса или просмотрите «Index Explained» для получения полного руководства по принятию решений.
Сравнение методов перебора и кластерного поиска в табличном виде. Настройка параметра « nprobe » в режиме реального времени.
Посмотрите, как PQ-in-RAM + full-vectors-on-SSD позволяет выполнять поиск в наборах данных объемом в миллиарды записей на ноутбуке.
Перетащите точку запроса и переключайтесь между режимами « L2 », «Cosine» и « IP », чтобы увидеть, как меняется понятие «ближайший».