Few-shot NER : Extraction d'entités sans annotation et apprentissage basé sur GPT

Les modèles d'extraction d'entités pré-entraînés basés sur spaCy ou NLTK donnent d'excellents résultats mais nécessitent un processus d'annotation et d'entraînement fastidieux afin de détecter les entités non natives comme les titres de postes, les numéros de TVA, les médicaments, etc. Grâce aux grands modèles de langage comme GPT-3, GPT-J et GPT-NeoX, il est maintenant possible d'extraire tout type d'entités grâce à un apprentissage en quelques coups, sans aucune annotation ni entraînement. Dans cet article, nous montrons comment faire.

Le NER (extraction d'entités) consiste essentiellement à extraire des informations structurées d'un texte non structuré. Si vous êtes novice en matière de NER, vous pouvez d'abord lire notre brève introduction : introduction aux NER.

NER avec spaCy et NLTK : la méthode traditionnelle

SpaCy est pratiquement devenu la norme de facto pour les NER ces dernières années. (voir le site web du spaCy). SpaCy est un framework très attractif car il est facile à utiliser, et sa rapidité le rend bien adapté à une utilisation en production.

SpaCy est un framework Python de traitement du langage naturel qui propose de nombreux modèles pré-entraînés dans plusieurs langues. Il est donc facile d'extraire plusieurs types d'entités (entreprises, villes, adresses, dates, etc.) dans votre propre langue sans avoir à entraîner votre propre modèle.

NLTK est également un choix intéressant pour l'extraction d'entités avec Python, mais il propose moins d'entités par défaut, et en général NLTK n'est pas recommandé pour la production (il s'agit plutôt d'un cadre éducatif et de recherche).

Cependant, vous rencontrerez rapidement une limite avec ces frameworks : le nombre d'entités supportées en natif est limité. La plupart des entreprises souhaitent exploiter le NER afin d'extraire des informations commerciales spécifiques telles que des informations sur les personnes, des données financières, des traitements médicaux, etc. Bien entendu, ces entités ne sont pas prises en charge par défaut par les modèles pré-entraînés de spaCy. Pour y parvenir, vous devez donc créer votre propre jeu de données et entraîner votre propre modèle à partir de celui-ci.

L'apprentissage de votre propre modèle spaCy est un processus d'annotation long et fastidieux : une ou plusieurs personnes doivent collaborer afin de créer un énorme ensemble de bons exemples et de les annoter. Un très grand volume d'exemples est nécessaire pour que le modèle puisse apprendre correctement. Il existe de bons outils d'annotation (comme Prodigy, de spaCy), mais cela reste une tâche pénible qui fait avorter de nombreux projets NLP.

Illustration de l'annotation

Bonne nouvelle : avec l'essor des grands modèles de langue comme GPT-3, GPT-J et GPT-NeoX, il est désormais possible d'extraire n'importe quelle entité sans annoter et sans entraîner un nouveau modèle !

Génération de texte avec GPT-3, GPT-J et GPT-NeoX

Les grands modèles de langage pour la génération de textes ont commencé à apparaître récemment avec GPT-3 (Pour en savoir plus sur GPT-3, consultez le site de l'OpenAI.). Lorsqu'OpenAI a publié son modèle GPT-3, composé de 175 milliards de paramètres, ce fut une révolution car il a ouvert la voie à de nombreuses applications d'IA de pointe basées sur le traitement du langage naturel sans nécessiter de formation supplémentaire.

L'objectif initial des modèles GPT comme GPT-3 est de générer du texte : il suffit de fournir une entrée au modèle et de le laisser générer le reste pour vous. Sur la base de la génération de texte, pratiquement tous les cas d'utilisation du traitement du langage naturel peuvent être réalisés : classification, résumé, IA conversationnelle, paraphrase... et bien sûr extraction d'entités !

Comme GPT-3 n'est pas un modèle open-source, la communauté open-source a travaillé sur des alternatives à GPT-3 et nous avons maintenant 2 excellents équivalents open-source : GPT-J et GPT-NeoX. Ils ne sont pas encore aussi importants que GPT-3, mais il ne fait aucun doute que ce n'est qu'une question de temps avant que la communauté open-source ne rattrape OpenAI.

Pour exploiter correctement ces modèles, il faut recourir à une nouvelle technique appelée "apprentissage en quelques coups".

Apprentissage par la méthode du " Few-shot

Ces grands modèles GPT sont si grands qu'ils peuvent très rapidement apprendre de vous.

Disons que vous voulez que GPT-3 génère pour vous une courte description de produit. Voici un exemple sans apprentissage en quelques clics :

Generate a product description containing these specific keywords: t-shirt, men, $50

La réponse que vous obtiendrez sera inutile. Cela pourrait être quelque chose comme ceci par exemple :

Generate a product description containing these specific keywords: t-shirt, men, $50 and short.

The product description needs to be a few words long. Don’t use plurals, use the keywords in the order they are

Bonne nouvelle : vous pouvez obtenir de bien meilleurs résultats en donnant simplement quelques exemples au modèle !

Generate a product description containing specific keywords.

Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1499
Result:

Le résultat sera quelque chose comme ceci :

Generate a product description containing specific keywords.

Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1,499
Result: The best gaming GPU on the market, at the price of $1,499 only.

Comme vous pouvez le constater, la réponse du modèle est maintenant parfaitement ciblée, grâce aux trois exemples que nous lui avons donnés au départ. Pourtant, ce modèle n'a jamais été entraîné à ce type de tâche de génération de descriptions de produits. C'est en cela que consiste la technique de "l'apprentissage en quelques coups" : vous effectuez un "apprentissage par transfert" à la volée avec quelques exemples seulement. Pour obtenir ce type de résultat, il faut généralement entraîner un modèle de traitement du langage naturel avec des tonnes d'exemples, mais pas ici.

Extraction d'entités à l'aide de l'apprentissage en quelques étapes

Nous allons maintenant effectuer l'extraction d'entités grâce à l'apprentissage en quelques coups.

Supposons que vous souhaitiez extraire des titres de postes à partir de sites Web. Donnez simplement quelques exemples d'extraction de titres de postes avant de formuler votre demande :

Extract job titles from the following sentences.

Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:

Le résultat sera le suivant :

Extract job titles from the following sentences.

Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title: CTO

Comme vous l'avez remarqué, nous devons faire preuve d'intelligence dans la création de nos exemples. Il peut arriver qu'aucun titre de poste ne soit trouvé, c'est pourquoi nous avons créé un exemple renvoyant "aucun" (cela évite les faux positifs). Peut-être voulez-vous extraire plusieurs titres de poste en même temps ? Dans ce cas, il est important de créer des exemples renvoyant également plusieurs titres de poste (titres de poste séparés par des virgules, par exemple).

Vous obtiendrez des résultats encore meilleurs en ajoutant encore plus d'exemples. Et il est important que vos exemples soient aussi proches que possible de votre demande finale réelle. Par exemple, si vous savez que vous allez analyser des paragraphes entiers au lieu de simples phrases, il est préférable de créer des exemples avec des paragraphes également.

Si vous n'avez pas accès à un modèle TPG, vous pouvez simplement utiliser l'API NLP Cloud. Plusieurs clients sont disponibles (Python, Go, Node.js, Ruby, PHP...). Montrons ici un exemple utilisant GPT-J avec le client Python :

import nlpcloud

client = nlpcloud.Client("gpt-j", "your API token", gpu=True)
client.generation("""Extract job titles from the following sentences.

    Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
    Job title: Linux Engineer
    ###
    Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
    Job title: none
    ###
    Sentence: Marc Simoncini | Director | Meetic
    Job title: Director
    ###
    Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
    Job title: CEO
    ###
    Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
    Job title:""",
top_p=0.1,
length_no_input=True,
remove_input=True,
end_sequence="###",
remove_end_sequence=True
)

Le résultat sera : CTO

Permettez-moi de vous donner une explication rapide sur les paramètres de génération de texte que nous venons d'utiliser.

Nous avons fixé une valeur p supérieure très basse car nous ne voulons pas que GPT-J crée des résultats trop originaux : nous voulons simplement qu'il s'en tienne à ce qu'il a vu dans votre demande.

"length_no_input" signifie que la valeur de la longueur maximale ne doit pas tenir compte du texte d'entrée.

"remove_input" signifie que le texte d'entrée doit être supprimé du résultat.

"end_sequence" signifie que lorsque le modèle rencontre ce caractère, il doit arrêter de générer du texte. Comme dans nos exemples en quelques clics, nous avons ajouté "###" à la fin de chaque réponse, le modèle générera automatiquement "###" après avoir généré la réponse et s'arrêtera là.

"remove_end_sequence" signifie que nous voulons supprimer "###" de la réponse.

Vous pouvez voir plus de détails dans la documentation de NLP Cloud : voir ici.

Considérations sur les performances

L'extraction d'entités avec un modèle GPT offre une grande liberté car toute nouvelle entité peut être extraite à la volée, même si le modèle n'a pas été entraîné pour cela !

Cela a toutefois un coût : ces grands modèles linguistiques sont énormes et relativement lents.

Par exemple, si vous voulez utiliser GPT-J ou GPT-NeoX, il vous faudra un énorme GPU avec beaucoup de VRAM comme un NVIDIA RTX A6000 ou A40. Et il y aura une certaine latence (l'extraction d'une entité prend environ 500 ms). Au contraire, spaCy ou NLTK seront beaucoup plus rapides et moins coûteux du point de vue de l'infrastructure.

Conclusion

En 2022, il sera possible d'effectuer des NER avancés très facilement, sans aucune annotation ni formation ! Cela aidera grandement les entreprises à mener à bien leurs projets d'extraction d'entités plus rapidement, et cela permettra également de développer des applications plus pointues basées sur le traitement du langage naturel.

Toutefois, les grands modèles linguistiques tels que GPT-3, GPT-J et GPT-NeoX sont coûteux. Il ne faut donc pas sous-estimer les coûts d'infrastructure impliqués.

J'espère que cet article vous aidera à économiser du temps et de l'argent !

Julien Salinas
Directeur technique de NLP Cloud