Sprachassistenten sind keine ferne Zukunft, sondern Realität. Alexa, Siri, Google Now, Alice sind in intelligente Lautsprecher, Uhren und Telefone integriert. Sie verändern allmählich unsere Art der Interaktion mit Anwendungen und Geräten. Über einen Assistenten können Sie die Wettervorhersage herausfinden, Flugtickets kaufen, ein Taxi bestellen, Musik hören und den Wasserkocher in der Küche einschalten, der in einem anderen Raum auf dem Sofa liegt.

Siri oder Alexa sprechen hauptsächlich Englisch mit Benutzern, daher sind sie in Russland nicht so beliebt wie Alice von Yandex. Für Entwickler ist Alice auch praktischer: Ihre Entwickler haben ein Blog, veröffentlichen praktische Tools auf GitHub und helfen beim Erstellen des Assistenten in neuen Geräten.
Nikita Dubko (@dark_mefody auf Twitter) ist ein Entwickler der Yandex-Benutzeroberfläche, Organisator von MinskCSS- und MinskJS-Meetings und Nachrichtenredakteur für Webstandards. Nikita arbeitet nicht in Yandex.Dialogs und ist in keiner Weise mit Yandex.Alisa verbunden. Da er jedoch daran interessiert war zu verstehen, wie Alice funktioniert, versuchte er, ihre Fähigkeiten für das Web anzuwenden, und erstellte einen Bericht darüber bei
FrontendConf RIT ++. Bei der Entschlüsselung von Nikitas Bericht berücksichtigen wir, welche Sprachassistenten beim Lesen dieses Materials nützlich sein und eine Fähigkeit aufbauen können.
Bots
Beginnen wir mit der Geschichte der Bots. 1966 erschien der
Eliza- Bot und gab vor, ein Therapeut zu sein. Es war möglich, mit ihm zu kommunizieren, und einige glaubten sogar, dass eine lebende Person ihnen antwortet. 1995 kam der
ALICE- Bot heraus. - Nicht zu verwechseln mit Alice. Der Bot konnte sich als echte Person ausgeben. Bis heute liegt in Open Source und wird finalisiert. Leider besteht ALICE den Turing-Test nicht, aber dies hindert ihn nicht daran, Menschen irrezuführen.
Im Jahr 2006 hat IBM eine riesige Wissensbasis und ausgefeilte Intelligenz in den Bot eingebracht - so entstand
IBM Watson . Dies ist ein riesiger Computercluster, der englische Sprache verarbeiten und einige Fakten preisgeben kann.
Im Jahr 2016 führte Microsoft ein Experiment durch. Sie kreierte den
Tay- Bot, den sie auf Twitter startete. Dort lernte der Bot Microblog basierend auf der Interaktion von Live-Abonnenten. Infolgedessen wurde Tay ein Rassist und Frauenfeind. Dies ist ein geschlossenes Konto. Moral: Lass keine Kinder auf Twitter, er kann das Böse lehren.
Dies sind jedoch alles Bots, mit denen Sie nicht zu Ihrem eigenen Vorteil kommunizieren können. Im Jahr 2015 erschien "nützlich" auf Telegramm. In anderen Programmen gab es Bots, aber Telegram sorgte für Furore. Es war möglich, einen nützlichen Bot zu erstellen, der Informationen bereitstellt, Inhalte generiert und die Öffentlichkeit verwaltet - die Möglichkeiten sind groß und die API ist einfach. Bots haben Bilder, Schaltflächen und QuickInfos hinzugefügt - eine Interaktionsoberfläche wurde angezeigt.
Allmählich verbreitete sich die Idee auf fast alle Instant Messenger: Facebook, Viber, VKontakte, WhatsApp und andere Anwendungen. Jetzt sind Bots ein Trend, sie sind überall. Es gibt Dienste, mit denen Sie APIs für alle Plattformen sofort schreiben können.
Sprachassistenten
Die Entwicklung verlief parallel zu den Bots, aber wir gehen davon aus, dass die Ära der Assistenten später kam.
Am 9. August 2011 erschien
Siri . Anfangs war es ein unabhängiges Projekt, in dem Apple etwas Interessantes sah, also kaufte ich es. Dies ist der älteste beliebte Sprachassistent, der in das Betriebssystem integriert ist. Ein Jahr später holte Google Apple schnell ein, indem er
den Sprachassistenten von
Google Now in sein Betriebssystem integrierte.
Nach 2 Jahren veröffentlichte Microsoft
Microsoft Cortana . Es ist jedoch nicht klar, warum - der mobile Markt für Sprachassistenten scheint sie bereits verpasst zu haben. Das Unternehmen versuchte, einen Sprachassistenten in Desktop-Systeme zu integrieren, als es bereits Probleme mit dem Markt für verschiedene Geräte gab.
Amazon Alexa kam etwas später in diesem Jahr heraus.

