Fragmentar e vetorizar por layout ou estrutura do documento
Nota
Esta funcionalidade está atualmente em pré-visualização pública. Essa visualização é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.
As estratégias de fragmentação de dados de texto desempenham um papel fundamental na otimização das respostas e do desempenho do RAG. Usando a nova habilidade Layout de Documento que está atualmente em visualização, você pode fragmentar o conteúdo com base na estrutura do documento, capturar títulos e fragmentar o corpo do conteúdo com base na coerência semântica, como parágrafos e frases. Os chunks são processados de forma independente. Como os LLMs funcionam com várias partes, quando essas partes são de maior qualidade e semanticamente coerentes, a relevância geral da consulta é melhorada.
A habilidade Layout de Documento chama o modelo de layout em Document Intelligence. O modelo articula a estrutura de conteúdo em JSON usando a sintaxe Markdown (cabeçalhos e conteúdo), com campos para cabeçalhos e conteúdo armazenado em um índice de pesquisa no Azure AI Search. O conteúdo pesquisável produzido a partir da habilidade Layout do documento é texto simples, mas você pode aplicar vetorização integrada para gerar incorporações para qualquer campo em seus documentos de origem, incluindo imagens.
Neste artigo, saiba como:
- Use a habilidade Layout do documento para reconhecer a estrutura do documento
- Use a habilidade Divisão de texto para restringir o tamanho do bloco a cada seção de marcação
- Gerar incorporações para cada bloco
- Usar projeções de índice para mapear incorporações a campos em um índice de pesquisa
Para fins de ilustração, este artigo usa os PDFs de plano de integridade de exemplo carregados no Armazenamento de Blobs do Azure e, em seguida, indexados usando o assistente Importar e vetorizar dados.
Pré-requisitos
Um pipeline de indexação baseado em indexador com um índice que aceita a saída. O índice deve ter campos para receber títulos e conteúdo.
Uma fonte de dados suportada com conteúdo de texto que você deseja fragmentar.
Um conjunto de habilidades com habilidade de layout de documento que divide documentos com base em limites de parágrafo.
Uma habilidade de incorporação do Azure OpenAI que gera incorporações de vetor.
Uma projeção de índice para indexação um-para-muitos.
Preparar arquivos de dados
As entradas brutas devem estar em uma fonte de dados suportada e o arquivo precisa ser um formato suportado pela habilidade Layout de Documento.
Os formatos de ficheiro suportados incluem: PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML.
Os indexadores suportados podem ser qualquer indexador que possa lidar com os formatos de arquivo suportados. Esses indexadores incluem indexadores de Blob, indexadores OneLake, indexadores de arquivos.
As regiões suportadas para este recurso incluem: Leste dos EUA, Oeste dos EUA2, Europa Ocidental, Centro-Norte dos EUA. Certifique-se de verificar esta lista para atualizações sobre a disponibilidade regional.
Você pode usar o portal do Azure, APIs REST ou um pacote SDK do Azure para criar uma fonte de dados.
Gorjeta
Carregue os arquivos de exemplo PDF do plano de saúde para sua fonte de dados suportada para experimentar a habilidade Layout de Documento e fragmentação com reconhecimento de estrutura em seu próprio serviço de pesquisa. O assistente Importar e vetorizar dados é uma abordagem fácil e livre de código para experimentar essa habilidade. Certifique-se de selecionar o modo de análise padrão para usar o agrupamento com reconhecimento de estrutura. Caso contrário, o modo de análise Markdown será usado.
Criar um índice para indexação um-para-muitos
Aqui está um exemplo de carga útil de um único documento de pesquisa projetado em blocos. Sempre que estiver trabalhando com partes, você precisará de um campo de bloco e um campo pai que identifique a origem do bloco. Neste exemplo, os campos pai são os text_parent_id. Os campos filho são os blocos vetoriais e não vetoriais da seção de marcação.
A habilidade Layout do Documento gera títulos e conteúdo. Neste exemplo, header_1
por meio de header_3
cabeçalhos de documentos de armazenamento, conforme detetado pela habilidade. Outros conteúdos, como parágrafos, são armazenados em chunk
. O text_vector
campo é uma representação vetorial do conteúdo do campo de bloco.
Você pode usar o assistente Importar e vetorizar dados no portal do Azure, APIs REST ou um SDK do Azure para criar um índice. O índice a seguir é muito semelhante ao que o assistente cria por padrão. Você pode ter mais campos se adicionar vetorização de imagem.
Se você não estiver usando o assistente, o índice deve existir no serviço de pesquisa antes de criar o conjunto de habilidades ou executar o indexador.
{
"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"
}
]
}
}
Definir um conjunto de habilidades para fragmentação e vetorização com reconhecimento de estrutura
Como a habilidade Layout de Documento está em visualização, você deve usar a API REST Create Skillset 2024-11-01-preview para esta etapa. Você também pode usar o portal do Azure.
Esta seção mostra um exemplo de uma definição de conjunto de habilidades que projeta seções de marcação individuais, partes e seus equivalentes vetoriais como campos no índice de pesquisa. Ele usa a habilidade Layout do Documento para detetar títulos e preencher um campo de conteúdo com base em parágrafos e frases semanticamente coerentes no documento de origem. Ele usa a habilidade Divisão de texto para dividir o conteúdo de Markdown em partes. Ele usa a habilidade de incorporação do Azure OpenAI para vetorizar partes e qualquer outro campo para o qual você deseja incorporações.
Além das competências, o conjunto de competências inclui indexProjections
e cognitiveServices
:
indexProjections
são usados para índices que contêm documentos em partes. As projeções especificam como o conteúdo pai-filho é mapeado para campos em um índice de pesquisa para indexação um-para-muitos. Para obter mais informações, consulte Definir uma projeção de índice.cognitiveServices
anexa uma conta multisserviço do Azure AI para fins de cobrança (a habilidade Layout do Documento está disponível por meio de preços pré-pagos).
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"
}
}
}
Configurar e executar o indexador
Depois de criar uma fonte de dados, um índice e um conjunto de habilidades, você estará pronto para criar e executar o indexador. Esta etapa coloca o pipeline em execução.
Ao usar a habilidade Layout do documento, certifique-se de definir os seguintes parâmetros na definição do indexador:
- O
allowSkillsetToReadFileData
parâmetro deve ser definido comotrue
. - o
parsingMode
parâmetro deve ser definido comodefault
.
outputFieldMappings
não precisa ser definido neste cenário porque indexProjections
manipula o campo de origem para pesquisar associações de campo. As projeções de índice lidam com associações de campo para a habilidade Layout de Documento e também com fragmentação regular com a habilidade de divisão para cargas de trabalho de dados importados e vetorizados. Mapeamentos de campo de saída ainda são necessários para transformações ou mapeamentos de dados complexos com funções que se aplicam em outros casos. No entanto, para n-blocos por documento, as projeções de índice lidam com essa funcionalidade nativamente.
Aqui está um exemplo de uma solicitação de criação de indexador.
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": []
}
Quando você envia a solicitação para o serviço de pesquisa, o indexador é executado.
Verificar resultados
Você pode consultar seu índice de pesquisa após a conclusão do processamento para testar sua solução.
Para verificar os resultados, execute uma consulta no índice. Use o Search Explorer como um cliente de pesquisa ou qualquer ferramenta que envie solicitações HTTP. A consulta a seguir seleciona campos que contêm a saída do conteúdo não vetorial da seção de marcação e seu vetor.
Para o Search Explorer, você pode copiar apenas o JSON e colá-lo no modo de exibição JSON para execução da consulta.
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"
}
Se você usou os PDFs do plano de saúde para testar essa habilidade, os resultados do Search Explorer para a consulta de exemplo devem ser semelhantes aos resultados na captura de tela a seguir.
A consulta é uma consulta híbrida sobre texto e vetores, portanto, você vê um
@search.rerankerScore
e os resultados são classificados por essa pontuação.searchMode=all
significa que todos os termos de consulta devem ser considerados para uma correspondência (o padrão é qualquer).A consulta usa classificação semântica, para que você veja
captions
(também temanswers
, mas esses não são mostrados na captura de tela). Os resultados são os mais semanticamente relevantes para a entrada de consulta, conforme determinado pelo classificador semântico.A
select
instrução (não mostrada na captura de tela) especifica os campos de cabeçalho que a habilidade Layout do Documento deteta e preenche. Você pode adicionar mais campos à cláusula select para inspecionar o conteúdo de partes, título ou qualquer outro campo legível por humanos.