EXTRACTION D’INFORMATIONS DU LANGAGE NATUREL EN UTILISANT UNE IA GÉNÉRATIVE
Dans ce post, je vais introduire un paradigme récemment développé chez Anaplan pour extraire des informations temporelles à partir de textes en langage naturel, dans le cadre d’un projet de requête en langage naturel. Alors que je vais me concentrer sur l’extraction de temps, le paradigme est polyvalent et applicable pour l’analyse de divers textes non structurés et l’extraction de différents modèles d’informations. Cela inclut la reconnaissance d’entités nommées, la conversion de texte en SQL, l’extraction de quantités, et plus encore.
Le cœur du paradigme réside dans la construction d’un pipeline flexible, qui offre une flexibilité maximale, facilitant ainsi l’ajustement d’un modèle pour extraire le sens de toute expression concevable dans le langage. Il est basé sur un modèle d’apprentissage profond (transformateurs), mais pour nous, il a atteint une précision de 99,98 %, ce qui est relativement rare pour les méthodes d’apprentissage automatique. De plus, il n’utilise pas de LLM (grands modèles de langage), en fait, il nécessite un modèle de transformateur minimal. Cela permet d’obtenir un modèle ML compact, adaptable, qui présente la précision des systèmes basés sur des règles.
Pour ceux qui cherchent l’extraction de temps, de valeurs numériques ou de numéros de téléphone, le package Duckling de Facebook offre une solution basée sur des règles. Cependant, si Duckling ne répond pas à vos exigences ou si vous êtes désireux d’explorer un nouveau paradigme d’IA, lisez la suite.
LES MODÈLES DE LANGUE GÉNÉRATIFS PEUVENT-ILS CAPTURER LE SENS?
Les LLM, malgré leurs capacités, rencontrent des défis pour analyser de telles expressions et en extraire le sens de manière exhaustive. Considérez l’expression “les 15 premières semaines de l’année dernière”. Convertir ceci en une plage de dates nécessite que le modèle détermine l’année en cours, soustrait une année, et calcule la position de la 15ème semaine en tenant compte des années bissextiles. Les modèles de langage n’ont pas été conçus pour ce type de calcul.
Dans mon expérience, les LLM peuvent produire avec précision la plage de dates correcte environ 90 à 95 % du temps, mais ont du mal avec le reste, peu importe les techniques de provocation que vous utilisez. Sans oublier: les LLM sont gourmands en ressources et lents.
Heureusement, en suivant trois principes, les transformateurs compacts peuvent accomplir la tâche avec succès.
– Séparer l’extraction d’informations de la déduction logique.
– Générer automatiquement un ensemble de données en utilisant des modèles structurés.
– Contraindre l’IA générative à la structure requise.
Dans ce post, je couvrirai les deux premiers principes, le troisième étant abordé dans un post précédent.
SÉPARER L’EXTRACTION D’INFORMATIONS DE LA DÉDUCTION LOGIQUE
Le premier principe est de veiller à ce que le rôle du modèle de langage soit d’extraire des informations à partir de texte libre, sans faire de déduction logique: les déductions logiques peuvent facilement être implémentées dans le code.
Considérez la phrase: “Combien de films sont sortis il y a deux ans ?” La tâche du modèle de langage devrait être d’identifier que l’année pertinente est: cette_année – 2, sans calculer l’année réelle (ce qui signifie qu’il n’a pas besoin de connaître l’année en cours). Son objectif est d’analyser le sens et de structurer le langage non structuré. Une fois que cette formule est extraite, nous pouvons implémenter son calcul dans le code.
Pour que cela fonctionne, nous introduisons un Langage Structuré du Temps (STL) capable d’exprimer des éléments de temps. Par exemple, “en 2020” se traduit par “TEMPS.an==2020”, et “trois mois à partir de maintenant” devient “MAINTENANT.mois==3.” Bien que l’intégralité du langage STL ne soit pas détaillée ici, il devrait être relativement intuitif : vous pouvez faire référence à des attributs comme l’année, le trimestre et le mois pour un temps absolu ou en relation avec MAINTENANT. La traduction de “les 12 dernières semaines de l’année dernière” est “MAINTENANT.an==-1 ET TEMPS.semaine>=-12”
En séparant toute déduction logique ou calcul de la tâche, nous déchargeons grandement le modèle de langage et lui permettons de se concentrer sur l’extraction d’informations. Cette division du travail améliorera significativement sa précision. Une fois le processus de traduction terminé, il est facile de développer du code pour un analyseur qui lit le langage structuré et obtient la plage de dates nécessaire.
Puisqu’il s’agit d’une tâche de traduction – du langage naturel au STL – nous avons utilisé un transformateur codeur-décodeur. Nous avons utilisé le modèle Bart de Hugging Face, qui peut facilement être affiné pour cette tâche.
Mais comment obtenons-nous les données pour entraîner le modèle ?
GÉNÉRER AUTOMATIQUEMENT UN ENSEMBLE DE DONNÉES EN UTILISANT DES MODÈLES STRUCTURÉS
Étant donné qu’un ensemble de données d’entraînement pour cette tâche de traduction n’existe pas, nous devons le générer nous-mêmes. Cela a été fait en suivant ces étapes :
Étape un: Écrire des fonctions pour mapper des objets datetime vers des formats “langage naturel” et STL :
def depuis_an(datetime):
texte_libre = f“depuis {datetime.year}”
réponse = f”TEMPS.an >= {datetime.year}”
retour texte_libre, réponse
def moitié_littérale(datetime):
texte_libre = datetime.strftime(“%-d, %B %Y”)
réponse = f”TEMPS.date >= {datetime}”
retour texte_libre, réponse
def jusqu_au_trimestre_an(datetime):
q = datetime.month//3
texte_libre = f”jusqu’au T{q}-{datetime.year}”
réponse = f”TEMPS.an=={datetime.year} ET TEMPS.trimestre=={q}”
Étape deux : Choisir aléatoirement une fonction, et choisir aléatoirement une date dans une plage spécifiée :
date = np.random.choice(pd.date_range(‘1970/1/1’, ‘2040/12/31’))
insérer maintenant la date dans la fonction.
Étape trois : Ajouter le texte libre à une question aléatoire (nous pouvons facilement générer aléatoirement des questions ou les extraire d’un ensemble de données de questions, leur qualité et leur sens n’étant pas très importants).
Avec ce pipeline, nous pouvons générer rapidement des milliers de paires texte-STL, par exemple :
– “Quelle a été la croissance du PIB au T2-2019 ?”, “TEMPS.trimestre==2 ET TEMPS.an==2019”
– “Depuis 2017, qui a remporté le plus d’Oscars ?”, “TEMPS.an>=2017”
– “Qui était le président le 3 mai 2020 ?”, “TEMPS.date==2020/05/03”
Cette approche assure une flexibilité dans l’ajout de nouveaux modèles facilement. Si vous trouvez une expression de temps qui n’est pas couverte par l’une de ces fonctions (par exemple, “Dans N années”), vous pouvez écrire une fonction qui générera des exemples pour ce modèle en quelques secondes.
En pratique, nous pouvons optimiser encore davantage l’efficacité du code. Plutôt que des fonctions séparées pour chaque modèle comme “depuis 2020” et “jusqu’en 2020”, nous pouvons choisir aléatoirement des mots de liaison comme “depuis”, “jusqu’à”, “le”, etc. Ce premier lot de fonctions peut nécessiter un certain temps pour se développer, mais vous pouvez rapidement passer à des centaines de modèles. Ensuite, corriger toutes les expressions manquantes devient trivial, car le pipeline est déjà établi. Avec quelques itérations, presque toutes les expressions pertinentes peuvent être couvertes.
De plus, nous n’avons pas besoin de couvrir toutes les expressions : étant donné que le modèle de transformateur que nous avons utilisé est pré-entraîné sur un grand corpus de texte, il généralisera à partir des modèles fournis pour en créer de nouveaux.
Enfin, nous pouvons utiliser un LLM pour générer plus d’exemples. Il suffit de demander à un LLM :
“Hey, quelle est une autre façon d’écrire ‘Quel était le chiffre d’affaires jusqu’au 23 août'”
Et il pourrait répondre :
“Combien avons-nous gagné avant août 2023”.
Ce processus d’augmentation de données peut également être automatisé : envoyer de nombreux exemples à un LLM, ajoutant ainsi de la variété à notre ensemble de données. Étant donné que le rôle du LLM est uniquement dans la création de l’ensemble de données, les considérations de coût et de vitesse deviennent négligeables.
En combinant la flexibilité d’ajout de nouveaux modèles, la généralisation du modèle pré-entraîné et l’augmentation de données à l’aide d’un LLM, nous pouvons couvrir efficacement presque toutes les expressions.
Le dernier principe de ce paradigme est de contraindre l’IA générative à produire uniquement des requêtes STL, en veillant au respect de la structure requise. La méthode pour y parvenir, ainsi qu’une méthode pour optimiser le processus de tokenisation, ont été discutées dans un post précédent.
En respectant ces trois principes, nous avons atteint une précision impressionnante de 99,98 % sur notre ensemble de données de test. De plus, ce paradigme nous a donné la flexibilité de traiter rapidement de nouvelles expressions de temps non prises en charge.
RÉSUMÉ
Les grands modèles de langage (LLM) ne sont pas toujours la solution optimale pour les tâches linguistiques. Avec la bonne approche, les modèles de transformateurs moins profonds peuvent extraire efficacement des informations du langage naturel avec une précision et une flexibilité élevées, en réduisant le temps et les coûts.
Les principaux principes à retenir sont :
– Se concentrer sur l’extraction d’informations du modèle, éviter les déductions logiques complexes. Cela peut nécessiter la création d’un langage intermédiaire et l’implémentation d’un analyseur et de déductions logiques dans le code.
– Établir un pipeline pour générer un ensemble de données et entraîner un modèle, de sorte qu’ajouter de nouvelles fonctionnalités (nouveaux modèles de langage) soit simple et rapide. Ce pipeline peut inclure l’utilisation d’un LLM, ajoutant plus de variété à l’ensemble de données.
– Limiter la génération du modèle aux contraintes d’un langage structuré.
Alors que ce post s’est concentré sur l’extraction d’éléments temporels, le paradigme s’applique à extraire n’importe quelle information à partir de texte libre et à la structurer dans divers formats. Avec ce paradigme, vous pouvez obtenir la précision d’un moteur basé sur des règles, avec la flexibilité d’un modèle d’apprentissage automatique.
—
Sources :
– Vers des sciences des données : https://towardsdatascience.com
– Extraction et structuration des éléments textuels avec une grande précision en utilisant des petits modèles : https://medium.com/@orenmatar