RASA Chatbot: Parallels Experience



A indústria de chatbot está crescendo. No início, eram estúpidos o suficiente e podiam dialogar com o usuário, liderando e oferecendo possíveis respostas. Em seguida, os bots ficaram um pouco mais inteligentes e começaram a exigir entrada de texto do usuário para obter palavras-chave das respostas. O desenvolvimento do aprendizado de máquina levou ao surgimento da capacidade de se comunicar com o bot também na voz. No entanto, a maioria das soluções não foi muito longe da mesma construção do gráfico de diálogo e da transição entre seus nós por palavras-chave.

Recentemente, na Parallels, decidimos otimizar vários processos internos e criar um bot para nossas próprias necessidades como um experimento. Após uma breve pesquisa, decidimos tentar a sorte no projeto de código aberto RASA . De acordo com os próprios desenvolvedores, eles criaram um bot de bate-papo de terceira geração. Ou seja, esse bot não apenas percorre o gráfico de estado, mas é capaz de salvar e usar o contexto da caixa de diálogo anterior. Até o momento, a melhor ilustração para os bots de bate-papo modernos é mais ou menos assim:



Ou seja, os bots de bate-papo são apenas um conjunto de regras verificadas para mudar de um ponto no gráfico para outro. Se você olhar para as soluções existentes dos gigantes do mercado, na verdade não há nada muito diferente do conjunto de regras lá. Grosso modo, esse conjunto se parece com isso:

Diálogo no ponto XXX.
Se o usuário inseriu uma oferta com as palavras ['comprar', 'ingresso'], vá para o ponto "PERGUNTAR ONDE"
Se o usuário inseriu uma oferta com as palavras ['comprar', 'costeleta'], vá para o ponto “PERGUNTAR DO QUÊ”

É imediatamente óbvio que é lixo aqui, se o usuário digitar: "Gostaria de comprar uma passagem para o Porto", ele perguntará: "Para onde você quer ir?" Para tornar o diálogo mais humano, você precisará adicionar novas regras sobre o que fazer se houver uma indicação do local.
Em seguida, adicione regras sobre o que fazer se houver uma indicação do local e hora, e assim por diante.

Esse conjunto de regras crescerá rápido o suficiente, mas não é a pior coisa, todas as maneiras "certas" podem ser descritas, aprimoradas e lambidas.

O mais desagradável é que uma pessoa é uma criatura imprevisível, diferente de um bot, e pode a qualquer momento começar a perguntar completamente diferente. Ou seja, no momento em que o bot já está pronto para reservar um bilhete, uma pessoa pode perguntar "a propósito, e o tempo?" ou "embora não, eu gostaria de ir no meu carro, quanto tempo demora a estrada?"

No entanto, ele pode fazer isso também no momento depois de escolher uma cidade, mas antes de escolher um horário de partida ou mesmo escolher um lugar para onde ele quer ir. O bot, baseado em máquinas de estado, atolará e seus pseudópodes mecânicos se contorcerão tristemente, e o usuário ficará frustrado.

Aqui você pode (e deve) usar o aprendizado de máquina. Mas então surgem novos problemas: por exemplo, se você usar o treinamento de reforço para prever transições para pontos do gráfico, surgirão perguntas: onde obter dados para esse treinamento e quem avaliará a qualidade das respostas?

É improvável que os usuários concordem em ensinar seu bot e, como mostra a prática, uma comunidade de usuários pode ensinar um bot de maneira alguma o que você deseja e o que a sociedade considera decente. Além disso, o bot no estágio inicial responderá completamente fora do lugar, o que deixará os usuários nervosos e não mexerá com esse suporte em princípio.

Após analisar e pensar em todas as deficiências dos bots existentes, os desenvolvedores do RASA tentaram resolver os problemas da seguinte maneira:

  • Qualquer entrada do usuário passa pela “determinação da intenção”, ou seja, o texto digitado usando o aprendizado de máquina é mapeado para uma (ou várias) intenções. Além disso, se necessário, as entidades são isoladas do texto e adicionadas à memória do bot.
  • Esse processo é semelhante a outros bots, com exceção do modelo de determinação de intenção usado.
  • A próxima ação do bot é prevista usando o aprendizado de máquina com base no contexto, ou seja, as ações anteriores, intenções e status de memória do bot.
  • Ao mesmo tempo, não há muitos dados necessários para o treinamento inicial, e o bot pode prever bastante qual ação executar, mesmo sem exemplos e regras específicos.

