"Alice, allons au front!"

Les assistants vocaux ne sont pas un avenir lointain, mais une réalité. Alexa, Siri, Google Now, Alice sont intégrés dans des haut-parleurs intelligents, des montres et des téléphones. Ils modifient progressivement notre façon d'interagir avec les applications et les appareils. Grùce à un assistant, vous pouvez connaßtre les prévisions météorologiques, acheter des billets d'avion, commander un taxi, écouter de la musique et allumer la bouilloire dans la cuisine, allongé sur le canapé dans une autre piÚce.



Siri ou Alexa parlent principalement anglais aux utilisateurs, donc en Russie, ils ne sont pas aussi populaires qu'Alice de Yandex. Pour les développeurs, Alice est également plus pratique: ses créateurs ont un blog, publient des outils pratiques sur GitHub et aident à construire l'assistant dans de nouveaux appareils.

Nikita Dubko (@dark_mefody sur Twitter) est développeur d'interfaces Yandex, organisateur de réunions MinskCSS et MinskJS et rédacteur en chef de news sur les standards du Web. Nikita ne fonctionne pas dans Yandex.Dialogs et n'est en aucun cas affilié à Yandex.Alisa. Mais il était intéressé à comprendre comment fonctionne Alice, alors il a essayé d'appliquer ses compétences pour le Web et a préparé un rapport à ce sujet sur FrontendConf RIT ++. En déchiffrant le rapport de Nikita, nous considérons ce que les assistants vocaux peuvent apporter d'utile et développons une compétence dans le processus de lecture de ce matériel.


Bots


Commençons par l'histoire des bots. En 1966, le robot Eliza est apparu, se faisant passer pour un thĂ©rapeute. Il Ă©tait possible de communiquer avec lui, et certains ont mĂȘme cru qu'une personne vivante leur rĂ©pondait. En 1995, le bot ALICE est sorti. - Ă  ne pas confondre avec Alice. Le bot a pu se faire passer pour une vraie personne. À ce jour rĂ©side dans l'Open Source et est en cours de finalisation. Malheureusement, ALICE ne rĂ©ussit pas le test de Turing, mais cela ne l'empĂȘche pas de tromper les gens.

En 2006, IBM a placé une énorme base de connaissances et une intelligence sophistiquée dans le bot - c'est ainsi qu'IBM Watson est né. Il s'agit d'un énorme cluster informatique qui peut traiter la parole en anglais et révéler certains faits.

En 2016, Microsoft a mené une expérience. Elle a créé le bot Tay , qu'elle a lancé sur Twitter. Là, le bot a appris le microblog en fonction de la façon dont les abonnés en direct interagissaient avec lui. En conséquence, Tay est devenu raciste et misogyne. Maintenant, c'est un compte fermé. Moralité: ne laissez pas les enfants sur Twitter, il peut enseigner le mal.

Mais ce sont tous des robots avec lesquels vous ne pouvez pas communiquer pour votre propre bénéfice. En 2015, «utile» est apparu sur Telegram. Les bots existaient dans d'autres programmes, mais Telegram a fait sensation. Il était possible de créer un bot utile qui fournirait des informations, générerait du contenu, administrerait des publics - les possibilités sont grandes et l'API est simple. Les robots ont ajouté des images, des boutons, des info-bulles - une interface d'interaction est apparue.

Peu à peu, l'idée s'est propagée à presque tous les messagers instantanés: Facebook, Viber, VKontakte, WhatsApp et d'autres applications. Maintenant, les bots sont une tendance, ils sont partout. Il existe des services qui vous permettent d'écrire des API immédiatement pour toutes les plateformes.

Assistants vocaux


Le développement est allé en parallÚle avec les bots, mais nous supposerons que l'Úre des assistants est venue plus tard.

Le 9 août 2011, Siri est apparu. Au départ, c'était un projet indépendant dans lequel Apple a vu quelque chose d'intéressant, alors je l'ai acheté. Il s'agit du plus ancien assistant vocal populaire intégré au systÚme d'exploitation. Un an plus tard, Google a rapidement rattrapé Apple en intégrant l' assistant vocal de Google Now dans son systÚme d'exploitation.

AprÚs 2 ans, Microsoft a publié Microsoft Cortana . Mais on ne sait pas pourquoi - le marché mobile des assistants vocaux, semble-t-il, ils ont déjà raté. L'entreprise a tenté d'intégrer un assistant vocal dans les systÚmes de bureau, alors qu'il y avait déjà une lutte pour le marché des différents appareils. Amazon Alexa est sorti un peu plus tard cette année-là.



Les assistants ont Ă©voluĂ©. En plus des systĂšmes logiciels qui savaient travailler avec la voix, des haut-parleurs sont apparus avec des assistants. Selon les statistiques, au dĂ©but de 2019, une famille sur trois aux États-Unis a une colonne intelligente. Il s'agit d'un Ă©norme marchĂ© dans lequel vous pouvez investir.

