Compartilhar via


Agrupamento e vetorização com reconhecimento de estrutura na Pesquisa de IA do Azure

Observação

Esse recurso está atualmente em visualização pública. Essa versão prévia é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares de Versões Prévias do Microsoft Azure.

As estratégias de agrupamento de dados de texto desempenham um papel fundamental na otimização das respostas e do desempenho do RAG. Usando a nova habilidade de layout de documento que está atualmente em versão prévia, você pode agrupar conteúdo com base em parágrafos ou fragmentos semanticamente coerentes de uma representação de frase. Esses fragmentos podem ser processados de maneira independente e recombinados como representações semânticas sem perda de informações, interpretação ou relevância semântica. O significado inerente do texto é usado como um guia para o processo de agrupamento.

A habilidade Layout de Documento usa a sintaxe Markdown (títulos e conteúdo) para articular a estrutura do documento no documento de pesquisa. O conteúdo pesquisável obtido do documento de origem é texto sem formatação, mas você pode adicionar vetorização integrada para gerar inserções para qualquer campo.

Neste artigo, aprenda a:

  • Usar a habilidade Layout de Documento para detectar seções e conteúdo Markdown de saída
  • Usar a habilidade de Divisão de Texto para restringir o tamanho da parte para cada seção de markdown
  • Gerar inserções para cada parte
  • Usar projeções de índice para mapear inserções em campos em um índice de pesquisa

Pré-requisitos

Preparar arquivos de dados

As entradas brutas devem estar em uma fonte de dados com suporte e o arquivo precisa estar em um formato que dê suporte à habilidade do Layout de Documento.

  • Os formatos de arquivo com suporte incluem: PDF, JPEG, JPG, PNG, BMP, TIFF, DOCX, XLSX, PPTX, HTML.

  • Os indexadores com suporte podem ser qualquer indexador que possa lidar com os formatos de arquivo com suporte. Eles incluem indexadores de Blob, indexadores do OneLake, indexadores de arquivo.

  • As regiões com suporte para esse recurso incluem: Leste dos EUA, Oeste dos EUA 2, Oeste da Europa, Centro-Norte dos EUA. Verifique esta lista para obter atualizações sobre a disponibilidade regional.

Você pode usar o portal do Azure, as APIs REST ou um pacote do SDK do Azure para criar uma fonte de dados.

Dica

Carregue os arquivos de exemplo do PDF do plano de integridade em sua fonte de dados com suporte para experimentar a habilidade Layout do Documento e o agrupamento com reconhecimento de estrutura em seu próprio serviço de pesquisa. O assistente Importar e vetorizar dados é uma abordagem fácil e sem código para experimentar essa habilidade. Selecione 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 conteúdo de um único documento de pesquisa projetado em partes. Neste exemplo, os campos pai são text_parent_id. Os campos filho são as partes vetor e não vetor da seção markdown.

Você pode usar o portal do Azure, as APIs REST ou um SDK do Azure para criar um índice.

Um í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 conjunto de habilidades para agrupamento e vetorização com reconhecimento de estrutura

Como a habilidade Layout do Documento está em versão prévia, você deve usar a API REST Criar Conjunto de Habilidades 2024-11-01-preview para esta etapa.

Aqui está um exemplo de conteúdo de definição do conjunto de habilidades para projetar partes de seções de markdown individuais e suas saídas de vetor como documentos no índice de pesquisa usando a habilidade Layout de Documento e habilidade de inserção do OpenAI do Azure

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"
    }
  }
}

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 de Documento, defina os seguintes parâmetros na definição do indexador:

  • O parâmetro allowSkillsetToReadFileData deve ser definido como true.
  • o parâmetro parsingMode deve ser definido como default.

Aqui está um exemplo de conteúdo

{
  "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": []
}

Verificar os resultados

Você pode consultar o í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 Gerenciador de pesquisa 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 sem vetor da seção markdown e seu vetor.

Para o Explorador de Pesquisa, 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": "*",
    "select": "metadata_storage_path, markdown_section, vector"
}

Confira também