Contexto de habilidades e linguagem de anotação de entrada
Este artigo é a documentação de referência para contexto de habilidade e sintaxe de entrada. É uma descrição completa da linguagem de expressão usada para construir caminhos para nós em um documento enriquecido.
As habilidades do Azure AI Search podem usar e enriquecer os dados provenientes da fonte de dados e da saída de outras habilidades. O conjunto de trabalho de dados que representa o estado atual do trabalho do indexador para o documento atual começa a partir dos dados brutos provenientes da fonte de dados e é progressivamente enriquecido com os dados de saída de cada iteração de habilidade. Esses dados são organizados internamente em uma estrutura semelhante a uma árvore que pode ser consultada para ser usada como entrada de habilidades ou para ser adicionada ao índice. Os nós na árvore podem ser valores simples, como cadeias de caracteres e números, matrizes ou objetos complexos e até mesmo arquivos binários. Mesmo valores simples podem ser enriquecidos com informações estruturadas adicionais. Por exemplo, uma cadeia de caracteres pode ser anotada com informações adicionais armazenadas abaixo dela na árvore de enriquecimento. As expressões usadas para consultar essa estrutura interna usam uma sintaxe rica que é detalhada neste artigo. A estrutura de dados enriquecida pode ser inspecionada a partir de sessões de depuração. As expressões que consultam a estrutura também podem ser testadas a partir de sessões de depuração.
Ao longo do artigo, usaremos os seguintes dados enriquecidos como exemplo. Esses dados são típicos do tipo de estrutura que você obteria ao enriquecer um documento usando um conjunto de habilidades com OCR, extração de frases-chave, tradução de texto, deteção de idioma e habilidades de reconhecimento de entidade, bem como uma habilidade de tokenizador personalizado.
Caminho | Value |
---|---|
document |
|
merged_content |
"Estudo do BMN 110 em Doentes Pediátricos"... |
keyphrases |
|
[0] |
"Estudo da BMN" |
[1] |
"Síndrome" |
[2] |
"Doentes Pediátricos" |
... | |
locations |
|
[0] |
"IVA" |
translated_text |
"Étude de BMN 110 chez les patients pédiatriques"... |
entities |
|
[0] |
|
category |
"Organização" |
subcategory |
null |
confidenceScore |
0,72 |
length |
3 |
offset |
9 |
text |
"BMN" |
... | |
organizations |
|
[0] |
"BMN" |
language |
"en" |
normalized_images |
|
[0] |
|
layoutText |
... |
text |
|
words |
|
[0] |
"Estudo" |
[1] |
"de" |
[2] |
"BMN" |
[3] |
"110" |
... | |
[1] |
|
layoutText |
... |
text |
|
words |
|
[0] |
"Isso" |
[1] |
"é" |
[2] |
"Com certeza" |
... | |
... | |
... |
Raiz do documento
Todos os dados estão sob um elemento raiz, para o qual o caminho é "/document"
. O elemento raiz é o contexto padrão para habilidades.
Caminhos simples
Caminhos simples através do documento interno enriquecido podem ser expressos com fichas simples separadas por barras. Essa sintaxe é semelhante à especificação JSON Pointer.
Propriedades do objeto
As propriedades dos nós que representam objetos adicionam seus valores à árvore sob o nome da propriedade. Esses valores podem ser obtidos anexando o nome da propriedade como um token separado por uma barra:
Expression | Value |
---|---|
/document/merged_content/language |
"en" |
Os tokens de nome de propriedade diferenciam maiúsculas de minúsculas.
Índice de itens de matriz
Elementos específicos de uma matriz podem ser referenciados usando seu índice numérico como um nome de propriedade:
Expression | Value |
---|---|
/document/merged_content/keyphrases/1 |
"Syndrome" |
/document/merged_content/entities/0/text |
"BMN" |
Sequências de fuga
Há dois caracteres que têm um significado especial e precisam ser escapados se aparecerem em uma expressão e devem ser interpretados como estão em vez de como seu significado especial: '/'
e '~'
.
Esses caracteres devem ser escapados, respectivamente, como '~0'
e '~1'
.
Enumeração de matriz
Uma matriz de valores pode ser obtida usando o '*'
token:
Expression | Value |
---|---|
/document/normalized_images/0/text/words/* |
["Study", "of", "BMN", "110" ...] |
O '*'
token não precisa estar no final do caminho. É possível enumerar todos os nós que correspondem a um caminho com uma estrela no meio ou com várias estrelas:
Expression | Value |
---|---|
/document/normalized_images/*/text/words/* |
["Study", "of", "BMN", "110" ... "it", "is", "certainly" ...] |
Este exemplo retorna uma lista simples de todos os nós correspondentes.
É possível manter mais estrutura e obter uma matriz separada para as palavras de cada página usando um '#'
token em vez do segundo '*'
token:
Expression | Value |
---|---|
/document/normalized_images/*/text/words/# |
[["Study", "of", "BMN", "110" ...], ["it", "is", "certainly" ...] ...] |
O '#'
token expressa que a matriz deve ser tratada como um único valor em vez de ser enumerada.
Enumerando matrizes no contexto
Muitas vezes, é útil processar cada elemento de uma matriz isoladamente e ter um conjunto diferente de entradas e saídas de habilidades para cada um.
Isso pode ser feito definindo o contexto da habilidade como uma enumeração em vez do padrão "/document"
.
No exemplo a seguir, usamos uma das expressões de entrada que usamos antes, mas com um contexto diferente que altera o valor resultante.
Contexto | Expression | Valores |
---|---|---|
/document/normalized_images/* |
/document/normalized_images/*/text/words/* |
["Study", "of", "BMN", "110" ...] ["it", "is", "certainly" ...] ... |
Para essa combinação de contexto e entrada, a habilidade é executada uma vez para cada imagem normalizada: uma vez para "/document/normalized_images/0"
e uma vez para "/document/normalized_images/1"
. Os dois valores de entrada correspondentes a cada execução de habilidade são detalhados na coluna de valores.
Ao enumerar uma matriz no contexto, quaisquer saídas que a habilidade produza também serão adicionadas ao documento como enriquecimento do contexto.
No exemplo acima, uma saída nomeada "out"
tem seus valores para cada execução adicionada ao documento respectivamente em "/document/normalized_images/0/out"
e "/document/normalized_images/1/out"
.
Valores literais
As entradas de habilidade podem tomar valores literais como suas entradas, em vez de valores dinâmicos consultados a partir do documento existente. Isso pode ser conseguido prefixando o valor com um sinal de igual. Os valores podem ser números, strings ou booleanos.
Os valores de cadeia de caracteres podem ser colocados entre aspas simples '
ou duplas "
.
Expression | Value |
---|---|
=42 |
42 |
=2.45E-4 |
0.000245 |
="some string" |
"some string" |
='some other string' |
"some other string" |
="unicod\u0065" |
"unicode" |
=false |
false |
Matrizes em linha
Se uma determinada entrada de habilidade requer uma matriz de dados, mas os dados são representados como um único valor atualmente ou você precisa combinar vários valores únicos diferentes em um campo de matriz, então você pode criar um valor de matriz embutido como parte de uma expressão de entrada de habilidade quebrando uma lista separada por vírgulas de expressões entre colchetes ([
e ]
). O valor da matriz pode ser uma combinação de caminhos de expressão ou valores literais, conforme necessário. Você também pode criar matrizes aninhadas dentro de matrizes dessa maneira.
Expression | Value |
---|---|
=['item'] |
["item"] |
=[$(/document/merged_content/entities/0/text), 'item'] |
["BMN", "item"] |
=[1, 3, 5] |
[1, 3, 5] |
=[true, true, false] |
[verdadeiro, verdadeiro, falso] |
=[[$(/document/merged_content/entities/0/text), 'item'],['item2', $(/document/merged_content/keyphrases/1)]] |
[["BMN", "item"], ["item2", "Síndrome"]] |
Se a habilidade tiver um contexto que explique para executar a habilidade por uma entrada de matriz (ou seja, como "context": "/document/pages/*"
significa que a habilidade é executada uma vez por "página" em pages
), então passar esse valor como a expressão como entrada para uma matriz em linha usa um desses valores de cada vez.
Para um exemplo com nossos dados enriquecidos de amostra, se a sua habilidade context
é /document/merged_content/keyphrases/*
e, em seguida, você cria uma matriz embutida do seguinte =['key phrase', $(/document/merged_content/keyphrases/*)]
em uma entrada dessa habilidade, então a habilidade é executada três vezes, uma com um valor de ["frase-chave", "Estudo de BMN"], outra com um valor de ["frase-chave", "Síndrome"], e finalmente com um valor de ["frase-chave", "Doentes Pediátricos"]. O valor literal de "frase-chave" permanece o mesmo sempre, mas o valor do caminho da expressão muda a cada execução de habilidade.
Expressões compostas
É possível combinar valores usando operadores unários, binários e ternários.
Os operadores podem combinar valores literais e valores resultantes da avaliação de caminho.
Quando usados dentro de uma expressão, os caminhos devem ser colocados entre "$("
e ")"
.
Booleano não '!'
Expression | Value |
---|---|
=!false |
true |
Negativo '-'
Expression | Value |
---|---|
=-42 |
-42 |
=-$(/document/merged_content/entities/0/offset) |
-9 |
Adição '+'
Expression | Value |
---|---|
=2+2 |
4 |
=2+$(/document/merged_content/entities/0/offset) |
11 |
Subtração '-'
Expression | Value |
---|---|
=2-1 |
1 |
=$(/document/merged_content/entities/0/offset)-2 |
7 |
Multiplicação '*'
Expression | Value |
---|---|
=2*3 |
6 |
=$(/document/merged_content/entities/0/offset)*2 |
18 |
Divisão '/'
Expression | Value |
---|---|
=3/2 |
1.5 |
=$(/document/merged_content/entities/0/offset)/3 |
3 |
Módulo '%'
Expression | Value |
---|---|
=15%4 |
3 |
=$(/document/merged_content/entities/0/offset)%2 |
1 |
Menor, menor ou igual, maior e maior que ou igual '<'
'<='
'>'
'>='
Expression | Value |
---|---|
=15<4 |
false |
=4<=4 |
true |
=15>4 |
true |
=1>=2 |
false |
Igualdade e desigualdade '=='
'!='
Expression | Value |
---|---|
=15==4 |
false |
=4==4 |
true |
=15!=4 |
true |
=1!=1 |
false |
Operações lógicas e, ou e exclusivas ou '&&'
'||'
'^'
Expression | Value |
---|---|
=true&&true |
true |
=true&&false |
false |
=true||true |
true |
=true||false |
true |
=false||false |
false |
=true^false |
true |
=true^true |
false |
Operador ternário '?:'
É possível dar a uma entrada valores diferentes com base na avaliação de uma expressão booleana usando o operador ternário.
Expression | Value |
---|---|
=true?"true":"false" |
"true" |
=$(/document/merged_content/entities/0/offset)==9?"nine":"not nine" |
"nine" |
Parênteses e prioridade do operador
Os operadores são avaliados com prioridades que correspondem às convenções usuais: operadores unários, depois multiplicação, divisão e módulo, depois adição e subtração, depois comparação, depois igualdade e, em seguida, operadores lógicos. Aplicam-se também as regras habituais de associatividade.
Os parênteses podem ser usados para alterar ou desambiguar a ordem de avaliação.
Expression | Value |
---|---|
=3*2+5 |
11 |
=3*(2+5) |
21 |