Aller au contenu principal

Atelier : Analyse de Texte

Objectif de cet atelier

Cet atelier vous entraîne à utiliser Mistral pour des tâches d’analyse : analyser un texte, extraire des informations clés et classifier du contenu. Ces compétences sont essentielles pour automatiser le traitement de données textuelles en entreprise.

Exercice 1 : Analyser le sentiment d’avis clients

Le contexte

Vous gérez le service client d’une marketplace et recevez des centaines d’avis par jour. Vous devez les analyser automatiquement pour détecter les problèmes récurrents.

Le prompt

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
)

Résultat attendu

[
  {
    "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

Le contexte

Vous recevez des emails de candidature et devez extraire les informations clés pour alimenter votre ATS (Applicant Tracking System).

Le prompt

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
)

Résultat attendu

{
  "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.

Exercice 3 : Classifier des tickets de support

Le contexte

Votre équipe support reçoit des tickets non catégorisés. Vous devez les classifier automatiquement pour les router vers le bon service.

Le prompt

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
)

Résultat attendu

[
  {
    "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

  • Température 0 pour la classification et l’extraction — vous voulez de la constance
  • Définissez les catégories explicitement dans le system prompt pour éviter que le modèle invente les siennes
  • Incluez la consigne “non renseigné” pour les données manquantes plutôt que de laisser le modèle inventer
  • Testez sur des cas limites : textes ambigus, tickets multi-catégories, données partielles

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