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


Сжатие векторов с помощью скалярной или двоичной квантизации

Поиск ИИ Azure поддерживает скалярную и двоичную квантизацию для уменьшения размера векторов в индексе поиска. Квантизация рекомендуется уменьшить размер вектора, так как она снижает потребление памяти и дискового хранилища для внедрения float16 и float32. Чтобы смещать эффекты сжатия потери, можно добавить перераспределение и переопределение над несжатыми векторами.

Чтобы использовать встроенную квантизацию, выполните следующие действия.

  • Начните с полей вектора vectorSearch и конфигурации в индекс
  • Добавить vectorSearch.compressions
  • scalarQuantization Добавление или binaryQuantization настройка и присвоение ему имени
  • Задайте необязательные свойства для устранения последствий индексирования потери
  • Создание нового профиля вектора, использующего именованную конфигурацию
  • Создание поля вектора с новым профилем вектора
  • Загрузите индекс с данными float32 или float16, которые квантизованы во время индексирования с заданной конфигурацией
  • При необходимости запросите квантизованные данные с помощью параметра oversampling, если требуется переопределить значение по умолчанию.

Необходимые компоненты

  • Векторные поля в индексе поиска с конфигурацией, vectorSearch используя алгоритмы иерархических навигационных небольших миров (HNSW) или исчерпывающие алгоритмы K-ближайшего соседа (eKNN) и новый профиль вектора.

Поддерживаемые методы квантизации

Квантизация применяется к полям векторов, получающих векторы с плавающей запятой. В примерах в этой статье тип данных поля предназначен Collection(Edm.Single) для входящих внедрения float32, но float16 также поддерживается. При получении векторов в поле с настроенным сжатием подсистема автоматически выполняет квантизацию, чтобы уменьшить объем векторных данных в памяти и на диске.

Поддерживаются два типа квантизации:

  • Скалярная квантизация сжимает значения с плавающей запятой в более узкие типы данных. Поиск ИИ в настоящее время поддерживает int8, который составляет 8 битов, уменьшая размер векторного индекса четыре раза.

  • Двоичная квантизация преобразует с плавающей запятой в двоичные биты, которая занимает 1 бит. Это приводит к сокращению размера индекса вектора до 28 раз.

Добавление "сжатия" в индекс поиска

В следующем примере показано частичное определение индекса с коллекцией полей, включающей векторное поле и vectorSearch.compressions раздел.

Он включает оба scalarQuantization или binaryQuantization. Можно указать столько конфигураций сжатия, сколько вам нужно, а затем назначить нужные векторным профилям.

Синтаксис для vectorSearch.Compressions параметров зависит от стабильных и предварительных версий REST API, при этом предварительный просмотр добавляет новые параметры оптимизации хранилища, а также изменения существующего синтаксиса. Обратная совместимость сохраняется с помощью внутренних сопоставлений API, но следует применить новый синтаксис в коде, который предназначен для версии 2024-11-01-preview и будущих версий.

Используйте REST API создания индекса или обновления индекса для настройки параметров сжатия.

POST https://[servicename].search.windows.net/indexes?api-version=2024-07-01

{
  "name": "my-index",
  "fields": [
    { "name": "Id", "type": "Edm.String", "key": true, "retrievable": true, "searchable": true, "filterable": true },
    { "name": "content", "type": "Edm.String", "retrievable": true, "searchable": true },
    { "name": "vectorContent", "type": "Collection(Edm.Single)", "retrievable": false, "searchable": true, "dimensions": 1536,"vectorSearchProfile": "vector-profile-1"},
  ],
  "vectorSearch": {
        "profiles": [ ],
        "algorithms": [ ],
        "compressions": [
          {
            "name": "use-scalar",
            "kind": "scalarQuantization",
            "scalarQuantizationParameters": {
              "quantizedDataType": "int8"
            },
            "rerankWithOriginalVectors": true,
            "defaultOversampling": 10
          },
          {
            "name": "use-binary",
            "kind": "binaryQuantization",
            "rerankWithOriginalVectors": true,
            "defaultOversampling": 10
          }
        ]
    }
}

Основные моменты:

  • kind должен иметь scalarQuantization значение или binaryQuantization.

  • rerankWithOriginalVectors использует исходные несжатые векторы для пересчета сходства и повторного вычисления лучших результатов, возвращаемых первоначальным поисковым запросом. Несжатые векторы существуют в индексе поиска, даже если stored значение false. Это необязательное свойство. Значение по умолчанию — "истина".

  • defaultOversampling рассматривает более широкий набор потенциальных результатов для смещения сокращения информации от квантизации. Формула для потенциальных результатов состоит из k запроса с чрезмерным умножением. Например, если запрос указывает k значение 5, а превышение составляет 20, запрос фактически запрашивает 100 документов для повторного использования, используя исходный несжатый вектор для этой цели. Возвращаются только самые лучшие k результаты. Это необязательное свойство. Значение по умолчанию — 4.

  • quantizedDataType является необязательным и применяется только к скалярной квантизации. Если вы добавите его, его необходимо задать в значение int8. Это единственный примитивный тип данных, поддерживаемый для скалярной квантизации в настоящее время. По умолчанию — int8.