Considere os mecanismos de trabalho com mais detalhes.

RASA NLU


Vamos começar com a primeira baleia na qual o bot repousa. Este é um entendimento da linguagem natural, que consiste em duas partes principais: determinação da intenção e reconhecimento das entidades.

Detecção de intenção
A determinação da intenção é baseada em um algoritmo modificado chamado StarSpace do Facebook, implementado no Tensorflow. Nesse caso, não são usados ​​modelos pré-treinados de representações vetoriais de palavras, o que permite contornar as limitações dessas representações.

Por exemplo, determinar a intenção nos algoritmos RASA funcionará bem para qualquer idioma, bem como com quaisquer palavras específicas especificadas nos exemplos de treinamento. Quando implementada por meio de representações vetoriais pré-treinadas como GloVe ou word2vec, a localização do bot e sua aplicação em áreas altamente especializadas trará dor de cabeça suficiente.

O algoritmo trabalha com base na vetorização de sentenças através de um conjunto de palavras e na comparação de sua “similaridade”. Exemplos de intenções e intenções são convertidos em vetores usando um saco de palavras e alimentados à entrada das redes neurais correspondentes. Na saída da rede neural, um vetor é obtido para esse conjunto específico de palavras (a mesma incorporação).

O treinamento ocorre de forma a minimizar a função de perda na forma da soma das distâncias aos pares (produtos cosseno ou vetoriais) entre dois vetores semelhantes e k-diferentes. Assim, após o treinamento, um certo vetor será associado a cada intenção.

Após o recebimento da entrada do usuário, a proposta é similarmente vetorizada e é executada no modelo treinado. Depois disso, a distância do vetor resultante a todos os vetores de intenção é calculada. O resultado é classificado, destacando as intenções mais prováveis ​​e cortando valores negativos, ou seja, completamente diferentes.

Além dos bolos acima, essa abordagem permite distinguir automaticamente mais de uma intenção da proposta. Por exemplo: “sim, eu entendi isso. Mas como posso chegar em casa agora? Reconhecido como "intent_confirm + intent_how_to_drive", que permite criar diálogos mais humanos com o bot.

A propósito, antes do treinamento, você pode criar frases artificiais a partir de exemplos, misturando as existentes para aumentar o número de exemplos de treinamento.

Reconhecimento de entidade RASA


A segunda parte do NLU é a extração de entidades do texto. Por exemplo, um usuário escreve: "Quero ir a um restaurante chinês com dois amigos", o bot deve destacar não apenas a intenção, mas também os dados correspondentes a ela. Ou seja, lembre-se de que os pratos do restaurante devem ser chineses e que o número de visitantes é três.

Para isso, é usada uma abordagem baseada em campos aleatórios condicionais, que já foi descrita em algum lugar do Habré , então não vou repeti-la. Quem desejar pode ler sobre esse algoritmo no site da Stanford .

Além disso, observo que você pode obter entidades a partir de texto com base em modelos, textos (por exemplo, nomes de cidades), além de se conectar a um serviço separado do Facebook Duckling, o que também seria interessante escrever sobre algum dia.

Histórias da RASA


A segunda baleia azul na qual o RASA Core se baseia são as histórias. A essência geral das histórias são exemplos de conversas reais com o bot, formatadas como reação à intenção. Com base nessas histórias, uma rede neural recorrente (LSTM) é treinada, que mapeia o histórico de mensagens anterior para a ação desejada. Isso permite que você não configure gráficos de diálogos rigidamente, assim como não determine todos os estados e transições possíveis entre eles.

Com um número suficiente de exemplos, a rede preverá adequadamente o próximo estado da transição, independentemente da presença de um exemplo específico. Infelizmente, o número exato de histórias para isso é desconhecido, e tudo o que pode ser guiado é a frase dos desenvolvedores: "quanto mais, melhor".

Para treinar o sistema, não apenas gravando algumas caixas de diálogo inventadas, é possível usar o treinamento interativo.

Existem duas opções:
1. Faça com que vários engenheiros se envolvam em conversas com o bot, corrigindo previsões incorretas, definição incorreta de entidades e se conecte com ações de previsão de histórias.

