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


Создание векторного индекса

В службе "Поиск ИИ Azure" векторное хранилище содержит схему индекса, которая определяет поля векторов и невекторов, векторную конфигурацию алгоритмов, которые создают и сжимают пространство внедрения, а также параметры определений векторных полей, используемых в запросах.

API создания или обновления индекса создает векторное хранилище. Выполните следующие действия, чтобы индексировать векторные данные:

В этой статье объясняется рабочий процесс и используется REST для иллюстрации. После понимания базового рабочего процесса перейдите к примерам кода пакета SDK Azure в репозитории azure-search-vector-samples для использования этих функций в тестовом и рабочем коде.

Совет

Используйте портал Azure для создания векторного индекса и попробуйте интегрировать блоки и векторизацию данных.

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

  • Поиск ИИ Azure в любом регионе и на любом уровне. Большинство существующих служб поддерживают векторный поиск. Для служб, созданных до января 2019 года, существует небольшое подмножество, которое не может создать векторный индекс. В этой ситуации необходимо создать новую службу. Если вы используете встроенную векторизацию (наборы навыков, которые называют Azure AI), поиск Azure AI должен находиться в том же регионе, что и службы Azure OpenAI или Azure AI.

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

  • Необходимо знать предел измерений модели, используемой для создания внедрения. Допустимые значения : 2–3072 измерения. В Azure OpenAI для преобразования текста в ada-002 длина числового вектора составляет 1536. Для векторной длины 3-small или text-embedding-3-large длина вектора составляет 3072.

  • Кроме того, следует знать, какие метрики сходства поддерживаются. Для Azure OpenAI сходство вычисляется с помощью cosine.

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

Подготовка документов к индексации

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

Убедитесь, что документы:

  1. Укажите поле или свойство метаданных, которое однозначно идентифицирует каждый документ. Для всех индексов поиска требуется ключ документа. Чтобы удовлетворить требования к ключу документа, исходный документ должен иметь одно поле или свойство, которое может однозначно идентифицировать его в индексе. Это исходное поле должно быть сопоставлено с полем индекса типа Edm.String и key=true в индексе поиска.

  2. Укажите векторные данные (массив чисел с плавающей запятой с одной точностью) в исходных полях.

    Векторные поля содержат массив, созданный путем внедрения моделей, по одному внедрению для каждого поля, где поле является полем верхнего уровня (не частью вложенного или сложного типа). Для простейшей интеграции рекомендуется внедрить модели в Azure OpenAI, такие как text-embedding-ada-002 для текстовых документов или REST API извлечения изображений для изображений.

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

  3. Предоставьте другие поля с буквенно-цифровым содержимым для ответа запроса, а также для сценариев гибридного запроса, которые включают полный текстовый поиск или семантический ранжирование в том же запросе.

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

Краткий пример полезных данных документов, включающих векторные и невекторные поля, находится в разделе данных вектора нагрузки этой статьи.

Добавление конфигурации векторного поиска

Конфигурация вектора задает параметры, используемые во время индексирования для создания сведений о ближайших соседах между векторными узлами:

  • Иерархический навигации небольшой мир (HNSW)
  • Исчерпывающий KNN

Если вы выберете HNSW в поле, вы можете выбрать исчерпывающий KNN во время запроса. Но другое направление не работает: если выбрать исчерпывающий, вы не сможете позже запросить поиск HNSW, так как дополнительные структуры данных, обеспечивающие приблизительный поиск, не существуют.

Конфигурация вектора также задает методы квантизации для уменьшения размера вектора:

  • Scalar
  • Двоичный файл (доступен только в 2024-07-01 и более новых пакетах azure SDK)

Инструкции по переходу на последнюю версию см. в статье об обновлении REST API.

Общедоступна версия 2024-07-01 . Он поддерживает векторную конфигурацию:

  • vectorSearch.algorithms поддержка HNSW и исчерпывающих KNN.
  • vectorSearch.compressions поддерживает скалярную и двоичную квантизацию, переупачивание и повторную настройку с помощью исходных векторов.
  • vectorSearch.profiles предоставляет несколько сочетаний конфигураций алгоритма и сжатия.