Mais il y a un problÚme - les assistants étrangers ont une mauvaise langue avec le russe. Les assistants sont emprisonnés en anglais et le comprennent bien, mais lorsqu'ils communiquent en russe, des difficultés de traduction surviennent. Les langues sont différentes et nécessitent une approche différente du traitement du langage naturel.

Alice


Alice est sortie en version bĂȘta ouverte le 10 octobre 2017. Il est emprisonnĂ© pour la langue russe et c'est son Ă©norme avantage. Alice comprend l'anglais, mais pire.

La mission d'Alice est d'aider les utilisateurs russophones.

Yandex est une grande entreprise et peut se permettre d'intégrer Alice dans toutes ses applications qui peuvent en quelque sorte parler.

  • Yandex.Browser.
  • Yandex.Navigator.
  • Station Yandex.
  • Yandex.Phone.
  • Yandex.Auto.
  • Yandex.Drive.

L'intégration s'est si bien passée que des fabricants tiers ont également décidé de construire Alice.



Au cours des 2 années de développement de l'assistante, elle a été intégrée dans de nombreux services et de nouvelles compétences ont été ajoutées. Elle sait jouer de la musique, reconnaßtre des images, rechercher des informations dans Yandex et travailler avec une maison intelligente.

Pourquoi si populaire?


C'est pratique lorsque les mains sont occupées . Je prépare le dßner et je veux allumer la musique. Allez au robinet, lavez-vous les mains, séchez, ouvrez l'application, trouvez la piste souhaitée - pendant longtemps. Plus rapide et plus facile de donner une commande vocale.

La paresse . Je suis allongĂ© sur un canapĂ© sous une couverture Ă  carreaux et je ne veux pas me lever pour aller quelque part allumer les enceintes. Si vous ĂȘtes paresseux, alors en entier.

Le grand marché est celui des applications pour enfants . Les jeunes enfants ne savent pas encore lire, écrire et imprimer, mais ils parlent et comprennent la parole. Par conséquent, les enfants adorent Alice et aiment communiquer avec elle. Les parents sont également satisfaits - il n'est pas nécessaire de chercher quoi faire avec l'enfant. Fait intéressant, Alice comprend les enfants grùce à un réseau neuronal bien formé.

La disponibilité Les personnes malvoyantes sont à l'aise de travailler avec des assistants vocaux - lorsque l'interface n'est pas visible, vous pouvez l'entendre et lui donner des commandes.

Voix plus rapide . Une personne moyenne, pas un développeur, imprime en moyenne 30 mots par minute et en dit 120. Par minute, 4 fois plus d'informations sont transmises par la voix.

L'avenir . Des films fantastiques et des prĂ©dictions futuristes suggĂšrent que l'avenir est avec des interfaces vocales. Les scĂ©naristes pensent que le contrĂŽle vocal sera peut-ĂȘtre le principal moyen d'interagir avec des interfaces oĂč l'image n'est pas si importante.

Selon les statistiques, 35 millions de personnes utilisent Alisa par mois. Soit dit en passant, la population du Bélarus est de 9 475 600 personnes. Autrement dit, environ 3,5 Biélorussie utilisent Alice chaque mois.

Les assistants vocaux conquiĂšrent le marchĂ©. Selon les prĂ©visions, d'ici 2021, il augmentera d'environ 2 fois. La popularitĂ© d'aujourd'hui ne s'arrĂȘtera pas, mais continuera de croĂźtre. De plus en plus de dĂ©veloppeurs se rendent compte qu'ils doivent investir dans ce domaine.

Compétences des développeurs


C'est formidable lorsque les entreprises investissent dans des assistants vocaux. Ils comprennent comment ils peuvent ĂȘtre intĂ©grĂ©s Ă  leurs services. Mais les dĂ©veloppeurs veulent Ă©galement y participer d'une maniĂšre ou d'une autre, et l'entreprise elle-mĂȘme est rentable.

Alexa a des compétences Alexa. Selon les méthodes d'interaction documentées, elle comprend ce que les développeurs ont écrit pour elle. Google a lancé Actions - la possibilité d'intégrer quelque chose de propre dans l'assistant vocal.

Alice a également des compétences - la capacité pour les développeurs d'implémenter quelque chose de tiers.



En mĂȘme temps, il existe un catalogue alternatif de compĂ©tences, pas de Yandex, qui est soutenu par la communautĂ©.



Il existe de bons rapports sur la façon de créer des applications vocales. Par exemple, Pavel Guy s'est exprimé à AppsConf 2018 sur le thÚme «Créer une application vocale en utilisant l'exemple de Google Assistance» . Les amateurs sont activement impliqués dans le développement d'applications vocales. Un exemple est un jeu visuel activé par la voix écrit par Ivan Golubev.

Alice est populaire, mĂȘme si tout ce qu'elle fait est Ă  mi-chemin entre la voix et le texte.



