Fazer referência a um caminho para nós enriquecidos usando propriedades de contexto e origem um conjunto de habilidades do Azure AI Search
Durante a execução do conjunto de habilidades, o mecanismo cria uma árvore de enriquecimento na memória que captura cada enriquecimento, como entidades reconhecidas ou texto traduzido. Neste artigo, saiba como fazer referência a um nó de enriquecimento na árvore de enriquecimento para que você possa passar a saída para habilidades downstream ou especificar um mapeamento de campo de saída para um campo de índice de pesquisa.
Este artigo usa exemplos para ilustrar vários cenários. Para obter a sintaxe completa, consulte Contexto de habilidade e linguagem de anotação de entrada.
Conceitos básicos
Antes de revisar a sintaxe, vamos revisitar alguns conceitos importantes para entender melhor os exemplos fornecidos mais adiante neste artigo.
Termo | Description |
---|---|
"Documento enriquecido" | Um documento enriquecido é uma estrutura na memória que coleta resultados de habilidades à medida que é criado e contém todos os enriquecimentos relacionados a um documento. Pense num documento enriquecido como uma árvore. Geralmente, a árvore começa no nível do documento raiz, e cada novo enriquecimento é criado a partir de um anterior como seu filho. |
"Nó" | Dentro de um documento enriquecido, um nó (às vezes referido como uma "anotação") é criado e preenchido por uma habilidade, como "text" e "layoutText" na habilidade OCR. Um documento enriquecido é preenchido com enriquecimentos e valores de campo de origem originais ou metadados copiados da fonte. |
"contexto" | O escopo do enriquecimento, que é o documento inteiro, uma parte de um documento ou, se você estiver trabalhando com imagens, as imagens extraídas de um documento. Por padrão, o contexto de enriquecimento está no "/document" nível, com escopo para documentos individuais contidos na fonte de dados. Quando uma habilidade é executada, os resultados dessa habilidade tornam-se propriedades do contexto definido. |
Caminhos para diferentes cenários
Os caminhos são especificados nas propriedades "contexto" e "origem" de um conjunto de habilidades e nos mapeamentos de campo de saída em um indexador.
O exemplo na captura de tela ilustra o caminho para um item em uma coleção do Azure Cosmos DB.
context
path é/document/HotelId
porque a coleção é particionada em documentos pelo/HotelId
campo.source
caminho é/document/Description
porque a habilidade é uma habilidade de tradução, e o campo que você vai querer que a habilidade traduza é oDescription
campo em cada documento.
Todos os caminhos começam com /document
. Um documento enriquecido é criado no estágio de "quebra de documento" da execução do indexador, quando o indexador abre um documento ou lê em uma linha da fonte de dados. Inicialmente, o único nó em um documento enriquecido é o nó raiz (/document
), e é o nó a partir do qual todos os outros enriquecimentos ocorrem.
A lista a seguir inclui vários exemplos comuns:
/document
é o nó raiz e indica um blob inteiro no Armazenamento do Azure ou uma linha em uma tabela SQL./document/{key}
é a sintaxe de um documento ou item em uma coleção do Azure Cosmos DB, onde{key}
é a chave real, como/document/HotelId
no exemplo anterior./document/content
especifica a propriedade "content" de um blob JSON./document/{field}
é a sintaxe de uma operação executada em um campo específico, como a tradução do/document/Description
campo, vista no exemplo anterior./document/pages/*
ou/document/sentences/*
torne-se o contexto se você estiver dividindo um documento grande em partes menores para processamento. Se "contexto" for/document/pages/*
, a habilidade é executada uma vez em cada página do documento. Como pode haver mais de uma página ou frase, você anexará/*
para pegar todas./document/normalized_images/*
é criado durante a quebra de documentos se o documento contiver imagens. Todos os caminhos para imagens começam com normalized_images. Como geralmente há várias imagens incorporadas em um documento, anexe/*
.
Os exemplos no restante deste artigo são baseados no campo "conteúdo" gerado automaticamente pelos indexadores de blob do Azure como parte da fase de quebra de documentos. Ao se referir a documentos de um contêiner de Blob, use um formato como "/document/content"
, onde o campo "conteúdo" faz parte do "documento".
Exemplo 1: Referência de anotação simples
No Armazenamento de Blobs do Azure, suponha que você tenha uma variedade de arquivos contendo referências aos nomes das pessoas que deseja extrair usando o reconhecimento de entidade. Na seguinte definição de habilidade, "/document/content"
está a representação textual de todo o documento, e "pessoas" é uma extração de nomes completos para entidades identificadas como pessoas.
Como o contexto padrão é "/document"
, a lista de pessoas agora pode ser referenciada como "/document/people"
. Neste caso "/document/people"
específico é uma anotação, que agora pode ser mapeada para um campo em um índice, ou usada em outra habilidade no mesmo conjunto de habilidades.
{
"@odata.type": "#Microsoft.Skills.Text.V3.EntityRecognitionSkill",
"categories": [ "Person"],
"defaultLanguageCode": "en",
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "persons",
"targetName": "people"
}
]
}
Exemplo 2: Fazer referência a uma matriz dentro de um documento
Este exemplo se baseia no anterior, mostrando como invocar uma etapa de enriquecimento várias vezes sobre o mesmo documento. Suponha que o exemplo anterior gerou uma matriz de cadeias de caracteres com nomes de 10 pessoas de um único documento. Um próximo passo razoável pode ser um segundo enriquecimento que extraia o sobrenome de um nome completo. Como existem 10 nomes, você deseja que essa etapa seja chamada 10 vezes neste documento, uma vez para cada pessoa.
Para invocar o número correto de iterações, defina o contexto como "/document/people/*"
, onde o asterisco ("*"
) representa todos os nós no documento enriquecido como descendentes de "/document/people"
. Embora essa habilidade seja definida apenas uma vez na matriz de habilidades, ela é chamada para cada membro dentro do documento até que todos os membros sejam processados.
{
"@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
"description": "Fictitious skill that gets the last name from a full name",
"uri": "http://names.azurewebsites.net/api/GetLastName",
"context" : "/document/people/*",
"defaultLanguageCode": "en",
"inputs": [
{
"name": "fullname",
"source": "/document/people/*"
}
],
"outputs": [
{
"name": "lastname",
"targetName": "last"
}
]
}
Quando as anotações são matrizes ou coleções de cadeias de caracteres, convém direcionar membros específicos em vez da matriz como um todo. O exemplo acima gera uma anotação chamada "last"
sob cada nó representado pelo contexto. Se você quiser se referir a essa família de anotações, você pode usar a sintaxe "/document/people/*/last"
. Se você quiser se referir a uma anotação específica, você pode usar um índice explícito: "/document/people/1/last
" para fazer referência ao sobrenome da primeira pessoa identificada no documento. Observe que nesta sintaxe as matrizes são "0 indexadas".
Exemplo 3: Membros de referência dentro de uma matriz
Às vezes, você precisa agrupar todas as anotações de um tipo específico para passá-las para uma habilidade específica. Considere uma habilidade personalizada hipotética que identifique o sobrenome mais comum de todos os sobrenomes extraídos no Exemplo 2. Para fornecer apenas os sobrenomes para a habilidade personalizada, especifique o contexto como "/document"
e a entrada como "/document/people/*/lastname"
.
Observe que a cardinalidade de "/document/people/*/lastname"
é maior do que a de documento. Pode haver 10 nós de sobrenome enquanto há apenas um nó de documento para este documento. Nesse caso, o sistema criará automaticamente uma matriz contendo "/document/people/*/lastname"
todos os elementos do documento.
{
"@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
"description": "Fictitious skill that gets the most common string from an array of strings",
"uri": "http://names.azurewebsites.net/api/MostCommonString",
"context" : "/document",
"inputs": [
{
"name": "strings",
"source": "/document/people/*/lastname"
}
],
"outputs": [
{
"name": "mostcommon",
"targetName": "common-lastname"
}
]
}
Dicas para solução de problemas de caminho de anotação
Se você estiver tendo problemas com a especificação de entradas de habilidades, estas dicas podem ajudá-lo a avançar:
Execute o assistente Importar dados sobre seus dados para revisar as definições do conjunto de habilidades e os mapeamentos de campo gerados pelo assistente.
Inicie uma sessão de depuração em um conjunto de habilidades para exibir a estrutura de um documento enriquecido. Você pode editar os caminhos e outras partes da definição de habilidade e, em seguida, executar a habilidade para validar suas alterações.