Conceitos do conjunto de competências na Pesquisa de IA do Azure

Este artigo é para desenvolvedores que precisam de uma compreensão mais profunda dos conceitos e composição do conjunto de habilidades e pressupõe familiaridade com os conceitos de alto nível de enriquecimento de IA.

Um conjunto de habilidades é um recurso reutilizável na Pesquisa de IA do Azure que é anexado a um indexador. Ele contém uma ou mais habilidades que chamam IA integrada ou processamento personalizado externo sobre documentos recuperados de uma fonte de dados externa.

O diagrama a seguir ilustra o fluxo de dados básico da execução do conjunto de habilidades.

Diagram showing skillset data flows, with focus on inputs, outputs, and mappings.

Desde o início do processamento do conjunto de habilidades até sua conclusão, as habilidades leem e escrevem em um documento enriquecido. Inicialmente, um documento enriquecido é apenas o conteúdo bruto extraído de uma fonte de dados (articulado como o "/document" nó raiz). A cada execução de habilidade, o documento enriquecido ganha estrutura e substância à medida que a habilidade escreve sua saída como nós no gráfico.

Depois que a execução do conjunto de habilidades é feita, a saída de um documento enriquecido encontra seu caminho em um índice por meio de mapeamentos de campo de saída. Qualquer conteúdo bruto que você deseja transferir intacto, da origem para um índice, é definido por meio de mapeamentos de campo.

Para configurar o enriquecimento, você especificará as configurações em um conjunto de habilidades e indexador.

Definição do conjunto de competências

Um conjunto de habilidades é uma matriz de uma ou mais habilidades que executam um enriquecimento, como traduzir texto ou OCR em um arquivo de imagem. As habilidades podem ser as habilidades internas da Microsoft ou as habilidades personalizadas para lógica de processamento que você hospeda externamente. Um conjunto de habilidades produz documentos enriquecidos que são consumidos durante a indexação ou projetados para um armazenamento de conhecimento.

As competências têm um contexto, entradas e saídas:

Diagram showing which properties of skillsets establish the data path.

  • O contexto refere-se ao âmbito da operação, que pode ser uma vez por documento ou uma vez para cada item de uma coleção.

  • As entradas originam-se de nós em um documento enriquecido, onde uma "fonte" e um "nome" identificam um determinado nó.

  • A saída é enviada de volta para o documento enriquecido como um novo nó. Os valores são o "nome" do nó e o conteúdo do nó. Se um nome de nó estiver duplicado, você poderá definir um nome de destino para desambiguação.

Contexto das competências

