Les agents conversationnels avec python (chatbot)

Hatim Khouzaimi Mis à jour le : 29 juillet 2022 méthode, python Laissez un commentaire

Les agents conversationnels occupent une place importante parmi les applications de l’Intelligence Artificielle et du Machine Learning. Depuis quelques années, les entreprises se sont emparées de cet outil pour améliorer les échanges avec leurs clients et leurs collaborateurs. Cet article est une introduction aux agents conversationnels, leurs avantages et la façon de les concevoir. Il s’achève sur une application pratique où nous construirons un agent conversationnel très simple.

Définition

Un agent conversationnel, aussi appelé système de dialogue en recherche scientifique, est un logiciel capable d’interagir avec ses utilisateurs en langage naturel. En ce sens, il est capable de comprendre des requêtes formulées naturellement (comme si elles étaient adressées à un autre être humain), de les traiter, de prendre des actions et de formuler des réponses.

Un agent conversationnel peut être textuel et être accessible à travers une interface de messagerie par exemple, ou vocale comme c’est le cas de l’assistant Siri ou de l’enceinte Google Home.

Exemples d’applications

Depuis l’essor des chatbots il y a quelques années, plusieurs organismes et entreprises se sont emparés de cette technologie en essayant de l’appliquer à différents cas d’usage. Toutes ces expériences n’ont pas été couronnées de succès. Voici quatre exemples d’applications parmi les plus prometteuses et dont la valeur a été démontrée sur le marché.

Assistants virtuels

A l’instar de Siri, Amazon Echo (Alexa) ou de l’enceinte Google Home, les assistants vocaux ont vocation à réaliser des tâches diverses et variées de la vie courante: réveil, consultation de contenu sur internet, agenda…etc…

Ils sont à distinguer des chatbots et des voicebots qui sont généralement déployés par les entreprises afin de rendre un ou des services précis.

Service client et RH

Renforcer son service client ou RH grâce aux chatbots est une pratique courante de nos jours. Il s’agit de l’application principale des agents conversationnels en entreprise aujourd’hui. En général, beaucoup de requêtes émises par les clients, les prospects ou les collaborateurs lors d’un appel sont récurrentes et facilement reconnaissables par un algorithme de compréhension du langage. Par exemple:

  • Je veux télécharger ma dernière facture
  • Consulter mon solde
  • Suivi de ma commande
  • Télécharger ma dernière fiche de paie
  • Je voudrais poser des congés
  • …etc…

Les chatbots constituent un bon outil pour répondre à ces demandes et cela présente certains avantages que nous présenterons plus loin.

Education

A l’ère où les élèves et les étudiants utilisent très fréquemment des applications de messagerie, pourquoi ne pas utiliser ce canal pour favoriser l’accès aux contenus éducatifs et améliorer leur expérience d’apprentissage?

Dans ce cadre, les chatbots peuvent être utilisés comme un moyen interactif d’apprendre et qui offre une expérience personnalisée et adaptée au rythme de chacun.

Santé

Capables de répondre aux questions des patients, ils sont déployés par les organismes de santé et les sociétés d’assurance. Ils ont pour but de répondre aux questions fréquentes et d’effectuer des prises de rendez-vous par exemple.

Ayant l’avantage d’être accessibles et disponibles 24h/24 et 7j/7, ils peuvent aussi récolter les informations nécessaires pour une mise en relation avec un professionnel de santé, optimisant ainsi la prise de rendez-vous.

Pourquoi adopter un agent conversationnel en entreprise?

