Поделиться через


Квантизация продуктов для поиска векторов в Azure Cosmos DB для виртуальных ядер MongoDB

Квантизация продуктов (PQ) — это мощный метод в Azure Cosmos DB для виртуального ядра MongoDB, который значительно сжимает высокомерные векторные внедрения, используемые в векторном поиске. Это сжатие сокращает использование памяти и ускоряет поиск ближайших соседей, повышая эффективность больших векторных наборов данных. Хотя PQ предлагает преимущества для скорости и масштабирования, это может оказаться за счет точности.

Преимущества

  • Сокращенное хранилище: PQ значительно снижает объем хранилища, необходимого для векторных индексов, по сравнению с векторами с полной точностью (float32), что приводит к значительной экономии затрат для больших наборов данных.
  • Быстрый поиск: Работа с сжатыми векторами позволяет системе вычислять расстояния и находить потенциальные ближайшие соседи гораздо быстрее, чем с векторами полной точности.
  • Улучшенная масштабируемость: Более низкие затраты на память позволяют масштабировать векторный поиск для обработки больших и более высоких размеров внедрения в кластер.

Принцип работы

Квантизация продукта разделяет пространство высокомерных векторов на несколько нижнемерных подпространств. Затем каждое подпространство квантуется независимо с помощью алгоритма кластеризации (обычно алгоритм k-средних). Центр каждого кластера представляет все векторы внутри него. Затем каждый исходный вектор представлен коротким кодом идентификаторов кластера, к которому он принадлежит в каждом подпространстве.

Использование квантизации продуктов

Чтобы создать векторный индекс с квантацией продукта, используйте createIndexes команду с указанием cosmosSearchOptions"compression": "pq" и "kind" : "vector-diskann":

{
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "similarity": "<string_value>", // "COS", "L2"
                "dimensions": <integer_value>, // Max 16,000
                "compression": "pq",
                "pqCompressedDims": <integer_value>, // Dimensions after compression (< original)
                "pqSampleSize": <integer_value>    // Samples for centroid generation
            }
        }
    ]
}
Поле Тип Описание
compression струна Установите "pq", чтобы включить квантизацию продукта.
pqCompressedDims целое число Измерения после сжатия PQ (должны быть меньше исходных измерений). Автоматически вычисляется, если пропущен. Диапазон: 1–8000.
pqSampleSize целое число Количество примеров векторов для обучения центроидов PQ. Более высокое значение означает лучшее качество, но более длительное время сборки. По умолчанию: 1000. Диапазон: 1000–100000.

Замечание

В настоящее время квантизация продуктов поддерживается только с типом vector-diskann индекса.

Замечание

Для получения наилучших результатов создайте индекс PQ после получения данных. Если коллекция пуста, система использует случайные векторы для начальных центроидов. Если количество документов меньше pqSampleSize, обучающие данные заполняются случайными данными в диапазоне существующих векторных данных.

Настройка сжатых измерений

Если не указать pqCompressedDims, он автоматически определяется на основе исходного вектора dimensions:

Исходный диапазон измерений pqCompressedDims
[0 - 32) размеры / 2
[32 - 64) 16
[64 - 128) 32
[128 - 512) 64
[512 - 1536) 96
выше 1536 128

Создание индекса PQ

db.runCommand(
{
    "createIndexes": "your_vector_collection",
    "indexes": [
        {
            "key": { "v": "cosmosSearch" },
            "name": "diskann_pq_index",
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "similarity": "COS",
                "dimensions": 1536,
                "compression": "pq",
                "pqCompressedDims": 96,
                "pqSampleSize": 2000
            }
        }
    ]
} )

Улучшение поиска с помощью пересэмплинга

Сжатие PQ может привести к потере точности в вычислениях расстояния. Чтобы уменьшить это, Azure Cosmos DB для MongoDB (vCore) предлагает oversampling параметр в операторе $search .

Коэффициент oversampling (число с плавающей запятой, минимум 1) указывает, на сколько больше векторов кандидатов следует извлекать из сжатого индекса, чем k (число требуемых результатов). Эти дополнительные кандидаты используются для уточнения поиска с помощью исходных векторов полной точности, повышая окончательную верхнюю k точность. Например, чтобы получить первые 10 (k=10) наиболее похожих векторов, рекомендуется задать oversampling значение, например 1.5 или 2.0. При этом "oversampling": 1.5 система сначала получит 15 кандидатов из индекса, а затем уточнит топ-10 с помощью данных полной точности.

{
    "$search": {
        "cosmosSearch": {
            "vector": <vector_to_search>,
            "path": "<path_to_property>",
            "k": <num_results_to_return>,
            "oversampling": <float_value> 
        },
    }
}

Этот фрагмент кода демонстрирует векторный поиск с помощью $search оператора с квантацией продукта. Он получает queryVector в качестве входных данных и выполняет поиск по полю v. Запрос запрашивает 10 наиболее похожих документов (k: 10), с коэффициентом oversampling 2.0, что позволяет получить 20 кандидатов, улучшая точность поиска по отношению к сжатому индексу.

db.your_vector_collection.aggregate([
    {
        $search: {
            "cosmosSearch": {
                "vector": [0.1, 0.5, 0.9, ...],
                "path": "v",
                "k": 10,
                "oversampling": 2.0 // Retrieve 2 * 10 = 20 candidates for reranking
            },
            "returnStoredSource": true
        }
    }
])

Half-Precision и квантизация продуктов

И полупрецизионное сжатие, и квантование продукта (PQ) сжимают индексы векторов в Azure Cosmos DB для MongoDB (vCore), но они различаются по способу достижения сжатия и влиянию на поиск.

Функция Half-Precision Квантизация продуктов (PQ)
Метод сжатия Уменьшает каждое векторное измерение до 16 бит. Делит пространство векторов на подпространства и квантуизирует каждый.
Максимальное количество измерений До 4000 До 16 000
Изменение точности Небольшая потеря из-за нижней глубины бита. Потенциально больший убыток, настраиваемый с помощью pqCompressedDims.
Скорость поиска Умеренное увеличение скорости из-за меньшего индекса. Значительное увеличение скорости из-за сильно сжатых векторов.
Время сборки индекса Относительно быстро. Может быть длиннее из-за центроидного обучения (pqSampleSize).
Поддержка индекса HNSW, IVF. DiskANN.
Конфигурация Просто включите compression: "half". Дополнительные параметры: pqCompressedDims, pqSampleSize.
Использование передискретизации Помогает избежать незначительных потерь в точности. Важно для восстановления точности после значительного сжатия.
Идеальные варианты использования Умеренное сокращение памяти, увеличенные размеры, допустимый компромисс в точности. Большие наборы данных, высокая размерность, быстрый поиск с приоритетом, точность, управляемая с использованием избыточной выборки.

Рекомендации по квантизации продуктов

  • Точность и сжатие: Более высокое сжатие PQ приводит к уменьшению индексов и более быстрому поиску, но вызывает потерю точности. Поэкспериментируйте с помощью pqCompressedDims и oversampling, чтобы найти правильный баланс.
  • Время сборки индекса: Создание индекса PQ может занять больше времени из-за процесса обучения центроидов, на который влияет pqSampleSize.
  • Распределение данных: PQ лучше всего работает, если векторные данные имеют четкую структуру кластера.

Дальнейшие шаги