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
figi
que 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
entities
e 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.