Du slot filling au chatbot : annoter un corpus et spécialiser RoBERTa
Schéma IOB/BIO, corpus par croisement de templates, et fine-tuning de RoBERTa pour l’extraction de slots.
Un chatbot qui réserve un restaurant doit extraire, à partir d'une phrase libre, les informations structurées dont il a besoin : la date, l'heure, le nombre de convives. Cette étape s'appelle le slot filling, et sa qualité conditionne toute la conversation qui suit.
Un schéma d'annotation avant tout modèle
Tout commence par définir précisément ce que le modèle doit prédire. Le schéma IOB/BIO est le standard : chaque token reçoit un préfixe B- (début d'une entité), I- (à l'intérieur) ou O (hors entité).
Je O
veux O
réserver O
pour O
deux B-nombre_personnes
personnes I-nombre_personnes
demain B-date
Constituer ce corpus d'entraînement à la main est long et coûteux. Une alternative efficace : croiser des templates de phrases avec une base de données relationnelle. On génère des milliers d'énoncés variés — « une table pour deux demain », « je voudrais réserver pour 2 personnes » — chacun automatiquement étiqueté, puis on nettoie les cas limites à la main.
Spécialiser RoBERTa
Une fois le corpus prêt, on fine-tune un modèle de langue pré-entraîné. RoBERTa, via l'écosystème Hugging Face et Flair, s'y prête bien : on remplace la tête de classification par une tête de tagging séquentiel, et on entraîne avec un learning rate modeste.
from flair.models import SequenceTagger
# Chargement puis fine-tuning d'un tagger sur le corpus de slots
tagger = SequenceTagger.load("roberta-base")
L'optimisation des hyperparamètres (taux d'apprentissage, taille de batch, nombre d'époques) est déléguée à Optuna, qui explore l'espace de recherche par essais successifs plutôt que par grille exhaustive.
De l'inférence au chatbot
Un modèle n'a de valeur que s'il répond vite et de façon fiable en production. L'inférence est donc conteneurisée avec FastAPI et Docker, puis déployée sur une instance AWS EC2 où le chatbot l'appelle à chaque message. Le slot filling devient un simple service HTTP : une phrase en entrée, des slots structurés en sortie.
La leçon principale : un bon modèle de slot filling repose autant sur le schéma d'annotation et la qualité du corpus que sur l'architecture choisie.