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
| Nombre | Quand l’utiliser |
|---|---|
| 0 (zero-shot) | Tâches simples, modèle capable naturellement |
| 1-2 | Format de sortie standard (JSON, label) |
| 3-5 | Classification avec catégories multiples |
| 5-10 | Tâ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=0avec 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