Assistenten haben sich weiterentwickelt. Neben Softwaresystemen, die mit Sprache umgehen konnten, erschienen Sprecher mit Assistenten. Laut Statistik hat Anfang 2019 jede dritte Familie in den USA eine intelligente Säule. Dies ist ein riesiger Markt, in den Sie investieren können.
Aber es gibt ein Problem - ausländische Assistenten haben eine schlechte Sprache mit Russisch. Die Assistenten sind auf Englisch inhaftiert und verstehen es gut, aber bei der Kommunikation auf Russisch treten Übersetzungsschwierigkeiten auf. Sprachen sind unterschiedlich und erfordern einen anderen Ansatz für die Verarbeitung natürlicher Sprache.
Alice
Alice wurde am 10. Oktober 2017 in der offenen Beta veröffentlicht. Es ist wegen der russischen Sprache inhaftiert und dies ist sein großer Vorteil. Alice versteht Englisch, aber schlimmer.
Alices Mission ist es, russischsprachigen Benutzern zu helfen.
Yandex ist ein großes Unternehmen und kann es sich leisten, Alice in all seine Anwendungen einzubetten, die irgendwie sprechen können.
- Yandex.Browser.
- Yandex.Navigator.
- Yandex Station.
- Yandex.Phone.
- Yandex.Auto.
- Yandex.Drive.
Die Integration verlief so gut, dass auch Dritthersteller beschlossen, Alice zu bauen.

Während der 2-jährigen Entwicklungszeit der Assistentin wurde sie in viele Dienste integriert und neue Fähigkeiten hinzugefügt. Sie weiß, wie man Musik spielt, Bilder erkennt, in Yandex nach Informationen sucht und mit einem Smart Home arbeitet.
Warum so beliebt?
Es ist praktisch, wenn die Hände beschäftigt sind . Ich bereite das Abendessen vor und möchte die Musik einschalten. Gehen Sie zum Wasserhahn, waschen Sie Ihre Hände, trocknen Sie, öffnen Sie die Anwendung, finden Sie die gewünschte Spur - für eine lange Zeit. Schneller und einfacher, einen Sprachbefehl zu geben.
Faulheit . Ich liege auf einem Sofa unter einer karierten Decke und möchte nicht aufstehen, um irgendwohin zu gehen und die Lautsprecher einzuschalten. Wenn Sie faul sind, dann in vollem Umfang.
Der große Markt sind Apps für Kinder . Kleine Kinder können noch nicht lesen, schreiben und drucken, aber sie sprechen und verstehen Sprache. Deshalb lieben Kinder Alice und lieben es, mit ihr zu kommunizieren. Die Eltern sind ebenfalls zufrieden - es besteht keine Notwendigkeit zu suchen, was mit dem Kind zu tun ist. Interessanterweise versteht Alice Kinder dank eines gut ausgebildeten neuronalen Netzwerks.
Verfügbarkeit Sehbehinderte Menschen können problemlos mit Sprachassistenten arbeiten. Wenn die Benutzeroberfläche nicht sichtbar ist, können Sie sie hören und Befehle erteilen.
Stimme schneller . Eine durchschnittliche Person, kein Entwickler, druckt durchschnittlich 30 Wörter pro Minute und sagt 120. Pro Minute werden viermal mehr Informationen per Sprache übertragen.
Die Zukunft . Fantastische Filme und futuristische Vorhersagen deuten darauf hin, dass die Zukunft mit Sprachschnittstellen verbunden ist. Drehbuchautoren denken, dass Sprachsteuerung möglicherweise die Hauptmethode für die Interaktion mit Schnittstellen ist, bei denen das Bild nicht so wichtig ist.
Laut Statistik verwenden 35 Millionen Menschen Alisa pro Monat. In Belarus leben übrigens 9.475.600 Menschen. Das heißt, ungefähr 3,5 Weißrussland benutzt Alice jeden Monat.
Sprachassistenten erobern den Markt. Prognosen zufolge wird es bis 2021 etwa zweimal wachsen. Die heutige Popularität wird nicht aufhören, sondern weiter wachsen. Immer mehr Entwickler erkennen, dass sie in diesen Bereich investieren müssen.
Entwicklerfähigkeiten
Es ist großartig, wenn Unternehmen in Sprachassistenten investieren. Sie verstehen, wie sie in ihre Dienste integriert werden können. Entwickler wollen aber auch irgendwie daran teilnehmen, und das Unternehmen selbst ist profitabel.
Alexa hat Alexa Fähigkeiten. Nach den dokumentierten Interaktionsmethoden versteht sie, was die Entwickler für sie geschrieben haben. Google hat Actions gestartet - die Möglichkeit, etwas Eigenes in den Sprachassistenten zu integrieren.
Alice hat auch Fähigkeiten - die Fähigkeit für Entwickler, etwas von Drittanbietern zu implementieren.

