Chatbot RASA: Expérience Parallels



L'industrie du chatbot est en plein essor. Au début, ils étaient assez stupides et pouvaient mener un dialogue avec l'utilisateur, étant leader et offrant des réponses possibles. Ensuite, les robots sont devenus un peu plus intelligents et ont commencé à exiger la saisie de texte de l'utilisateur afin d'obtenir des mots clés des réponses. Le développement de l'apprentissage automatique a conduit à l'émergence de la capacité de communiquer avec le bot également en voix. Cependant, la plupart des solutions ne sont pas allées très loin de la même construction du graphe de dialogue et de la transition entre ses nœuds par mots-clés.

Récemment, chez Parallels, nous avons décidé d'optimiser un certain nombre de processus internes et de créer un bot pour nos propres besoins en tant qu'expérience. Après une courte recherche, nous avons décidé de tenter notre chance sur le projet open source RASA . Selon les développeurs eux-mêmes, ils ont créé un bot de discussion de troisième génération. Autrement dit, ce bot ne fait pas que faire le tour du graphe d'état, mais est capable d'enregistrer et d'utiliser le contexte de la boîte de dialogue précédente. À ce jour, la meilleure illustration pour les robots de discussion modernes ressemble à ceci:



Autrement dit, les robots de discussion ne sont qu'un ensemble de règles vérifiées pour passer d'un point du graphique à un autre. Si vous regardez les solutions existantes des géants du marché, en fait, il n'y a rien de très différent de l'ensemble des règles. En gros, cet ensemble ressemble à ceci:

Dialogue au point XXX.
Si l'utilisateur a entré une offre avec les mots ['acheter', 'ticket'], allez au point "DEMANDER OERE"
Si l'utilisateur a entré une offre avec les mots ['acheter', 'côtelette'], allez au point "DEMANDER DE QUOI"

Il est immédiatement évident que ce sont des ordures ici, si l'utilisateur entre: "Je voudrais acheter un billet pour Porto", ils lui demanderont quand même, "Où voulez-vous aller?" Pour rendre le dialogue plus humain, vous devrez ajouter de nouvelles règles sur ce qu'il faut faire s'il y a une indication du lieu.
Ajoutez ensuite des règles sur ce qu'il faut faire s'il y a une indication du lieu et de l'heure, etc.

Cet ensemble de règles se développera assez rapidement, mais ce n'est pas la pire des choses, toutes les «bonnes» manières peuvent être décrites, améliorées et léchées.

La chose la plus désagréable est qu'une personne est une créature imprévisible, contrairement à un bot, et peut à tout moment commencer à demander complètement différente. Autrement dit, au moment où le bot est déjà prêt à réserver un billet, une personne peut demander "au fait, qu'en est-il de la météo?" ou "bien que non, je voudrais monter dans ma voiture, combien de temps prend la route?"

Cependant, il peut le demander également au moment après avoir choisi une ville, mais avant de choisir une heure de départ ou même de choisir un endroit où il veut aller. Le bot, basé sur des machines à états, va se bloquer et ses pseudopodes mécaniques se contracteront malheureusement, et l'utilisateur sera frustré.

Ici, vous pouvez (et devez) utiliser l'apprentissage automatique. Mais de nouveaux problèmes surgissent: par exemple, si vous utilisez la formation par renforcement pour prédire les transitions vers les points du graphique, des questions se posent: où obtenir des données pour cette formation et qui notera la qualité des réponses?

Il est peu probable que les utilisateurs acceptent d'enseigner votre bot et, comme le montre la pratique, une communauté d'utilisateurs peut enseigner à un bot pas du tout ce que vous voulez et ce que la société considère comme décent. De plus, le bot au stade initial répondra complètement à sa place, ce qui rendra les utilisateurs nerveux et ne jouera pas avec un tel support en principe.

Après avoir analysé et réfléchi à toutes les lacunes des robots existants, les développeurs de RASA ont essayé de résoudre les problèmes comme suit:

  • Toute entrée de l'utilisateur passe par la «détermination de l'intention», c'est-à-dire que le texte saisi à l'aide de l'apprentissage automatique est mappé sur une (ou plusieurs) intention. De plus, si nécessaire, les entités sont isolées du texte et ajoutées à la mémoire du bot.
  • Ce processus est similaire à d'autres robots, à l'exception du modèle de détermination d'intention utilisé.
  • La prochaine action du bot est prédite à l'aide de l'apprentissage automatique basé sur le contexte, c'est-à-dire les actions précédentes, les intentions et l'état de la mémoire du bot.
  • Dans le même temps, il n'y a pas beaucoup de données nécessaires pour la formation initiale, et le bot peut très bien prédire quelle action effectuer même sans exemples et règles spécifiques.

