Je fais une interface vocale pour gérer un compte de courtage, j'en ai déjà écrit sur Habré - Alice, acheter Yandex . À un moment donné, j'ai dû extraire le prix dans différentes devises de la demande. Je suis sûr que je ne suis pas le premier à faire face à une telle tâche, j'ai donc essayé de trouver des intentions prêtes à l'emploi ou des entités nommées sur GitHub, mais je n'ai rien trouvé. Il y avait un hackathon au nez, de nombreux développeurs au même endroit, je pensais, si tout le monde partage ses meilleures pratiques, alors il y aura toute une bibliothèque d'entités. C'est ainsi qu'est née l'idée du référentiel de bibliothèques d'entités.
Entités personnalisées dans les boîtes de dialogue
Quand je dis à la colonne intelligente «acheter une action Yandex», le discours passe par la magie intérieure de la plate-forme Yandex.Dialogi, puis va au crochet Web, que j'ai spécifié comme gestionnaire de compétences. Voici ce qui entre dans le gestionnaire:
"request": {
"command": " ",
"original_utterance": " ",
"nlu": {
"tokens": [
"",
"1",
"",
""
],
...
"intents": {
"market.order": {
"slots": {
"amount": {
"type": "YANDEX.NUMBER",
"tokens": {
"start": 1,
"end": 2
},
"value": 1
},
"unit": {
"type": "OperationUnit",
"tokens": {
"start": 2,
"end": 3
},
"value": "share"
},
"figi": {
"type": "EFigi",
"tokens": {
"start": 3,
"end": 4
},
"value": "BBG006L8G4H1"
},
"operation": {
"type": "OperationType",
"tokens": {
"start": 0,
"end": 1
},
"value": "buy"
}
}
}
}
},
...
},
Faites attention à l'emplacement
figi
qui contient l'identifiant de l'action Yandex, le soi-disant FIGI (Financial Instrument Global Identifier), qui est nécessaire pour interagir avec l'API de la plateforme de trading Tinkoff Investments. Le type de données EFigi est une entité personnalisée que j'ai décrite dans la section Entités lors de la création d'une compétence sur la plateforme Yandex.Dialogi. Voici un extrait de la description:
entity EFigi:
values:
BBG005DXJS36:
%exact
TCS
%lemma
()?
()?
()?
()?
BBG006L8G4H1:
%exact
YNDX
%lemma
BBG004730JJ5:
%exact
MOEX
%lemma
BBG002B2J5X0:
%exact
KRKNP
%lemma
[ ]
[ ]
...
Grâce au mécanisme d'entité, dans le code du gestionnaire, je n'ai pas besoin de faire de manipulations supplémentaires sur les données d'entrée pour obtenir FIGI. La plate-forme de dialogue convertit le nom de la sécurité en FIGI pour moi.
J'utilise EFigi comme grammaire non terminale et type de slot dans les intentions. Les intentions sont des expressions régulières sur les stéroïdes dans les dialogues. Les intentions aident les dialogues à comprendre quelles données doivent être extraites de la demande de l'utilisateur et transmises au gestionnaire. Voici un exemple d'intention pour la commande d'acheter / vendre des titres en bourse à un prix de marché:
slots:
operation:
source: $Operation
type: OperationType
figi:
source: $Stock
type: Efigi
amount:
source: $Amount
type: YANDEX.NUMBER
unit:
source: $Unit
type: OperationUnit
root:
$Operation [$Amount $Unit $Stock]
$Operation:
$OperationType
$Amount:
$YANDEX.NUMBER
$Unit:
$OperationUnit
$Stock:
$EFigi
Ceci est similaire aux expressions régulières.
Bibliothèque d'entités pour les dialogues
Lors du hackathon pour développer les compétences d'Alice, j'ai créé le référentiel alice- entity-library, y ai poussé l'entité EFigi et je suis allé sur GitHub pour rechercher des référentiels contenant une description des entités personnalisées. Je m'attendais à trouver des centaines de référentiels, à contacter les développeurs et à proposer d'envoyer des pull requests à la bibliothèque d'entités.
J'ai recherché des référentiels par balises: yandex-dialogs, alice-skills, yandex-alice et alice-sdk. Il s'est avéré que très peu de personnes utilisent des balises sur GitHub, je n'ai pu trouver qu'un seul référentiel contenant un fichier décrivant l'entité ELang. Par coïncidence, l'auteur du référentiel s'est avéré être David, l'un des organisateurs du hackathon. J'ai suggéré à David d'ajouter l'entité ELang à la bibliothèque et j'ai reçu une demande d'extraction de sa part quelques minutes plus tard.
D'autres membres du hackathon en ligne ont ignoré mes messages de chat avec une proposition de reconstituer la bibliothèque d'entités. Peut-être qu'au milieu de la lutte, il n'y avait pas de temps pour cela. Pour être honnête, j'ai été un peu frustré, mais à la fin j'ai ajouté un lien vers le référentiel à sameoldmadness / awesome-alice .
Au lieu d'une conclusion
Chers développeurs de compétences Alice, veuillez télécharger le code source sur GitHub chaque fois que cela est possible afin que les autres puissent apprendre.
Veuillez ajouter les balises yandex-dialogs, alice-skills et yandex-alice aux dépôts afin que les autres puissent trouver vos compétences sur GitHub.
Créez un répertoire dans votre référentiel
entities
et placez-y les fichiers de description d'entité que vous avez écrits pour la compétence afin que d'autres puissent réutiliser votre travail.
Avant de décrire une nouvelle entité, jetez un œil à la bibliothèque d'entités , elle contient peut-être déjà ce dont vous avez besoin. Et sinon, ajoutez vos entités à la bibliothèque.