Entitäten für die Yandex.Dialogues-Plattform

Am vergangenen Samstag fand ein Online-Hackathon zur Entwicklung von Alices Fähigkeiten statt. Schade, dass hier niemand über die Ergebnisse geschrieben hat, es ist neugierig, die Geschichten der Gewinner zu lesen. Aber da es keine Freiwilligen gab, werde ich meine Geschichte teilen.



Ich mache eine Sprachschnittstelle für die Verwaltung eines Brokerage-Kontos. Ich habe bereits über Habré - Alice darüber geschrieben. Kaufen Sie Yandex . Irgendwann musste ich den Preis in verschiedenen Währungen aus der Anfrage extrahieren. Ich bin sicher, dass ich nicht der erste bin, der sich einer solchen Aufgabe gestellt hat, also habe ich versucht, vorgefertigte Absichten oder benannte Entitäten auf GitHub zu finden, aber ich konnte nichts finden. Es gab einen Hackathon in der Nase, viele Entwickler an einem Ort, dachte ich, wenn jeder seine Best Practices teilt, wird es eine ganze Bibliothek von Entitäten geben. Auf diese Weise wurde die Idee für das Repository der Entitätsbibliothek geboren.



Benutzerdefinierte Entitäten in Dialogen



Wenn ich zu der intelligenten Spalte „Eine Yandex-Aktie kaufen“ sage, geht die Rede durch die innere Magie der Yandex.Dialogi-Plattform und dann zum Web-Hook, den ich als Skill-Handler angegeben habe. Folgendes kommt in den Handler:



  "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"
            }
          }
        }
      }
    },
    ...
  },


Achten Sie auf den Slot figi, der die Yandex-Aktienkennung enthält, die sogenannte FIGI (Financial Instrument Global Identifier), die für die Interaktion mit der API der Handelsplattform Tinkoff Investments erforderlich ist. Der EFigi-Datentyp ist eine benutzerdefinierte Entität, die ich im Abschnitt Entitäten beim Erstellen einer Fertigkeit in der Yandex.Dialogi-Plattform beschrieben habe. Hier ist ein Ausschnitt aus der Beschreibung:



entity EFigi:
    values:
        BBG005DXJS36:
            %exact
            TCS
            %lemma
            ()?
            ()?
            ()?
               ()?
        BBG006L8G4H1:
            %exact
            YNDX
            %lemma
            
            
        BBG004730JJ5:
            %exact
            MOEX
            %lemma
             
            
        BBG002B2J5X0:
            %exact
            KRKNP
            %lemma
            [   ]
            [    ]
...


Dank des Entitätsmechanismus im Handler-Code muss ich keine zusätzlichen Manipulationen an den Eingabedaten vornehmen, um FIGI zu erhalten. Die Dialogplattform konvertiert für mich den Namen des Wertpapiers in FIGI.



Ich verwende EFigi als nicht terminale Grammatik und Slot-Typ in Absichten. Absichten sind reguläre Ausdrücke für Steroide in Dialogen. Absichten helfen Dialogen zu verstehen, welche Daten aus der Benutzeranforderung abgerufen und an den Handler übergeben werden müssen. Hier ist ein Beispiel für die Absicht des Befehls, Wertpapiere an der Börse zu einem Marktpreis zu kaufen / verkaufen:



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


Dies ähnelt regulären Ausdrücken.



Entitätsbibliothek für Dialoge



Während des Hackathons, um Fähigkeiten für Alice zu entwickeln, habe ich das Alice-Entities-Library- Repository erstellt , die EFigi-Entität dorthin verschoben und bin zu GitHub gegangen, um nach Repositorys zu suchen, die eine Beschreibung der benutzerdefinierten Entitäten enthalten. Ich hatte erwartet, Hunderte von Repositorys zu finden, die Entwickler zu kontaktieren und anzubieten, Pull-Anfragen an die Entitätsbibliothek zu senden.



Ich suchte nach Repositories nach Tags: Yandex-Dialoge, Alice-Skills, Yandex-Alice und Alice-SDK. Es stellte sich heraus, dass nur sehr wenige Leute Tags auf GitHub verwenden. Ich konnte nur ein Repository finden, das eine Datei enthält, die die ELang-Entität beschreibt. Zufällig stellte sich heraus, dass der Autor des Repositorys David war, einer der Organisatoren des Hackathons. Ich schlug David vor, die ELang-Entität zur Bibliothek hinzuzufügen, und erhielt einige Minuten später eine Pull-Anfrage von ihm.



Andere Mitglieder des Online-Hackathons ignorierten meine Chat-Nachrichten mit dem Vorschlag, die Entitätsbibliothek aufzufüllen. Vielleicht war mitten im Kampf keine Zeit dafür. Um ehrlich zu sein, war ich ein wenig frustriert, aber am Ende habe ich einen Link zum Repository bei sameoldmadness / awesome-alice hinzugefügt .



Anstelle einer Schlussfolgerung



Sehr geehrte Alice Skill-Entwickler, bitte laden Sie den Quellcode nach Möglichkeit auf GitHub hoch, damit andere ihn lernen können.



Bitte füge die Yandex-Dialoge, Alice-Skills und Yandex-Alice-Tags zu den Repos hinzu, damit andere deine Fähigkeiten auf GitHub finden können.



Erstellen Sie ein Verzeichnis in Ihrem Repository entitiesund legen Sie die Entitätsbeschreibungsdateien, die Sie für die Fertigkeit geschrieben haben, dort ab, damit andere Ihre Arbeit wiederverwenden können.



Bevor Sie eine neue Entität beschreiben, werfen Sie einen Blick auf die Entitätsbibliothek , die möglicherweise bereits das enthält, was Sie dort benötigen. Wenn nicht, fügen Sie bitte Ihre Entitäten zur Bibliothek hinzu.



All Articles