Убедитесь, что у вас есть стратегия векторизации содержимого. Рекомендуется интегрировать векторизацию и векторизаторы времени запроса для встроенной кодировки.

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

  2. vectorSearch Добавьте раздел в индекс, указывающий алгоритмы поиска, используемые для создания пространства внедрения.

     "vectorSearch": {
         "compressions": [
             {
                 "name": "scalar-quantization",
                 "kind": "scalarQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
                     "scalarQuantizationParameters": {
                         "quantizedDataType": "int8"
                     }
             },
             {
                 "name": "binary-quantization",
                 "kind": "binaryQuantization",
                 "rerankWithOriginalVectors": true,
                 "defaultOversampling": 10.0,
             }
         ],
         "algorithms": [
             {
                 "name": "hnsw-1",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 4,
                     "efConstruction": 400,
                     "efSearch": 500,
                     "metric": "cosine"
                 }
             },
             {
                 "name": "hnsw-2",
                 "kind": "hnsw",
                 "hnswParameters": {
                     "m": 8,
                     "efConstruction": 800,
                     "efSearch": 800,
                     "metric": "hamming"
                 }
             },
             {
                 "name": "eknn",
                 "kind": "exhaustiveKnn",
                 "exhaustiveKnnParameters": {
                     "metric": "euclidean"
                 }
             }
    
         ],
         "profiles": [
           {
             "name": "vector-profile-hnsw-scalar",
             "compression": "scalar-quantization",
             "algorithm": "hnsw-1"
           }
         ]
     }
    

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

    • Имена для каждой конфигурации сжатия, алгоритма и профиля должны быть уникальными для его типа в индексе.

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

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

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

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

    • vectorSearch.algorithms.kind"hnsw" имеют значение или "exhaustiveKnn". Это алгоритмы приблизительных ближайших соседей (ANN), используемые для упорядочивания векторного содержимого во время индексирования.

    • vectorSearch.algorithms.m — это число двунаправленных ссылок. Значение по умолчанию — 4. Диапазон составляет от 4 до 10. Более низкие значения должны возвращать меньше шума в результатах.

    • vectorSearch.algorithms.efConstruction — это число ближайших соседей, используемых во время индексирования. Значение по умолчанию — 400. Диапазон составляет от 100 до 1000.

    • "vectorSearch.algorithms.fSearch — это число ближайших соседей, используемых во время поиска. Значение по умолчанию — 500. Диапазон составляет от 100 до 1000.

    • vectorSearch.algorithms.metric если вы используете Azure OpenAI, в противном случае используйте метрику сходства, связанную с используемой моделью внедрения. Поддерживаемые значения: cosine, euclideandotProducthamming (используется для индексирования двоичных данных).

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

Добавление векторного поля в коллекцию полей

Коллекция полей должна содержать поле для ключа документа, векторных полей и других полей, необходимых для гибридных сценариев поиска.

Поля векторов характеризуются их типом данных, свойством на основе модели внедрения, dimensions используемой для вывода векторов, и профиля вектора.

Общедоступна версия 2024-07-01 .

  1. Используйте индекс создания или обновления для создания индекса.

  2. Определите поле вектора со следующими атрибутами. Вы можете сохранить одно созданное внедрение на поле. Для каждого поля вектора:

    • typeдолжен быть векторным типом данных. Collection(Edm.Single) является наиболее распространенным для внедрения моделей.
    • dimensions — это количество измерений, созданных моделью внедрения. Для преобразования текста в ada-002 это значение 1536.
    • vectorSearchProfile — это имя профиля, определенного в другом месте индекса.
    • searchable должно быть true.
    • retrievable может иметь значение true или false. True возвращает необработанные векторы (1536 из них) в виде обычного текста и потребляет место в хранилище. Задайте значение true, если вы передаете результат вектора в нижнее приложение.
    • stored может иметь значение true или false. Он определяет, хранится ли дополнительная копия векторов для извлечения. Дополнительные сведения см. в разделе "Уменьшение размера вектора".
    • filterable, facetablesortable должен иметь значение false.
  3. Добавьте фильтруемые поля невектора в коллекцию, например "title" с filterable заданным значением true, если требуется вызвать префильтрацию или послефильтрацию в векторном запросе.

  4. Добавьте другие поля, определяющие вещество и структуру индексированного содержимого. Как минимум, вам нужен ключ документа.

    Кроме того, следует добавить поля, полезные в запросе или в ответе. В следующем примере показаны векторные поля для заголовка и содержимого ("titleVector", "contentVector"), которые эквивалентны векторам. Он также предоставляет поля для эквивалентного текстового содержимого ("title", "content") полезно для сортировки, фильтрации и чтения в результатах поиска.

    В следующем примере показана коллекция полей:

    PUT https://my-search-service.search.windows.net/indexes/my-index?api-version=2024-07-01&allowIndexDowntime=true
    Content-Type: application/json
    api-key: {{admin-api-key}}
    {
        "name": "{{index-name}}",
        "fields": [
            {
                "name": "id",
                "type": "Edm.String",
                "key": true,
                "filterable": true
            },
            {
                "name": "title",
                "type": "Edm.String",
                "searchable": true,
                "filterable": true,
                "sortable": true,
                "retrievable": true
            },
            {
                "name": "titleVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": true,
                "stored": true,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            },
            {
                "name": "content",
                "type": "Edm.String",
                "searchable": true,
                "retrievable": true
            },
            {
                "name": "contentVector",
                "type": "Collection(Edm.Single)",
                "searchable": true,
                "retrievable": false,
                "stored": false,
                "dimensions": 1536,
                "vectorSearchProfile": "vector-profile-1"
            }
        ],
        "vectorSearch": {
            "algorithms": [
                {
                    "name": "hnsw-1",
                    "kind": "hnsw",
                    "hnswParameters": {
                        "m": 4,
                        "efConstruction": 400,
                        "efSearch": 500,
                        "metric": "cosine"
                    }
                }
            ],
            "profiles": [
                {
                    "name": "vector-profile-1",
                    "algorithm": "hnsw-1"
                }
            ]
        }
    }
    

