Entités pour la plateforme Yandex.Dialogues

Un hackathon en ligne pour développer les compétences d'Alice a eu lieu samedi dernier. Il est dommage que personne n'ait écrit sur les résultats ici, il est curieux de lire les histoires des gagnants. Mais comme il n'y avait pas de volontaires, je vais partager mon histoire.



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 figiqui 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 entitieset 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.



All Articles