Quelques fonctionnalités du développement des compétences pour Alice



Vous vivez à Moscou et conduisez votre voiture? Si oui, comment payez-vous le stationnement? Envoyer des SMS? Payer via l'application Moscow Parking? Utilisez le bot dans Telegram? «Tout cela est inconfortable», ai-je décidé, et j'ai créé mon habileté pour Alice de payer pour le stationnement par la voix. De plus, Alice est déjà intégrée à Yandex.Navigator. Maintenant, vous pouvez simplement dire au navigateur quelque chose comme "Alice, demandez à Moscow Parking de payer le parking 3209 pendant 30 minutes ".

Qu'est-ce que j'ai rencontré lors du développement d'une compétence?

La session


Pour démarrer la compétence à partir d'un développeur tiers, Alice doit dire "Alice, lance la compétence telle ou telle chose". C'est bon et pratique si vous avez une longue communication avec la compétence - par exemple, le jeu démarre. Si vous avez besoin de dire une phrase, d’obtenir une réponse et c’est tout, alors «saisir une compétence» n’est pas pratique - avec cette entrée, lorsque vous aurez fini de travailler avec une compétence, vous devrez la «quitter».

Pour une phrase, il y a une solution des développeurs d'Alice - vous devez dire: «Alice demande la compétence pour faire telle ou telle chose ». Cependant, l' exemple python des développeurs d'Alice ne prend pas en charge un tel lancement de compétence:

if req['session']['new']: # -  return 

Chaque fois qu'une compétence est lancée, incl. et avec la commande "Alice demande une compétence ...", la valeur de session.new est True . Par conséquent, tous les codes de traitement ultérieurs ne seront pas exécutés. La solution consiste à vérifier le texte de session.command - il doit être vide.

Soit dit en passant, si vous avez «entré» une compétence, puis par défaut pour toutes les compétences, Alice prend en charge les phrases de sortie - «Alice, arrêtez-la» et «Alice, revenez». Si vous souhaitez terminer la session avec force avec la compétence, vous devez transmettre end_session égal à True dans la réponse. Mais cela ne fonctionne qu'avec Yandex.Station - sur d'autres appareils, la sortie de la compétence dans ce cas ne fonctionne pas.

Travailler avec des nombres


Ma compétence consiste à travailler avec des chiffres - d'abord reconnaître le numéro de téléphone de l'utilisateur, puis reconnaître le numéro de stationnement.

Dans l'exemple ci-dessus de Yandex utilisé

 req['request']['original_utterance'].lower() 

pour travailler avec une demande de l'utilisateur. Tout d'abord, j'ai utilisé ce champ de la demande. Afin de reconnaître le numéro de téléphone de l'utilisateur, j'ai dû lui demander de nommer chaque chiffre du numéro séparément - par exemple, «neuf un six un deux trois quatre cinq six sept». Et dans le code - remplacez les valeurs de texte ("neuf") par numérique (9). Il s'est avéré encore plus drôle avec le code de stationnement - j'appelle le code "3209" comme "trente-deux zéro neuf", il y avait beaucoup de remplacements dans le code comme

 s.replace(' ', '32').replace(' ', '31').replace('', '0') 

Étant donné que sur la base du texte de la demande dans le code de compétence, j'ai essayé de comprendre ce que l'utilisateur veut (la machine d'état n'est pas utilisée dans la compétence), j'ai dû faire cette conversion avec presque toutes les (!) Demandes d'utilisateurs.

Il s'est avéré que les serveurs d'Alice font déjà tout pour vous (et même plus). Juste au lieu de request.original_utterance, vous devez utiliser request.command . Oui, cela est indiqué dans la documentation. Dans l'info-bulle de l'exemple de réponse.
Champ de service: demande utilisateur convertie pour le traitement interne d'Alice. Pendant la conversion, le texte, en particulier, est effacé des signes de ponctuation et les chiffres sont convertis en nombres.
Il est étrange que dans l'exemple des développeurs d'Alice (lien ci-dessus) le texte original soit utilisé ( request.original_utterance ). En fait, encore plus est fait dans request.command (qui n'est pas décrit dans la documentation). Par exemple, un numéro de téléphone est converti au format (916) 123-45-67 - maintenant l'utilisateur de ma compétence peut appeler le téléphone dans n'importe quel format qui lui convient. De plus, les phrases «Alice, demandez telle ou telle compétence», les messages «Alice» sont supprimés, les fautes de frappe sont corrigées.

Du côté d'Alice, des parties individuelles des demandes (numéros, noms, adresses, dates) peuvent être converties en entités nommées . Mais ça marche bizarre. Demande 79161234567 1234 , en entités nommées converties en deux nombres - 791612345 70 et 1234 . Pourquoi le premier numéro s'avère différent, il n'a pas été possible de le savoir - ceux-là. Le support Yandex.Dialog réfléchit toujours à la réponse.

Temps de réponse des compétences


Alice attend une réponse de la compétence dans les 3 secondes (Google a cette limite - 5/10 secondes ). Ma compétence consiste à accéder à des serveurs tiers pour démarrer et terminer le stationnement. Ils répondent lentement. Parfois, en 3 secondes, ma compétence n'a pas le temps de répondre. Individuellement, il n'a pas été possible d'augmenter le temps de réponse de la compétence. Par conséquent, dans certains cas, il a fallu sacrifier la commodité - par exemple, au début du stationnement, la compétence ne demande pas la voiture réelle spécifiée dans le profil de l'application Parking Moscou, mais utilise celle qu'elle a conservée lors de l'autorisation de l'utilisateur.

Eh bien, sur les droits de "je suis PR";) -

Source: https://habr.com/ru/post/fr471388/


All Articles