Examinez plus en détail les mécanismes de travail.

RASA NLU


Commençons par la première baleine sur laquelle repose le bot. Il s'agit d'une compréhension du langage naturel, qui se compose de deux parties principales: la détermination de l'intention et la reconnaissance des entités.

Détection d'intention
La détermination de l'intention est basée sur un algorithme modifié appelé StarSpace de Facebook, implémenté sur Tensorflow. Dans ce cas, les modèles pré-formés de représentations vectorielles de mots ne sont pas utilisés, ce qui vous permet de contourner les limites de ces représentations.

Par exemple, la détermination de l'intention dans les algorithmes RASA fonctionnera bien pour n'importe quelle langue, ainsi qu'avec les mots spécifiques que vous spécifiez dans les exemples de formation. Lorsqu'elle est implémentée via des représentations vectorielles pré-formées comme GloVe ou word2vec, la localisation du bot et son application dans des domaines hautement spécialisés apporteront suffisamment de maux de tête.

L'algorithme fonctionne sur la base de la vectorisation des phrases par sac de mots et de la comparaison de leur «similitude». Des exemples d'intentions et d'intentions elles-mêmes sont convertis en vecteurs à l'aide d'un sac de mots et alimentés à l'entrée des réseaux neuronaux correspondants. A la sortie du réseau neuronal, un vecteur est obtenu pour cet ensemble particulier de mots (le même plongement).

La formation se déroule de manière à minimiser la fonction de perte sous la forme de la somme des distances par paires (cosinus ou produits vectoriels) entre deux vecteurs similaires et k-dissemblables. Ainsi, après l'entraînement, un certain vecteur sera associé à chaque intention.

Dès réception de la contribution de l'utilisateur, la proposition est également vectorisée et exécutée à travers le modèle formé. Après cela, la distance entre le vecteur résultant et tous les vecteurs d'intention est calculée. Le résultat est classé, mettant en évidence les intentions les plus probables et supprimant les valeurs négatives, c'est-à-dire complètement différentes.

En plus des petits pains ci-dessus, cette approche vous permet de distinguer automatiquement plus d'une intention de la proposition. Par exemple: «oui, j'ai compris cela. Mais comment puis-je rentrer maintenant? " Reconnu comme "intent_confirm + intent_how_to_drive", ce qui vous permet de construire des dialogues plus humains avec le bot.

Soit dit en passant, avant la formation, vous pouvez créer des phrases artificielles à partir d'exemples en mélangeant les phrases existantes pour augmenter le nombre d'exemples de formation.

Reconnaissance d'entité RASA


La deuxième partie de la NLU est l'extraction d'entités du texte. Par exemple, un utilisateur écrit: «Je veux aller dans un restaurant chinois avec deux amis», le bot doit mettre en évidence non seulement l'intention, mais aussi les données qui lui correspondent. Autrement dit, remplissez votre mémoire que les plats du restaurant doivent être chinois et que le nombre de visiteurs est de trois.

Pour cela, une approche basée sur les champs aléatoires conditionnels est utilisée, qui a déjà été décrite quelque part sur le Habré , donc je ne la répéterai pas. Ceux qui le souhaitent peuvent lire cet algorithme sur le site Web de Stanford .

De plus, je note que vous pouvez obtenir des entités à partir de texte basé sur des modèles, des textes (par exemple, les noms de villes), ainsi que vous connecter à un service Facebook Duckling séparé, ce qui serait également agréable d'écrire un jour.

Histoires RASA


La deuxième baleine bleue sur laquelle RASA Core est basé, ce sont les histoires. L'essence générale des histoires sont des exemples de conversations réelles avec le bot, formatées en intention-réaction. Sur la base de ces histoires, un réseau neuronal récurrent (LSTM) est formé, qui mappe l'historique des messages précédents à l'action souhaitée. Cela vous permet de ne pas définir les graphiques des boîtes de dialogue de manière rigide, ainsi que de ne pas déterminer tous les états et transitions possibles entre eux.

Avec un nombre suffisant d'exemples, le réseau prédira de manière adéquate le prochain état de la transition, quelle que soit la présence d'un exemple spécifique. Malheureusement, le nombre exact d'histoires pour cela est inconnu, et tout ce qui peut être guidé par la phrase des développeurs: "plus, mieux c'est".

Pour entraîner le système, et pas seulement pour y enregistrer des dialogues inventés, vous pouvez utiliser une formation interactive.

Il y a deux options:
1.Faites engager un certain nombre d'ingénieurs dans des conversations avec le bot, corrigeant des prédictions incorrectes, une définition incorrecte d'entités et des prises avec des actions de prédiction sur des histoires.