Загрузка векторных данных для индексирования

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

Для приема данных можно использовать методы принудительной отправки или извлечения.

Использование документов — индекс для загрузки векторных и невекторных данных в индекс. API push-уведомлений для индексирования идентичны во всех стабильных и предварительных версиях. Используйте любой из следующих API для загрузки документов:

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

{
    "value": [
        {
            "id": "1",
            "title": "Azure App Service",
            "content": "Azure App Service is a fully managed platform for building, deploying, and scaling web apps. You can host web apps, mobile app backends, and RESTful APIs. It supports a variety of programming languages and frameworks, such as .NET, Java, Node.js, Python, and PHP. The service offers built-in auto-scaling and load balancing capabilities. It also provides integration with other Azure services, such as Azure DevOps, GitHub, and Bitbucket.",
            "category": "Web",
            "titleVector": [
                -0.02250031754374504,
                 . . . 
                        ],
            "contentVector": [
                -0.024740582332015038,
                 . . .
            ],
            "@search.action": "upload"
        },
        {
            "id": "2",
            "title": "Azure Functions",
            "content": "Azure Functions is a serverless compute service that enables you to run code on-demand without having to manage infrastructure. It allows you to build and deploy event-driven applications that automatically scale with your workload. Functions support various languages, including C#, F#, Node.js, Python, and Java. It offers a variety of triggers and bindings to integrate with other Azure services and external services. You only pay for the compute time you consume.",
            "category": "Compute",
            "titleVector": [
                -0.020159931853413582,
                . . .
            ],
            "contentVector": [
                -0.02780858241021633,
                 . . .
            ],
            "@search.action": "upload"
        }
        . . .
    ]
}

Проверьте индекс для векторного содержимого

Для проверки можно запросить индекс с помощью обозревателя поиска в портал Azure или вызове REST API. Так как поиск по искусственному интеллекту Azure не может преобразовать вектор в удобочитаемый пользователем текст, попробуйте вернуть поля из того же документа, который предоставляет доказательства соответствия. Например, если векторный запрос предназначен для поля titleVector, можно выбрать "title" для результатов поиска.

Поля должны быть указаны как "извлекаемые" для включения в результаты.

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

  • Используйте обозреватель поиска для запроса индекса. Обозреватель поиска имеет два представления: представление запросов (по умолчанию) и представление JSON.

    • Задайте параметры>запроса Скрыть векторные значения в результатах поиска для получения более доступных для чтения результатов.

    • Используйте представление JSON для векторных запросов. Вы можете вставить определение JSON векторного запроса, который требуется выполнить, или использовать встроенное преобразование текста в вектор или изображения в вектор, если индекс имеет назначение векторизатора. Дополнительные сведения о поиске изображений см . в кратком руководстве. Поиск изображений в обозревателе поиска.

    • Используйте представление запроса по умолчанию для быстрого подтверждения того, что индекс содержит векторы. Представление запроса предназначено для полнотекстового поиска. Хотя его нельзя использовать для векторных запросов, можно отправить пустой поиск (search=*) для проверки содержимого. Содержимое всех полей, включая векторные поля, возвращается в виде обычного текста.

    • Дополнительные сведения см. в статье "Создание векторного запроса ".

Обновление хранилища векторов

Чтобы обновить векторное хранилище, измените схему и при необходимости перезагрузите документы, чтобы заполнить новые поля. API для обновлений схемы включают создание или обновление индекса (REST), CreateOrUpdateIndex в пакете SDK azure для .NET, create_or_update_index в пакете SDK Azure для Python и аналогичных методах в других пакетах SDK Azure.

Стандартное руководство по обновлению индекса рассматривается в разделе "Обновление" или перестроение индекса.

Ключевые моменты:

  • Удаление и перестроение часто требуется для обновлений и удаления существующих полей.

  • Однако можно обновить существующую схему со следующими изменениями без необходимости перестроения:

    • Добавление новых полей в коллекцию полей.
    • Добавьте новые конфигурации векторов, назначенные новым полям, но не существующим полям, которые уже векторизированы.
    • Измените значение "извлекаемое" (значения имеют значение true или false) в существующем поле. Поля векторов должны быть доступны для поиска и извлечения, но если вы хотите отключить доступ к полю вектора в ситуациях, когда удаление и перестроение невозможно, можно задать значение false.

Следующие шаги

На следующем шаге мы рекомендуем запрашивать векторные данные в индексе поиска.

Примеры кода в репозитории azure-search-vector демонстрируют сквозные рабочие процессы, включающие определение схемы, векторизацию, индексирование и запросы.

Существует демонстрационный код для Python, C# и JavaScript.