Entidades para la plataforma Yandex.Dialogues

El sábado pasado se realizó un hackathon en línea para desarrollar las habilidades de Alice. Es una pena que nadie haya escrito sobre los resultados aquí, es curioso leer las historias de los ganadores. Pero como no había voluntarios, compartiré mi historia.



Estoy creando una interfaz de voz para administrar una cuenta de corretaje, ya escribí sobre ella en Habré: Alice, compre Yandex . En algún momento, necesitaba extraer el precio en diferentes monedas de la solicitud. Estoy seguro de que no soy el primero en enfrentar un problema así, así que intenté encontrar intenciones ya hechas o entidades con nombre en GitHub, pero no pude encontrar nada. Había un hackathon en la nariz, muchos desarrolladores en un solo lugar, pensé, si todos comparten sus mejores prácticas, entonces habrá una biblioteca completa de entidades. Así nació la idea del repositorio de la biblioteca de entidades.



Entidades personalizadas en cuadros de diálogo



Cuando le digo a la columna inteligente "compre una acción de Yandex", el discurso atraviesa la magia interna de la plataforma Yandex.Dialogi, luego va al enlace web que especifiqué como el manejador de habilidades. Esto es lo que viene en el controlador:



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


Preste atención a la ranura figique contiene el identificador de acciones de Yandex, el llamado FIGI (identificador global de instrumentos financieros), que se requiere para interactuar con la API de la plataforma de negociación de Tinkoff Investments. El tipo de datos EFigi es una entidad personalizada que describí en la sección Entidades al crear una habilidad en la plataforma Yandex.Dialogi. Aquí hay un fragmento de la descripción:



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


Gracias al mecanismo de la entidad, en el código del controlador, no necesito hacer manipulaciones adicionales en los datos de entrada para obtener FIGI. Dialogue Platform convierte el nombre de la seguridad en FIGI para mí.



Estoy usando EFigi como una gramática no terminal y tipo de ranura en intentos. Los intentos son expresiones regulares con esteroides en Diálogos. Las intenciones ayudan a los Diálogos a comprender qué datos deben recuperarse de la solicitud del usuario y pasarse al controlador. Aquí hay un ejemplo de una intención para el comando de comprar / vender valores en la bolsa a un precio de mercado:



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


Esto es similar a las expresiones regulares.



Biblioteca de entidades para diálogos



Durante el hackathon para desarrollar habilidades para Alice, creé el repositorio alice-entidades-library , empujé la entidad EFigi allí y fui a GitHub para buscar repositorios que tengan una descripción de entidades personalizadas. Esperaba encontrar cientos de repositorios, contactar a los desarrolladores y ofrecer enviar solicitudes de extracción a la biblioteca de la entidad.



Busqué repositorios por etiquetas: yandex-dialogs, alice-skills, yandex-alice y alice-sdk. Resultó que muy pocas personas usan etiquetas en GitHub, solo pude encontrar un repositorio que contiene un archivo que describe la entidad ELang. Por coincidencia, el autor del repositorio resultó ser David, uno de los organizadores del hackathon. Le sugerí a David que agregara la entidad ELang a la biblioteca y recibí una solicitud de extracción de él unos minutos después.



Otros miembros del hackathon en línea ignoraron mis mensajes de chat con una propuesta para reponer la biblioteca de la entidad. Quizás, en medio de la lucha, no había tiempo para esto. Para ser honesto, me frustré un poco, pero al final agregué un enlace al repositorio en sameoldmadness / awesome-alice .



En lugar de una conclusión



Estimados desarrolladores de habilidades de Alice, carguen el código fuente en GitHub siempre que sea posible para que otros puedan aprender.



Agregue los cuadros de diálogo yandex-dialog, alice-skill y yandex-alice a los repositorios para que otros puedan encontrar sus habilidades en GitHub.



Cree un directorio en su repositorio entitiesy coloque los archivos de descripción de entidad que escribió para la habilidad allí para que otros puedan reutilizar su trabajo.



Antes de describir una nueva entidad, eche un vistazo a la biblioteca de entidades , ya puede tener lo que necesita allí. Y si no, agregue sus entidades a la biblioteca.



All Articles