Langage d’annotation du contexte et des entrées de compétences
Cet article est la documentation de référence de la syntaxe du contexte et des entrées de compétences. Il s’agit d’une description complète du langage d’expression utilisé pour construire des chemins vers des nœuds dans un document enrichi.
Les compétences de la Recherche Azure AI peuvent utiliser et enrichir les données provenant de la source de données et de la sortie d’autres compétences. La plage de travail des données qui représente l’état actuel du travail de l’indexeur pour le document actif commence avec les données brutes provenant de la source de données et est progressivement enrichie avec les données de sortie de chaque itération de compétence. Ces données sont organisées en interne dans une structure d’arborescence qui peut être interrogée pour servir d’entrée de compétence ou être ajoutée à l’index. Les nœuds de l’arborescence peuvent être des valeurs simples comme des chaînes et des nombres, des tableaux ou des objets complexes, et même des fichiers binaires. Même les valeurs simples peuvent être enrichies avec des informations structurées supplémentaires. Par exemple, une chaîne peut être annotée avec des informations supplémentaires qui sont stockées sous celle-ci dans l’arborescence d’enrichissement. Les expressions utilisées pour interroger cette structure interne utilisent une syntaxe riche qui est détaillée dans cet article. Vous pouvez inspecter la structure des données enrichies dans des sessions de débogage. Les expressions qui interrogent la structure peuvent également être testées dans des sessions de débogage.
Tout au long de l’article, nous utilisons les données enrichies suivantes comme exemple. Ces données sont typiques du type de structure que vous obtenez quand vous enrichissez un document en utilisant un ensemble de compétences avec OCR, l’extraction de phrases clés, la traduction de texte, la détection de langue, la reconnaissance d’entités, ainsi qu’une compétence de génération de jetons personnalisée.
Chemin d’accès | Valeur |
---|---|
document |
|
merged_content |
« Study of BMN 110 in Pediatric Patients »... |
keyphrases |
|
[0] |
« Study of BMN » |
[1] |
« Syndrome » |
[2] |
« Pediatric Patients » |
... | |
locations |
|
[0] |
« IVA » |
translated_text |
« Études de BMN 110 chez les patients en pédiatrie »... |
entities |
|
[0] |
|
category |
« Organization » |
subcategory |
null |
confidenceScore |
0,72 |
length |
3 |
offset |
9 |
text |
« BMN » |
... | |
organizations |
|
[0] |
« BMN » |
language |
« en » |
normalized_images |
|
[0] |
|
layoutText |
... |
text |
|
words |
|
[0] |
« Étude » |
[1] |
« of » |
[2] |
« BMN » |
[3] |
« 110 » |
... | |
[1] |
|
layoutText |
... |
text |
|
words |
|
[0] |
« it » |
[1] |
« is » |
[2] |
« certainly » |
... | |
... | |
... |
Toutes les données se trouvent sous un élément racine, dont le chemin est "/document"
. L’élément racine est le contexte par défaut des compétences.
Les chemins simples dans le document enrichi interne peuvent être exprimés avec des jetons simples séparés par des barres obliques. Cette syntaxe est équivalente à la spécification du pointeur JSON.
Les propriétés des nœuds qui représentent les objets ajoutent leurs valeurs à l’arborescence sous le nom de la propriété. Ces valeurs peuvent être obtenues en ajoutant le nom de la propriété sous la forme d’un jeton séparé par une barre oblique :
Expression | Valeur |
---|---|
/document/merged_content/language |
"en" |
Les jetons de nom de propriété respectent la casse.
Des éléments spécifiques d’un tableau peuvent être référencés en utilisant leur index numérique comme nom de propriété :
Expression | Valeur |
---|---|
/document/merged_content/keyphrases/1 |
"Syndrome" |
/document/merged_content/entities/0/text |
"BMN" |
Deux caractères ont une signification particulière et doivent être échappés s’ils apparaissent dans une expression et qu’ils doivent être interprétés tel quel plutôt qu’avec leur signification particulière : '/'
et '~'
.
Ces caractères doivent être échappés respectivement avec '~0'
et '~1'
.
Un tableau de valeurs peut être obtenu en utilisant le jeton '*'
:
Expression | Valeur |
---|---|
/document/normalized_images/0/text/words/* |
["Study", "of", "BMN", "110" ...] |
Le jeton '*'
n’a pas besoin d’être à la fin du chemin. Vous pouvez énumérer tous les nœuds correspondant à un chemin avec une étoile au milieu ou avec plusieurs étoiles :
Expression | Valeur |
---|---|
/document/normalized_images/*/text/words/* |
["Study", "of", "BMN", "110" ... "it", "is", "certainly" ...] |
Cet exemple retourne une liste plate de tous les nœuds correspondants.
Vous pouvez conserver plus de structure et obtenir un tableau séparé pour les mots de chaque page en utilisant un jeton '#'
au lieu du deuxième jeton '*'
:
Expression | Valeur |
---|---|
/document/normalized_images/*/text/words/# |
[["Study", "of", "BMN", "110" ...], ["it", "is", "certainly" ...] ...] |
Le jeton '#'
indique que le tableau doit être traité comme une seule valeur au lieu d’être énuméré.
Il est souvent utile de traiter chaque élément d’un tableau séparément et d’avoir un ensemble différent d’entrées et de sorties de compétence pour chacun d’entre eux.
Pour ce faire, définissez le contexte de la compétence sur une énumération plutôt que sur la valeur par défaut "/document"
.
Dans l’exemple suivant, nous utilisons une des expressions d’entrée que nous avons utilisées précédemment, mais avec un contexte différent qui change la valeur obtenue.
Context | Expression | Valeurs |
---|---|---|
/document/normalized_images/* |
/document/normalized_images/*/text/words/* |
["Study", "of", "BMN", "110" ...] ["it", "is", "certainly" ...] ... |
Pour cette combinaison de contexte et d’entrée, la compétence est exécutée une fois pour chaque image normalisée : une fois pour "/document/normalized_images/0"
et une fois pour "/document/normalized_images/1"
. Les deux valeurs d’entrée correspondant à chaque exécution de compétence sont détaillées dans la colonne de valeurs.
Quand vous énumérez un tableau dans le contexte, toutes les sorties générées par la compétence sont également ajoutées au document sous forme d’enrichissements du contexte.
Dans l'exemple ci-dessus, une sortie nommée "out"
a ses valeurs pour chaque exécution ajoutée au document respectivement sous "/document/normalized_images/0/out"
et "/document/normalized_images/1/out"
.
Les entrées de compétence peuvent prendre des valeurs littérales comme entrées au lieu de valeurs dynamiques interrogées à partir du document existant. Pour ce faire, ajoutez un signe égal en préfixe de la valeur. Les valeurs peuvent être des nombres, des chaînes ou des valeurs booléennes.
Les valeurs de chaîne doivent être placées entre guillemets simples '
ou doubles "
.
Expression | Valeur |
---|---|
=42 |
42 |
=2.45E-4 |
0.000245 |
="some string" |
"some string" |
='some other string' |
"some other string" |
="unicod\u0065" |
"unicode" |
=false |
false |
Si une certaine entrée de compétence nécessite un tableau de données, mais que les données sont représentées sous la forme d’une valeur unique actuellement ou que vous devez combiner plusieurs valeurs uniques dans un champ de tableau, vous pouvez créer une valeur de tableau inline dans le cadre d’une expression d’entrée de compétence en encapsulant une liste séparée par des virgules d’expressions entre crochets ([
et ]
). La valeur de tableau peut être une combinaison de chemins d’expression ou de valeurs littérales si nécessaire. Vous pouvez également créer des tableaux imbriqués dans des tableaux de cette façon.
Expression | Valeur |
---|---|
=['item'] |
["item"] |
=[$(/document/merged_content/entities/0/text), 'item'] |
["BMN", "item"] |
=[1, 3, 5] |
[1, 3, 5] |
=[true, true, false] |
[true, true, false] |
=[[$(/document/merged_content/entities/0/text), 'item'],['item2', $(/document/merged_content/keyphrases/1)]] |
[["BMN", "item"], ["item2", "Syndrome"]] |
Si la compétence a un contexte qui explique comment exécuter la compétence par entrée de tableau (autrement dit, comment "context": "/document/pages/*"
signifie que la compétence s’exécute une fois par « page » dans pages
) puis en passant cette valeur en tant qu’expression comme entrée à un tableau de lignes utilise l’une de ces valeurs à la fois.
Pour obtenir un exemple avec nos exemples de données enrichies, si votre compétence context
est /document/merged_content/keyphrases/*
et que vous créez un tableau inline des éléments suivants =['key phrase', $(/document/merged_content/keyphrases/*)]
sur une entrée de cette compétence, la compétence est exécutée trois fois, une fois avec une valeur ["key phrase", "Study of BMN"], une autre avec une valeur ["key phrase", "Syndrome"] et enfin avec une valeur ["key phrase", "Pediatric Patients"]. La valeur littérale « phrase clé » reste la même à chaque fois, mais la valeur du chemin d’accès d’expression change avec chaque exécution de compétence.
Vous pouvez combiner des valeurs en utilisant des opérateurs unaires, binaires et ternaires.
Les opérateurs peuvent combiner des valeurs littérales et des valeurs résultant de l’évaluation du chemin.
Quand ils sont utilisés dans une expression, les chemins doivent être placés entre "$("
et ")"
.
Expression | Valeur |
---|---|
=!false |
true |
Expression | Valeur |
---|---|
=-42 |
-42 |
=-$(/document/merged_content/entities/0/offset) |
-9 |
Expression | Valeur |
---|---|
=2+2 |
4 |
=2+$(/document/merged_content/entities/0/offset) |
11 |
Expression | Valeur |
---|---|
=2-1 |
1 |
=$(/document/merged_content/entities/0/offset)-2 |
7 |
Expression | Valeur |
---|---|
=2*3 |
6 |
=$(/document/merged_content/entities/0/offset)*2 |
18 |
Expression | Valeur |
---|---|
=3/2 |
1.5 |
=$(/document/merged_content/entities/0/offset)/3 |
3 |
Expression | Valeur |
---|---|
=15%4 |
3 |
=$(/document/merged_content/entities/0/offset)%2 |
1 |
Expression | Valeur |
---|---|
=15<4 |
false |
=4<=4 |
true |
=15>4 |
true |
=1>=2 |
false |
Expression | Valeur |
---|---|
=15==4 |
false |
=4==4 |
true |
=15!=4 |
true |
=1!=1 |
false |
Expression | Valeur |
---|---|
=true&&true |
true |
=true&&false |
false |
=true||true |
true |
=true||false |
true |
=false||false |
false |
=true^false |
true |
=true^true |
false |
Vous pouvez attribuer des valeurs différentes à une entrée en fonction de l’évaluation d’une expression booléenne en utilisant l’opérateur ternaire.
Expression | Valeur |
---|---|
=true?"true":"false" |
"true" |
=$(/document/merged_content/entities/0/offset)==9?"nine":"not nine" |
"nine" |
Les opérateurs sont évalués avec des priorités qui correspondent aux conventions habituelles : les opérateurs unaires, puis la multiplication, la division et le modulo, puis l’addition et la soustraction, puis la comparaison, puis l’égalité, puis les opérateurs logiques. Les règles d’associativité habituelles s’appliquent également.
Vous pouvez utiliser des parenthèses pour changer ou lever l’ambiguïté de l’ordre d’évaluation.
Expression | Valeur |
---|---|
=3*2+5 |
11 |
=3*(2+5) |
21 |