Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Стратегии разбиения текстовых данных играют ключевую роль в оптимизации ответов и производительности RAG. С помощью навыка макета документов можно фрагментировать содержимое на основе структуры документа, записи заголовков и фрагментирования текста контента на основе семантической согласованности, таких как абзацы и предложения. Частичные блоки обрабатываются независимо. Поскольку LLM работают с несколькими сегментами, когда эти сегменты имеют более высокое качество и семантически согласованы, общая релевантность запроса улучшается.
Навык оформления документа вызывает модель макета из Интеллекта документов Azure в средстве Foundry. Модель формирует структуру содержимого в формате JSON, используя синтаксис Markdown (заголовки и содержимое), с полями для заголовков и содержимого, хранящимися в поисковом индексе на Azure AI Search. Поисковый контент, полученный с помощью навыка «Макет документа», представлен в виде простого текста, но вы можете применить встроенную векторизацию для создания эмбеддингов для любого поля в ваших исходных документах, включая изображения.
В этой статье вы узнаете, как:
- Используйте навык разметки документа, чтобы распознать структуру документа.
- Использование навыка разделения текста для ограничения размера блока для каждого раздела Markdown
- Генерировать встраивания для каждого фрагмента
- Используйте проекции индекса для сопоставления встраиваний с полями в поисковом индексе
Для иллюстрации в этой статье используются образцы PDF-файлов медицинского плана, загруженные в хранилище BLOB-объектов Azure, а затем индексированные с помощью мастера импорта данных.
Предпосылки
Индексационная система, основанная на индекаторе, с индексом, который принимает результат. Индекс должен иметь поля для получения заголовков и содержимого.
An index projection для индексации один-ко-многим.
Поддерживаемый источник данных с текстовым содержимым, которое вы хотите разбить на части.
Набор навыков с этими двумя умениями:
Навык оформления документа, который разделяет документы по границам абзацев. Если вы используете выставление счетов на основе ключей, этот навык требует, чтобы Microsoft Foundry находилось в том же регионе, что и Поиск Azure AI для обогащения искусственного интеллекта. Требования к регионам расслаблены для выставления счетов без ключей (предварительная версия).
Azure OpenAI Embedding skill, который генерирует векторные встраивания. Этот навык не имеет требований к регионам.
Подготовьте файлы данных
Для необработанных входных данных необходимо использовать поддерживаемый источник данных , а файл должен иметь формат, поддерживаемый навыком макета документов.
Поддерживаемые форматы файлов включают PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX и HTML.
Поддерживаемые индексаторы — это любой индексатор, который может обрабатывать поддерживаемые форматы файлов. Эти индексаторы включают индексаторы BLOB-объектов, индексаторы Microsoft OneLake и индексаторы файлов.
Поддерживаемые регионы для портального интерфейса этой функции включают Восточный район США, Западную Европу и Северный Центральный район США. Если вы настраиваете набор навыков программным способом, вы можете использовать любой регион Аналитики документов Azure, который также предоставляет функцию обогащения ИИ в Службе поиска ИИ 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"
}
]
}
}
Определение набора навыков для фрагментирования и векторизации с учетом структуры
В следующем примере показано определение набора навыков, которое проектирует отдельные разделы Markdown, блоки и их векторные эквиваленты в качестве полей в индексе поиска. Он использует навык макета документов для обнаружения заголовков и заполнения поля контента на основе семантической последовательности абзацев и предложений в исходном документе. Он использует навык Text Split, чтобы разбить содержимое Markdown на части. Он использует навык создания векторных представлений Azure OpenAI для векторизации блоков и любого другого поля, для которого вы хотите создать векторные представления.
Помимо навыков, комплект навыков включает indexProjections и cognitiveServices:
indexProjectionsиспользуются для индексов, содержащих разделённые документы. Прогнозы определяют, как содержимое отношений родитель-потомок отображается на поля в поисковом индексе для индексации по принципу один-ко-многим. Дополнительные сведения см. в разделе "Определение проекции индекса".cognitiveServicesприсоединяет ресурс Microsoft Foundry для выставления счетов. Навык оформления документов доступен по стандартным ценам.
POST {endpoint}/skillsets?api-version=2025-09-01
{
"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=2025-09-01
{
"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",
"select": "header_1, header_2, header_3"
}
Если вы использовали PDF-файлы с планами здравоохранения для тестирования этой функции, то результаты в Search Explorer для примера запроса должны быть похожи на результаты на следующем скриншоте.
Запрос является гибридным по тексту и векторам, поэтому вы видите c
@search.rerankerScore, и результаты ранжируются по этому показателю.searchMode=allозначает, что для совпадения должны быть учтены все термины запроса (по умолчанию — любой).Запрос использует семантический ранжирование, поэтому отображается
captions. Он также имеетanswers, но они не отображаются на снимке экрана. Результаты являются наиболее семантически релевантными вводу запроса, как определено семантическим ранжировщиком.Инструкция
select(не показана на скриншоте) определяет поля заголовка, которые обнаруживает и заполняет навык компоновки документа. Вы можете добавить дополнительные поля в предложение select для проверки содержимого блоков, заголовка или любого другого читаемого поля.