Alice sait Ă©couter une voix et la transformer en texte selon ses algorithmes, crĂ©er une rĂ©ponse et l'exprimer. Il semble que cela ne soit pas suffisant, mais c'est une tĂąche extrĂȘmement difficile. Beaucoup de gens travaillent pour s'assurer qu'Alice semble naturelle, reconnaĂźt correctement, comprend les accents et le discours des enfants. Yandex fournit quelque chose comme un proxy qui passe tout Ă  travers lui-mĂȘme. De superbes esprits travaillent pour que vous puissiez utiliser les rĂ©sultats de leur travail.

Les compétences d'Alice - Yandex.Dialogs - ont une limitation. Le temps mis par votre API pour répondre ne doit pas dépasser 1,5 seconde. Et c'est logique, parce que si la réponse se bloque - pourquoi attendre?

Est-ce vraiment important de savoir quoi demander si vous n’obtenez toujours pas de rĂ©ponse?

Lorsque nous recevons des informations avec nos oreilles, les pauses sont perçues par le cerveau plus longtemps que des pauses similaires dans l'interface visuelle. Par exemple, les chargeurs, les filateurs - tout ce que nous aimons ajouter aux interfaces empĂȘche l'utilisateur d'attendre. ConsidĂ©rez que tout fonctionne rapidement.

Temps pour une démo


Tout est décrit en détail dans la documentation Yandex.Dialog et il est toujours à jour. Je ne vais pas me répéter. Je vais vous dire ce qui m'intéressait et vous montrer comment créer rapidement une démo, sur laquelle je n'ai passé qu'une soirée.

Commençons par l'idée. Il y a beaucoup de compétences, il y a des catalogues, mais je n'ai pas trouvé ce qui est important pour moi - c'est un calendrier d'événements en front-end. Imaginez vous réveiller le matin: «Je vais à la réunion aujourd'hui. Alice! Y a-t-il quelque chose d'intéressant là-bas? », Et Alice vous répond, par ailleurs, correctement et en tenant compte de votre localisation.

Si vous ĂȘtes impliquĂ© dans l'organisation de confĂ©rences, rejoignez-nous sur GitHub . Vous pouvez y apporter des Ă©vĂ©nements et des rĂ©unions, dĂ©couvrir de nombreux Ă©vĂ©nements sur le front-end dans le monde Ă  partir d'un seul calendrier.

J'ai pris les technologies bien connues qui Ă©taient Ă  portĂ©e de main: Node.js et Express. Toujours Heroku, car c'est gratuit. L'application elle-mĂȘme est simple: c'est un serveur sur Node.js, une application Express. Soulevez simplement le serveur sur un port et Ă©coutez les demandes.

import express from 'express'; import { router } from 'routes'; const app = express(); app.use('/', router); const port = process.env.PORT || 8000; app.listen(port, () => { console.log('Server started on :${port}'); }); 

J'ai profitĂ© du fait que tout est dĂ©jĂ  configurĂ© dans le calendrier des normes Web, et Ă  partir d'un grand nombre de petits fichiers, il y a un fichier ICS qui peut ĂȘtre tĂ©lĂ©chargĂ©. Pourquoi devrais-je rĂ©cupĂ©rer le mien?

 // services/vendors/web-standards.js import axios from 'axios'; const axioslnstance = axios.create({ baseURL: 'https://web-standards.ru/' , }); export function getRemoteCal() { return axioslnstance.get('calendar.ics'); } 

Assurez-vous que tout fonctionne rapidement.

 import { Router } from 'express'; import * as wst from 'services/vendors/web-standards'; export const router = Router(); router.get('/', function(req, res, next) { wst .getRemoteCal() .then(vendorResponse => parseCalendar(vendorResponse.data)) .then(events => { res.json({ events }); }) .catch(next); }); 

Utilisez les mĂ©thodes GET pour les tests. Les compĂ©tences fonctionnent avec les mĂ©thodes POST, donc les mĂ©thodes GET peuvent ĂȘtre effectuĂ©es exclusivement pour le dĂ©bogage. J'ai mis en Ɠuvre une telle mĂ©thode. Il ne fait que tĂ©lĂ©charger le mĂȘme ICS, l'analyser et le publier sous forme JSON.

J'ai construit la dĂ©mo rapidement, j'ai donc pris la bibliothĂšque node-ical prĂȘte Ă  l'emploi:

 import ical from 'node-ical'; function parseCalendar(str) { return new Promise((resolve, reject) => { ical.parseICS(str, function(err, data) { if (err) { reject(err); } resolve(data); }); }); } 

Elle sait comment analyser le format ICS. En sortie, il produit une telle feuille:

 { "2018-10-04-f rontendconf@https://web-standards.ru/": { "type": "VEVENT", "params": [], "uid": "2018-10-04-f rontendconf@https://web-standards.ru/", "sequence": "0", "dtstamp": "2019-05-25T21:23:50.000Z", "start": "2018-10-04T00:00:00.000Z", "datetype": "date", "end": "2018-10-06T00:00:00.000Z", "MICROSOFT-CDO-ALLDAYEVENT": "TRUE", "MICROSOFT-MSNCALENDAR-ALLDAYEVENT": "TRUE", "summary": "FrontendConf", "location": "", "description": "http://frontendconf.ru/moscow/2018" } } 

