HNSW_PQ
HNSW_PQ использует графы Hierarchical Navigable Small World (HNSW) с Product Quantization (PQ), создавая передовой метод векторного индексирования, который предлагает контролируемый компромисс между размером и точностью. По сравнению с HNSW_SQ, этот тип индекса обеспечивает более высокий коэффициент запоминания при том же уровне сжатия, хотя при этом снижается скорость обработки запросов и увеличивается время построения индекса.
Обзор
HNSW_PQ сочетает в себе две техники индексирования: HNSW для быстрой навигации по графам и PQ для эффективного сжатия векторов.
HNSW
HNSW строит многослойный граф, в котором каждый узел соответствует вектору в наборе данных. В этом графе узлы соединяются на основе их сходства, что позволяет быстро перемещаться по пространству данных. Иерархическая структура позволяет алгоритму поиска сузить круг соседей-кандидатов, что значительно ускоряет процесс поиска в высокоразмерных пространствах.
Дополнительную информацию см. на сайте HNSW.
PQ
PQ - это техника сжатия векторов, которая разбивает высокоразмерные векторы на более мелкие подвекторы, которые затем квантуются и сжимаются. Сжатие значительно снижает требования к памяти и ускоряет вычисления расстояний.
Дополнительную информацию см. в разделе IVF_PQ.
HNSW + PQ
HNSW_PQ объединяет сильные стороны HNSW и PQ для эффективного приближенного поиска ближайших соседей. Алгоритм использует PQ для сжатия данных (что уменьшает расход памяти), а затем строит граф HNSW на этих сжатых векторах, чтобы обеспечить быстрый поиск кандидатов. В процессе поиска алгоритм может уточнять результаты поиска, используя более точные данные для повышения точности. Вот как работает этот процесс:
Сжатие данных: PQ разбивает каждый вектор на несколько подвекторов и квантует их с помощью кодовой книги центроидов, управляемой такими параметрами, как
m(количество подвекторов) иnbits(биты на подвектор).Построение графа: Сжатые векторы затем используются для построения графа HNSW. Поскольку векторы хранятся в сжатом виде, результирующий граф обычно меньше, требует меньше памяти и может быть пройден быстрее, что значительно ускоряет этап поиска кандидатов.
Поиск кандидатов: При выполнении запроса алгоритм использует сжатые данные в графе HNSW для эффективного определения пула соседей-кандидатов. Такой поиск на основе графа значительно сокращает количество векторов, которые необходимо учитывать, что улучшает задержку запроса по сравнению с поиском методом "грубой силы".
(Необязательно) Уточнение результатов: Первоначальные результаты поиска кандидатов могут быть уточнены для повышения точности на основе следующих параметров:
refine: Управляет тем, активирован ли этот шаг уточнения. Если установлено значениеtrue, система пересчитывает расстояния, используя более точные или несжатые представления.refine_type: Определяет уровень точности данных, используемых при уточнении (например, SQ6, SQ8, BF16). Выбор более высокой точности, напримерFP32, может дать более точные результаты, но требует больше памяти. Эта точность должна превышать точность исходного набора сжатых данных наsq_type.refine_k: Действует как коэффициент увеличения. Например, если ваш топ k равен 100, аrefine_k- 2, система переранжирует 200 лучших кандидатов и возвращает 100 лучших, повышая общую точность.
Полный список параметров и допустимых значений см. в разделе Index params.
Построение индекса
Чтобы построить индекс HNSW_PQ по векторному полю в Milvus, используйте метод add_index(), указав index_type, metric_type и дополнительные параметры для индекса.
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="HNSW_PQ", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"M": 30, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 360, # Number of candidate neighbors considered for connection during index construction
"m": 384,
"nbits": 8,
"refine": true, # Whether to enable the refinement step
"refine_type": "SQ8" # Precision level of data used for refinement
} # Index building params
)
В данной конфигурации:
index_type: Тип индекса, который будет построен. В этом примере задайте значениеHNSW_PQ.metric_type: Метод, используемый для вычисления расстояния между векторами. Поддерживаются следующие значения:COSINE,L2иIP. Подробнее см. в разделе Типы метрик.params: Дополнительные параметры конфигурации для построения индекса. Подробнее см. в разделе Параметры построения индекса.
После настройки параметров индекса вы можете создать индекс, используя метод create_index() напрямую или передавая параметры индекса в метод create_collection. Подробнее см. в разделе Создание коллекции.
Поиск по индексу
После того как индекс создан и сущности вставлены, можно выполнять поиск по сходству в индексе.
search_params = {
"params": {
"ef": 10, # Parameter controlling query time/accuracy trade-off
"refine_k": 1 # The magnification factor
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)
В этой конфигурации:
params: Дополнительные параметры конфигурации для поиска по индексу. Подробнее см. в разделе Параметры поиска по индексу.
Параметры индекса
В этом разделе представлен обзор параметров, используемых для построения индекса и выполнения поиска по индексу.
Параметры построения индекса
В следующей таблице перечислены параметры, которые можно настроить в params при построении индекса.
Параметр |
Описание |
Диапазон значений |
Предложение по настройке |
|
|---|---|---|---|---|
HNSW |
|
Максимальное количество связей (или ребер), которое может иметь каждый узел в графе, включая исходящие и входящие ребра. Этот параметр напрямую влияет как на построение индекса, так и на поиск. |
Тип: Integer Диапазон: [2, 2048] Значение по умолчанию: |
Большее значение Уменьшайте В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [5, 100]. |
|
Количество соседей-кандидатов, рассматриваемых для соединения при построении индекса. Для каждого нового элемента оценивается больший пул кандидатов, но максимальное количество фактически установленных соединений по-прежнему ограничено |
Тип: Integer Диапазон: [1, int_max]. Значение по умолчанию: |
Более высокое значение Уменьшите В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [50, 500]. |
|
PQ |
|
Количество подвекторов (используемых для квантования), на которые нужно разделить каждый высокоразмерный вектор в процессе квантования. |
Тип: Целое число Диапазон: [1, 65536] Значение по умолчанию: Нет |
Большее значение В большинстве случаев мы рекомендуем задавать значение в этом диапазоне: [D/8, D]. |
|
Количество битов, используемых для представления индекса центроида каждого субвектора в сжатом виде. Оно напрямую определяет размер каждой кодовой книги. Каждая кодовая книга будет содержать 2nbits центроидов. Например, если значение |
Тип: Целое число Диапазон: [1, 24] Значение по умолчанию: |
Большее значение |
|
|
Булевский флаг, определяющий, будет ли применяться шаг уточнения при поиске. Уточнение заключается в повторном ранжировании исходных результатов путем вычисления точных расстояний между вектором запроса и кандидатами. |
Тип: Boolean Диапазон: [ Значение по умолчанию: |
Установите значение |
|
|
Определяет точность данных, используемых в процессе уточнения. Эта точность должна быть выше, чем точность сжатых векторов (заданная параметрами |
Тип: String Диапазон:[ Значение по умолчанию: None |
Используйте |
Параметры поиска, специфичные для индекса
В следующей таблице перечислены параметры, которые могут быть настроены в search_params.params при поиске по индексу.
Параметр |
Описание |
Диапазон значений |
Предложение по настройке |
|
|---|---|---|---|---|
HNSW |
|
Управляет широтой поиска при поиске ближайших соседей. Он определяет, сколько вершин будет посещено и оценено как потенциальные ближайшие соседи. Этот параметр влияет только на процесс поиска и применяется исключительно к нижнему слою графа. |
Тип: Integer Диапазон: [1, int_max]. Значение по умолчанию: limit (TopK ближайших соседей для возврата). |
Большее значение Рассмотрите возможность уменьшения В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [K, 10K]. |
PQ |
|
Коэффициент увеличения, который контролирует, сколько дополнительных кандидатов будет рассмотрено на этапе уточнения (реранжирования) по отношению к запрашиваемому топ K результатов. |
Тип: Float Диапазон: [1, float_max]. Значение по умолчанию: 1 |
Более высокие значения |