In-Context Learning : LLMs qui Apprennent Sans Fine-Tuning
Vous fournissez à GPT-4 3 exemples de traduction français → anglais. Sans aucun entraînement supplémentaire, le modèle comprend la tâche et traduit correctement de nouveaux textes.
Comment ? Vous n’avez pas fine-tuné le modèle. Vous n’avez pas mis à jour ses poids. Vous avez simplement montré des exemples dans le prompt.
Bienvenue dans In-Context Learning (ICL) - la capacité émergente des LLMs à apprendre de nouvelles tâches à partir d’exemples fournis en contexte.
Exemple concret :
# Sans ICL (zero-shot)
prompt = "Traduis en anglais : Le chat dort."
response = llm(prompt)
# → "The cat sleeps." (OK, mais parfois imprécis)
# Avec ICL (few-shot)
prompt = """
Traduis en anglais :
Français : Le chien court.
Anglais : The dog runs.
Français : La maison est grande.
Anglais : The house is big.
Français : Je mange une pomme.
Anglais : I eat an apple.
Français : Le chat dort.
Anglais :"""
response = llm(prompt)
# → "The cat sleeps." (Plus fiable, pattern appris)
Dans ce guide :
- Définition : Qu’est-ce que l’ICL ?
- Types : Zero-shot, few-shot, many-shot
- Mécanismes : Comment les LLMs font-ils ça ?
- Limitations : Context length, format sensitivity
- ICL vs Fine-tuning : Quand utiliser quoi
- Best practices : Optimiser ICL