Les agents conversationnels présentent un certain nombre d’avantages pour les entreprises, leurs clients et leurs collaborateurs:

  • Disponibilité: contrairement à la majorité des services reposant sur des humains, les agents conversationnels ne fonctionnent pas pendant des horaires d’ouvertures. Ils sont disponibles tous les jours et à n’importe quelle heure.
  • Réponse instantanée: les agents conversationnels sont en mesure de fournir des réponses de manière immédiate (sauf rares cas particuliers). Cela permet d’éviter les attentes – parfois très longues – pour joindre un conseiller par téléphone ou sur livechat.
  • Baisse des coûts: gérer une partie des requêtes utilisateurs de manière automatique entraîne une baisse des coûts de service client.
  • Désengorger les services existants: en diminuant le trafic à gérer par des humains, cela permet de fluidifier le service client, rendant les conseillers plus facilement accessibles.
  • Conseillers plus valorisés: les agents conversationnels peuvent se charger des tâches à faible valeur ajoutée, permettant aux conseillers d’être plus valorisés en se consacrant aux tâches à plus forte valeur ajoutée.
  • Meilleure expérience client: savoir combiner les recours aux opérateurs humains et aux agents conversationnels permet d’optimiser l’expérience client de manière générale.

Les briques de base

Le schéma suivant récapitule l’architecture classique des agents conversationnels.

User icons created by Vitaly Gorbachev, Database icons created by phatplus - Flaticon

User icons created by Vitaly Gorbachev, Database icons created by phatplus – Flaticon

  • ASR (Automatic Speech Recognition): Transforme le signal audio en texte (reconnaissance vocale en français). Historiquement, les briques d’ASR étaient basées sur des modèles de type HMM (Hidden Markov Models) et l’algorithme de Viterbi. Aujourd’hui, le Deep Learning a pris le dessus.
  • NLU (Natural Language Understanding): Transforme le texte en concepts (symboles compréhensible par la machine). Par exemple, la requête “Je voudrais acheter un billet de train de Paris à Lyon le 22 septembre dans l’après-midi.” pourra être transformée en un JSON:

Untitled

  • DM (Dialogue Manager): Cerveau de l’agent conversationnel, il décide du prochain acte de dialogue à effectuer, à chaque tour de parole. L’apprentissage par renforcement est appliqué au DM depuis plusieurs années, surtout en recherche scientifique. D’autres approches basées sur le Deep Learning, comme TED, ont également vu le jour. Néanmoins, dans la pratique, la complexité de la tâche pousse les concepteurs à opter pour des approches à base de règles en grande majorité (arbres de dialogue).
  • NLG (Natural Language Generation): Transforme les concepts en texte. Les concepteurs optent pour des templates prédéfinis en pratique. Cela permet de contrôler les sorties possibles du chatbot et de s’assurer que cela est en adéquation avec les valeurs et la marque de l’entreprise.
  • TTS (Text-To-Speech): Transforme le texte en signal audio (synthèse vocale en français). Pendant longtemps, nous avons préféré les pistes audio pré-enregistrées car ayant une voix plus naturelle et moins “robotisée”. Aujourd’hui, les techniques de Deep Learning permettent d’imiter une voix humaine de manière précise ce qui favorise leur utilisation, de plus en plus importante.

Processus d’élaboration d’un agent conversationnel

Construire un agent conversationnel est un processus cyclique, chaque cycle se composant de trois phases:

  • Préparation
  • Développement
  • Pilotage et amélioration continue

Préparation

Il est important d’identifier le périmètre d’un agent conversationnel. Il existe deux façons de procéder:

  • Approche introspective/brainstorming: les collaborateurs d’une entreprise se basent sur leur expertise métier pour déterminer les services que devrait rendre l’agent conversationnel
  • Approche data-driven: les thématiques récurrentes que l’agent conversationnel doit être capable de traiter sont déterminées en analysant les données conversationnelles de l’entreprise: appels téléphoniques, e-mails, livechat, réseaux sociaux…etc…

En deuxième lieu et une fois le périmètre établi, des exemples de formulations pour chaque requête sont récoltées, par exemple:

  • Je veux consulter mon solde
  • Mon solde?
  • Quel est mon solde actuel?
  • …etc…

Là encore, ces exemples peuvent être générées par des experts ou récupérées dans les données existantes.

Il est conseillé de combiner les deux approches, à la fois pour la définition du périmètre et la récolte d’exemples de formulations.

Développement

Dans bon nombre de cas, l’utilisation de solutions d’ASR sur étagère est suffisante. Dans le cas où un vocabulaire/jargon spécifique doit être introduit, il est possible d’utiliser des solutions à l’instar de Kaldi. Notez cependant que cela requiert une expertise spécifique et il est recommandé de consulter un spécialiste.