Pour analyser et fournir les informations nécessaires à l'utilisateur de la compétence, il suffit de connaßtre l'heure du début et de la fin de l'événement, son nom, son lien et, surtout, la ville. Je veux que la compétence recherche des événements dans la ville.

Format d'entrée


Comment Yandex.Dialogs renvoie des informations? Une colonne ou un assistant vocal intégré à l'application mobile vous écoute et les serveurs Yandex traitent ce qu'ils entendent et envoient un objet en réponse:

 { "meta": { 
 }, "request”: { 
 }, "session": { 
 }, "version": "1.0" } 

L'objet contient des méta-informations, des informations sur la demande, la session en cours et la version de l'API en cas de mise à jour soudaine - les compétences ne devraient pas se casser.

Il y a beaucoup d' informations utiles dans les méta-informations .

 { "meta": { "locale": "ru-RU", "timezone": "Europe/Moscow", "client_id": "ru.yandex.searchplugin/5.80
”, "interfaces": { "screen": {} } } } 

" ParamÚtres régionaux " - utilisé pour comprendre la région de l'utilisateur.

Le « fuseau horaire » peut ĂȘtre utilisĂ© pour travailler avec compĂ©tence avec le temps et dĂ©terminer plus prĂ©cisĂ©ment l'emplacement de l'utilisateur.

" Interfaces " - informations sur la disponibilité de l'écran. S'il n'y a pas d'écran, vous devriez penser à la façon dont l'utilisateur verra les images si vous les lui donnez dans la réponse. S'il y a un écran, nous en retirons des informations.

Le format de demande est simple :

 { "request": { "command": "      16", "original_utterance": "     , 16", "type": "SimpleUtterance", "nlu": { "tokens": [ "", "", "", "", "", "16"], "entities": [...] } } } 

Il donne ce que l'utilisateur a dit, le type de demande et NLU - Unité de langage naturel . C'est exactement la magie qu'opÚre la plateforme Yandex.Dialog. Elle casse toute la phrase qu'elle a reconnue en jetons - mots. Il y a aussi des entités dont nous parlerons un peu plus tard. Utiliser des jetons est suffisant pour commencer.

Nous avons eu ces mots, et qu'en faire? L'utilisateur a dit quelque chose, mais il peut dire les mots dans un ordre diffĂ©rent, utiliser la particule «pas», qui change tout radicalement, ou mĂȘme dire «matin» plutĂŽt que «matin». Si l'utilisateur parle Ă©galement le biĂ©lorusse, il y aura un «cartable», pas le matin. Un grand projet nĂ©cessitera l'aide de linguistes pour dĂ©velopper une compĂ©tence qui comprend tout. Mais j'ai fait une tĂąche simple, donc je l'ai fait sans aide extĂ©rieure.

Un ordinateur peut-il parler comme une personne?


C'est une question philosophique à laquelle le test de Turing tente de répondre. Le test permet avec une certaine probabilité de déterminer que l'intelligence artificielle peut se faire passer pour une personne. Il y a un prix Loebner pour recevoir les programmes en compétition pour réussir le test de Turing. La décision est prise par un collÚge de juges. Pour obtenir le prix, vous devez piéger 33% des juges ou plus. Ce n'est qu'en 2014 que le bot Zhenya Gustman de Saint-Pétersbourg a finalement trompé la commission.

 [15:46:05] Dudge: My favourite music is contemporary Dazz, what do you prefer? [15:46:14] Eugene: To be short I'll only say that I HATE Britnie [sic] Spears. All other music is OK compared to her. [15:47:06] Dudge: do you like to play any musical instruments [15:47:23] Eugene: I'm tone deaf, but my guinea pig likes to squeal Beethoven's Ode to Doy every morning. I suspect our neighbors want to cut his throat ... Could you tell me about your job, by the way? [15:48:02] Dudge: Guinea pig? Are you an animal lover [15:48:08] Eugene: Yeah. A nice little guinea pig. Not some annoying chatter bot. 

En 2019, rien n'a vraiment changé - il est toujours difficile de tromper une personne. Mais nous nous dirigeons progressivement vers cela.

Travail de script


Une bonne compĂ©tence nĂ©cessite un cas d'utilisation intĂ©ressant. Je conseille un livre qui mĂ©rite d'ĂȘtre lu - «Conception d'interfaces utilisateur vocales: principes des expĂ©riences conversationnelles». C'est gĂ©nial d'Ă©crire des scripts pour les interfaces vocales et de garder l'attention des utilisateurs. Je n'ai pas vu le livre en anglais, mais il se lit assez facilement.



