Aller au contenu principal

Atelier : Analyse de Texte

Mis à jour le 28 juillet 2026

Objectif de cet atelier

Après la rédaction, changeons de registre : cet atelier vous entraîne à utiliser Mistral pour des tâches d’analyse — analyser le sentiment d’un texte, en extraire des informations clés et classifier du contenu. Ces compétences sont au cœur de l’automatisation du traitement de données textuelles en entreprise : chaque fois qu’un humain lit des dizaines de textes semblables pour en tirer la même grille d’information, il y a un candidat à l’automatisation. Vous remarquerez un fil rouge dans les trois exercices : la température y est toujours basse, car en analyse, la constance vaut plus que la créativité.

Exercice 1 : Analyser le sentiment d’avis clients

Mettez-vous dans la situation suivante : vous gérez le service client d’une marketplace et recevez des centaines d’avis par jour. Impossible de tous les lire ; il faut les analyser automatiquement pour détecter les problèmes récurrents et prioriser les réponses. Le system prompt définit une grille d’analyse fixe — sentiment, thèmes, urgence, action — et impose une sortie JSON pour que le résultat soit exploitable par votre outil de ticketing.

messages = [
    {
        "role": "system",
        "content": """Vous êtes un analyste spécialisé en expérience client.
Pour chaque avis, fournissez :
1. Sentiment global : positif / mixte / négatif
2. Thèmes abordés (max 3)
3. Niveau d'urgence : faible / moyen / élevé
4. Action recommandée (1 phrase)

Répondez en JSON structuré."""
    },
    {
        "role": "user",
        "content": """Analysez ces 3 avis clients :

Avis 1 : "Commande reçue en 2 jours, emballage soigné. Par contre le mode
d'emploi est uniquement en anglais, c'est dommage pour un produit vendu en
France. Le produit en lui-même fonctionne très bien."

Avis 2 : "C'est la TROISIÈME fois que je reçois un article défectueux. Le SAV
me fait tourner en rond depuis 2 semaines. Je vais contacter la DGCCRF si
rien ne bouge."

Avis 3 : "Bon rapport qualité-prix. Rien d'exceptionnel mais fait le job.
Livraison standard, RAS."

Retournez un tableau JSON avec l'analyse de chaque avis."""
    }
]

response = client.chat.complete(
    model="mistral-large-latest",
    messages=messages,
    temperature=0.1
)

Le résultat attendu ressemble à ceci — notez que l’avis 1, globalement satisfait mais avec une réserve, doit sortir en « mixte » et non en « positif », et que l’avis 2, avec sa menace de saisir la DGCCRF, doit déclencher une urgence élevée :

[
  {
    "avis": 1,
    "sentiment": "mixte",
    "themes": ["livraison", "documentation", "qualité produit"],
    "urgence": "faible",
    "action": "Traduire le mode d'emploi en français pour les prochains lots."
  },
  {
    "avis": 2,
    "sentiment": "négatif",
    "themes": ["qualité produit", "service client", "récurrence"],
    "urgence": "élevé",
    "action": "Escalader au responsable SAV pour traitement prioritaire."
  },
  {
    "avis": 3,
    "sentiment": "positif",
    "themes": ["rapport qualité-prix", "livraison"],
    "urgence": "faible",
    "action": "Aucune action requise, avis standard satisfait."
  }
]

Exercice 2 : Extraire des données structurées

Deuxième situation : vous recevez des emails de candidature en texte libre et devez en extraire les informations clés pour alimenter votre ATS (Applicant Tracking System). Le danger principal de l’extraction est l’invention : un modèle laissé sans consigne comblera volontiers les trous avec des déductions plausibles. D’où les deux règles cardinales du system prompt — « non renseigné » pour toute information absente, et interdiction absolue de déduire.

messages = [
    {
        "role": "system",
        "content": """Vous extrayez des données structurées à partir de textes libres.
Règles :
- Si une information n'est pas mentionnée, indiquez "non renseigné"
- Ne déduisez JAMAIS une information : restez strictement au texte
- Les dates doivent être au format YYYY-MM-DD
- Les compétences doivent être des termes normalisés"""
    },
    {
        "role": "user",
        "content": """Extrayez les informations de cet email de candidature :

"Bonjour,

Je me permets de vous adresser ma candidature pour le poste de développeur
full-stack publié sur LinkedIn. Je m'appelle Sarah Benali et j'ai 6 ans
d'expérience en développement web. Actuellement lead dev chez DataViz (Paris),
je travaille principalement avec React, Node.js et PostgreSQL. J'ai aussi une
bonne expérience avec AWS et Docker. Mon TJM actuel est de 650 euros et je suis
disponible à partir du 15 mai 2026.

Cordialement,
Sarah Benali"

Format JSON attendu :
{
  "nom": "",
  "poste_vise": "",
  "experience_annees": 0,
  "poste_actuel": "",
  "entreprise_actuelle": "",
  "localisation": "",
  "competences": [],
  "tjm": "",
  "disponibilite": ""
}"""
    }
]

