IA Générative et Entreprises : extraire la donnée

IA Générative et Entreprises : extraire la donnée

Table Of Contents

L’IA générative dans les workflows de l’entreprise

L’essor phénoménal de l’IA générative ces dernières années est actuellement indéniable. Non seulement elle suscite l’engouement du grand public, mais elle transforme également en profondeur de nombreux secteurs professionnels. Dans le contexte de l’entreprise, au-delà de l’utilisation classique des chatbots pour l’assistance client, l’un de ses intérêts majeurs réside dans sa capacité à extraire et structurer des informations dispersées dans divers documents non structurés. Cette compétence est particulièrement précieuse, car elle permet de connecter les IA génératives à des flux de travail existants, en intégrant harmonieusement les outils informatiques de gestion de l’information déjà en place.

Cas d’école, extraire une adresse d’un texte non sturcturé

Par exemple, considérons un cas simplifié d’un extrait d’un message électronique d’un client qui indique dans son mail :

J’habite actuellement au 10 rue de Rivoli dans le 4ᵉ arrondissement de Paris.

Pour une entreprise, cette information peut sembler basique, mais elle est en réalité cruciale pour de nombreuses raisons : mise à jour des coordonnées du client, envoi de documents, planification de visites, etc.

Avec les outils classiques de l’informatique, nous ne serions pas en mesure d’exploiter automatiquement le contenu de ce mail. Les systèmes traditionnels requièrent des données structurées, où chaque champ est identifié de manière explicite et conforme à un schéma prédéfini. Ainsi, il faudrait qu’un opérateur humain intervienne pour extraire l’adresse du client et la ressaisisse dans une autre application, comme un logiciel de gestion des commandes ou un CRM (Customer Relationship Management). Ce processus manuel est non seulement chronophage, mais également sujet aux erreurs humaines, ce qui peut entraîner des retards et des coûts supplémentaires pour l’entreprise.

C’est ici que l’IA générative, et plus particulièrement les modèles LLM (Large Language Models), apportent une solution innovante pour lever cette problématique. Ces modèles, entraînés sur de vastes corpus de données textuelles, possèdent une compréhension approfondie du langage naturel.

Avec de l’expertise et un « prompt » bien construit, le LLM peut prendre le contenu du mail en entrée et générer en sortie un objet JSON contenant l’adresse, tout en respectant les éléments de la norme Postale AFNOR NF Z 10-011. Cette norme assure une uniformité dans la manière dont les adresses postales sont présentées, garantissant ainsi une intégration fluide avec les systèmes existants. Dans le cadre de notre exemple de mail, une version simplifiée du JSON généré pourrait être :

{
    "numeroVoie" : "10",
    "libelleVoie" : "rue de Rivoli",
    "codePostal" : "75004",
    "ville" : "Paris"
}

Cette capacité de structuration automatique permet d’envisager des workflows combinant l’IT classique et l’IA générative, aboutissant à une amélioration significative de la productivité et à un ROI (Retour sur Investissement) clairement identifiable pour les entreprises. En automatisant le processus d’extraction et de structuration des données, les entreprises peuvent réduire les coûts opérationnels, améliorer la précision des données et offrir un meilleur service à leurs clients.

Génération de JSON, comment cela fonctionne ?

Passons maintenant à la partie technique et posons-nous la question essentielle : comment peut-on imposer à un LLM de générer du JSON avec un schéma particulier ? Répondre à cette question permet d’identifier les forces et les limites de l’approche, et donc d’évaluer sa pertinence pour un besoin métier spécifique. Bien entendu, afin de générer du JSON, le LLM doit avoir été entraîné sur des exemples de fichiers JSON. La plupart des modèles actuels, tels que GPT (OpenAI), BERT (Google) ou LLAMA (Meta) par exemple, ont été formés sur d’énormes quantités de données provenant d’Internet, y compris des exemples de code et de structures de données comme JSON.