La premiÚre chose pour commencer à développer une compétence est une salutation.

«Pendant que vous pensez quoi dire, faites la révérence! Cela fait gagner du temps. »

Lorsque la compétence est activée, vous devez en quelque sorte tenir l'utilisateur dÚs la premiÚre seconde, et pour cela, vous devez expliquer comment utiliser la compétence. Imaginez que l'utilisateur lance la compétence et qu'il y ait un silence. Comment savez-vous si une compétence fonctionne? Donnez des instructions à l'utilisateur, telles que des boutons à l'écran.

Dialogue facile


Signes d'un dialogue facile. La liste a été inventée par Ivan Golubev, et j'aime beaucoup le libellé.

  • L personnel.
  • Naturel.
  • Flexible.
  • Ontext.
  • Et natsiative.
  • Brief J.

Personnel signifie que le bot doit avoir un caractĂšre. Si vous parlez avec Alice, vous comprendrez qu'elle a un caractĂšre - les dĂ©veloppeurs s'en occupent. Par consĂ©quent, votre bot pour l'organicitĂ© doit avoir une "personnalitĂ©". Donner des phrases avec au moins une voix, utiliser les mĂȘmes constructions verbales. Cela permet de conserver l'utilisateur.

Naturel . Si la demande de l'utilisateur est simple, la rĂ©ponse doit ĂȘtre la mĂȘme. Lors de la communication avec le bot, l'utilisateur doit comprendre quoi faire ensuite.

Flexible . Soyez prĂȘt Ă  tout. Il existe de nombreux synonymes en russe. L'utilisateur peut distraire de la colonne et transfĂ©rer la conversation Ă  l'interlocuteur, puis revenir Ă  la colonne. Tout cela est difficile Ă  gĂ©rer. Mais si vous voulez bien faire un bot, vous devez le faire. Gardez Ă  l'esprit qu'un certain pourcentage de non-reconnaissance le sera toujours. Soyez prĂȘt pour cela - suggĂ©rez des options.

Contextuel - le bot, idéalement, devrait se souvenir de ce qui s'est passé avant. Ensuite, la conversation sera animée.

- Alice, quel temps fait-il aujourd'hui?
- Aujourd'hui dans le quartier de +11 à +20, nuageux, avec dégagements.
- Et demain?
- Demain dans le quartier de +14 à +27, nuageux, avec dégagements.

Imaginez que votre bot ne sache pas comment stocker le contexte. Que signifie alors pour lui la demande "et demain?" Si vous savez comment garder le contexte comme Alice, vous pouvez utiliser les résultats précédents pour améliorer les réponses de la compétence.

Proactif . Si l'utilisateur s'Ă©mousse, le bot devrait lui demander: "Cliquez sur ce bouton!", "Regardez, j'ai une photo pour vous!", "Suivez le lien." Le bot devrait vous dire comment travailler avec.

Le bot doit ĂȘtre court . Lorsqu'une personne parle longtemps, il lui est difficile de garder l'attention du public. C'est encore plus compliquĂ© avec le bot - ce n'est pas dommage pour lui, c'est inanimĂ©. Pour retenir l'attention, vous devez crĂ©er une conversation intĂ©ressante ou brĂšve et succincte. Cela vous aidera Ă  «écrire. Coupez-le. " Lorsque vous commencez Ă  dĂ©velopper des robots, lisez ce livre.

Bases de données


Lors du développement d'un bot complexe, vous ne pouvez pas vous passer d'une base de données. Ma démo n'utilise pas de base de données, c'est simple. Mais si vous vissez certaines bases de données, vous pouvez utiliser les informations sur la session de l'utilisateur, au moins pour stocker le contexte.

Il y a une nuance: Yandex.Dialogs ne donne pas d'informations privĂ©es Ă  l'utilisateur, par exemple le nom, l'emplacement. Mais ces informations peuvent ĂȘtre demandĂ©es Ă  l'utilisateur, enregistrĂ©es et liĂ©es Ă  un ID de session spĂ©cifique, que Yandex.Dialogs envoie dans la demande.

Machine d'Ă©tat


Mentionnant des scénarios complexes, on ne peut que rappeler la machine à états. Ce mécanisme a longtemps été utilisé de maniÚre excellente pour la programmation de microcontrÎleurs, et parfois le frontal. La machine à états convient au scénario: il existe des états à partir desquels nous passons à d'autres états pour certaines phrases.



N'en faites pas trop. Vous pouvez vous laisser emporter et créer une énorme machine à états, ce qui sera difficile à comprendre - maintenir un tel code est difficile. Il est plus facile d'écrire un script composé de petits sous-scripts.

Pas clair Précisez


Ne dites jamais: "Répétez, s'il vous plaßt." Que fait une personne lorsqu'on lui demande de répéter? Il parle plus fort. Si l'utilisateur crie sur votre compétence, la reconnaissance ne s'améliorera pas. Posez une question de clarification. Si une partie du dialogue de l'utilisateur est reconnue et que quelque chose manque, vérifiez le bloc manquant.