Gleichzeitig gibt es einen alternativen Katalog von Fähigkeiten, nicht von Yandex, der von der Community unterstützt wird.

Es gibt gute Berichte darüber, wie Sprachanwendungen erstellt werden. Zum Beispiel sprach
Pavel Guy auf der AppsConf 2018 mit dem Thema
„Erstellen einer Sprachanwendung am Beispiel von Google Assistance“ . Enthusiasten sind aktiv an der Entwicklung von Sprachanwendungen beteiligt. Ein Beispiel ist ein visuelles sprachaktiviertes Spiel von Ivan Golubev.
Alice ist beliebt, obwohl im Wesentlichen alles, was sie tut, auf halbem Weg zwischen Stimme und Text liegt.

Alice weiß, wie man eine Stimme hört und sie gemäß ihren Algorithmen in einen Text umwandelt, eine Antwort erstellt und sie ausspricht. Es scheint, dass dies nicht genug ist, aber es ist eine äußerst schwierige Aufgabe. Viele Menschen arbeiten daran, dass Alice natürlich klingt, Akzente und die Sprache der Kinder richtig erkennt, versteht. Yandex bietet so etwas wie einen Proxy, der alles durch sich selbst führt. Atemberaubende Köpfe arbeiten, damit Sie die Ergebnisse ihrer Arbeit nutzen können.
Alices Fähigkeiten - Yandex.Dialogs - haben eine Einschränkung. Die Antwortzeit Ihrer API darf 1,5 Sekunden nicht überschreiten. Und das ist logisch, denn wenn die Antwort hängt - warum warten?
Ist es wirklich wichtig, worüber Sie fragen müssen, wenn Sie immer noch keine Antwort erhalten?
Wenn wir Informationen mit unseren Ohren empfangen, werden Pausen vom Gehirn länger wahrgenommen als ähnliche Pausen in der visuellen Oberfläche. Zum Beispiel Lader, Spinner - alles, was wir den Schnittstellen hinzufügen möchten, lenkt den Benutzer vom Warten ab. Betrachten Sie alles als schnell.
Zeit für eine Demo
Alles ist in der Yandex.Dialog-
Dokumentation ausführlich beschrieben und immer auf dem neuesten Stand. Ich werde mich nicht wiederholen. Ich werde Ihnen sagen, was für mich interessant war, und zeigen, wie Sie schnell eine Demo erstellen, für die ich nur einen Abend verbracht habe.
Beginnen wir mit der Idee. Es gibt viele Fähigkeiten, es gibt Kataloge, aber ich habe nicht gefunden, was mir wichtig ist - dies ist ein Veranstaltungskalender am Frontend. Stellen Sie sich vor, Sie wachen morgens auf: „Ich gehe heute zum Meeting. Alice! Gibt es dort etwas Interessantes? “, Und Alice antwortet Ihnen außerdem korrekt und unter Berücksichtigung Ihres Standorts.
Wenn Sie an der Organisation von Konferenzen beteiligt sind, nehmen Sie
an GitHub teil . Sie können dort Veranstaltungen und Meetings abhalten und aus einem Kalender mehr über viele Veranstaltungen im Front-End der Welt erfahren.
Ich nahm die bekannten Technologien, die zur Hand waren: Node.js und Express. Immer noch Heroku, weil es kostenlos ist. Die Anwendung selbst ist einfach: Es ist ein Server auf Node.js, einer Express-Anwendung. Heben Sie einfach den Server an einem Port an und hören Sie auf Anfragen.
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}'); });
Ich habe die Tatsache ausgenutzt, dass alles bereits im Webstandardkalender konfiguriert ist und aus einer großen Anzahl kleiner Dateien eine ICS-Datei heruntergeladen werden kann. Warum sollte ich meine eigenen sammeln?
Stellen Sie sicher, dass alles schnell funktioniert.
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); });
Verwenden Sie GET-Methoden für Tests. Die Fähigkeiten arbeiten mit POST-Methoden, sodass GET-Methoden ausschließlich zum Debuggen verwendet werden können. Ich habe eine solche Methode implementiert. Er lädt lediglich dasselbe ICS herunter, analysiert es und gibt es in JSON-Form aus.
Ich habe die Demo schnell erstellt und die fertige knotenbezogene Bibliothek genommen:
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); }); }); }
Sie weiß, wie man das ICS-Format analysiert. Am Ausgang erzeugt es ein solches Blatt:
{ "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" } }
Um die erforderlichen Informationen zu analysieren und dem Benutzer der Fertigkeit zur Verfügung zu stellen, reicht es aus, den Zeitpunkt des Beginns und des Endes der Veranstaltung, ihren Namen, ihren Link und vor allem die Stadt zu kennen. Ich möchte, dass die Fähigkeit nach Ereignissen in der Stadt sucht.
Eingabeformat
Wie geben Yandex.Dialogs Informationen zurück? Eine in die mobile Anwendung integrierte Spalte oder ein Sprachassistent hört Ihnen zu, und Yandex-Server verarbeiten das, was sie hören, und senden als Antwort ein Objekt:
{ "meta": { … }, "request”: { … }, "session": { … }, "version": "1.0" }
Das Objekt enthält Metainformationen, Informationen zur Anforderung, zur aktuellen Sitzung und zur Version der API, falls diese plötzlich aktualisiert wird - Fähigkeiten sollten nicht unterbrochen werden.
Es gibt viele nützliche
Informationen in
Metainformationen .
{ "meta": { "locale": "ru-RU", "timezone": "Europe/Moscow", "client_id": "ru.yandex.searchplugin/5.80…”, "interfaces": { "screen": {} } } }
"
Gebietsschema " - wird verwendet, um die Region des Benutzers zu verstehen.
"
Zeitzone " kann verwendet werden, um kompetent mit der Zeit zu arbeiten und den Standort des Benutzers genauer zu bestimmen.
"
Schnittstellen " - Informationen zur Verfügbarkeit des Bildschirms. Wenn kein Bildschirm vorhanden ist, sollten Sie darüber nachdenken, wie der Benutzer die Bilder sehen wird, wenn Sie sie in der Antwort angeben. Wenn es einen Bildschirm gibt, nehmen wir Informationen darüber heraus.
Das Anforderungsformat ist
einfach :
{ "request": { "command": " 16", "original_utterance": " , 16", "type": "SimpleUtterance", "nlu": { "tokens": [ "", "", "", "", "", "16"], "entities": [...] } } }
Es gibt an, was der Benutzer gesagt hat, den Anforderungstyp und die
NLU - Natural-Language Unit . Dies ist genau die Magie, die die Yandex.Dialog-Plattform annimmt. Sie bricht den ganzen Satz, den sie erkannt hat, in Token - Wörter. Es gibt dort auch Entitäten, über die wir etwas später sprechen werden. Die Verwendung von Token reicht für den Anfang aus.
Wir haben diese Worte und was tun wir damit? Der Benutzer hat etwas gesagt, aber er kann die Wörter in einer anderen Reihenfolge sagen, das "Nicht" -Partikel verwenden, das alles dramatisch verändert, oder sogar "Morgen" statt "Morgen" sagen. Wenn der Benutzer auch Weißrussisch spricht, gibt es eine „Tasche“, nicht am Morgen. Ein großes Projekt erfordert die Hilfe von Linguisten, um eine Fähigkeit zu entwickeln, die alles versteht. Aber ich habe eine einfache Aufgabe erledigt, also habe ich auf Hilfe von außen verzichtet.
Kann ein Computer wie eine Person sprechen?
Dies ist eine philosophische Frage, die der Turing-Test zu beantworten versucht. Der Test ermöglicht es mit einer gewissen Wahrscheinlichkeit festzustellen, dass künstliche Intelligenz eine Person verkörpern kann. Es gibt einen
Loebner-Preis , um zu erhalten, welche Programme den Turing-Test bestehen. Die Entscheidung wird von einer Jury getroffen. Um den Preis zu erhalten, müssen Sie 33% der Richter oder mehr austricksen. Erst 2014 täuschte der Bot
Zhenya Gustman aus St. Petersburg die Kommission endgültig.
[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.
Im Jahr 2019 hat sich nichts wirklich geändert - es ist immer noch schwierig, eine Person zu täuschen. Aber wir bewegen uns allmählich darauf zu.
Skriptarbeit
Eine gute Fähigkeit erfordert einen interessanten Anwendungsfall. Ich empfehle ein Buch, das es wert ist, gelesen zu werden - „Entwerfen von Sprachbenutzeroberflächen: Prinzipien von Konversationserfahrungen“. Es ist großartig, Skripte für Sprachschnittstellen zu schreiben und die Aufmerksamkeit der Benutzer zu erhalten. Ich habe das Buch nicht auf Englisch gesehen, aber es ist recht leicht zu lesen.

Das erste, was Sie tun müssen, um eine Fertigkeit zu entwickeln, ist eine Begrüßung.
„Während du dir überlegst, was du sagen sollst, mach Knicks! Das spart Zeit. “
Wenn sich die Fertigkeit einschaltet, müssen Sie den Benutzer von der ersten Sekunde an irgendwie festhalten, und dazu müssen Sie erklären, wie die Fertigkeit verwendet wird. Stellen Sie sich vor, der Benutzer hat die Fertigkeit gestartet und es herrscht Stille. Woher weißt du, ob eine Fertigkeit überhaupt funktioniert? Geben Sie dem Benutzer Anweisungen, z. B. Schaltflächen auf dem Bildschirm.
Einfacher Dialog
Zeichen des einfachen Dialogs. Die Liste wurde von Ivan Golubev erfunden, und der Wortlaut gefällt mir sehr gut.
- L persönlich.
- Natürlich.
- Flexibel.
- Ontext.
- Und natsiative.
- Brief J.
Persönlich bedeutet, dass der Bot einen Charakter haben muss. Wenn Sie mit Alice sprechen, werden Sie verstehen, dass sie einen Charakter hat - die Entwickler kümmern sich darum. Daher muss Ihr Bot für Organizität eine "Persönlichkeit" haben. Geben Sie Sätze mit mindestens einer Stimme aus und verwenden Sie dieselben verbalen Konstruktionen. Dies hilft, den Benutzer zu halten.
Natürlich . Wenn die Benutzeranforderung einfach ist, sollte die Antwort dieselbe sein. Während der Kommunikation mit dem Bot muss der Benutzer verstehen, was als nächstes zu tun ist.
Flexibel . Mach dich bereit für alles. Es gibt viele Synonyme auf Russisch. Der Benutzer kann von der Spalte ablenken und die Konversation an den Gesprächspartner übertragen und dann zur Spalte zurückkehren. All dies ist schwer zu handhaben. Aber wenn du einen Bot gut machen willst, musst du. Beachten Sie, dass ein gewisser Prozentsatz der Nichtanerkennung weiterhin besteht. Seien Sie darauf vorbereitet - schlagen Sie Optionen vor.
Kontextuell - der Bot sollte sich im Idealfall daran erinnern, was zuvor passiert ist. Dann wird das Gespräch lebhaft.
- Alice, wie ist das Wetter heute?- Heute im Bezirk von +11 bis +20, bewölkt, mit Lichtungen.- Und morgen?- Morgen im Bezirk von +14 bis +27, bewölkt, mit Lichtungen.Stellen Sie sich vor, Ihr Bot kann den Kontext nicht speichern. Was bedeutet dann für ihn die Bitte "und morgen"? Wenn Sie wissen, wie man einen Kontext wie Alice beibehält, können Sie die vorherigen Ergebnisse verwenden, um die Antworten in der Fertigkeit zu verbessern.
Proaktiv . Wenn der Benutzer langweilig wird, sollte der Bot ihn auffordern: "Klicken Sie auf diese Schaltfläche!", "Schauen Sie, ich habe ein Bild für Sie!", "Folgen Sie dem Link." Der Bot sollte Ihnen sagen, wie Sie damit arbeiten sollen.
Der Bot sollte
kurz sein . Wenn eine Person lange spricht, ist es für sie schwierig, die Aufmerksamkeit des Publikums zu erhalten. Mit dem Bot ist es noch komplizierter - es ist nicht schade, es ist leblos. Um Aufmerksamkeit zu erregen, müssen Sie ein Gespräch interessant oder kurz und prägnant aufbauen. Dies hilft beim Schreiben. Schneiden Sie es. " Wenn Sie mit der Entwicklung von Bots beginnen, lesen Sie dieses Buch.
Datenbanken
Bei der Entwicklung eines komplexen Bots können Sie nicht auf eine Datenbank verzichten. Meine Demo verwendet keine Datenbank, es ist einfach. Wenn Sie jedoch einige Datenbanken verschrauben, können Sie die Informationen über die Sitzung des Benutzers zumindest zum Speichern des Kontexts verwenden.
Es gibt eine Nuance: Yandex.Dialogs geben keine privaten Benutzerinformationen weiter, z. B. Name, Standort. Diese Informationen können jedoch vom Benutzer angefordert, gespeichert und mit einer bestimmten Sitzungs-ID verknüpft werden, die Yandex.Dialogs in der Anforderung sendet.
Zustandsmaschine
Wenn man komplexe Szenarien erwähnt, kann man sich nur an die Zustandsmaschine erinnern. Dieser Mechanismus wurde lange Zeit hervorragend für die Programmierung von Mikrocontrollern und manchmal auch für das Frontend verwendet. Die Zustandsmaschine ist für das Szenario praktisch: Es gibt Zustände, von denen wir für bestimmte Phrasen zu anderen Zuständen übergehen.

Übertreibe es nicht. Sie können sich mitreißen lassen und eine riesige Zustandsmaschine erstellen, die schwer herauszufinden ist - die Pflege eines solchen Codes ist schwierig. Es ist einfacher, ein Skript zu schreiben, das aus kleinen Unterskripten besteht.
Unverständlich? Geben Sie an
Sag niemals: "Wiederhole es bitte." Was macht eine Person, wenn sie gebeten wird, es zu wiederholen? Er spricht lauter. Wenn der Benutzer Ihre Fähigkeiten anschreit, verbessert sich die Erkennung nicht. Stellen Sie eine klärende Frage. Wenn ein Teil des Benutzerdialogs erkannt wird und etwas fehlt, überprüfen Sie den fehlenden Block.
Die Texterkennung ist die schwierigste Aufgabe bei der Entwicklung eines Bots, daher hilft manchmal die Klärung nicht. In jeder unverständlichen Situation besteht die beste Lösung darin, alles an einem Ort zu sammeln, zu protokollieren und dann zu analysieren und in Zukunft zu verwenden. Zum Beispiel, wenn der Benutzer offen gesagt seltsame und unverständliche Dinge sagt.
„Es hat gekocht. Cremige Küste
Stocherte auf nav.
Und grunzte grunzte.
Wie eine Mumie in einem Film. “Benutzer können unerwartet einen Neologismus verwenden, der etwas bedeutet, und er muss irgendwie verarbeitet werden. Infolgedessen sinkt der Erkennungsprozentsatz. Mach dir keine Sorgen - logge dich ein, studiere und verbessere deinen Bot.
Stoppwort
Es muss etwas geben, das die Fertigkeit aufhält, wenn Sie sie verlassen möchten. Alice weiß, wie man nach den Sätzen aufhört: "Alice, das ist genug!" oder "Alice, hör auf!" Benutzer lesen jedoch normalerweise keine Anweisungen. Antworten Sie daher zumindest auf das Wort „Stop“ und geben Sie die Kontrolle an Alice zurück.
Nun sehen wir uns den Code an.
Zeit für eine Demo
Ich möchte die folgenden Sätze implementieren.
- Kommende Events in einer Stadt.
- Name der Stadt: "Ereignisse in Moskau", "Ereignisse in Minsk", "St. Petersburg", um die dort gefundenen Ereignisse zu zeigen.
- Stoppwörter: "Stopp", "Genug." "Danke", wenn der Benutzer das Gespräch mit diesem Wort beendet. Idealerweise wird hier jedoch ein Linguist benötigt.
Für "bevorstehende Veranstaltungen" ist jede Phrase geeignet. Ich habe einen faulen Bot erstellt, und wenn er nicht versteht, was sie sagen, gibt er Informationen über die nächsten drei Ereignisse heraus.
{ "request": { "nlu": { "entities": [ { "tokens": { "start": 2, "end": 6 }, "type": "YANDEX.GEO", "value": { "house_number": "16", "street": " ", "city": "" } } ] } } }
Yandex verbessert schrittweise die Yandex.Dialogs-Plattform und gibt Entitäten aus, die es erkennen konnte. Zum Beispiel weiß er, wie man Adressen aus einem Text erhält und ihn in Teile sortiert: Stadt, Land, Straße, Haus. Er weiß auch, wie man absolute und relative Zahlen und Daten erkennt. Er wird verstehen, dass das Wort „Morgen“ das heutige Datum ist, zu dem eines hinzugefügt wird.
Antwort an den Benutzer
Sie müssen irgendwie auf Ihren Benutzer reagieren. Die gesamte Fertigkeit besteht aus
209 Zeilen mit der letzten leeren Zeile. Nichts kompliziertes - Arbeit für den Abend.
Sie bearbeiten lediglich die POST-Anfrage und erhalten eine „Anfrage“.
router.post('/', (req/ res, next) ⇒ { const request = req.body;
Außerdem habe ich die Zustandsmaschine nicht sehr kompliziert, sondern bin nach Prioritäten vorgegangen. Wenn der Benutzer lernen möchte, wie man den Bot benutzt, ist dies der erste Start oder eine Bitte um Hilfe. Deshalb bereite ich ihm nur eine "Leere Antwort" vor - so nenne ich es.
if (needHelp(request.request)) { res.json(prepareEmptyResponse(request)); return; }
Die NeedHelp-Funktion ist einfach.
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; }
Wenn wir keine Token haben, stehen wir am Anfang der Anfrage. Der Benutzer hat gerade die Fertigkeit gestartet oder nichts gefragt. Sie müssen überprüfen, ob die Token Null sind und dies keine Schaltfläche ist. Wenn Sie auf die Schaltfläche klicken, sagt der Benutzer auch nichts. Wenn ein Benutzer um Hilfe bittet, gehen wir die Token durch und suchen nach dem Wort "Hilfe". Die Logik ist einfach.
Wenn der Benutzer anhalten möchte.
if (needToStop(request.request)) { res.json(prepareStopResponse(request)); return; }
Also suchen wir nach einer Art Stoppwort im Inneren.
function needStop(req) { const stopWords = ['', '', '' ]; return req.nlu.token.length ≤ 2 && stopWords.some(w ⇒ return req.nlu.token.includes(w)); }
In allen Antworten müssen Sie die Informationen zurückgeben, die Yandex.Dialogs über die Sitzung gesendet hat. Er muss irgendwie mit Ihrer Antwort und der Anfrage des Benutzers übereinstimmen.
function prepare StopResponse(req) { const { session, version } = req; return { response: { text: ' . !', end_session: true, }, session, version, }; }
Daher, was Sie in den Variablen "Sitzung" und "Version" erhalten haben, kehren Sie zurück, und alles wird in Ordnung sein. Bereits in der Antwort können Sie Alice einen Text geben, um ihn auszusprechen, und "Sitzung beenden: wahr" bestehen. Dies bedeutet, dass wir die Skill-Sitzung beenden und die Kontrolle an Alice übertragen.
Wenn Sie eine Fertigkeit aufrufen, schaltet sich Alice aus. Alles, was sie hört, sind ihre Stoppwörter, und Sie steuern den Prozess der Arbeit mit der Fähigkeit vollständig. Daher müssen Sie die Kontrolle zurückgeben.
Mit einer leeren Anfrage ist interessanter.
return { "response": { "text": '! - .', "tts": '! - .', buttons: [ { title: ' ', payload: {} hide: false, }, { title: ' ', payload: { city: '', } hide: false, }, ], end_session: false, }, session, version, };
Es gibt ein
TTS- Feld (
Text To Speech ) -
Sprachsteuerung . Dies ist ein einfaches Format, mit dem Sie den Text auf verschiedene Arten lesen können. Zum Beispiel hat das Wort "multidisziplinär" zwei Schwerpunkte in der russischen Sprache - eine primäre, die zweite sekundäre. Die Aufgabe ist, dass Alice dieses Wort richtig aussprechen konnte. Sie können es mit einem Leerzeichen brechen:
+ +
Sie wird ihn als zwei verstehen. Plus Akzent wird hervorgehoben.
Es gibt Pausen in der Rede - Sie setzen ein Interpunktionszeichen, das durch Leerzeichen getrennt ist. So können Sie dramatische Pausen erstellen:
— - - - - - - - - +
Ich habe bereits über
Knöpfe gesprochen . Sie sind wichtig, wenn Sie nicht mit einer Spalte kommunizieren, sondern beispielsweise mit der mobilen Yandex-Anwendung.
{ "response": { "buttons": [ { "title": "Frontend Conf", "payload": {}, "url": "https://frontendconf.ru/moscow-rit/2019" , "hide": false } ] } }
Schaltflächen sind auch Hinweise für Phrasen, die Sie in Ihren Fähigkeiten wahrnehmen. Fähigkeiten funktionieren in Yandex-Anwendungen - Sie kommunizieren mit der Benutzeroberfläche. Wenn Sie einige Informationen weitergeben möchten - geben Sie einen Link an, der Benutzer klickt darauf. Sie können hierfür auch Schaltflächen hinzufügen.
Es gibt ein Feld "Nutzlast", in dem Sie Daten hinzufügen können. Sie werden dann mit einer „Anfrage“ zurückkommen - Sie wissen beispielsweise, wie Sie diese Schaltfläche markieren.
Sie können die
Stimmen auswählen, die Ihre Fähigkeiten sprechen.
- Alice ist Alices Standardstimme. Optimiert für kurze Interaktionen.
- Oksana - die Stimme von Yandex.Navigator.
- Jane
- Zahar.
- Ermil.
- Erkan Yavas - für lange Texte. Ursprünglich erstellt, um Nachrichten zu lesen.
Um
die Fertigkeit zu
vervollständigen , geben Sie einfach "end_session: true" zurück.
{ "response": { "end_session": true } }
Was ist mit der Demo passiert?
Zuerst filtere ich nach Datum.
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); }); }
Die Logik ist einfach: Bei allen Ereignissen, die ich aus dem Kalender analysiert habe, nehme ich diejenigen, die in Zukunft stattfinden werden, oder sie gehen jetzt. Es ist wahrscheinlich seltsam, nach vergangenen Ereignissen zu fragen - bei der Fähigkeit geht es nicht darum.
Als nächstes ging es darum, an Ort und Stelle zu filtern.
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); } });
Unter "Entitäten" finden Sie die Entität YANDEX.GEO, die den Speicherort verfeinert. Wenn die Entität eine Stadt hat, fügen Sie sie unserem Set hinzu. Als nächstes ist die Logik ebenfalls einfach. Wir suchen diese Stadt in Token, und wenn sie dort ist, suchen wir nach dem, was der Benutzer will. Wenn nicht, schauen wir uns alle „Orte“ und „Ereignisse“ an, die wir haben.
Angenommen, Yandex hat nicht erkannt, dass es sich um YANDEX.GEO handelt, aber der Benutzer hat die Stadt benannt - er war sich sicher, dass dort etwas los war. Wir gehen in „Events“ durch alle Städte und suchen das gleiche in Token. Es stellt sich ein Kreuzvergleich von Arrays heraus. Natürlich nicht der produktivste Weg, aber was ist. Das ist die ganze Fähigkeit!
Bitte schimpfen Sie nicht mit mir für den Code - ich habe ihn schnell geschrieben. Dort ist alles primitiv, aber versuchen Sie es zu benutzen oder spielen Sie einfach herum.
Fähigkeit veröffentlichen
Gehen Sie zur Seite Yandex.Dialogs.