Qu’est-ce que l’In-Context Learning ?
Définition
In-Context Learning (ICL) : Capacité d’un LLM à effectuer une nouvelle tâche en se basant uniquement sur des exemples fournis dans le prompt, sans modification des paramètres du modèle.
Caractéristiques :
- ✅ Pas de fine-tuning : Poids du modèle inchangés
- ✅ Apprentissage via prompt : Exemples dans le contexte
- ✅ Généralisation : Applique pattern appris à nouveaux cas
- ✅ Éphémère : Oublie dès fin de conversation
Émergence avec l’échelle
ICL n’apparaît pas dans petits modèles. C’est une capacité émergente à grande échelle.
Évolution historique :
| Modèle | Paramètres | ICL ? | Performance Few-Shot |
|---|---|---|---|
| GPT-2 | 1.5B | ⚠️ Faible | 20-30% accuracy |
| GPT-3 | 175B | ✅ Oui | 60-80% accuracy |
| PaLM | 540B | ✅✅ Fort | 75-90% accuracy |
| GPT-4 | ~1.7T | ✅✅✅ Excellent | 85-95% accuracy |
Observation : ICL émerge vers 10-100B paramètres, s’améliore avec taille.
Types d’In-Context Learning
Zero-Shot Learning
Définition : Aucun exemple, juste instruction.
prompt = "Traduis en anglais : Le chat dort."
# Pas d'exemples, le modèle doit comprendre de l'instruction seule
Quand ça marche :
- ✅ Tâches communes (traduction, résumé)
- ✅ Grands modèles (GPT-4, Claude 3)
- ✅ Instructions claires
Quand ça échoue :
- ❌ Tâches obscures ou domaine-spécifiques
- ❌ Formats de sortie complexes
- ❌ Petits modèles (<10B)
Exemple :
# Zero-shot sentiment analysis
prompt = "Classifie le sentiment de cette phrase : 'Ce film était génial !'"
response = llm(prompt)
# → "Positif" ✅ (tâche connue)
# Zero-shot tâche obscure
prompt = "Convertis ce nom en notation IPA phonétique : 'Beauchamp'"
response = llm(prompt)
# → Peut échouer sans exemples ❌
Few-Shot Learning
Définition : 1-10 exemples fournis dans le prompt.
prompt = """
Classifie le sentiment (Positif/Négatif/Neutre) :
Phrase : "J'adore ce produit !"
Sentiment : Positif
Phrase : "C'est vraiment nul."
Sentiment : Négatif
Phrase : "Le ciel est bleu."
Sentiment : Neutre
Phrase : "Ce restaurant est incroyable !"
Sentiment :"""
response = llm(prompt)
# → "Positif" ✅
Nombre optimal d’exemples :
| Exemples | Performance | Use Case |
|---|---|---|
| 0 (zero-shot) | Baseline | Tâches standards |
| 1-3 | +20-40% | Formats spécifiques |
| 5-10 | +40-60% | Tâches complexes |
| 20-50 | +10-20% | Gains marginaux |
| 100+ | Voir many-shot | Edge cases |
Observation : Rendements décroissants après 5-10 exemples.
One-Shot Learning
Définition : 1 seul exemple.
prompt = """
Transforme le nom en version féminine :
Exemple : Julien → Julienne
Question : François → ?
"""
response = llm(prompt)
# → "Françoise" ✅
Quand utiliser :
- ✅ Pattern très simple
- ✅ Économiser tokens (context window limité)
- ✅ Tâche claire avec 1 exemple suffisant
Many-Shot Learning
Définition : 100-1000+ exemples dans le contexte.
Nouveau concept (2024) : Avec context windows 128K-2M, possible de mettre des centaines d’exemples.
# Gemini 1.5 Pro (2M context)
prompt = """
Voici 500 exemples de résumés d'articles scientifiques :
Article 1 : [...]
Résumé 1 : [...]
Article 2 : [...]
Résumé 2 : [...]
... (498 autres exemples)
Article 501 : [nouveau texte]
Résumé 501 :
"""
# Modèle apprend style précis de résumé sur 500 exemples
# Performance proche fine-tuning !
Résultats (Google Research, 2024) :
| Tâche | Few-Shot (10) | Many-Shot (500) | Fine-Tuning |
|---|---|---|---|
| Classification | 75% | 89% | 92% |
| Extraction | 68% | 85% | 88% |
| Génération | 72% | 87% | 90% |
Observation : Many-shot ICL comble 70% du gap vs fine-tuning !
Comment Fonctionne l’ICL ? (mécanismes internes)
Induction Heads
Découverte (Anthropic, 2022) : Circuits neuronaux spécialisés dans les LLMs appelés induction heads.
Fonction :
1. Détectent patterns dans le contexte
2. "Mémorisent" associations
3. Appliquent à nouveaux cas
Exemple :
Contexte : "cat → animal, rose → flower"
Nouveau : "oak → ?"
Induction head : "oak est comme cat/rose → type de chose → tree"
Visualisation :
Prompt avec exemples :
[cat] → [animal]
↓ Induction head détecte pattern
[rose] → [flower]
↓ Généralise : "X → catégorie de X"
[oak] → [?]
↓ Applique pattern appris
[oak] → [tree] ✅
Attention sur les exemples
Les LLMs utilisent attention mechanism pour :
- Scanner tous les exemples dans le contexte
- Identifier patterns communs (format, structure)
- Extraire règle implicite
- Appliquer à la nouvelle requête
Exemple de poids d’attention :
Query : "oak → ?"
Attention sur :
"cat → animal" : 0.35 (pattern similaire)
"rose → flower" : 0.40 (pattern similaire)
"Le ciel est bleu" : 0.05 (non-pertinent)
Instruction initiale : 0.20
→ Modèle "regarde" surtout les exemples pertinents
→ Infère : "oak → [type/catégorie]" → "tree"
Méta-apprentissage
Hypothèse : Durant pré-entraînement, les LLMs apprennent à apprendre.
Pré-entraînement :
Millions de documents avec patterns variés
→ Modèle apprend : "Si je vois A→B, C→D, alors E→?"
→ Développe capacité de méta-apprentissage
Inférence (ICL) :
Nouveau pattern dans prompt
→ Modèle reconnaît : "Ah, c'est un problème d'apprentissage de pattern"
→ Active circuits méta-apprentissage
→ Généralise
Analogie : LLM = étudiant qui a appris comment apprendre de nouveaux sujets rapidement.
Limitations de l’ICL
Context Length
Problème : Nombre d’exemples limité par context window.
GPT-4o : 128K tokens
Exemple avg : 100 tokens (input + output)
→ Max ~1,000 exemples
Mais prompt système + instructions = -10K
→ Réaliste : 500-800 exemples max
GPT-4o mini : 128K tokens
Même calcul, mais moins cher
Gemini 1.5 Pro : 2M tokens
→ 10,000-15,000 exemples possibles ! ✅
Trade-off :
- Plus d’exemples = meilleure performance
- Plus d’exemples = coût ↑, latence ↑
Format Sensitivity
ICL est très sensible au format des exemples.
# ✅ FORMAT COHÉRENT
prompt = """
Q: What is 2+2?
A: 4
Q: What is 5+3?
A: 8
Q: What is 10+7?
A:"""
# → "17" ✅
# ❌ FORMAT INCOHÉRENT
prompt = """
Question: What is 2+2?
Réponse: 4
Q: What is 5+3?
A: 8
What is 10+7?
"""
# → Peut confondre le modèle ❌
Best practice : Format strictement identique pour tous les exemples.
Ordre des exemples
Surprising : L’ordre des exemples affecte les résultats.
import random
examples = [
("cat", "animal"),
("rose", "flower"),
("oak", "tree"),
("gold", "metal"),
("water", "liquid")
]
# Test 10 ordres aléatoires
accuracies = []
for _ in range(10):
random.shuffle(examples)
prompt = create_prompt(examples)
acc = evaluate(prompt)
accuracies.append(acc)
print(f"Mean: {np.mean(accuracies):.1%}")
print(f"Std: {np.std(accuracies):.1%}")
# Résultat typique :
# Mean: 82.3%
# Std: 8.7% ← Variance significative !
Recommandation :
- Essayer plusieurs ordres
- Utiliser ordre logique (simple → complexe)
- Ou ordre aléatoire pour robustesse
Qualité des exemples
Garbage in, garbage out.
# ❌ EXEMPLES INCORRECTS
prompt = """
Traduire :
"Hello" → "Bonjour"
"Goodbye" → "Au revoir"
"Cat" → "Chien" ← ERREUR !
"Dog" → ?
"""
# → "Chat" (apprend le mauvais pattern) ❌
# ✅ EXEMPLES CORRECTS
prompt = """
"Cat" → "Chat"
"Dog" → ?
"""
# → "Chien" ✅
Checklist qualité :
- Exemples corrects (vérifier !)
- Diversité (couvrir edge cases)
- Représentatifs de la tâche réelle
- Pas de biais (équilibre classes)
Tâches complexes
ICL excelle sur tâches simples, peine sur complexes.
| Tâche | ICL Performance | Notes |
|---|---|---|
| Classification binaire | ⭐⭐⭐⭐⭐ | Parfait |
| Extraction simple | ⭐⭐⭐⭐ | Très bon |
| Traduction | ⭐⭐⭐⭐ | Bon |
| Raisonnement multi-étapes | ⭐⭐⭐ | Moyen |
| Code génération complexe | ⭐⭐ | Difficile |
| Tâches créatives | ⭐⭐⭐ | Variable |
Pour tâches complexes : Envisager fine-tuning ou prompting avancé (Chain-of-Thought).
⚠️ ICL n’est pas magique. Pour tâches très spécialisées ou performance critique, fine-tuning reste supérieur.
ICL vs Fine-Tuning : quand utiliser quoi ?
Comparaison
| Critère | In-Context Learning | Fine-Tuning |
|---|---|---|
| Setup | Immédiat (créer prompt) | 1-3 jours (data prep, training) |
| Coût initial | $0 | $50-500 (compute) |
| Coût runtime | $$$ (tokens input élevés) | $ (modèle custom) |
| Performance | 70-90% de fine-tuning | 100% (optimisé tâche) |
| Flexibilité | ✅ Changer tâche instantanément | ❌ Re-train pour changer |
| Données requises | 5-10 exemples | 500-5000+ exemples |
| Maintenance | Aucune | ✅ Re-train périodiquement |
| Explicabilité | ✅ Exemples visibles | ❌ Poids opaque |
Matrice de décision
Performance requise
↑
|
FINE-TUNING | FINE-TUNING
(prod critique) | (si budget data)
|
──────────────────┼──────────────────→
| Rapidité
ICL | ICL requise
(prototypage) | (itération rapide)
|
↓
Choisir ICL si :
- ✅ Prototypage / MVP
- ✅ Tâche change fréquemment
- ✅ Peu de données (<100 exemples)
- ✅ Besoin de transparence (voir exemples)
- ✅ Pas de budget/temps pour fine-tuning
Choisir Fine-Tuning si :
- ✅ Production critique
- ✅ Gros volume (millions de requêtes/mois)
- ✅ Performance maximale requise
- ✅ Dataset large disponible (>1000 exemples)
- ✅ Tâche stable long-terme
Stratégie hybride
Best of both worlds :
# Phase 1 : Prototyper avec ICL
few_shot_prompt = """
Exemples :
[5 exemples]
Nouvelle requête :
"""
# Tester, itérer sur prompt
# Identifier ce qui marche
# Phase 2 : Collecter données
# Utiliser ICL en prod
# Logger toutes les entrées/sorties
# → Dataset de 10K exemples
# Phase 3 : Fine-tuner
# Entraîner modèle custom sur 10K exemples
# → Performance +15-25%
# → Coût runtime -70% (pas de tokens examples)
# Phase 4 : Production
# Modèle fine-tuné pour 95% cas
# ICL pour edge cases / nouvelles catégories
Optimiser l’In-Context Learning
Sélection d’exemples
Pas tous les exemples sont égaux.
Stratégie : Diversité maximale
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
def select_diverse_examples(examples, embeddings, k=5):
"""Sélectionne k exemples les plus divers"""
selected = []
selected_embeddings = []
# Premier exemple : aléatoire
idx = np.random.randint(len(examples))
selected.append(examples[idx])
selected_embeddings.append(embeddings[idx])
# Sélectionner k-1 suivants
while len(selected) < k:
# Calculer similarité avec déjà sélectionnés
sims = cosine_similarity(embeddings, selected_embeddings)
avg_sim = sims.mean(axis=1)
# Choisir le MOINS similaire
idx = avg_sim.argmin()
selected.append(examples[idx])
selected_embeddings.append(embeddings[idx])
return selected
# Usage
diverse_examples = select_diverse_examples(all_examples, embeddings, k=10)
prompt = create_prompt(diverse_examples)
Gain : +10-20% performance vs sélection aléatoire.
Retrieval-Augmented ICL
Dynamique : Sélectionner exemples pertinents à la requête.
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
# Indexer tous les exemples possibles
examples_db = Chroma.from_texts(
[ex["input"] for ex in all_examples],
OpenAIEmbeddings(),
metadatas=all_examples
)
def dynamic_few_shot(query: str, k: int = 5):
"""Récupère k exemples les plus similaires à la query"""
# Rechercher exemples similaires
similar = examples_db.similarity_search(query, k=k)
# Construire prompt
prompt = "Voici des exemples :\n\n"
for ex in similar:
prompt += f"Input: {ex.metadata['input']}\n"
prompt += f"Output: {ex.metadata['output']}\n\n"
prompt += f"Input: {query}\nOutput:"
return prompt
# Utilisation
query = "Traduire : The cat sleeps"
prompt = dynamic_few_shot(query, k=5)
# → Récupère 5 exemples de traduction similaires
Gain : +15-30% performance, surtout sur tâches variées.
Chain-of-Thought dans ICL
Combiner ICL + CoT pour raisonnement.
prompt = """
Résous le problème étape par étape :
Q: Si j'ai 5 pommes et j'en achète 3 de plus, puis j'en donne 2, combien en ai-je ?
Raisonnement :
1. Départ : 5 pommes
2. J'achète 3 : 5 + 3 = 8 pommes
3. Je donne 2 : 8 - 2 = 6 pommes
Réponse : 6
Q: Si j'ai 10 euros et je dépense 3.50, puis je gagne 5, combien ai-je ?
Raisonnement :
1. Départ : 10 euros
2. Je dépense 3.50 : 10 - 3.50 = 6.50 euros
3. Je gagne 5 : 6.50 + 5 = 11.50 euros
Réponse : 11.50
Q: Si un train va à 120 km/h pendant 30 min, quelle distance parcourt-il ?
Raisonnement :
"""
# LLM va suivre le pattern CoT appris
Gain : +20-40% sur problèmes mathématiques/logiques.
Format standardisé
Template strict pour cohérence.
TEMPLATE = """
{instruction}
Exemples :
{examples}
Question :
{query}
Réponse :
"""
def create_prompt(instruction, examples, query):
examples_str = "\n\n".join([
f"Input: {ex['input']}\nOutput: {ex['output']}"
for ex in examples
])
return TEMPLATE.format(
instruction=instruction,
examples=examples_str,
query=query
)
Évaluation et itération
Toujours tester plusieurs configurations.
configurations = [
{"num_examples": 3, "order": "random"},
{"num_examples": 5, "order": "random"},
{"num_examples": 10, "order": "random"},
{"num_examples": 5, "order": "diverse"},
{"num_examples": 5, "order": "retrieved"},
]
results = []
for config in configurations:
prompt = create_prompt_with_config(config)
accuracy = evaluate(prompt, test_set)
results.append({"config": config, "accuracy": accuracy})
# Choisir meilleure config
best = max(results, key=lambda x: x["accuracy"])
print(f"Best: {best['config']} → {best['accuracy']:.1%}")
Cas d’usage pratiques
Classification custom
# Classifier tickets support en catégories
prompt = """
Classifie le ticket support :
Ticket : "Mon mot de passe ne fonctionne plus"
Catégorie : Compte
Ticket : "Le paiement a échoué"
Catégorie : Facturation
Ticket : "Comment utiliser la fonctionnalité X ?"
Catégorie : Question produit
Ticket : "L'app crash au démarrage"
Catégorie : Bug technique
Ticket : "Je veux annuler mon abonnement"
Catégorie : Abonnement
Ticket : "La page ne charge pas"
Catégorie :"""
# → "Bug technique" ✅
Extraction d’informations
# Extraire infos structurées de texte libre
prompt = """
Extrait nom, email, téléphone :
Texte : "Je m'appelle Marie Dubois, contactez-moi au 06.12.34.56.78 ou [email protected]"
Résultat : {"nom": "Marie Dubois", "email": "[email protected]", "tel": "06.12.34.56.78"}
Texte : "Paul Martin - [email protected] - 01 23 45 67 89"
Résultat : {"nom": "Paul Martin", "email": "[email protected]", "tel": "01 23 45 67 89"}
Texte : "Appelez Sophie au 0678901234, email: [email protected]"
Résultat :"""
# → {"nom": "Sophie", "email": "[email protected]", "tel": "0678901234"} ✅
Transformation de format
# Convertir formats de données
prompt = """
Transforme CSV en JSON :
CSV : name,age,city
Alice,30,Paris
JSON : [{"name": "Alice", "age": 30, "city": "Paris"}]
CSV : product,price,stock
Laptop,999,5
JSON : [{"product": "Laptop", "price": 999, "stock": 5}]
CSV : title,author,year
1984,Orwell,1949
JSON :"""
# → [{"title": "1984", "author": "Orwell", "year": 1949}] ✅
Recherches récentes (2024-2025)
Many-Shot ICL (Google, 2024)
Découverte : Avec Gemini 1.5 Pro (1M context), 100-1000 exemples ≈ fine-tuning.
Résultats :
| Dataset | Few-Shot (10) | Many-Shot (1000) | Fine-Tuning |
|---|---|---|---|
| MMLU | 82.3% | 88.9% | 89.5% |
| HumanEval | 76.2% | 84.1% | 85.7% |
| DROP (reading) | 73.5% | 82.8% | 84.2% |
Conclusion : Many-shot comble 70-80% du gap vs fine-tuning.
Instruction Tuning + ICL
Modèles instruction-tuned (GPT-4, Claude 3) sont meilleurs en ICL.
Pourquoi :
- Entraînés à suivre formats variés
- Meilleures capacités méta-apprentissage
- Plus robustes aux variations prompt
Test (même tâche, même exemples) :
| Modèle | ICL Accuracy |
|---|---|
| Llama 2 70B (base) | 68% |
| Llama 2 70B (chat) | 79% |
| GPT-4 | 91% |
Leçon : Utiliser modèles instruction-tuned pour ICL.
Exercices pratiques
Optimiser Few-Shot
Objectif : Trouver nombre optimal d’exemples.
Tâche : Classification sentiment (positif/négatif/neutre)
Étapes :
- Créer dataset test (100 phrases)
- Tester k=0, 1, 3, 5, 10, 20 exemples
- Mesurer accuracy pour chaque k
- Tracer courbe performance vs k
- Identifier plateau (rendements décroissants)
Extension :
- Comparer sélection aléatoire vs diversité
- Tester impact ordre des exemples
Retrieval-Augmented ICL
Objectif : Implémenter sélection dynamique d’exemples.
Tâche : Classification multi-classe (20 catégories)
Architecture :
# 1. Indexer 1000 exemples dans Chroma
# 2. Pour chaque query, récupérer 5 plus similaires
# 3. Construire prompt avec ces 5
# 4. Comparer vs 5 exemples fixes aléatoires
Métriques :
- Accuracy
- Temps de récupération
- Coût tokens (avec retrieval = peut-être moins tokens totaux)
ICL vs Fine-Tuning
Objectif : Comparer performance et coûts.
Scénario : Classification tickets support (10 catégories, 10K tickets/mois)
Tâches :
ICL :
- Créer prompt 10-shot
- Mesurer accuracy sur test set
- Calculer coût mensuel (tokens)
Fine-Tuning :
- Fine-tuner GPT-4o-mini sur 1K exemples
- Mesurer accuracy
- Calculer coût (training + inférence)
Comparer :
- Performance (accuracy)
- Coût total (setup + runtime)
- Time-to-deploy
- Maintenance
Checklist de production
Setup ICL
Exemples :
- Minimum 5-10 exemples de qualité
- Exemples diversifiés (couvrir edge cases)
- Vérifiés manuellement (pas d’erreurs)
- Format strictement identique
Prompt :
- Instruction claire en début
- Exemples avec format consistent
- Séparateurs nets entre exemples
- Template réutilisable
Évaluation :
- Test set représentatif (100+ exemples)
- Métrique objective (accuracy, F1, etc.)
- A/B test plusieurs configurations
- Monitoring performance production
Optimisation :
- Tester 3-5-10 exemples (trouver optimal)
- Essayer retrieval-augmented
- Combiner avec Chain-of-Thought si pertinent
- Versionner prompts (track changes)
Conclusion
In-Context Learning est une des capacités les plus impressionnantes des LLMs modernes. Apprendre de nouvelles tâches sans entraînement, juste par démonstration.
Points clés à retenir :
- ICL = apprentissage via exemples dans le prompt, zéro fine-tuning
- Émergence à grande échelle : >10B paramètres, optimal à 100B+
- Types : Zero-shot, few-shot (5-10), many-shot (100-1000)
- Mécanismes : Induction heads, attention, méta-apprentissage
- Limitations : Context length, format sensitivity, performance <fine-tuning
- Use case : Prototypage rapide, tâches changeantes, peu de données
Stratégie recommandée :
Prototyper avec ICL :
- Rapide (heures vs jours)
- Itération facile
- Validation use case
Scaler vers fine-tuning :
- Si volume élevé (>100K req/mois)
- Si performance critique
- Si dataset large disponible
Tendances 2025-2026 :
- 📈 Many-shot ICL (1000+ exemples) devient standard
- 🧠 Context windows 10M+ tokens (100K exemples possibles)
- 🔄 Hybrid : ICL pour adaptation rapide + fine-tuning pour core tasks
- 🤖 Modèles spécialement pré-entraînés pour ICL
In-Context Learning démocratise l’IA : pas besoin de compétences ML/data science pour adapter un LLM. Quelques exemples bien choisis suffisent.
Pour aller plus loin
Articles connexes :
Papers fondateurs :
- Language Models are Few-Shot Learners (GPT-3, 2020)
- Induction Heads (Anthropic, 2022)
- Many-Shot In-Context Learning (Google, 2024)
- Rethinking the Role of Demonstrations (2022)
Ressources externes :