Cada habilidade tem um contexto, que pode ser o documento inteiro (/document) ou um nó mais baixo na árvore (/document/countries/*). Um contexto determina:

  • O número de vezes que a habilidade é executada, sobre um único valor (uma vez por campo, por documento), ou para valores de contexto da coleção de tipos, onde a adição de um /* resulta em chamada de habilidade, uma vez para cada instância na coleção.

  • Declaração de saída, ou onde na árvore de enriquecimento as saídas de habilidades são adicionadas. As saídas são sempre adicionadas à árvore como filhos do nó de contexto.

  • Forma das entradas. Para coleções de vários níveis, definir o contexto para a coleção pai afetará a forma da entrada para a habilidade. Por exemplo, se você tiver uma árvore de enriquecimento com uma lista de países/regiões, cada um enriquecido com uma lista de estados contendo uma lista de códigos postais, a forma como você define o contexto determinará como a entrada será interpretada.

    Contexto Entrada Forma da entrada Invocação de Habilidade
    /document/countries/* /document/countries/*/states/*/zipcodes/* Uma lista de todos os códigos postais no país/região Uma vez por país/região
    /document/countries/*/states/* /document/countries/*/states/*/zipcodes/* Uma lista de CEPs no estado Uma vez por combinação de país/região e estado

Dependências de habilidades

As habilidades podem ser executadas de forma independente e em paralelo, ou sequencialmente, se você alimentar o resultado de uma habilidade em outra habilidade. O exemplo a seguir demonstra duas habilidades internas que são executadas em sequência:

  • A habilidade #1 é uma habilidade de Divisão de Texto que aceita o conteúdo do campo de origem "reviews_text" como entrada e divide esse conteúdo em "páginas" de 5000 caracteres como saída. Dividir texto grande em pedaços menores pode produzir melhores resultados para habilidades como deteção de sentimento.

  • A habilidade #2 é uma habilidade de Deteção de Sentimento que aceita "páginas" como entrada e produz um novo campo chamado "Sentimento" como saída que contém os resultados da análise de sentimento.

Observe como a saída da primeira habilidade ("páginas") é usada na análise de sentimento, onde "/document/reviews_text/pages/*" é tanto o contexto quanto a entrada. Para obter mais informações sobre a formulação de caminho, consulte Como referenciar enriquecimentos.

{
    "skills": [
        {
            "@odata.type": "#Microsoft.Skills.Text.SplitSkill",
            "name": "#1",
            "description": null,
            "context": "/document/reviews_text",
            "defaultLanguageCode": "en",
            "textSplitMode": "pages",
            "maximumPageLength": 5000,
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/reviews_text"
                }
            ],
            "outputs": [
                {
                    "name": "textItems",
                    "targetName": "pages"
                }
            ]
        },
        {
            "@odata.type": "#Microsoft.Skills.Text.SentimentSkill",
            "name": "#2",
            "description": null,
            "context": "/document/reviews_text/pages/*",
            "defaultLanguageCode": "en",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/reviews_text/pages/*",
                }
            ],
            "outputs": [
                {
                    "name": "sentiment",
                    "targetName": "sentiment"
                },
                {
                    "name": "confidenceScores",
                    "targetName": "confidenceScores"
                },
                {
                    "name": "sentences",
                    "targetName": "sentences"
                }
            ]
        }
      . . .
  ]
}

Árvore de enriquecimento

Um documento enriquecido é uma estrutura de dados temporária, semelhante a uma árvore, criada durante a execução do conjunto de habilidades que coleta todas as mudanças introduzidas por meio das habilidades. Coletivamente, os enriquecimentos são representados como uma hierarquia de nós endereçáveis. Os nós também incluem quaisquer campos não enriquecidos que são passados literalmente da fonte de dados externa.

Um documento enriquecido existe durante a execução do conjunto de habilidades, mas pode ser armazenado em cache ou enviado para um repositório de conhecimento.

Inicialmente, um documento enriquecido é simplesmente o conteúdo extraído de uma fonte de dados durante a quebra de documentos, onde texto e imagens são extraídos da fonte e disponibilizados para análise de linguagem ou imagem.

O conteúdo inicial são metadados e o raiz (document/content). O nó raiz geralmente é um documento inteiro ou uma imagem normalizada que é extraída de uma fonte de dados durante a quebra de documento. A forma como ela é articulada em uma árvore de enriquecimento varia para cada tipo de fonte de dados. A tabela a seguir mostra o estado de um documento que entra no pipeline de enriquecimento para várias fontes de dados suportadas:

Fonte de dados\Modo de análise Predefinido JSON, Linhas JSON & CSV
Armazenamento de Blobs /documento/conteúdo
/documento/normalized_images/*
...
/documento/{key1}
/documento/{key2}
...
SQL do Azure /documento/{coluna1}
/documento/{coluna2}
...
N/A
Azure Cosmos DB /documento/{key1}
/documento/{key2}
...
N/A

À medida que as habilidades são executadas, a saída é adicionada à árvore de enriquecimento como novos nós. Se a execução de habilidades estiver em todo o documento, os nós serão adicionados no primeiro nível sob a raiz.

Os nós podem ser usados como entradas para habilidades a jusante. Por exemplo, habilidades que criam conteúdo, como cadeias de caracteres traduzidas, podem se tornar entrada para habilidades que reconhecem entidades ou extraem frases-chave.

Skills read and write from enrichment tree

Embora você possa visualizar e trabalhar com uma árvore de enriquecimento através do editor visual Debug Sessions, é principalmente uma estrutura interna.

O enriquecimento é imutável: uma vez criados, os nós não podem ser editados. À medida que seus conjuntos de habilidades se tornam mais complexos, sua árvore de enriquecimento também ficará, mas nem todos os nós na árvore de enriquecimento precisam chegar ao índice ou ao armazenamento de conhecimento.

Você pode persistir seletivamente apenas um subconjunto das saídas de enriquecimento para manter apenas o que pretende usar. Os mapeamentos de campo de saída em sua definição de indexador determinarão qual conteúdo realmente será ingerido no índice de pesquisa. Da mesma forma, se você estiver criando um repositório de conhecimento, poderá mapear saídas em formas atribuídas a projeções.

Nota

O formato da árvore de enriquecimento permite que o pipeline de enriquecimento anexe metadados até mesmo a tipos de dados primitivos. Os metadados não serão um objeto JSON válido, mas podem ser projetados em um formato JSON válido em definições de projeção em um repositório de conhecimento. Para obter mais informações, consulte Habilidade Shaper.

Definição do indexador

Um indexador tem propriedades e parâmetros usados para configurar a execução do indexador. Entre essas propriedades estão mapeamentos que definem o caminho de dados para campos em um índice de pesquisa.

Diagram showing which properties of indexers establish the data path to fields in an index.

Existem dois conjuntos de mapeamentos:

A propriedade "sourceFieldName" especifica um campo em sua fonte de dados ou um nó em uma árvore de enriquecimento. A propriedade "targetFieldName" especifica o campo de pesquisa em um índice que recebe o conteúdo.

Exemplo de enriquecimento

Usando o conjunto de habilidades de avaliações de hotéis como ponto de referência, este exemplo explica como uma árvore de enriquecimento evolui através da execução de habilidades usando diagramas conceituais.

Este exemplo também mostra:

  • Como o contexto e as entradas de uma habilidade funcionam para determinar quantas vezes uma habilidade é executada
  • Qual é a forma da entrada com base no contexto

Neste exemplo, os campos de origem de um arquivo CSV incluem avaliações de clientes sobre hotéis ("reviews_text") e classificações ("reviews_rating"). O indexador adiciona campos de metadados do armazenamento de Blob e as habilidades adicionam texto traduzido, pontuações de sentimento e deteção de frases-chave.

No exemplo de avaliações de hotéis, um "documento" dentro do processo de enriquecimento representa uma única avaliação de hotel.

Gorjeta

Você pode criar um índice de pesquisa e armazenamento de conhecimento para esses dados no portal do Azure ou APIs REST. Você também pode usar as Sessões de Depuração para obter informações sobre a composição do conjunto de habilidades, dependências e efeitos em uma árvore de enriquecimento. As imagens neste artigo são extraídas de Debug Sessions.

Conceitualmente, a árvore de enriquecimento inicial tem a seguinte aparência:

enrichment tree after document cracking

O nó raiz para todos os enriquecimentos é "/document". Quando você estiver trabalhando com indexadores de blob, o "/document" nó terá nós filhos de "/document/content" e "/document/normalized_images". Quando os dados são CSV, como neste exemplo, os nomes das colunas serão mapeados para os nós abaixo de "/document".

Habilidade #1: Dividir habilidade

Quando o conteúdo de origem consiste em grandes pedaços de texto, é útil dividi-lo em componentes menores para maior precisão na deteção de linguagem, sentimento e frases-chave. Há dois grãos disponíveis: páginas e frases. Uma página tem aproximadamente 5000 caracteres.

Uma habilidade de divisão de texto normalmente é a primeira em um conjunto de habilidades.

"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"name": "#1",
"description": null,
"context": "/document/reviews_text",
"defaultLanguageCode": "en",
"textSplitMode": "pages",
"maximumPageLength": 5000,
"inputs": [
{
    "name": "text",
    "source": "/document/reviews_text"
}
],
"outputs": [
{
    "name": "textItems",
    "targetName": "pages"
}

Com o contexto de habilidade de , a habilidade dividida é executada "/document/reviews_text"uma vez para o reviews_text. A saída de habilidade é uma lista onde o reviews_text é dividido em 5000 segmentos de caracteres. A saída da habilidade dividida é nomeada pages e adicionada à árvore de enriquecimento. O targetName recurso permite que você renomeie uma saída de habilidade antes de ser adicionada à árvore de enriquecimento.

A árvore de enriquecimento agora tem um novo nó colocado sob o contexto da habilidade. Este nó está disponível para qualquer habilidade, projeção ou mapeamento de campo de saída.

enrichment tree after skill #1

Para acessar qualquer um dos enriquecimentos adicionados a um nó por uma habilidade, o caminho completo para o enriquecimento é necessário. Por exemplo, se você quiser usar o pages texto do nó como uma entrada para outra habilidade, precisará especificá-lo como "/document/reviews_text/pages/*". Para obter mais informações sobre caminhos, consulte Enriquecimentos de referência.

Habilidade #2 Deteção de idioma

Os documentos de avaliação do hotel incluem comentários dos clientes expressos em vários idiomas. A habilidade de deteção de idioma determina qual idioma é usado. O resultado será então passado para a extração de frases-chave e deteção de sentimentos (não mostrados), levando em consideração a linguagem ao detetar sentimentos e frases.

Embora a habilidade de deteção de linguagem seja a terceira (habilidade #3) definida no conjunto de habilidades, é a próxima habilidade a ser executada. Ele não requer nenhuma entrada, então ele é executado em paralelo com a habilidade anterior. Como a habilidade de divisão que a precedeu, a habilidade de deteção de idioma também é invocada uma vez para cada documento. A árvore de enriquecimento agora tem um novo nó para a linguagem.

enrichment tree after skill #2

Habilidades #3 e #4 (análise de sentimento e deteção de frases-chave)

O feedback dos clientes reflete uma série de experiências positivas e negativas. A habilidade de análise de sentimento analisa o feedback e atribui uma pontuação ao longo de um contínuo de números negativos a positivos, ou neutro se o sentimento for indeterminado. Paralelamente à análise de sentimento, a deteção de frases-chave identifica e extrai palavras e frases curtas que parecem consequentes.

Dado o contexto do , tanto a análise de sentimento quanto as habilidades de /document/reviews_text/pages/*frases-chave serão invocadas uma vez para cada um dos itens da pages coleção. A saída da habilidade será um nó sob o elemento de página associado.

Agora você deve ser capaz de olhar para o resto das habilidades no conjunto de habilidades e visualizar como a árvore de enriquecimento continuará a crescer com a execução de cada habilidade. Algumas habilidades, como a habilidade de mesclagem e a habilidade de shaper, também criam novos nós, mas usam apenas dados de nós existentes e não criam novos enriquecimentos líquidos.

enrichment tree after all skills

As cores dos conectores na árvore acima indicam que os enriquecimentos foram criados por diferentes habilidades e os nós precisarão ser abordados individualmente e não farão parte do objeto retornado ao selecionar o nó pai.

Habilidade #5 Habilidade Shaper

Se a saída incluir um repositório de conhecimento, adicione uma habilidade Shaper como última etapa. A habilidade Shaper cria formas de dados a partir de nós em uma árvore de enriquecimento. Por exemplo, talvez você queira consolidar vários nós em uma única forma. Em seguida, você pode projetar essa forma como uma tabela (os nós se tornam as colunas de uma tabela), passando a forma pelo nome para uma projeção de tabela.

A habilidade Shaper é fácil de trabalhar porque se concentra na modelagem sob uma habilidade. Alternativamente, você pode optar pela modelagem em linha dentro de projeções individuais. A Habilidade Shaper não adiciona ou prejudica uma árvore de enriquecimento, por isso não é visualizada. Em vez disso, você pode pensar em uma habilidade Shaper como o meio pelo qual você rearticula a árvore de enriquecimento que você já tem. Conceitualmente, isso é semelhante à criação de exibições a partir de tabelas em um banco de dados.

{
  "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
  "name": "#5",
  "description": null,
  "context": "/document",
  "inputs": [
    {
      "name": "name",
      "source": "/document/name"
    },
    {
      "name": "reviews_date",
      "source": "/document/reviews_date"
    },
    {
      "name": "reviews_rating",
      "source": "/document/reviews_rating"
    },
    {
      "name": "reviews_text",
      "source": "/document/reviews_text"
    },
    {
      "name": "reviews_title",
      "source": "/document/reviews_title"
    },
    {
      "name": "AzureSearch_DocumentKey",
      "source": "/document/AzureSearch_DocumentKey"
    },
    {
      "name": "pages",
      "sourceContext": "/document/reviews_text/pages/*",
      "inputs": [
        {
          "name": "Sentiment",
          "source": "/document/reviews_text/pages/*/Sentiment"
        },
        {
          "name": "LanguageCode",
          "source": "/document/Language"
        },
        {
          "name": "Page",
          "source": "/document/reviews_text/pages/*"
        },
        {
          "name": "keyphrase",
          "sourceContext": "/document/reviews_text/pages/*/Keyphrases/*",
          "inputs": [
            {
              "name": "Keyphrases",
              "source": "/document/reviews_text/pages/*/Keyphrases/*"
            }
          ]
        }
      ]
    }
  ],
  "outputs": [
    {
      "name": "output",
      "targetName": "tableprojection"
    }
  ]
}

Próximos passos

Com uma introdução e um exemplo por trás, tente criar seu primeiro conjunto de habilidades usando habilidades integradas.