Afin de construire le modèle de NLU, il faut se baser sur les résultats du travail préparatoire. Le périmètre établi permet de définir les intentions et entités et les exemples de formulation récoltées servent d’exemples d’entraînement pour le modèle de Machine Learning que vous aurez choisi.

Bien que la plupart des DM soient basés sur des arbres avec des règles, il est également possible de construire des exemples de conversation pour entraîner des modèles de Machine Learning. Pour ce module, il ne faut pas négliger le travail d’intégration avec le backend qui peut être long dans certaines situations.

Concernant la NLG, ayez recours à des templates qui seront complétés en fonction des résultats récoltés par le DM. Voici un exemple de template, avec les noms des champs à compléter entre accolades:

  • Merci {prefixe} {prenom} {nom}, votre vol pour {destination} a bien été confirmé.

Enfin, n’hésitez pas à utiliser des solutions existantes pour la TTS. Elles vous permettent même de personnaliser la voix!

Pilotage et amélioration continue

Chaque agent conversationnel en entreprise doit disposer d’indicateurs pour mesurer sa performance, au même titre que n’importe quelle application. Par exemple:

  • Traffic
  • Engagement
  • Ventes (le cas échéant)
  • Satisfaction client
  • …etc…

Cependant, ces agents disposent de métriques qui leurs sont propres:

  • Taux de compréhension (intentions correctement comprises)
  • Taux de faux positifs (requêtes associées à une mauvaise intention)
  • Taux de compréhension des entités
  • …etc…

Les solutions de création d’agent conversationnel offrent en général des tableaux de bord qui permettent de suivre ces indicateurs mais il est fréquent que les besoins spécifiques des entreprises les poussent à développer leur propre logiciel de suivi.

Afin de maintenir un chatbot qui réponde aux attentes des utilisateurs, il est important de l’améliorer en continu. Pour cela et au delà des analyses des KPIs, il faut analyser les conversations plus en profondeur afin de:

  • Détecter les intentions et les entités mal reconnues, puis les renforcer en ajoutant des exemples d’entraînement issues de ces conversations
  • Créer de nouvelles intentions quand les requêtes des utilisateurs indiquent de nouveaux besoins

Là encore, beaucoup d’outils de création de chatbot offrent des fonctionnalités pour cela, mais il est fréquent que les entreprises fabriquent leur propre outillage à cette fin.

Application pratique sur Rasa (avec Python)

Dans cette section, nous allons créer un chatbot simple capable de restituer des données météo à partir d’une base de données externe. Nous utiliserons un outil gratuit et open source développé en Python: Rasa. Vous pouvez retrouver l’ensemble des fichiers correspondant au projet dans ce repo. Nous utilisons ici la version 3.2.1 de Rasa.

Commencez par installer Rasa Open Source en suivant ce lien. Vous devez préalablement avoir installé Python. Suivez le mode d’installation correspondant à votre système d’exploitation.

Une fois Rasa installé, créez un nouveau répertoire pour votre projet et utilisez la commande suivante pour créer un template avec un mini-chatbot par défaut:

rasa init

Répondez “Yes” quand l’assistant vous demande s’il devraient entraîner un nouveau modèle:

Untitled

Vous pouvez ensuite interagir avec ce chatbot en ligne de commande, en anglais:

Untitled

Explorez l’arborescence des fichiers créés par Rasa. Le répertoire data contient les données d’entraînement pour la NLU et le DM. Intéressons-nous d’abord à la NLU en ouvrant le fichier nlu.yml:

nlu.yml

nlu.yml

Il s’agit d’un fichier au format YAML, avec des exemples de formulations pour chaque intention. Commençons par éliminer toutes les intentions sauf greet, goodbye, ask_bot_purpose et bot_challenge, puis traduisons les exemples de formulation en français:

version: "3.1"

nlu:
- intent: greet
  examples: |
    - bonjour
    - salut
    - hey
    - hello
    - hola
    - coucou
- intent: goodbye
  examples: |
    - au revoir
    - bye
    - ciao
    - bye bye
    - à plus
    - à plus tard
    - à la prochaine