Wähle eine Fertigkeit in Alice. Klicken Sie auf die Schaltfläche "Dialog erstellen" und Sie gelangen in das Formular, das Sie mit Ihren Daten ausfüllen müssen.
- Der Name wird im Dialog stehen.
- Aktivierungsname . Wenn Sie den Aktivierungsnamen "Web Standards Calendar" durch einen Bindestrich auswählen, erkennt Alice ihn nicht - sie hört keine Bindestriche. Wir sagen Wörter ohne Bindestriche, und die Aktivierung funktioniert nicht. Um Geld zu verdienen, setzen Sie den Namen auf "Web Standards Calendar".
- Aktivierungsphrasen zum Starten der Fertigkeit. Wenn dies ein Spiel ist, dann "Lass uns etwas spielen", "Frag jemanden". Das Set ist begrenzt, aber das liegt daran, dass solche Sätze für Alice aktiviert sind. Sie muss verstehen, dass es Zeit ist, eine Fertigkeit zu erlernen.
- Webhook-URL - dieselbe Adresse, an die Alice POST-Anfragen sendet.
- Die Stimme . Der Standardwert ist Oksana. Daher haben viele im Katalog ihre Stimme, nicht Alice.
- Ist ein Gerät mit Bildschirm erforderlich? Wenn Bilder vorhanden sind, ist die Verwendung der Fertigkeit auf Sie beschränkt. In der Spalte kann der Benutzer sie nicht starten.
- Private Fähigkeiten sind ein wichtiges Feld für Entwickler. Wenn Sie nicht bereit sind, die Fertigkeit öffentlich zu veröffentlichen, schon weil sie roh ist, wird sie nicht im Katalog angezeigt, was den Datenschutz einschränkt. Private Fähigkeiten werden schnell gemildert - in ein paar Stunden. Solche Fähigkeiten müssen nicht gründlich getestet werden - genug, um mit dem Aktivierungsnamen übereinzustimmen. Da der Benutzer sie nicht im Katalog findet, sind sie ihnen gegenüber loyaler.
- Hinweise für den Moderator . Ich bat den Moderator um Hilfe: "Ich brauche wirklich die Fähigkeiten für die Demo auf der Konferenz!" - und ich habe es geschafft, schnell durch die Moderation zu kommen.
- Urheberrechte . Wenn Sie nicht in einer bedingten Bank arbeiten und sich dazu entschließen, eine Fähigkeit dafür zu erstellen, müssen Sie nachweisen, dass Sie das Recht dazu haben. Plötzlich werden sie zu dir kommen? Und sie werden definitiv kommen, und zwar über den Distributor, also Yandex, der keine zusätzlichen Probleme benötigt.
Fertig - Senden Sie die Fertigkeit zur Moderation, und Sie können testen.
Testen
Ich habe einen banalen Express-Server geschrieben. 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 — , . Ich empfehle es!
FAQ . , . , , .
. , , , . — , . , . , .
IFTTT , — Trello. — API. , , . , IFTT — .
. , . .

, «» .
. Xiaomi . . . , Arduino - --- , , : «, - 2000!» — !
, : «, !» — ! . , .
. , , : , .
. . .
. .
GitHub- ., . — .
Telegram- . . — . , . . .
. , . - , . , . . , . , : , -, , . , , . : « , ?» , , , .
— , . .
. — . , , . , .
, , - , !
— ,
— . . — — !
FrontendConf 2019 « CSS — ». — . , FrontendConf 2019 . , , , , .
. , , .