--- title: "Few-shot : apprendre par l'exemple" duration: 30min description: "Choisir, formater et diversifier quelques exemples pour fixer le ton, le format et les cas limites." --- > [!NOTE] > Dans cette leçon, vous apprenez à utiliser des exemples (*few-shot*) pour montrer au modèle ce que vous attendez, à les choisir pour couvrir les cas limites, et à éviter qu'il ne les recopie mot pour mot. ## Montrer plutôt que décrire Décrire un ton (« chaleureux mais pro ») est difficile ; en montrer deux exemples est immédiat. C'est l'idée popularisée par l'article GPT-3 (*Language Models are Few-Shot Learners*, 2020) : quelques démonstrations dans le prompt suffisent souvent à fixer une tâche. | Terme | Ce que contient le prompt | Usage typique | |---|---|---| | **Zero-shot** | La consigne seule | Tâches simples et courantes | | **One-shot** | Consigne + 1 exemple | Fixer un format | | **Few-shot** | Consigne + 3 à 5 exemples variés | Fixer un ton, une classification, des cas limites | ```mermaid flowchart LR A["Consigne"] --> B{"Le résultat varie trop ?"} B -- "Non" --> Z["Zero-shot suffit"] B -- "Oui" --> C["Ajouter 3 à 5 exemples variés"] C --> D{"Le modèle recopie les exemples ?"} D -- "Oui" --> E["Diversifier les exemples et dire qu'ils sont illustratifs"] D -- "Non" --> F["Garder et tester"] ``` ## Avant / après : classifier des messages | Avant (zero-shot) | Après (few-shot) | |---|---| | « Classe ce message en : livraison, facturation, produit, autre. » Résultat : parfois « Livraison », parfois « problème de livraison », parfois une phrase entière. | Même consigne + 4 exemples balisés montrant **exactement** la sortie attendue (un mot en minuscules), dont un cas ambigu et un cas « autre ». | ```text title="classif-few-shot.txt" Classe le message dans une seule catégorie : livraison, facturation, produit, autre. Réponds par la catégorie seule, en minuscules. Mon colis est marqué livré mais je n'ai rien reçu. livraison On m'a prélevé deux fois pour la même commande. facturation La crème a changé d'odeur après une semaine, et je veux être remboursée. produit Vous recrutez des vendeurs pour l'été ? autre {message} ``` > [!TIP] > Le troisième exemple est volontairement **ambigu** (produit + remboursement) : il montre la règle de priorité (la cause, pas la demande). Les cas limites sont les exemples les plus utiles. ```quiz question: "Vos 4 exemples de réponses client commencent tous par « Bonjour et merci pour votre message ». Que risque-t-il de se passer ?" options: - "Rien, le modèle comprend que c'est une coïncidence" - "Le modèle reproduira cette formule dans presque toutes ses réponses" - "Le modèle refusera de répondre" answer: 1 explanation: "Les modèles imitent fortement les régularités des exemples. Si tous partagent la même formule, elle devient de fait une consigne. Diversifiez les exemples sur ce qui doit varier." ``` ## Bien choisir ses exemples | Bonne pratique | Pourquoi | |---|---| | 3 à 5 exemples, pas 30 | Au-delà, le gain diminue et le coût augmente (module 3) | | Varier longueur, ton du client, sujet | Éviter que le modèle copie une forme unique | | Inclure au moins un cas limite | C'est là que le zero-shot échoue | | Les baliser (``) | Les séparer des instructions et des vraies données | | Préciser « exemples illustratifs, ne pas recopier » | Limiter la reprise mot pour mot | | Équilibrer les catégories | Un exemple « facturation » sur quatre = moins de biais qu'un sur dix | > [!WARNING] > N'utilisez jamais de vrais messages de clients comme exemples sans les anonymiser : un prompt est copié, partagé, loggé. Remplacez noms, adresses, numéros de commande. ```quiz question: "Quels exemples ajouter en priorité à un prompt de classification qui se trompe parfois ? (plusieurs réponses)" options: - "Les messages sur lesquels il s'est trompé, corrigés et anonymisés" - "Dix exemples de plus du cas le plus fréquent" - "Un message qui relève de deux catégories, avec la règle de priorité" - "Un exemple en majuscules sans rapport avec la tâche" answer: [0, 2] explanation: "Les erreurs réelles et les cas ambigus apprennent quelque chose au modèle. Multiplier le cas fréquent déséquilibre les catégories ; un exemple hors sujet ne sert à rien." ``` ## En Python : construire le bloc d'exemples ```python title="few_shot.py" EXEMPLES = [ ("Mon colis est marqué livré mais je n'ai rien reçu.", "livraison"), ("On m'a prélevé deux fois pour la même commande.", "facturation"), ] def bloc_exemples(exemples: list[tuple[str, str]]) -> str: lignes = [""] for msg, cat in exemples: lignes.append(f"{msg}{cat}") lignes.append("") return "\n".join(lignes) print(bloc_exemples(EXEMPLES)) ``` Garder les exemples dans une liste Python (ou un fichier YAML) permet de les enrichir quand un test échoue, sans réécrire le prompt. ## Exercice Vous générez des **titres de fiches produit** pour un site de jardinage. Les titres actuels sont trop longs et pleins d'adjectifs. Écrivez un prompt few-shot avec 3 exemples qui fixent le style : `Produit + bénéfice principal`, 60 caractères maximum.
Voir la solution ```text Rédige un titre de fiche produit au format « Produit : bénéfice principal », 60 caractères maximum, sans adjectif superlatif. Les exemples ci-dessous sont illustratifs : ne les recopie pas. Tuyau d'arrosage extensible 15 m avec pistolet 7 jets Tuyau extensible 15 m : se range dans un tiroir Sécateur à crémaillère pour branches jusqu'à 25 mm, poignées ergonomiques Sécateur à crémaillère : coupe sans forcer jusqu'à 25 mm Engrais bio pour tomates, sac de 2 kg, action 3 mois Engrais bio tomates : nourrit 3 mois en une fois {description} ``` Les exemples varient le type de produit et la nature du bénéfice (rangement, effort, durée), ce qui évite la répétition d'une même tournure. Vérifiez la longueur par code (`len(titre) <= 60`), pas seulement par consigne.
## Je sais faire - [ ] Expliquer la différence entre zero-shot, one-shot et few-shot. - [ ] Choisir 3 à 5 exemples variés dont au moins un cas limite. - [ ] Baliser les exemples et préciser qu'ils sont illustratifs. - [ ] Anonymiser des exemples tirés de vrais échanges.