- intent: ask_bot_purpose
  examples: |
    - à quoi sers-tu?
    - que sais-tu faire?
    - quels services rends-tu?
    - quelle est ta raison d'être?
    - pourquoi existes-tu?
    - quel est le sens de ton existence?
    - liste de services
    - comment peux-tu m'aider?
    - quelles sont tes capacités?
    - sais-tu faire le café?
- intent: bot_challenge
  examples: |
    - est-ce que tu es un bot?
    - est-ce que tu es humain?
    - suis-je en train de parler à un chatbot?
    - est-ce que je parle à un humain?
    - chatbot ou humain?
    - es-tu un robot?
    - je parle à une machine?
    - c'est un algorithme?
    - es-tu une intelligence artificielle?
    - c'est une IA à laquelle je parle?

Changeons également la langue dans le fichier config.yml:

Untitled

Nous pouvons à présent entraîner un nouveau modèle de NLU grâce à la commande:

rasa train nlu

Utilisons ensuite la commande suivante pour évaluer les résultats sur de nouvelles requêtes, de notre choix:

rasa shell nlu

Nous constatons que Rasa nous renvoie l’intention détectée ainsi que le score de confiance associé. Il renvoie également les scores de confiance associés aux autres intentions:

Untitled

Nous souhaitons fabriquer un chatbot capable de nous fournir des informations concernant la météo d’une ville en particulier. Pour cela, nous créons une nouvelle intention dans nlu.yml, ask_weather, comme suit:

- intent: ask_weather
  examples: |
    - quelle est la météo à [Paris](city)?
    - rapport météo [Berlin](city)
    - quel temps fait-il à [Tokyo](city)?
    - donne-moi la météo à [San Francisco](city)
    - je me demande quel temps il fait à [Pékin](city)
    - il fait quel temps à [Bruxelles](city) l'ami?
    - que peux-tu me dire sur [Manille](city)?
    - quelle est la situation à [Bogota](city)?
    - que peux-tu me dire sur [San Sebastian](city)?

Afin de récupérer la météo pour une ville en particulier, nous utiliserons l’API fournie https://www.weatherapi.com/. Il est nécessaire de créer un compte sur le site et de récupérer la clé associée pour accéder à l’API. Essayons d’envoyer une requête GET en utilisant Postman (ou votre navigateur) en utilisant l’URL avec querystring suivante: http://api.weatherapi.com/v1/current.json?key=<CLE_API>&q=Paris&lang=fr. Ceci retourne un JSON avec les informations météo.

Il est temps d’exploiter cela sur Rasa pour générer une réponse utilisateur. Ce type d’opérations sont gérées par les actions. En ouvrant le fichier actions/actions.py, nous pouvons voir une classe HelloWorld héritant de Action. Nous l’utiliserons comme modèle pour créer notre propre classe, ActionTellWeather, comme suit (utilisez votre propre clé API et prenez le temps de comprendre le code):

from typing import Any, Text, Dict, List

from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher

import json
import requests

# Informations pour accéder à l'API météo
API_ENDPOINT = 'http://api.weatherapi.com/v1/current.json'
API_KEY = '<CLE_API>'
API_LANG = 'fr'

class ActionTellWeather(Action):

    def name(self) -> Text:
        return "action_tell_weather"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

    	# Récupération de nom de ville à partir de la requête
        city = tracker.get_slot('city')

        if city:
        	# Appel GET vers l'API météo
            r = requests.get(API_ENDPOINT + '?'
                             + 'key=' + API_KEY
                             + '&q=' + city
                             + '&lang=' + API_LANG 
            )

            api_resp = json.loads(r.text)

            image = None
            if 'error' in api_resp:
                if api_resp['error']['code'] == 1006:
                    response = 'Désolé, je ne connais aucune ville appelée ' + city + ' :('
                else:
                    response = 'Désolé, je rencontre une difficulté technique pour satisfaire votre requête. Nos équipes se chargent d\'investiguer le problème!'
            else:
            	# Si tout se passe bien, récupération des conditions météo et de l'icone associée
                weather_status = api_resp['current']['condition']['text'].lower()
                response = 'La météo à ' + city + ' affiche un temps ' + weather_status
                image = api_resp['current']['condition']['icon']
        else:
            response = 'Vous souhaitez connaître la météo pour quelle ville? Dites par exemple "Météo Paris"!'

        dispatcher.utter_message(text=response)
        if image:
            dispatcher.utter_message(image=image)

        return []

