Фрагмент и векторизация по макету документа или структуре
Примечание.
Эта функция сейчас доступна в виде общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения на уровне обслуживания и не рекомендуется для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в статье Дополнительные условия использования Предварительных версий Microsoft Azure.
Стратегии блокирования текстовых данных играют ключевую роль в оптимизации ответов RAG и производительности. Используя новый навык макета документов, который в настоящее время находится в предварительной версии, можно фрагментировать содержимое на основе структуры документа, захвата заголовков и фрагментирования текста контента на основе семантической согласованности, таких как абзацы и предложения. Блоки обрабатываются независимо. Так как LLM работают с несколькими блоками, когда эти блоки имеют более высокое качество и семантику согласованности, общая релевантность запроса улучшается.
Навык макета документа вызывает модель макета в аналитике документов. Модель сформулирует структуру содержимого в ФОРМАТЕ JSON с помощью синтаксиса Markdown (заголовки и содержимое) с полями для заголовков и содержимого, хранящихся в индексе поиска в службе "Поиск ИИ Azure". Содержимое, доступное для поиска из навыка макета документов, является обычным текстом, но можно применить интегрированную векторизацию для создания внедрения для любого поля в исходных документах, включая изображения.
В этой статье раскрываются следующие темы:
- Использование навыка макета документов для распознавания структуры документов
- Использование навыка разделения текста для ограничения размера блока для каждого раздела Markdown
- Создание внедрения для каждого блока
- Использование проекций индекса для сопоставления внедрения с полями в индексе поиска
Для иллюстрации в этой статье используются примеры PDF-файлов плана работоспособности, отправленных в Хранилище BLOB-объектов Azure, а затем индексированы с помощью мастера импорта и векторизации данных.
Необходимые компоненты
Конвейер индексирования на основе индексатора с индексом, принимаюющим выходные данные. Индекс должен иметь поля для получения заголовков и содержимого.
Поддерживаемый источник данных с текстовым содержимым, который требуется фрагментировать.
Набор навыков с навыком макета документов, который разделяет документы на основе границ абзаца.
Навык внедрения Azure OpenAI, который создает векторные внедрения.
Проекция индекса для индексирования "один ко многим".
Подготовка файлов данных
Необработанные входные данные должны находиться в поддерживаемом источнике данных, а файл должен быть форматом, который поддерживает навык макета документов.
Поддерживаемые форматы файлов: PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML.
Поддерживаемые индексаторы могут быть любым индексатором, который может обрабатывать поддерживаемые форматы файлов. Эти индексаторы включают индексаторы BLOB-объектов, индексаторы OneLake, индексаторы файлов.
Поддерживаемые регионы для этой функции: восточная часть США, западная часть США2, Западная Европа, Северная Часть США. Обязательно проверьте этот список обновлений для региональной доступности.
Для создания источника данных можно использовать портал 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, блоки и их векторные эквиваленты в качестве полей в индексе поиска. Он использует навык макета документов для обнаружения заголовков и заполнения поля контента на основе семантической последовательности абзацев и предложений в исходном документе. Он использует навык разделения текста для разделения содержимого 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 a 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": []
}
При отправке запроса в службу поиска индексатор запускается.
проверите результаты;
Вы можете запросить индекс поиска после завершения обработки, чтобы протестировать решение.
Чтобы проверить результаты, выполните запрос к индексу. Используйте обозреватель поиска в качестве клиента поиска или любого средства, отправляющего HTTP-запросы. Следующий запрос выбирает поля, содержащие выходные данные содержимого раздела Markdown, не относящееся к невектору, и его вектор.
Для обозревателя поиска можно скопировать только 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.rerankerScore
и результаты ранжируются по этой оценке.searchMode=all
означает, что все термины запроса должны рассматриваться для соответствия (значение по умолчанию — любое).Запрос использует семантический ранжирование, поэтому
captions
отображается (он также содержитanswers
, но они не отображаются на снимке экрана). Результаты наиболее семантически относятся к входным данным запроса, как определено семантикой ранжирования.Оператор
select
(не показан на снимке экрана) указывает поля заголовка, которые обнаруживает и заполняет навык макета документов. Вы можете добавить дополнительные поля в предложение select для проверки содержимого блоков, заголовка или любого другого читаемого поля.