Aller au contenu principal

Extraction d'entités et classification

Les cas d’usage fondamentaux

Les sorties structurées brillent dans deux catégories de tâches : l’extraction d’informations depuis du texte non structuré, et la classification de contenu. Ces deux cas d’usage sont au coeur de la plupart des applications d’IA en entreprise.

Extraction d’entités nommées

L’extraction d’entités consiste à identifier et catégoriser les éléments clés dans un texte : personnes, entreprises, lieux, dates, montants, etc.

from pydantic import BaseModel
from typing import Literal

class Entite(BaseModel):
    texte: str
    type: Literal[
        "personne", "entreprise", "lieu",
        "date", "montant", "produit"
    ]
    contexte: str

class ExtractionEntites(BaseModel):
    entites: list[Entite]
    nombre_total: int
    langue_detectee: str

response, parsed = client.chat.parse(
    model="grok-4.20-reasoning",
    messages=[{
        "role": "user",
        "content": """Extrais toutes les entités de ce texte :

        Le 15 mars 2026, Mistral AI a levé 600 millions d'euros
        auprès de General Catalyst. Arthur Mensch, le CEO basé à
        Paris, prévoit de lancer Mistral Large 3 d'ici juin."""
    }],
    response_format=ExtractionEntites
)

for e in parsed.entites:
    print(f"[{e.type}] {e.texte}{e.contexte}")

Classification de contenu

La classification attribue des catégories prédéfinies à un contenu. Les structured outputs garantissent que le modèle ne retourne que des catégories valides.

class ClassificationEmail(BaseModel):
    categorie: Literal[
        "commercial", "support", "facturation",
        "partenariat", "candidature", "spam", "autre"
    ]
    sous_categorie: str
    priorite: Literal["basse", "moyenne", "haute", "urgente"]
    sentiment: Literal["positif", "neutre", "negatif"]
    action_requise: bool
    resume: str

response, parsed = client.chat.parse(
    model="grok-4.20-reasoning",
    messages=[{
        "role": "user",
        "content": """Classifie cet email :

        Objet : Problème de facturation urgent

        Bonjour, notre dernière facture #2847 contient une erreur.
        Le montant affiché est de 3500 EUR au lieu des 2800 EUR
        convenus. Merci de corriger rapidement."""
    }],
    response_format=ClassificationEmail
)

print(f"Catégorie : {parsed.categorie}")      # "facturation"
print(f"Priorité : {parsed.priorite}")        # "haute"
print(f"Action requise : {parsed.action_requise}")  # True

Classification multi-label

Quand un contenu peut appartenir à plusieurs catégories :

class ClassificationArticle(BaseModel):
    titre: str
    themes: list[str]
    audience_cible: list[Literal[
        "developpeurs", "managers", "data_scientists",
        "designers", "dirigeants", "grand_public"
    ]]
    niveau_technique: Literal["debutant", "intermediaire", "avance"]
    mots_cles_seo: list[str]
    temps_lecture_minutes: int

Extraction de données tabulaires

Transformer du texte en données structurées exploitables :

class LigneCommande(BaseModel):
    reference: str
    designation: str
    quantite: int
    prix_unitaire: float
    montant_total: float

class BonCommande(BaseModel):
    numero: str
    date: str
    fournisseur: str
    lignes: list[LigneCommande]
    montant_ht: float
    tva: float
    montant_ttc: float

response, parsed = client.chat.parse(
    model="grok-4.20-reasoning",
    messages=[{
        "role": "user",
        "content": """Extrais les données de ce bon de commande :

        BC-2026-0847 du 28/03/2026 — Fournisseur : TechParts SAS

        REF-001 | Câble USB-C 2m | x50 | 3.20 EUR
        REF-002 | Adaptateur HDMI | x20 | 12.50 EUR
        REF-003 | Hub USB 4 ports | x10 | 24.90 EUR"""
    }],
    response_format=BonCommande
)

Analyse de sentiment granulaire

Au-delà du simple positif/négatif, structurez une analyse complète :

class AspectSentiment(BaseModel):
    aspect: str
    sentiment: Literal["tres_positif", "positif", "neutre", "negatif", "tres_negatif"]
    mention: str

class AnalyseAvis(BaseModel):
    note_globale: float
    sentiment_global: str
    aspects: list[AspectSentiment]
    points_forts: list[str]
    points_faibles: list[str]
    recommande: bool

Points clés à retenir

  • L’extraction d’entités identifie personnes, lieux, dates, montants dans du texte libre
  • La classification force des catégories prédéfinies grâce à Literal et enum
  • La classification multi-label utilise des listes de Literal
  • L’extraction tabulaire transforme du texte non structuré en données exploitables
  • L’analyse de sentiment peut être granulaire avec des aspects individuels
  • Tous ces patterns fonctionnent avec parse() ou response_format