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


Проектирование индекса для агентного извлечения в Azure AI Search

Замечание

Эта функция сейчас доступна в общедоступной предварительной версии. Этот предварительный просмотр предоставляется без соглашения об уровне обслуживания и не предназначается для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Для получения дополнительной информации см. Дополнительные условия использования для предварительных версий Microsoft Azure.

В службе Azure AI Search агентивное извлечение — это новая архитектура параллельных запросов, использующая модель завершения чата для планирования запросов и создания подзапросов, которые расширяют область поиска и увеличивают релевантность.

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

Сводные данные: индекс поиска, указанный в targetIndexesопределении агента , должен иметь следующие элементы:

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

При необходимости следующие элементы индекса повышают возможности оптимизации:

  • scoringProfile с defaultScoringProfile, для повышения релевантности
  • synonymMaps для терминологии или жаргона
  • analyzers для правил или шаблонов лингвистики (например, сохранения пробелов или специальных символов)

Пример определения индекса

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

{
  "name": "earth_at_night",
  "fields": [
    {
      "name": "id", "type": "Edm.String",
      "searchable": true, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "key": true,
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "page_chunk", "type": "Edm.String",
      "searchable": true, "retrievable": true, "filterable": false, "sortable": false, "facetable": false,
      "analyzer": "en.microsoft",
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "page_chunk_text_3_large", "type": "Collection(Edm.Single)",
      "searchable": true, "retrievable": false, "filterable": false, "sortable": false, "facetable": false,
      "dimensions": 3072,
      "vectorSearchProfile": "hnsw_text_3_large",
      "stored": false,
      "synonymMaps": []
    },
    {
      "name": "page_number", "type": "Edm.Int32",
      "searchable": false, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "chapter_number", "type": "Edm.Int32",
      "searchable": false, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "stored": true,
      "synonymMaps": []
    }
  ],
  "scoringProfiles": [],
  "suggesters": [],
  "analyzers": [],
  "normalizers": [],
  "tokenizers": [],
  "tokenFilters": [],
  "charFilters": [],
  "similarity": {
    "@odata.type": "#Microsoft.Azure.Search.BM25Similarity"
  },
  "semantic": {
    "defaultConfiguration": "semantic_config",
    "configurations": [
      {
        "name": "semantic_config",
        "flightingOptIn": false,
        "prioritizedFields": {
          "prioritizedContentFields": [
            {
              "fieldName": "page_chunk"
            }
          ],
          "prioritizedKeywordsFields": []
        }
      }
    ]
  },
  "vectorSearch": {
    "algorithms": [
      {
        "name": "alg",
        "kind": "hnsw",
        "hnswParameters": {
          "metric": "cosine",
          "m": 4,
          "efConstruction": 400,
          "efSearch": 500
        }
      }
    ],
    "profiles": [
      {
        "name": "hnsw_text_3_large",
        "algorithm": "alg",
        "vectorizer": "azure_openai_text_3_large"
      }
    ],
    "vectorizers": [
      {
        "name": "azure_openai_text_3_large",
        "kind": "azureOpenAI",
        "azureOpenAIParameters": {
          "resourceUri": "https://YOUR-AOAI-RESOURCE.openai.azure.com",
          "deploymentId": "text-embedding-3-large",
          "apiKey": "<redacted>",
          "modelName": "text-embedding-3-large"
        }
      }
    ],
    "compressions": []
  }
}

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

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

Этот индекс включает векторное поле, используемое во время запроса. Вам не нужен вектор в результатах, так как он не является читаемым ни для человека, ни для модели машинного обучения, но он должен быть searchable. Так как в ответе не нужны векторы, оба retrievable и stored являются ложными.

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

Все searchable поля включены в процесс запроса. Нет поддержки инструкции select , которая явно указывает, какие поля запрашивать.

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

Индекс должен иметь по крайней мере одну семантику. Семантическая конфигурация должна иметь следующее:

  • Набор defaultSemanticConfiguration для заданной именованной конфигурации.
  • Установите prioritizedContentFields как минимум для одного строкового поля, которое является и searchable, и retrievable.

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

Пример семантической конфигурации, которая работает для агентивного извлечения:

"semantic":{
   "defaultConfiguration":"semantic_config",
   "configurations":[
      {
         "name":"semantic_config",
         "flightingOptIn":false,
         "prioritizedFields":{
            "prioritizedFields":{
               "titleField":{
                  "fieldName":""
               },
               "prioritizedContentFields":[
                  {
                     "fieldName":"page_chunk"
                  }
               ],
               "prioritizedKeywordsFields":[
                  {
                     "fieldName":"Category"
                  },
                  {
                     "fieldName":"Tags"
                  },
                  {
                     "fieldName":"Location"
                  }
               ]
            }
         }
      }
   ]
}

Замечание

Ответ предоставляет title, terms и content, которые сопоставляют приоритетные поля в этой конфигурации.

Добавление векторизатора

Если у вас есть векторные поля в индексе, план запроса включает их, если они searchable, и имеют назначение vectorizer.

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

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

  {
    "name": "page_chunk_text_3_large", "type": "Collection(Edm.Single)",
    "searchable": true, "retrievable": false, "filterable": false, "sortable": false, "facetable": false,
    "dimensions": 3072,
    "vectorSearchProfile": "hnsw_text_3_large",
    "stored": false,
    "synonymMaps": []
  }

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

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

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

"vectorSearch": {
  "algorithms": [
    {
      "name": "alg",
      "kind": "hnsw",
      "hnswParameters": {
        "metric": "cosine",
        "m": 4,
        "efConstruction": 400,
        "efSearch": 500
      }
    }
  ],
  "profiles": [
    {
      "name": "hnsw_text_3_large",
      "algorithm": "alg",
      "vectorizer": "azure_openai_text_3_large"
    }
  ],
  "vectorizers": [
    {
      "name": "azure_openai_text_3_large",
      "kind": "azureOpenAI",
      "azureOpenAIParameters": {
        "resourceUri": "https://YOUR-AOAI-RESOURCE.openai.azure.com",
        "deploymentId": "text-embedding-3-large",
        "apiKey": "<redacted>",
        "modelName": "text-embedding-3-large"
      }
    }
  ],
  "compressions": []
}  

Добавьте профиль оценки

Профили оценивания — это критерии повышения релевантности. Они применяются к невекторным полям (тексту и числам) и оцениваются во время выполнения запроса, хотя точное поведение зависит от версии API, используемой для создания индекса.

Если вы создаете индекс с помощью 2025-05-01-preview, оценочный профиль выполняется последним. Если индекс создан с использованием более ранней версии API, профили оценки анализируются перед семантическим перераспределением.

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

"scoringProfiles": [  
    {  
      "name": "boostSearchTerms",  
      "text": {  
        "weights": {  
          "Location": 2,  
          "Category": 5 
        }  
      }  
    }
]

Добавление анализаторов

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

Анализаторы определяются в индексе поиска и назначаются полям. Пример коллекции полей содержит ссылку анализатора на фрагменты текста. В этом примере анализатор по умолчанию (стандартный Lucene) заменяется анализатором языка Майкрософт.

{
  "name": "page_chunk", "type": "Edm.String",
  "searchable": true, "retrievable": true, "filterable": false, "sortable": false, "facetable": false,
  "analyzer": "en.microsoft",
  "stored": true,
  "synonymMaps": []
}

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

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

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

{
    "name":"locations",
    "type":"Edm.String",
    "searchable":true,
    "synonymMaps":[ "country-synonyms" ]
}