Aller au contenu principal

Few-shot via l'API

Enseigner par l’exemple

Le few-shot prompting consiste à fournir au modèle quelques exemples d’entrées/sorties avant de lui soumettre la vraie requête. Via l’API Chat Completions, ces exemples sont injectés sous forme de paires de messages user/assistant factices dans l’historique de conversation.

C’est la technique la plus fiable pour obtenir un format de sortie précis sans fine-tuning.

Le principe

Au lieu de décrire longuement le format attendu dans le system prompt, vous montrez au modèle ce que vous attendez :

from mistralai import Mistral
import os

client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": "Vous classifiez le sentiment des avis clients."
        },
        # Exemple 1
        {"role": "user", "content": "Avis : Livraison rapide, produit conforme. Très satisfait !"},
        {"role": "assistant", "content": "POSITIF"},
        # Exemple 2
        {"role": "user", "content": "Avis : Colis arrivé abîmé, service client injoignable."},
        {"role": "assistant", "content": "NÉGATIF"},
        # Exemple 3
        {"role": "user", "content": "Avis : Le produit est correct mais un peu cher pour ce que c'est."},
        {"role": "assistant", "content": "MITIGÉ"},
        # Vraie requête
        {"role": "user", "content": "Avis : Excellente qualité, je recommande vivement cette boutique."}
    ],
    temperature=0.0
)

print(response.choices[0].message.content)
# POSITIF

Le modèle apprend le pattern (avis -> label en majuscules) à partir des exemples et l’applique à la nouvelle entrée.

Combien d’exemples fournir

NombreQuand l’utiliser
0 (zero-shot)Tâches simples, modèle capable naturellement
1-2Format de sortie standard (JSON, label)
3-5Classification avec catégories multiples
5-10Tâches complexes ou format très spécifique

Au-delà de 10 exemples, vous consommez beaucoup de tokens d’entrée sans gain proportionnel. Envisagez plutôt le fine-tuning.

Few-shot pour l’extraction JSON

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": "Extrayez les entités nommées au format JSON."
        },
        # Exemple 1
        {
            "role": "user",
            "content": "Pierre Martin a rejoint Google France à Paris en janvier 2025."
        },
        {
            "role": "assistant",
            "content": '{"personnes": ["Pierre Martin"], "organisations": ["Google France"], "lieux": ["Paris"], "dates": ["janvier 2025"]}'
        },
        # Exemple 2
        {
            "role": "user",
            "content": "La conférence VivaTech organisée par Publicis se tiendra en juin."
        },
        {
            "role": "assistant",
            "content": '{"personnes": [], "organisations": ["Publicis"], "lieux": [], "dates": ["juin"]}'
        },
        # Vraie requête
        {
            "role": "user",
            "content": "Sophie Leclerc, directrice de Mistral AI, a annoncé un partenariat avec Microsoft lors du salon AI Paris le 15 mars 2026."
        }
    ],
    temperature=0.0
)

import json
result = json.loads(response.choices[0].message.content)
print(json.dumps(result, indent=2, ensure_ascii=False))

Few-shot pour la transformation de texte

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": "Transformez le texte technique en résumé grand public."
        },
        # Exemple
        {
            "role": "user",
            "content": "Le modèle utilise une architecture transformer encoder-decoder avec attention multi-têtes et normalisation RMS pré-couche."
        },
        {
            "role": "assistant",
            "content": "Ce système d'IA utilise une technologie avancée qui lui permet de comprendre et générer du texte en analysant les relations entre les mots de manière parallèle et efficace."
        },
        # Vraie requête
        {
            "role": "user",
            "content": "L'API utilise le nucleus sampling avec top_p pour tronquer la distribution de probabilité des tokens candidats lors de la génération auto-régressive."
        }
    ]
)

print(response.choices[0].message.content)

Few-shot dynamique

En production, sélectionnez les exemples les plus pertinents dynamiquement :

# Base d'exemples
EXAMPLES = {
    "technique": [
        {"user": "Comment configurer un VPN ?", "assistant": "Voici les étapes..."},
        {"user": "Mon serveur renvoie une erreur 502.", "assistant": "L'erreur 502..."},
    ],
    "commercial": [
        {"user": "Quels sont vos tarifs ?", "assistant": "Nos offres commencent à..."},
        {"user": "Y a-t-il une période d'essai ?", "assistant": "Oui, 14 jours..."},
    ],
    "facturation": [
        {"user": "Je n'ai pas reçu ma facture.", "assistant": "Vérifiez votre..."},
        {"user": "Comment changer de plan ?", "assistant": "Rendez-vous dans..."},
    ]
}

def build_messages(category: str, user_question: str) -> list:
    """Construit les messages avec few-shot dynamique."""
    messages = [
        {"role": "system", "content": "Assistant de support technique."}
    ]

    # Ajouter les exemples de la catégorie
    for ex in EXAMPLES.get(category, []):
        messages.append({"role": "user", "content": ex["user"]})
        messages.append({"role": "assistant", "content": ex["assistant"]})

    # Ajouter la vraie question
    messages.append({"role": "user", "content": user_question})
    return messages

# Utilisation
messages = build_messages("technique", "Mon déploiement Docker échoue.")
response = client.chat.complete(
    model="mistral-large-latest",
    messages=messages
)

Bonnes pratiques

  • Diversifiez vos exemples — couvrez les cas normaux ET les cas limites
  • Gardez un format cohérent — tous les exemples doivent suivre exactement le même format
  • Montrez les cas négatifs — incluez un exemple de ce que le modèle ne doit PAS faire
  • Comptez les tokens — chaque exemple consomme des tokens d’entrée (facturés)
  • Testez sans exemples d’abord — parfois le zero-shot suffit, surtout avec les modèles récents

Points clés à retenir

  • Le few-shot injecte des paires user/assistant factices avant la vraie requête
  • 3-5 exemples suffisent pour la plupart des tâches de classification et d’extraction
  • Utilisez temperature=0 avec le few-shot pour maximiser la cohérence
  • Le few-shot dynamique sélectionne les exemples pertinents en fonction du contexte
  • Au-delà de 10 exemples, envisagez le fine-tuning plutôt que le few-shot