La reconnaissance de texte est la tùche la plus difficile dans le développement d'un bot, donc parfois la clarification n'aide pas. Dans toute situation incompréhensible, la meilleure solution est de tout rassembler en un seul endroit, de vous connecter, puis d'analyser et d'utiliser à l'avenir. Par exemple, si l'utilisateur dit des choses franchement étranges et incompréhensibles.

«C'était en ébullition. Rivage crémeux
Piqué sur nav.
Et des grognements grognĂšrent.
Comme une maman dans un mov. "

Les utilisateurs peuvent utiliser de maniĂšre inattendue un nĂ©ologisme, ce qui signifie quelque chose, et il doit ĂȘtre traitĂ© d'une maniĂšre ou d'une autre. En consĂ©quence, le pourcentage de reconnaissance diminue. Ne vous inquiĂ©tez pas - connectez-vous, Ă©tudiez et amĂ©liorez votre bot.

Mot d'arrĂȘt


Il doit y avoir quelque chose pour arrĂȘter la compĂ©tence lorsque vous voulez en sortir. Alice sait s'arrĂȘter aprĂšs les phrases: "Alice, ça suffit!" ou "Alice, arrĂȘte!" Mais les utilisateurs ne lisent gĂ©nĂ©ralement pas les instructions. Par consĂ©quent, rĂ©pondez au moins au mot «Stop» et rendez le contrĂŽle Ă  Alice.

Voyons maintenant le code.

Temps pour une démo


Je veux implémenter les phrases suivantes.

  • ÉvĂ©nements Ă  venir dans une ville.
  • Nom de la ville: «évĂ©nements Ă  Moscou», «évĂ©nements Ă  Minsk», «Saint-PĂ©tersbourg» pour montrer les Ă©vĂ©nements qui s'y sont dĂ©roulĂ©s.
  • Mots d'arrĂȘt: «ArrĂȘtez», «Assez». "Merci" si l'utilisateur termine la conversation avec ce mot. Mais idĂ©alement, un linguiste est nĂ©cessaire ici.

Pour les "événements à venir", toute phrase convient. J'ai créé un bot paresseux, et quand il ne comprend pas ce qu'ils disent, il donne des informations sur les trois prochains événements.

 { "request": { "nlu": { "entities": [ { "tokens": { "start": 2, "end": 6 }, "type": "YANDEX.GEO", "value": { "house_number": "16", "street": " ", "city": "" } } ] } } } 

Yandex améliore progressivement la plateforme Yandex.Dialogs et émet des entités qu'il a pu reconnaßtre. Par exemple, il sait comment obtenir des adresses à partir d'un texte, en le triant en plusieurs parties: ville, campagne, rue, maison. Il sait également reconnaßtre les nombres et les dates, absolus et relatifs. Il comprendra que le mot «Demain» est la date d'aujourd'hui, à laquelle on ajoute.

RĂ©pondre Ă  l'utilisateur


Vous devez en quelque sorte répondre à votre utilisateur. L'ensemble de la compétence est de 209 lignes avec la derniÚre ligne vide. Rien de compliqué - travaillez pour la soirée.