Cependant, à part le fait que le LLM « connaît » le format JSON, il n’existe pas de mécanismes intrinsèques dans le modèle permettant de contraindre le format de sortie ou même d’imposer un schéma JSON spécifique. Les LLM génèrent du texte en prédisant le mot ou le token suivant le plus probable, sans garantie que la sortie respecte une structure particulière. Alors, comment s’assurer que la sortie du LLM sera correcte, à la fois en termes de respect de la syntaxe JSON, mais aussi en termes de conformité au schéma attendu ? C’est un enjeu crucial, car une sortie mal formatée ou non conforme peut entraîner des erreurs lors de son exploitation par les systèmes informatiques.

Contraindre la sortie d’un LLM : approches

Les différentes librairies ou API qui permettent une sortie contrainte (au sens du respect d’un schéma JSON) d’un LLM utilisent deux approches principales, que nous allons illustrer dans le cadre des deux frameworks « llama.cpp » et « Guidance » :

  • « llama.cpp » est une implémentation open-source légère et optimisée en C++ des modèles de langage de la famille LLaMA (Large Language Model Meta AI). L’un de ses principaux atouts est qu’il ne nécessite pas de frameworks lourds comme TensorFlow ou PyTorch. En effet, « llama.cpp » peut fonctionner sur des systèmes avec des ressources limitées, ce qui le rend particulièrement populaire pour des applications embarquées ou sur des appareils moins puissants. Plus d’informations sont disponibles sur leur dépôt GitHub.
  • Guidance est un framework développé par Microsoft qui structure les interactions avec les modèles d’IA générative. Il permet de créer des workflows complexes via un langage de script intégré, combinant prompts et logique conditionnelle. Compatible multi-modèles, il facilite la personnalisation, la génération guidée et l’automatisation, simplifiant ainsi les projets d’IA générative avancés. Vous pouvez en savoir plus sur leur dépôt GitHub.

“Llama.cpp” : masquage des probabilités

Pour rappel, les modèles LLM génèrent des prédictions basées sur les probabilités des mots ou des tokens suivants. Lorsqu’on leur fournit un prompt, ils calculent la probabilité de chaque mot possible pour continuer le texte, en se basant sur les données sur lesquelles ils ont été entraînés. Les frameworks d’exécution utilisent ces listes de probabilités pour sélectionner les tokens, en appliquant des paramètres tels que la température (qui ajuste le niveau d’aléatoire dans la génération) et des techniques comme top-k ou top-p (qui restreignent le choix aux tokens les plus probables), afin de générer un texte cohérent et contrôlé. Approche de « llama.cpp » via une grammaire BNF

« llama.cpp » permet de contraindre la sortie via une grammaire BNF (Backus-Naur Form), comme expliqué dans leur documentation. Cette approche utilise un masque de probabilité pour s’assurer que seuls les tokens conformes à la grammaire peuvent être générés.

Lorsqu’un modèle génère un token, il produit une distribution de probabilités pour tous les tokens possibles. Le code de « llama.cpp » intervient pour masquer ou forcer à zéro la probabilité des tokens qui ne respectent pas la grammaire, empêchant ainsi leur sélection. Cela garantit que la sortie générée est syntaxiquement correcte par rapport à la grammaire définie.

Dans « llama.cpp », le processus est géré de la manière suivante :

  1. Modification de la boucle de génération : La logique interne du modèle est ajustée pour intercepter chaque étape de la génération. Avant de sélectionner le token suivant, le modèle vérifie si ce token est conforme à la grammaire.
  2. Masquage dynamique des tokens : Une fonction externe évalue les règles définies dans la grammaire BNF et applique des masques sur les probabilités des tokens. Si le token proposé n’est pas valide selon la grammaire, sa probabilité est mise à zéro, le rendant impossible à sélectionner :
  if (!is_valid_token(grammar, token)) {
      probabilities[token] = 0.0;
  }
  1. Contrôle en temps réel : Un moteur d’analyse syntaxique fonctionne en parallèle avec le modèle pour vérifier que chaque choix de token s’aligne sur la grammaire. Cela assure que la sortie complète respecte la structure définie.

Cette approche offre une garantie élevée de conformité à la grammaire, ce qui est essentiel pour des applications nécessitant une syntaxe stricte, comme la génération de code source, de requêtes SQL ou de fichiers JSON conformes à un schéma précis.

« Guidance » : prompting structuré

« Guidance » de Microsoft adopte une approche différente pour forcer le format de sortie d’un LLM. Plutôt que de s’appuyer sur des masques dynamiques basés sur une grammaire, Guidance mise sur un prompting structuré et des interactions guidées pour produire des sorties conformes.