2. Salve as conversas no banco de dados e continue usando engenheiros especialmente treinados para examinar as caixas de diálogo em que o usuário não conseguiu resolver seu problema, ou seja, mudou para uma pessoa, ou o bot admitiu seu desamparo e não conseguiu responder.

Para entender o mecanismo das histórias, é mais fácil analisar um exemplo simples. Digamos uma reserva de mesa em um restaurante, um exemplo fornecido pelos desenvolvedores na seção de exemplos de código-fonte. Primeiro, determinaremos nossas intenções e depois faremos algumas histórias.

Intenções e seus exemplos:

Intent_hello
  • Oi
  • Olá
  • Aloha
  • Bom dia

...
Intent_thanks
  • Obrigado
  • Nice
  • Obrigada

...
Intent_request
  • Bye skip

Intent_inform
  • Bye skip

Em seguida, você precisa criar a memória do bot, ou seja, determinar os slots nos quais o que o usuário exige será gravado. Defina os slots:

cozinha:
tipo: não caracterizado
auto_fill: false
num_people:
tipo: não caracterizado
auto_fill: false

E agora mostraremos exemplos (uma pequena parte) para as intenções omitidas acima. Os colchetes nos exemplos são os dados para o treinamento de Ner_CRF, no formato [entidade] (nome da variável para armazenamento: o que armazenamos).

intent_request_restaurant
  • estou procurando um restaurante
  • posso obter comida (sueca) (culinária) para [seis pessoas] (num_people: 6)
  • um restaurante que serve comida do Caribe
  • id como um restaurante
  • estou procurando um restaurante que serve comida [mediterrânea] (culinária)

intent_inform
  • [2] (num_people) pessoas
  • para [três] (num_people: 3) pessoas
  • apenas [um] (num_people: 1) pessoa
  • que tal [asiático oriental] (cozinha)
  • e quanto à comida (indiana)
  • uh e quanto ao tipo de comida [turca] (culinária)
  • um [português] (cozinha)

Agora, determinamos a história do caminho principal:

* cumprimentar
- utter_greet
* Intent_request
- restaurant_form
- formulário {"nome": "restaurant_form"}
- formulário {"nome": nulo}
- action_book_restaurant
* obrigado
- utter_noworries

Esse é o bot perfeito para um mundo perfeito. Se o usuário indicou imediatamente todos os dados necessários na primeira frase, uma tabela será reservada. Por exemplo, ele escreve "eu quero reservar mesa em restaurante espanhol para cinco pessoas". Nesse caso, num_people será 5 e cuisine - espanhol, o que é suficiente para o bot para ações adicionais na reserva.

No entanto, se você observar os exemplos, poderá ver que os dados nem sempre estão presentes na quantidade necessária e, às vezes, nem sequer estão. Portanto, diálogos não essenciais aparecem.

Suponha que não haja dados sobre a cozinha na solicitação, ou seja, algo como este diálogo:
Olá
Oi
Quero reservar restaurante para cinco pessoas
...

Para que seja concluído corretamente, você precisa determinar o histórico do seguinte formulário:
* cumprimentar
- utter_greet
* Intent_request
- restaurant_form
- formulário {"nome": "restaurant_form"}
- slot {"request_slot": "num_people"}
- utter_ask_coven
* formulário: informe {"cuisine": "mexican"}
- slot {"cuisine": "mexican"}
- formulário: restaurant_form
...

E a melhor parte é que, se você criar histórias para várias cozinhas, conhecer um desconhecido, o bot preverá a próxima ação por conta própria, embora não tenha muita certeza. Ao mesmo tempo, se você criar uma história semelhante, mas onde o slot "cuisine" for preenchido, e não o slot "num_people", o bot não se importará absolutamente em que ordem as informações sobre os parâmetros de reserva da tabela serão fornecidas.

Há duas maneiras de interromper qualquer tentativa de levar um bot do caminho certo: identificar possíveis histórias para falar "sobre nada" ou todas as tentativas de iniciar uma conversa como essa - para responder que vale a pena voltar aos negócios.

Como nossa empresa está no início de uma incrível jornada pelo mundo dos chatbots, existe a chance de haver novos artigos sobre o rake que coletamos e o que fizemos. Fique atento!

Source: https://habr.com/ru/post/pt470754/


All Articles