Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Примечание
Эта функция в настоящее время находится в публичном превью. Этот предварительный просмотр предоставляется без соглашения об уровне обслуживания и не предназначается для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или могут иметь ограниченные возможности. Для получения дополнительной информации см. Дополнительные условия использования для предварительных версий Microsoft Azure.
Стратегии разбиения текстовых данных играют ключевую роль в оптимизации ответов и производительности RAG. Используя новый навык Макета документа, который в настоящее время находится в предварительной версии, можно разбивать содержимое на основе структуры документа, фиксируя заголовки и фрагментируя текст на основе семантической согласованности, например на абзацы и предложения. Частичные блоки обрабатываются независимо. Поскольку LLM работают с несколькими сегментами, когда эти сегменты имеют более высокое качество и семантически согласованы, общая релевантность запроса улучшается.
Функция макета документа вызывает модель макета в Аналитике документов. Модель формирует структуру содержимого в формате JSON, используя синтаксис Markdown (заголовки и содержимое), с полями для заголовков и содержимого, хранящимися в поисковом индексе на Azure AI Search. Поисковый контент, полученный с помощью навыка «Макет документа», представлен в виде простого текста, но вы можете применить встроенную векторизацию для создания эмбеддингов для любого поля в ваших исходных документах, включая изображения.
В этой статье вы узнаете, как:
- Используйте навык разметки документа, чтобы распознать структуру документа.
- Используйте навык Text Split, чтобы ограничить размер фрагмента для каждого раздела в markdown.
- Генерировать встраивания для каждого фрагмента
- Используйте проекции индекса для сопоставления встраиваний с полями в поисковом индексе
В качестве примера в этой статье используются образцы PDF-документов медицинских планов, загруженные в Azure Blob Storage и затем индексированные с помощью мастера импорта и векторизации данных.
Предпосылки
Индексационная система, основанная на индекаторе, с индексом, который принимает результат. Индекс должен иметь поля для получения заголовков и содержимого.
An index projection для индексации один-ко-многим.
Поддерживаемый источник данных с текстовым содержимым, которое вы хотите разбить на части.
Набор навыков с этими двумя умениями:
Навык оформления документа, который разделяет документы по границам абзацев. Эта способность имеет региональные требования. Мультисервисный ресурс Azure AI должен находиться в том же регионе, что и Azure AI Search с обогащением ИИ.
Azure OpenAI Embedding skill, который генерирует векторные встраивания. Этот навык не имеет требований к регионам.
Подготовьте файлы данных
Исходные данные должны находиться в поддерживаемом источнике данных, а файл должен быть в формате, который поддерживает навык верстки документа.
Поддерживаемые форматы файлов: PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML.
Поддерживаемые индексы могут быть любым индексатором, который может обрабатывать поддерживаемые форматы файлов. Эти индексаторы включают индексаторы BLOB-объектов, индексаторы OneLake, индексаторы файлов.
Поддерживаемые регионы для портального интерфейса этой функции включают: Восточный регион США, Западная Европа, Северо-Центральный регион США. Если вы настраиваете набор навыков программным способом, вы можете использовать любой регион Аналитики документов, который также предоставляет функцию обогащения ИИ в Службе поиска ИИ Azure. Для получения дополнительной информации см. Доступность продукта по регионам.
Вы можете использовать портал Azure, REST API или пакет Azure SDK, чтобы создать источник данных.
Подсказка
Загрузите образцы файлов PDF плана медицинского обслуживания в ваш поддерживаемый источник данных, чтобы попробовать навык оформления документов и разбивку, осведомленную о структуре, в вашей собственной поисковой службе. Мастер импорта и векторизации данных — это простой подход без кода для проверки этого навыка. Убедитесь, что выбрали режим разбора по умолчанию для использования структурно-осведомленного разделения. В противном случае используется режим синтаксического анализа Markdown .
Создайте индекс для индексирования один ко многим
Вот пример полезной нагрузки одного поискового документа, разработанного на основе фрагментов. Когда вы работаете с фрагментами, вам нужно поле для фрагмента и поле родителя, которое позволяет определить происхождение фрагмента. В этом примере поля родителей представлены в виде text_parent_id. Дочерние поля — это векторные и невекторные блоки раздела Markdown.
Навык макета документов выводит заголовки и содержимое. В этом примере header_1
по header_3
хранятся заголовки документов, обнаруженные навыком. Другое содержимое, например абзацы, хранится в chunk
. Поле text_vector
представляет собой векторное представление содержимого поля блока.
Мастер импорта и векторизации данных можно использовать на портале Azure, REST API или пакете SDK Azure для создания индекса. Следующий индекс очень похож на то, что мастер создает по умолчанию. Вы могли бы получить больше полей, если добавите векторизацию изображений.
Если вы не используете мастер, индекс должен существовать в службе поиска до того, как вы создадите набор навыков или запустите индексатор.
{
"name": "my_consolidated_index",
"fields": [
{
"name": "chunk_id",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": true,
"facetable": false,
"key": true,
"analyzer": "keyword"
},
{
"name": "text_parent_id",
"type": "Edm.String",
"searchable": false,
"filterable": true,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "chunk",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "title",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_1",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_2",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_3",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "text_vector",
"type": "Collection(Edm.Single)",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false,
"dimensions": 1536,
"stored": false,
"vectorSearchProfile": "profile"
}
],
"vectorSearch": {
"profiles": [
{
"name": "profile",
"algorithm": "algorithm"
}
],
"algorithms": [
{
"name": "algorithm",
"kind": "hnsw"
}
]
}
}
Определение набора навыков для фрагментирования и векторизации с учетом структуры
Так как навык макета документов находится в предварительной версии, для этого шага необходимо использовать REST API create Skillset 2024-11-01-preview . Вы также можете использовать портал Azure.
Этот раздел демонстрирует пример определения набора навыков, который проецирует отдельные разделы markdown, фрагменты и их векторные эквиваленты в качестве полей в поисковом индексе. Он использует навык макета документов для обнаружения заголовков и заполнения поля контента на основе семантической последовательности абзацев и предложений в исходном документе. Он использует навык Text Split, чтобы разбить содержимое Markdown на части. Он использует навык создания векторных представлений Azure OpenAI для векторизации блоков и любого другого поля, для которого вы хотите создать векторные представления.
Помимо навыков, комплект навыков включает indexProjections
и cognitiveServices
:
indexProjections
используются для индексов, содержащих разделённые документы. Прогнозы определяют, как содержимое отношений родитель-потомок отображается на поля в поисковом индексе для индексации по принципу один-ко-многим. Дополнительные сведения см. в разделе "Определение проекции индекса".cognitiveServices
подключает мультисервисную учетную запись служб Azure AI для выставления счетов (навык макета документов доступен по стандартным ценам).
POST {endpoint}/skillsets?api-version=2024-11-01-preview
{
"name": "my_skillset",
"description": "A skillset for structure-aware chunking and vectorization with an index projection around markdown section",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Util.DocumentIntelligenceLayoutSkill",
"name": "my_document_intelligence_layout_skill",
"context": "/document",
"outputMode": "oneToMany",
"inputs": [
{
"name": "file_data",
"source": "/document/file_data"
}
],
"outputs": [
{
"name": "markdown_document",
"targetName": "markdownDocument"
}
],
"markdownHeaderDepth": "h3"
},
{
"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"name": "my_markdown_section_split_skill",
"description": "A skill that splits text into chunks",
"context": "/document/markdownDocument/*",
"inputs": [
{
"name": "text",
"source": "/document/markdownDocument/*/content",
"inputs": []
}
],
"outputs": [
{
"name": "textItems",
"targetName": "pages"
}
],
"defaultLanguageCode": "en",
"textSplitMode": "pages",
"maximumPageLength": 2000,
"pageOverlapLength": 500,
"unit": "characters"
},
{
"@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
"name": "my_azure_openai_embedding_skill",
"context": "/document/markdownDocument/*/pages/*",
"inputs": [
{
"name": "text",
"source": "/document/markdownDocument/*/pages/*",
"inputs": []
}
],
"outputs": [
{
"name": "embedding",
"targetName": "text_vector"
}
],
"resourceUri": "https://<subdomain>.openai.azure.com",
"deploymentId": "text-embedding-3-small",
"apiKey": "<Azure OpenAI api key>",
"modelName": "text-embedding-3-small"
}
],
"cognitiveServices": {
"@odata.type": "#Microsoft.Azure.Search.CognitiveServicesByKey",
"key": "<Cognitive Services api key>"
},
"indexProjections": {
"selectors": [
{
"targetIndexName": "my_consolidated_index",
"parentKeyFieldName": "text_parent_id",
"sourceContext": "/document/markdownDocument/*/pages/*",
"mappings": [
{
"name": "text_vector",
"source": "/document/markdownDocument/*/pages/*/text_vector"
},
{
"name": "chunk",
"source": "/document/markdownDocument/*/pages/*"
},
{
"name": "title",
"source": "/document/title"
},
{
"name": "header_1",
"source": "/document/markdownDocument/*/sections/h1"
},
{
"name": "header_2",
"source": "/document/markdownDocument/*/sections/h2"
},
{
"name": "header_3",
"source": "/document/markdownDocument/*/sections/h3"
}
]
}
],
"parameters": {
"projectionMode": "skipIndexingParentDocuments"
}
}
}
Настройте и запустите индексатор
После создания источника данных, индекса и набора навыков вы можете создать и запустить индексатор. Этот шаг запускает конвейер в исполнение.
При использовании умения Макета документа убедитесь, что вы устанавливаете следующие параметры в определении индексатора:
-
allowSkillsetToReadFileData
параметр должен быть установлен вtrue
. - Параметр
parsingMode
должен быть установлен наdefault
.
outputFieldMappings
не нужно настраивать в этом сценарии, поскольку indexProjections
обрабатывает ассоциации между исходным полем и полем поиска. Проекции индекса обрабатывают связи полей для навыка макета документов, а также регулярное фрагментирование с помощью навыка разделения для импортированных и векторизованных рабочих нагрузок данных. Соответствие выходных полей все еще необходимо для преобразований или сложных сопоставлений данных с использованием функций, которые применяются в других случаях. Однако проекции индекса изначально обрабатывают эту функциональность для n-частей на документ.
Ниже приведен пример запроса на создание индексатора.
POST {endpoint}/indexers?api-version=2024-11-01-preview
{
"name": "my_indexer",
"dataSourceName": "my_blob_datasource",
"targetIndexName": "my_consolidated_index",
"skillsetName": "my_skillset",
"parameters": {
"batchSize": 1,
"configuration": {
"dataToExtract": "contentAndMetadata",
"parsingMode": "default",
"allowSkillsetToReadFileData": true
}
},
"fieldMappings": [
{
"sourceFieldName": "metadata_storage_path",
"targetFieldName": "title"
}
],
"outputFieldMappings": []
}
Когда вы отправляете запрос в поисковую службу, запускается индексатор.
Проверка результатов
Вы можете запросить индекс поиска после завершения обработки, чтобы протестировать решение.
Чтобы проверить результаты, выполните запрос к индексу. Используйте Search Explorer в качестве клиента поиска или любой инструмент, который отправляет HTTP-запросы. Следующий запрос выбирает поля, содержащие вывод из секции Markdown невекторного контента и его вектор.
Для Search Explorer вы можете скопировать только JSON и вставить его в JSON вид для выполнения запроса.
POST /indexes/[index name]/docs/search?api-version=[api-version]
{
"search": "copay for in-network providers",
"count": true,
"searchMode": "all",
"vectorQueries": [
{
"kind": "text",
"text": "*",
"fields": "text_vector,image_vector"
}
],
"queryType": "semantic",
"semanticConfiguration": "healthplan-doc-layout-test-semantic-configuration",
"captions": "extractive",
"answers": "extractive|count-3",
"queryLanguage": "en-us",
"select": "header_1, header_2, header_3"
}
Если вы использовали PDF-файлы с планами здравоохранения для тестирования этой функции, то результаты в Search Explorer для примера запроса должны быть похожи на результаты на следующем скриншоте.
Запрос является гибридным по тексту и векторам, поэтому вы видите c
@search.rerankerScore
, и результаты ранжируются по этому показателю.searchMode=all
означает, что для совпадения должны быть учтены все термины запроса (по умолчанию — любой).Запрос использует семантическую ранжировку, так что вы видите
captions
(в нем также естьanswers
, но они не показаны на скриншоте). Результаты являются наиболее семантически релевантными вводу запроса, как определено семантическим ранжировщиком.Инструкция
select
(не показана на скриншоте) определяет поля заголовка, которые обнаруживает и заполняет навык компоновки документа. Вы можете добавить дополнительные поля в предложение select для проверки содержимого блоков, заголовка или любого другого читаемого поля.