Cette méthode implique de créer un script Guidance qui guide le modèle à travers la génération, étape par étape. Le modèle génère alors un morceau de texte à la fois, en suivant les instructions du script. Par exemple, si la sortie attendue est un fichier JSON avec des champs spécifiques, le script peut demander au modèle de fournir successivement la valeur de chaque champ, en s’assurant que chaque partie est correcte avant de passer à la suivante.

Voici comment cela fonctionne :

  • Prompting structuré : Le script définit une structure pour le modèle, en utilisant des placeholders pour les valeurs à générer. Par exemple :
  {
     "numeroVoie": "{{gen "numeroVoie"}}",
     "libelleVoie": "{{gen "libelleVoie"}}",
     "codePostal": "{{gen "codePostal"}}",
     "ville": "{{gen "ville"}}"
  }

Chaque {{gen "champ"}} indique au modèle de générer la valeur correspondante.

  • Guidage interactif : Après chaque génération, le script peut vérifier la validité de la valeur et éventuellement redemander au modèle de régénérer si elle n’est pas conforme.
  • Flexibilité et adaptation : Cette approche s’appuie sur les capacités du modèle à comprendre les instructions et à produire des sorties cohérentes. Elle est plus flexible que l’approche par grammaire stricte et peut être adaptée à différents formats ou structures.

Cette méthode peut être plus lente, car elle implique souvent des interactions multiples avec le modèle, surtout si des vérifications supplémentaires sont nécessaires. Cependant, elle est idéale pour des formats structurés mais nécessitant une certaine flexibilité, ou lorsque le schéma n’est pas strictement défini.

Comparaison entre les approches de « llama.cpp » et « Guidance »

Voici un tableau comparatif des deux approches :

AspectGuidancellama.cpp
NatureStrcuturation par promptMasquage de probabilité
Contraintes imposéesPar un script prédéfiniPar une grammaire formelle (BNF)
Validation des sortiesSemi-dynamique, via prompts et scriptsDynamique, via masquage des tokens
Complexité de mise en œuvreFacile (gabarit + logique)Moyenne à élevée (construction de grammaires)
Garantie de conformitéMoyenne (dépend du modèle et des prompts)Élevée (si la grammaire est correcte)
Cas d’usage optimalFormats structurés mais flexiblesSyntaxes strictes comme JSON, SQL, code source

Conclusion et perspectives

Pour conclure, le choix entre ces deux approches dépend des besoins spécifiques de l’application et du niveau de strictness requis dans la sortie générée :

  • L’approche par masquage de probabilité, comme dans « llama.cpp », est à privilégier si l’on souhaite générer une sortie avec un respect strict d’une grammaire, indispensable pour des applications où la validité syntaxique est critique, comme la génération de code ou de documents structurés selon un schéma précis.
  • L’approche guidée par le prompt, proposée par Guidance, est à favoriser lorsqu’on attend une sortie sous forme de template, dans lequel certaines parties sont à compléter dynamiquement. Elle offre une plus grande flexibilité et est adaptée aux situations où la structure est importante, mais où une certaine tolérance est acceptable.

Il est également possible de combiner les deux approches au sein d’une même application pour tirer parti des avantages de chacune. Par exemple, on peut utiliser Guidance pour structurer globalement la génération et intégrer des contraintes grammaticales précises via « llama.cpp » pour des parties spécifiques nécessitant une syntaxe stricte.

En somme, l’intégration de l’IA générative dans les processus d’entreprise ouvre de nouvelles perspectives en matière d’automatisation et d’efficacité opérationnelle. En comprenant les forces et les limites des approches disponibles, les entreprises, aidées pour cela par des experts IA, peuvent choisir les solutions les plus adaptées à leurs besoins, maximisant ainsi le retour sur investissement et renforçant leur compétitivité sur le marché.

Il est important de continuer à explorer et innover dans ce domaine, en restant attentif aux évolutions technologiques et aux nouvelles méthodes qui pourraient émerger. La collaboration entre les développeurs, les chercheurs et les entreprises sera essentielle pour tirer pleinement parti du potentiel de l’IA générative.