2. Enregistrez les conversations dans la base de données, puis continuez à utiliser des ingénieurs spécialement formés pour examiner les boîtes de dialogue où l'utilisateur n'a pas pu résoudre son problème, c'est-à-dire qu'il est passé à une personne ou que le bot a reconnu son impuissance et n'a pas pu répondre.

Afin de comprendre le mécanisme des histoires, il est plus facile d'analyser un exemple simple. Disons une réservation de table dans un restaurant, un exemple fourni par les développeurs dans la section des exemples de code source. D'abord, nous déterminerons nos intentions, puis nous ferons quelques histoires.

Intentions et leurs exemples:

Intent_hello
  • Salut
  • Bonjour
  • Aloha
  • Bonjour

...
Intent_thanks
  • Merci
  • Nice
  • Je vous remercie

...
Intent_request
  • Au revoir sauter

Intent_inform
  • Au revoir sauter

Ensuite, vous devez créer la mémoire du bot, c'est-à-dire déterminer les emplacements dans lesquels les besoins de l'utilisateur seront enregistrés. Définissez les emplacements:

cuisine:
type: non caractérisé
auto_fill: false
num_people:
type: non caractérisé
auto_fill: false

Et maintenant, nous allons montrer des exemples (une petite partie) des intentions omises ci-dessus. Les crochets dans les exemples sont les données pour la formation Ner_CRF, au format [entité] (nom de variable pour le stockage: ce que nous stockons).

intent_request_restaurant
  • Je cherche un restaurant
  • puis-je obtenir de la nourriture [suédoise] (cuisine) pour [six personnes] (num_people: 6)
  • un restaurant qui sert des plats [des Caraïbes] (cuisine)
  • id comme un restaurant
  • Je cherche un restaurant qui sert de la nourriture (méditerranéenne) (cuisine)

intent_inform
  • [2] (num_people) personnes
  • pour [trois] (num_people: 3) personnes
  • juste [une] (num_people: 1) personne
  • how bout [asian oriental] (cuisine)
  • qu'en est-il de la nourriture [indienne] (cuisine)
  • euh que diriez-vous du type de nourriture [turc] (cuisine)
  • um [anglais] (cuisine)

Maintenant, nous déterminons l'histoire du chemin principal:

* saluer
- utter_greet
* Intent_request
- restaurant_form
- formulaire {"nom": "restaurant_form"}
- formulaire {"nom": null}
- action_book_restaurant
* merci
- utter_noworries

C'est le bot parfait pour un monde parfait. Si l'utilisateur a immédiatement indiqué toutes les données nécessaires dans la première phrase, un tableau sera réservé. Par exemple, il écrit «je veux réserver une table dans un restaurant espagnol pour cinq personnes». Dans ce cas, num_people sera 5, et la cuisine - espagnol, ce qui est suffisant pour le bot pour d'autres actions sur la réservation.

Cependant, si vous regardez les exemples, vous pouvez voir que les données ne sont pas toujours présentes dans la quantité requise, et parfois elles ne le sont pas du tout. Des dialogues non essentiels apparaissent donc.

Supposons qu'il n'y ait pas de données sur la cuisine dans la demande, c'est-à-dire quelque chose comme cette boîte de dialogue:
Bonjour
Salut
Je veux réserver un restaurant pour cinq personnes
...

Pour qu'il se termine correctement, vous devez déterminer l'historique du formulaire suivant:
* saluer
- utter_greet
* Intent_request
- restaurant_form
- formulaire {"nom": "restaurant_form"}
- emplacement {"required_slot": "num_people"}
- utter_ask_coven
* formulaire: informer {"cuisine": "mexicain"}
- emplacement {"cuisine": "mexicain"}
- forme: restaurant_form
...

Et la meilleure partie est que si vous créez des histoires pour plusieurs cuisines, alors, en rencontrant un inconnu, le bot prédira lui-même la prochaine action, bien qu'il ne soit pas très sûr. Dans le même temps, si vous créez une histoire similaire, mais où l'emplacement "cuisine" est rempli, et non l'emplacement "num_people", le bot ne se souciera absolument pas de l'ordre dans lequel les informations sur les paramètres de réservation de table seront fournies.

Il y a deux façons d'arrêter toute tentative de mener un bot du bon chemin: identifier les histoires possibles pour ne parler de "rien", ou à toutes les tentatives pour entamer une telle conversation - pour répondre qu'il vaut la peine de reprendre les affaires.

Étant donné que notre entreprise est au début d'un voyage incroyable dans le monde des chatbots, il y a une chance qu'il y ait de nouveaux articles sur ce râteau que nous avons collecté et ce que nous avons fait. Restez à l'écoute!

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


All Articles