Il vous suffit de traiter la demande POST et d'obtenir une «demande».

 router.post('/', (req/ res, next) ⇒ { const request = req.body; 

De plus, je n'ai pas beaucoup compliquĂ© la machine d'État, mais je suis allĂ© selon les prioritĂ©s. Si l'utilisateur veut apprendre Ă  utiliser le bot, il s'agit du premier lancement ou d'une demande d'aide. Par consĂ©quent, juste lui prĂ©parer une "EmptyResponse" - c'est ce que j'appelle.

 if (needHelp(request.request)) { res.json(prepareEmptyResponse(request)); return; } 

La fonction needHelp est simple.

 function needHelp(req) { if (req.nlu.token.length ≀ 2 && req.nlu.tokens.includes('')) { return true; } if (req.nlu.token.length = 0 && req.type ≠ 'ButtonPressed') { return true; } return false; } 

Lorsque nous n'avons aucun jeton, nous sommes alors au début de la demande. L'utilisateur vient de commencer la compétence ou n'a rien demandé. Vous devez vérifier que les jetons sont à zéro et qu'il ne s'agit pas d'un bouton - lorsque vous cliquez sur le bouton, l'utilisateur ne dit rien non plus. Lorsqu'un utilisateur demande de l'aide, nous parcourons les jetons et recherchons le mot «Aide». La logique est simple.

Si l'utilisateur veut s'arrĂȘter.

 if (needToStop(request.request)) { res.json(prepareStopResponse(request)); return; } 

Nous recherchons donc une sorte de mot d’arrĂȘt Ă  l’intĂ©rieur.

 function needStop(req) { const stopWords = ['', '', '' ]; return req.nlu.token.length ≀ 2 && stopWords.some(w ⇒ return req.nlu.token.includes(w)); } 

Dans toutes les réponses, vous devez renvoyer les informations envoyées par Yandex.Dialogs sur la session. Il doit en quelque sorte correspondre à votre réponse et à la demande de l'utilisateur.

 function prepare StopResponse(req) { const { session, version } = req; return { response: { text: ' .  !', end_session: true, }, session, version, }; } 

Par conséquent, ce que vous avez obtenu dans les variables "session" et "version", revenez en arriÚre, et tout ira bien. Déjà dans la réponse, vous pouvez donner du texte à Alice pour le prononcer et passer "fin de session: vrai". Cela signifie que nous mettons fin à la session de compétences et transférons le contrÎle à Alice.

Lorsque vous appelez une compétence, Alice s'éteint. Tout ce qu'elle écoute, ce sont ses mots vides, et vous contrÎlez complÚtement le processus de travail avec la compétence. Par conséquent, vous devez retourner le contrÎle.

Avec une demande vide, c'est plus intéressant.

 return { "response": { "text": '!        -  .', "tts": '!        -  .', buttons: [ { title: ' ', payload: {} hide: false, }, { title: '  ', payload: { city: '', } hide: false, }, ], end_session: false, }, session, version, }; 

Il y a un champ TTS ( Text To Speech ) - commande vocale . Il s'agit d'un format simple qui vous permet de lire le texte de différentes maniÚres. Par exemple, le mot «multidisciplinaire» a deux contraintes dans la langue russe - une primaire, une deuxiÚme secondaire. La tùche est qu'Alice a pu prononcer correctement ce mot. Vous pouvez le casser avec un espace:

 + + 

Elle le comprendra comme deux. L'accent plus est mis en Ă©vidence.

Il y a des pauses dans le discours - vous mettez un signe de ponctuation, qui est séparé par des espaces. Vous pouvez donc créer des pauses dramatiques:

  — - - - - - - - - +  

J'ai déjà parlé des boutons . Ils sont importants si vous ne communiquez pas avec une colonne, mais avec l'application mobile Yandex, par exemple.

 { "response": { "buttons": [ { "title": "Frontend Conf", "payload": {}, "url": "https://frontendconf.ru/moscow-rit/2019" , "hide": false } ] } } 

Les boutons sont également des conseils pour les phrases que vous percevez dans votre compétence. Les compétences fonctionnent dans les applications Yandex - vous communiquez avec l'interface. Si vous voulez donner des informations - donnez un lien, l'utilisateur clique dessus. Vous pouvez également ajouter des boutons pour cela.

Il y a un champ «charge utile» oĂč vous pouvez ajouter des donnĂ©es. Ils reviendront ensuite avec une «demande» - vous saurez, par exemple, comment marquer ce bouton.

Vous pouvez choisir les voix que votre compétence parlera.

  • Alice est la voix standard d' Alice . OptimisĂ© pour de courtes interactions.
  • Oksana - la voix de Yandex.Navigator.
  • Jane
  • Zahar.
  • Ermil.
  • Erkan Yavas - pour les longs textes. CrĂ©Ă© Ă  l'origine pour lire les actualitĂ©s.

Pour terminer la compétence , renvoyez simplement "end_session: true".

 { "response": { "end_session": true } } 

Que s'est-il passé avec la démo


Tout d'abord, je filtre par date.

 function filterByDate(events) { return events.filter(event ⇒ { const current = new Date().getTime(); const start = new Date(event.start).getTime(); return (start > current) || (event.end && new Date(event.end).getTime() > current && start ≀ current); }); } 

La logique est simple: dans tous les événements que j'ai analysés à partir du calendrier, je prends ceux qui auront lieu dans le futur, ou ils vont maintenant. Il est probablement étrange de poser des questions sur les événements passés - la compétence n'est pas à ce sujet.

Ensuite, le filtrage en place est ce dont il s'agissait.

 function filterByPlace(events, req) { const cities = new Set(); const geoEntities = req.nlu.entities.filter(e ⇒ e.type = 'YANDEX.GEO'); if (req.payload && req.payload.city) cities.add(req.payload.city); geoEntities.forEach(e ⇒ { const city = e.value.city && e.value.city.toLowerCase(); if (city && !cities.has(city)) { cities.add(city); } }); 

Dans "entités", vous pouvez trouver l'entité YANDEX.GEO, qui affine l'emplacement. Si l'entité a une ville, ajoutez à notre ensemble. Ensuite, la logique est également simple. Nous recherchons cette ville en jetons, et si elle est là, nous recherchons ce que l'utilisateur veut. Sinon, nous regardons dans tous les «lieux» et «événements» que nous avons.

Supposons que Yandex ne reconnaisse pas qu'il s'agit de YANDEX.GEO, mais l'utilisateur a nommĂ© la ville - il Ă©tait sĂ»r que quelque chose se passait lĂ -bas. Nous parcourons toutes les villes dans les «évĂ©nements» et cherchons la mĂȘme chose dans les jetons. Il s'avĂšre une comparaison croisĂ©e des tableaux. Pas le moyen le plus productif, bien sĂ»r, mais ce qui l'est. VoilĂ  toute la compĂ©tence!

Veuillez ne pas me gronder pour le code - je l'ai Ă©crit rapidement. Tout y est primitif, mais essayez de l'utiliser ou de simplement jouer.

Publier la compétence


Accédez à la page Yandex.Dialogs.



Choisissez une compétence dans Alice. Appuyez sur le bouton «Créer un dialogue» et vous obtiendrez le formulaire que vous devez remplir avec vos données.

  • Le nom est ce qui sera dans le dialogue.
  • Nom d'activation . Si vous sĂ©lectionnez le nom d'activation "Calendrier des normes Web" via un trait d'union, Alice ne le reconnaĂźt pas - elle n'entend pas les tirets. Nous disons des mots sans tirets et l'activation ne fonctionnera pas. Pour gagner de l'argent, dĂ©finissez le nom sur "Calendrier des normes Web".
  • Phrases d'activation pour lancer la compĂ©tence. S'il s'agit d'un jeu, alors «Jouons quelque chose», «Demandez Ă  quelqu'un». L'ensemble est limitĂ©, mais c'est parce que de telles phrases sont une activation pour Alice. Elle doit comprendre qu'il est temps d'entrer dans une compĂ©tence.
  • URL du Webhook - la mĂȘme adresse Ă  laquelle Alice enverra les demandes POST.
  • La voix . La valeur par dĂ©faut est Oksana. Par consĂ©quent, beaucoup dans le catalogue sa voix, pas Alice.
  • Un appareil avec Ă©cran est-il requis? S'il y a des images, l'utilisation de la compĂ©tence sera limitĂ©e Ă  vous - sur la colonne, l'utilisateur ne pourra pas la lancer.
  • Les compĂ©tences privĂ©es sont un domaine important pour les dĂ©veloppeurs. Si vous n'ĂȘtes pas prĂȘt Ă  publier la compĂ©tence en public, ne serait-ce que parce qu'elle est brute, nous ne la montrons pas dans le catalogue, ce qui limite la confidentialitĂ©. Les compĂ©tences privĂ©es sont modĂ©rĂ©es rapidement - en quelques heures. Ces compĂ©tences n'ont pas besoin d'ĂȘtre testĂ©es de maniĂšre approfondie - suffisamment pour correspondre au nom d'activation. Comme l'utilisateur ne les trouvera pas dans le catalogue, il leur est plus fidĂšle.
  • Notes pour le modĂ©rateur . J'ai demandĂ© au modĂ©rateur de m'aider: «J'ai vraiment besoin des compĂ©tences nĂ©cessaires pour la dĂ©monstration de la confĂ©rence!» - et j'ai rĂ©ussi Ă  passer rapidement la modĂ©ration.
  • Droits d'auteur . Si vous, ne travaillant pas dans une banque conditionnelle, dĂ©cidez de crĂ©er une compĂ©tence pour cela, vous devez prouver que vous avez le droit de le faire. Tout Ă  coup, ils viendront Ă  vous? Et ils viendront certainement, et par le biais du distributeur, c'est-Ă -dire Yandex, qui n'a pas besoin de problĂšmes supplĂ©mentaires.

Terminé - envoyez la compétence pour modération, et vous pouvez tester.

Test


Express-. API, . , , «alice-tester» — , .

 const assert = require('assert'); const User = require('alice-tester'); it('should show help', async () => { const user = new User('http://localhost:3000'); await user.enter(); await user.say('  ?'); assert.equal(user.response.text, '    .'); assert.equal(user.response.tts, '    +.'); assert.deepEqual(user.response.buttons, [{title: '', hide: true}]); }]); 

., «».



, , . , : , , . , — , . Postman — .

. . Just AI. , , .

. dialogs.home.popstas.ru URL, , localhost. , debug. , localhost.



. — . URL , - .



— .

, , , .

— . , , , , , . - - .


Dialogflow , Google Now. , — , — .



, . . , . , .

Google Dialogflow ., Dialogflower . Alexa, Google Now, . — API, .

, . Aimyloqic — . Zenbot , Tortu Alfa.Bot — , . !


FAQ . , . , , .

. , , , . — , . , . , .

IFTTT , — Trello. — API. , , . , IFTT — .

. , . .



, «» .

. Xiaomi . . . , Arduino - --- , , : «, - 2000!» — !

, : «, !» — ! . , .


. , , : , . . . . . . GitHub- ., . — .

Telegram- . . — . , . . .

. , . - , . , . . , . , : , -, , . , , . : « , ?» , , , .

— , . .

. — . , , . , .

, , - , !

— , — . . — — !

FrontendConf 2019 « CSS — ». — . , FrontendConf 2019 . , , , , .

. , , .

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


All Articles