Notez le nom de l’action: action_tell_weather.

Les actions sont gérées par un serveur indépendant appelé Rasa Action Server. Pour le lancer, commençons par décommenter les deux lignes suivantes dans endpoints.yml:

action_endpoint:
  url: "http://localhost:5055/webhook"

Lançons ensuite le serveur d’actions dans un terminal indépendant en utilisant la commande:

rasa run actions

Pour configurer le gestionnaire de dialogue (DM), nous utiliserons une configuration question/réponse simple, où à chaque intention nous associons une réponse (sous forme de template ou calculée à l’aide d’une action). Ceci est à spécifier dans le fichier rules.yml:

version: "3.1"

rules:

- rule: Say hi anytime the user says hi
  steps:
  - intent: greet
  - action: utter_greet

- rule: Say goodbye anytime the user says goodbye
  steps:
  - intent: goodbye
  - action: utter_goodbye

- rule: Provide bot purpose
  steps:
  - intent: ask_bot_purpose
  - action: utter_purpose

- rule: Say 'I am a bot' anytime the user challenges
  steps:
  - intent: bot_challenge
  - action: utter_iamabot

- rule: Provide weather status
  steps:
  - intent: ask_weather
  - action: action_tell_weather

Les templates sont ensuite spécifiés dans le fichier domain.yml. Dans ce fichier, nous spécifions également l’ensemble des intentions, entités, les informations récupérées appelées slots (comme city dans notre cas) et les actions:

version: "3.1"

intents:
  - greet
  - goodbye
  - ask_bot_purpose
  - bot_challenge
  - ask_weather

entities:
  - city

slots:
  city:
    type: text
    mappings:
    - type: from_entity
      entity: city

actions:
  - action_tell_weather

responses:
  utter_greet:
  - text: "Bonjour! Je suis votre assistant météo. Comment puis-je vous aider?"

  utter_goodbye:
  - text: "Au revoir et à la prochaine!"

  utter_purpose:
  - text: "Je connais toute la météo, partout dans le monde et en temps réel! Comment puis-je vous aider?"

  utter_iamabot:
  - text: "Je suis un chatbot!"

session_config:
  session_expiration_time: 60
  carry_over_slots_to_new_session: true

Enfin n’oubliez pas de décommenter la ligne name: RulePolicy dans config.yml afin d’indiquer que nous utilisons un système de dialogue à base de règles.

Nous pouvons à présent entraîner puis lancer le chatbot en ligne de commande:

rasa train
rasa shell

Essayons de demander la météo à Paris:

Untitled

Notez que le chatbot ne reconnait que les villes apparaissant dans les exemples d’entraînement. Pour enrichir cette liste, nous pouvons utiliser une lookup table.

Notre agent conversationnel est maintenant prêt à être intégré avec une interface (textuelle ou vocale) de notre choix. Consultez ce lien pour plus d’informations. Nous vous conseillons également d’utiliser Rasa X pour le suivi et l’amélioration continue.

Conclusion

Les agents conversationnels permettent d’optimiser les relations entre les entreprises/organismes et leurs clients/prospects collaborateurs. Pour bénéficier pleinement des avantages qu’ils offrent, ils doivent être constamment suivis et améliorés en continu. Ils ne sont pas capables de remplacer des opérateurs humains et ne sont pas destinés à cela. En revanche, ils doivent être utilisés en complément des interactions humaines pour en tirer parti.

Plusieurs outils permettent de créer et d’assurer le suivi des agents conversationnels, à l’instar de Rasa présenté dans cet article. Pourquoi ne pas les mettre au service de votre organisation et créer vos propres agents conversationnels? A vous de jouer!

Partager cet article

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.