Добавление алгоритма поиска векторов

Алгоритм HNSW или исчерпывающий KNN можно использовать в REST API 2024-11-01-preview. Для стабильной версии используйте только HNSW.

"vectorSearch": {
    "profiles": [ ],
    "algorithms": [
      {
          "name": "use-hnsw",
          "kind": "hnsw",
          "hnswParameters": {
              "m": 4,
              "efConstruction": 400,
              "efSearch": 500,
              "metric": "cosine"
          }
      }
    ],
     "compressions": [ <see previous section>] 
}

Создание и назначение нового профиля вектора

Чтобы использовать новую конфигурацию квантизации, необходимо создать новый профиль вектора. Создание нового профиля вектора необходимо для создания сжатых индексов в памяти. Новый профиль использует HNSW.

  1. В том же определении индекса создайте новый профиль вектора и добавьте свойство сжатия и алгоритм. Ниже приведены два профиля, по одному для каждого подхода квантизации.

    "vectorSearch": {
        "profiles": [
           {
              "name": "vector-profile-hnsw-scalar",
              "compression": "use-scalar", 
              "algorithm": "use-hnsw",
              "vectorizer": null
           },
           {
              "name": "vector-profile-hnsw-binary",
              "compression": "use-binary", 
              "algorithm": "use-hnsw",
              "vectorizer": null
           }
         ],
         "algorithms": [  <see previous section> ],
         "compressions": [ <see previous section> ] 
    }
    
  2. Назначьте профиль вектора новому полю вектора. Тип данных поля — float32 или float16.

    В службе "Поиск ИИ Azure" эквиваленты модели данных сущностей (EDM) типов float32 и float16, Collection(Edm.Single) Collection(Edm.Half)соответственно.

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. Загрузите индекс с помощью индексаторов для индексирования модели извлечения или API-интерфейсов для индексации модели принудительной отправки.

Скалярная квантизация уменьшает разрешение каждого числа в каждом векторном внедрении. Вместо описания каждого числа в виде 16-разрядного или 32-разрядного числа с плавающей запятой используется 8-разрядное целое число. Он определяет диапазон чисел (обычно 99-й процентиль минимального и максимального) и делит их на конечное число уровней или ячейки, присваивая каждому ячейке идентификатор. В 8-разрядной скалярной квантизации существует 2^8 или 256, возможные ячейки.

Каждый компонент вектора сопоставляется с ближайшим репрезентативным значением в этом наборе уровней квантизации в процессе с округлением реального числа до ближайшего целого числа. В квантизованном 8-разрядном векторе номер идентификатора стоит вместо исходного значения. После квантизации каждый вектор представлен массивом идентификаторов для ячеек, к которым принадлежат его компоненты. Эти квантизованные векторы требуют гораздо меньше битов для хранения по сравнению с исходным вектором, что снижает требования к хранилищу и объем памяти.

Двоичная квантизация сжимает высокомерные векторы путем представления каждого компонента в виде одного бита либо 0, либо 1. Этот метод резко сокращает объем памяти и ускоряет операции сравнения векторов, которые являются важными для задач поиска и извлечения. Тесты теста теста показывают до 96 % уменьшения размера векторного индекса.

Это особенно эффективно для внедрения с измерениями больше 1024. Для небольших измерений рекомендуется протестировать качество двоичной квантизации или попробовать скалярную. Кроме того, мы обнаружили, что BQ работает очень хорошо, когда внедрение сосредоточено около нуля. Большинство популярных моделей внедрения, таких как OpenAI, Cohere и Mistral, сосредоточены около нуля.

Запрос к квантизованному полю вектора с помощью переполнения

Синтаксис запроса для сжатого или квантизованного векторного поля совпадает с некомжатыми полями векторов, если только не требуется переопределять параметры, связанные с перераспределением или переопределением с исходными векторами.

Помните, что определение сжатия векторов в индексе имеет параметры rerankWithOriginalVectors и defaultOversampling для устранения последствий сжатия потери. Значения по умолчанию можно переопределить, чтобы изменить поведение во время запроса. Например, если defaultOversampling значение равно 10.0, его можно изменить на что-то другое в запросе запроса.

Параметр oversampling можно задать, даже если индекс не имеет явного rerankWithOriginalVectors значения или defaultOversampling определения. Предоставление oversampling во время запроса переопределяет параметры индекса для этого запроса и выполняет запрос с эффективным значением rerankWithOriginalVectors true.

POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2024-07-01

{    
    "vectorQueries": [
        {    
            "kind": "vector",    
            "vector": [8, 2, 3, 4, 3, 5, 2, 1],    
            "fields": "myvector",
            "oversampling": 12.0,
            "k": 5   
        }
  ]    
}

Основные моменты:

  • Применяется к полям векторов, которые проходят сжатие векторов на назначение профиля вектора.

  • Переопределяет defaultOversampling значение или вводит превышение значения во время запроса, даже если конфигурация сжатия индекса не указала параметры чрезмерного использования или повторного использования.