Entidades para a plataforma Yandex.Dialogues

Um hackathon online para desenvolver as habilidades de Alice ocorreu no último sábado. É uma pena que ninguém tenha escrito sobre os resultados aqui, é curioso ler as histórias dos vencedores. Mas como não houve voluntários, vou compartilhar minha história.



Estou fazendo uma interface de voz para gerenciar uma conta de corretagem, já escrevi sobre ela na Habré - Alice, compre o Yandex . Em algum momento, eu precisava extrair o preço em diferentes moedas da solicitação. Tenho certeza de que não sou o primeiro a enfrentar essa tarefa, então tentei encontrar intenções prontas ou entidades nomeadas no GitHub, mas não consegui encontrar nada. Havia um hackathon no nariz, muitos desenvolvedores em um só lugar, pensei, se todos compartilharem suas melhores práticas, haverá toda uma biblioteca de entidades. Foi assim que nasceu a ideia para o repositório da biblioteca de entidades.



Entidades personalizadas em caixas de diálogo



Quando digo à coluna inteligente "compre uma ação Yandex", o discurso passa pela mágica interna da plataforma Yandex.Dialogi e depois passa para o gancho da Web que eu especifiquei como manipulador de habilidades. É isso que entra no manipulador:



  "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 atenção ao slot figique contém o identificador de ações Yandex, o chamado FIGI (Identificador Global de Instrumentos Financeiros), necessário para interagir com a API da plataforma de negociação da Tinkoff Investments. O tipo de dados EFigi é uma entidade personalizada que descrevi na seção Entidades ao criar uma habilidade na plataforma Yandex.Dialogi. Aqui está um trecho da descrição:



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


Graças ao mecanismo da entidade, no código do manipulador, não preciso fazer manipulações adicionais nos dados de entrada para obter o FIGI. A Plataforma de Diálogo converte o nome da segurança em FIGI para mim.



Estou usando o EFigi como uma gramática não-terminal e tipo de slot nas intenções. Intenções são expressões regulares em esteróides nos Diálogos. Intenções ajudam os Diálogos a entender quais dados precisam ser recuperados da solicitação do usuário e transmitidos ao manipulador. Aqui está um exemplo de uma intenção do comando de comprar / vender títulos na bolsa a um preço 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


Isso é semelhante às expressões regulares.



Biblioteca de entidades para diálogos



Durante o hackathon para desenvolver habilidades para Alice, criei o repositório alice- entity -library , empurrei a entidade EFigi para lá e fui ao GitHub para procurar repositórios com uma descrição de entidades personalizadas. Eu esperava encontrar centenas de repositórios, entrar em contato com os desenvolvedores e me oferecer para enviar solicitações pull à biblioteca da entidade.



Pesquisei repositórios por tags: yandex-dialogs, alice-skills, yandex-alice e alice-sdk. Aconteceu que muito poucas pessoas usam tags no GitHub, eu consegui encontrar apenas um repositório contendo um arquivo que descreve a entidade ELang. Por coincidência, o autor do repositório acabou sendo David, um dos organizadores da hackathon. Sugeri a David que adicionasse a entidade ELang à biblioteca e recebi uma solicitação de recebimento dele alguns minutos depois.



Outros membros do hackathon online ignoraram minhas mensagens de bate-papo com uma proposta para reabastecer a biblioteca da entidade. Talvez, no meio da luta, não houvesse tempo para isso. Para ser sincero, fiquei um pouco frustrado, mas no final adicionei um link para o repositório em sameoldmadness / awesome-alice .



Em vez de uma conclusão



Caros desenvolvedores de habilidades da Alice, carregue o código-fonte no GitHub sempre que possível para que outros possam aprender.



Adicione as tags yandex-dialogs, alice-skills e yandex-alice aos repositórios para que outras pessoas possam encontrar suas habilidades no GitHub.



Crie um diretório em seu repositório entitiese coloque lá os arquivos de descrição da entidade que você escreveu para a habilidade, para que outras pessoas possam reutilizar seu trabalho.



Antes de descrever uma nova entidade, dê uma olhada na biblioteca de entidades , pois ela já pode ter o que você precisa. Caso contrário, adicione suas entidades à biblioteca.



All Articles