Conceitos do conjunto de competências na Pesquisa de IA do Azure
Este artigo destina-se a programadores que necessitam de uma compreensão mais profunda dos conceitos e composição do conjunto de competências e pressupõe familiaridade com os conceitos de alto nível de IA aplicada no Azure AI Search.
Um conjunto de habilidades é um objeto reutilizável na Pesquisa de IA do Azure que está 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.
Desde o início do processamento de habilidades até sua conclusão, as habilidades leem e escrevem em um documento enriquecido que existe na memória. Inicialmente, um documento enriquecido é apenas o conteúdo bruto extraído de uma fonte de dados (articulado como o "/document"
nó raiz). Com cada execução de habilidade, o documento enriquecido ganha estrutura e substância à medida que cada habilidade escreve sua saída como nós no gráfico.
Depois que a execução do conjunto de habilidades é concluída, a saída de um documento enriquecido encontra seu caminho para um índice por meio de mapeamentos de campo de saída definidos pelo usuário. Qualquer conteúdo bruto que você deseja transferir intacto, da origem para um índice, é definido por meio de mapeamentos de campo.
Para configurar a IA aplicada, especifique 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 reconhecimento ótico de caracteres (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:
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, em um único valor (uma vez por campo, por documento) ou para uma coleção, onde a adição de um
/*
resulta na invocação de habilidade para cada instância da 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 afeta 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 determina como a entrada é 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 5.000 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 nó 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.
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 na definição do indexador determinam qual conteúdo realmente é 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.
Existem dois conjuntos de mapeamentos:
"fieldMappings" mapeia um campo de origem para um campo de pesquisa.
"outputFieldMappings" mapeia um nó em um documento enriquecido para um campo de pesquisa.
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:
O nó raiz para todos os enriquecimentos é "/document"
. Quando você está trabalhando com indexadores de blob, o "/document"
nó tem nós filho de "/document/content"
e "/document/normalized_images"
. Quando os dados são CSV, como neste exemplo, os nomes das colunas são mapeados para 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 consiste em aproximadamente 5.000 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 segmentos de 5.000 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.
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, especifique-o 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.
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/*
frase-chave sã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 continua 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.
As cores dos conectores na árvore acima indicam que os enriquecimentos foram criados por diferentes habilidades e os nós precisam 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.