response = client.chat.complete(
    model="mistral-large-latest",
    messages=messages,
    temperature=0.0
)

Voici la sortie que vous devez obtenir :

{
  "nom": "Sarah Benali",
  "poste_vise": "Développeur full-stack",
  "experience_annees": 6,
  "poste_actuel": "Lead dev",
  "entreprise_actuelle": "DataViz",
  "localisation": "Paris",
  "competences": ["React", "Node.js", "PostgreSQL", "AWS", "Docker"],
  "tjm": "650€",
  "disponibilite": "2026-05-15"
}

Notez la température à 0.0 : pour de l’extraction, on veut une réponse déterministe et fidèle au texte source. Notez aussi la conversion de la date en format ISO, explicitement demandée dans les règles — sans cette consigne, le modèle aurait recopié « 15 mai 2026 » tel quel.

Exercice 3 : Classifier des tickets de support

Dernière situation : votre équipe support reçoit des tickets non catégorisés qu’il faut router automatiquement vers le bon service. La clé de cet exercice est la définition exhaustive des catégories et des priorités dans le system prompt. Si vous laissez le modèle inventer sa propre taxonomie, chaque lot de tickets sortira avec des catégories différentes et votre routage deviendra ingérable.

messages = [
    {
        "role": "system",
        "content": """Vous classifiez des tickets de support technique.

Catégories disponibles :
- FACTURATION : problèmes de paiement, factures, abonnements, remboursements
- TECHNIQUE : bugs, erreurs, problèmes de fonctionnement, lenteurs
- COMPTE : connexion, mot de passe, paramètres, suppression de compte
- FONCTIONNALITÉ : demandes de nouvelles fonctionnalités, suggestions
- AUTRE : tout ce qui ne rentre pas dans les catégories ci-dessus

Priorités :
- P1 : service inaccessible, perte de données, impact financier direct
- P2 : fonctionnalité dégradée, contournement possible
- P3 : question, demande d'information, suggestion

Répondez UNIQUEMENT en JSON, sans texte avant ni après."""
    },
    {
        "role": "user",
        "content": """Classifiez ces 4 tickets :

Ticket A : "Impossible de me connecter depuis ce matin. J'ai essayé de
réinitialiser mon mot de passe mais je ne reçois pas l'email."

Ticket B : "Serait-il possible d'ajouter un export Excel en plus du CSV ?"

Ticket C : "J'ai été débité deux fois pour mon abonnement de mars."

Ticket D : "L'application plante quand j'importe un fichier de plus de 50 Mo.
Message d'erreur : MEMORY_EXCEEDED."

Format :
[{"ticket": "A", "categorie": "", "priorite": "", "service": "", "resume": ""}]"""
    }
]

response = client.chat.complete(
    model="mistral-large-latest",
    messages=messages,
    temperature=0.0
)

Le résultat attendu — observez que le ticket C, avec son impact financier direct, monte en P1 alors que le crash technique du ticket D reste en P2 puisqu’un contournement existe :

[
  {
    "ticket": "A",
    "categorie": "COMPTE",
    "priorite": "P2",
    "service": "Support Niveau 1",
    "resume": "Connexion impossible, email de réinitialisation non reçu"
  },
  {
    "ticket": "B",
    "categorie": "FONCTIONNALITÉ",
    "priorite": "P3",
    "service": "Produit",
    "resume": "Demande d'export Excel en plus du CSV"
  },
  {
    "ticket": "C",
    "categorie": "FACTURATION",
    "priorite": "P1",
    "service": "Comptabilité",
    "resume": "Double débit abonnement mars, demande de remboursement"
  },
  {
    "ticket": "D",
    "categorie": "TECHNIQUE",
    "priorite": "P2",
    "service": "Développement",
    "resume": "Crash import fichiers volumineux (MEMORY_EXCEEDED)"
  }
]

Conseils pour les tâches d’analyse

Quatre réflexes résument la méthode de cet atelier. Travaillez à température 0 pour la classification et l’extraction : vous voulez de la constance, pas de l’inspiration. Définissez les catégories explicitement dans le system prompt, sans quoi le modèle inventera les siennes. Incluez toujours la consigne « non renseigné » pour les données manquantes, faute de quoi le modèle comblera les trous par des inventions plausibles. Et avant tout déploiement, testez sur des cas limites : textes ambigus, tickets qui relèvent de deux catégories, données partielles — c’est là que votre grille montrera ses faiblesses, pas sur les cas d’école.

Points clés à retenir

  • L’analyse de texte avec Mistral fonctionne mieux avec une température basse (0-0.2)
  • Définissez toujours les catégories et le format de sortie dans le prompt
  • Imposez la règle « non renseigné » pour éviter les hallucinations
  • Le few-shot améliore la cohérence de la classification
  • Testez sur des cas réels représentatifs avant de déployer en production