Menu

Chaînage de prompts : découper une tâche en étapes

Le chaînage de prompts découpe un travail en une suite de prompts plus petits, où la sortie de chaque étape devient l'entrée de la suivante. Chaque étape fait une seule chose, et vous pouvez vérifier son résultat avant que la suivante ne démarre.

Chaque prompt de cette page se modifie, puis s'ouvre dans ChatGPT, Claude ou une autre application d'IA.

Le chaînage de prompts consiste à découper un travail en une suite de prompts, où la sortie de l'un devient une partie de l'entrée du suivant. Au lieu de demander à un modèle de lire cinquante avis, de trouver les problèmes, de les classer et de rédiger un rapport d'un seul coup, vous demandez chacune de ces tâches à tour de rôle. Chaque prompt a une seule mission, et entre les étapes, vous (ou votre code) pouvez regarder le résultat, le corriger ou vous arrêter.

Le bloc ci-dessous est une chaîne en trois étapes qui transforme des avis clients en note pour une équipe produit. Chaque onglet est une étape. L'entrée de l'étape 2 est la réponse de l'étape 1, collée telle quelle, et l'entrée de l'étape 3 est la réponse de l'étape 2.

Fill in
Liste chaque plainte présente dans les avis situés entre les balises <reviews>. Ignore les compliments. Renvoie un tableau JSON d'objets avec les clés "review" (le numéro de l'avis) et "complaint" (huit mots au maximum). Renvoie uniquement le JSON. <reviews> 1. La batterie a lâché au bout de 4 heures, et le câble de charge est trop court. 2. Super son. Par contre, l'appli me déconnecte sans arrêt. 3. Je les adore, mais la batterie tient à peine mon trajet retour. 4. L'appli a planté deux fois pendant l'appairage, et la batterie se vide vite. 5. Le câble est si court que je ne peux pas les utiliser en charge à mon bureau. </reviews>
Try it
Example replyReplies vary between models and runs.
[
  {"review": 1, "complaint": "Batterie morte au bout de 4 heures"},
  {"review": 1, "complaint": "Câble de charge trop court"},
  {"review": 2, "complaint": "L'appli déconnecte sans arrêt"},
  {"review": 3, "complaint": "Batterie ne tient pas un trajet"},
  {"review": 4, "complaint": "L'appli plante pendant l'appairage"},
  {"review": 4, "complaint": "Batterie se vide vite"},
  {"review": 5, "complaint": "Câble trop court pour utiliser en charge"}
]

L'étape 1 ne fait que lire et extraire. L'étape 2 ne voit jamais les avis, seulement la liste, elle ne peut donc pas repartir dans un résumé des avis. L'étape 3 ne fait que rédiger. Si l'étape 3 revient avec le mauvais ton, vous relancez l'étape 3 seule ; l'extraction et le regroupement restent tels quels.

Remarquez ce que l'étape 3 ne dit pas : qu'une batterie a lâché au bout de 4 heures, ou que les problèmes d'appli étaient des déconnexions et des plantages. L'étape 3 n'a reçu que les noms des thèmes, ces détails ne figuraient donc pas dans son entrée. Décider de ce que reçoit chaque étape est le principal choix de conception d'une chaîne, et un détail que vous voulez dans la réponse finale doit être transmis jusqu'au bout.

Pourquoi chaîner plutôt qu'écrire un gros prompt

Chaque étape a une mission et un critère de qualité. Un prompt unique qui demande extraction, analyse et rédaction soignée doit équilibrer trois objectifs, et rien ne vous dit lequel il a bâclé. Un prompt à mission unique peut dire exactement à quoi ressemble un bon résultat pour cette mission, et vous pouvez juger la réponse à cette aune.

Vous pouvez vérifier le milieu. Dans un prompt unique, une plainte oubliée disparaît dans un paragraphe bien écrit et vous ne la voyez jamais. Dans une chaîne, la liste de l'étape 1 est là sous vos yeux. La vérifier prend quelques secondes, et la corriger avant l'étape 2 coûte moins cher que de trouver l'erreur dans le rapport final.

Chaque étape peut avoir ses propres réglages. L'extraction et le regroupement demandent une température basse et une sortie structurée que le code peut analyser. L'étape de rédaction peut être plus libre. Dans le code, vous pouvez même envoyer les étapes à des modèles différents, par exemple un petit modèle rapide pour l'extraction.

Les échecs restent localisés. Quand une chaîne casse, vous savez quelle étape a cassé, et vous ne relancez que celle-là.

Les coûts sont réels aussi. Une chaîne fait plus d'appels, elle prend donc plus de temps et coûte plus cher qu'un seul prompt. Et une erreur qui passe à travers une étape du début se propage dans toutes les suivantes, c'est pourquoi les étapes intermédiaires valent la peine d'être vérifiées.

Comment concevoir une chaîne

  1. Écrivez les étapes que vous suivriez à la main. Si vous feriez d'abord une liste, puis la trieriez, puis rédigeriez le tout, cela fait trois prompts. Les étapes qui demandent des types de réflexion différents sont les endroits naturels où découper.
  2. Décidez du format de sortie de chaque étape avant d'écrire son prompt. Ce que consomme l'étape suivante doit être facile à lire et à vérifier : un tableau JSON, une liste numérotée, un tableau. La prose libre ne convient qu'à la dernière étape.
  3. Ne transmettez que ce dont l'étape suivante a besoin. L'étape 2 ci-dessus reçoit la liste des plaintes, pas les avis. Moins d'entrée, c'est moins de distractions, et chaque étape devient testable séparément.
  4. Ajoutez une vérification entre les étapes. Dans le code, analysez le JSON et confirmez que les champs existent. Pour les questions de jugement, une vérification peut elle-même être un prompt : "Cette liste contient-elle toutes les plaintes de ces avis ? Réponds oui ou non, puis liste celles qui manquent."
  5. Signalez clairement le contenu collé. L'entrée de chaque étape est du texte produit par une étape précédente, et les délimiteurs évitent que le modèle la lise comme de nouvelles consignes.

Voici une étape de vérification pour la chaîne ci-dessus, exécutée sur une version de la sortie de l'étape 1 qui a oublié une plainte. Une vérification de ce genre est un prompt distinct avec une seule question précise, elle est donc plus facile à réussir que l'extraction elle-même.

Vérifier une étape avant de la transmettre
Compare les avis situés entre les balises <reviews> avec la liste de plaintes située entre les balises <complaints>. La liste contient-elle toutes les plaintes des avis ? Réponds "Complète" ou "Incomplète" sur la première ligne. Si elle est incomplète, liste chaque plainte manquante avec son numéro d'avis. <reviews> 1. La batterie a lâché au bout de 4 heures, et le câble de charge est trop court. 2. Super son. Par contre, l'appli me déconnecte sans arrêt. 3. Je les adore, mais la batterie tient à peine mon trajet retour. 4. L'appli a planté deux fois pendant l'appairage, et la batterie se vide vite. 5. Le câble est si court que je ne peux pas les utiliser en charge à mon bureau. </reviews> <complaints> Avis 1 : Batterie morte au bout de 4 heures Avis 1 : Câble de charge trop court Avis 2 : L'appli déconnecte sans arrêt Avis 3 : Batterie ne tient pas un trajet Avis 4 : L'appli plante pendant l'appairage Avis 5 : Câble trop court pour utiliser en charge </complaints>
Try it
Example replyReplies vary between models and runs.

Incomplète

  • Avis 4 : la batterie se vide vite

Si la vérification répond "Incomplète", relancez l'étape 1 ou ajoutez l'élément manquant à la main avant de lancer l'étape 2.

Une chaîne dans le code

Dans le code, une chaîne est une suite d'appels où chaque prompt est construit à partir de la réponse précédente. Cette version utilise le SDK Python d'Anthropic ; la même structure marche avec n'importe quel fournisseur.

import json
import anthropic

client = anthropic.Anthropic()
MODEL = "your-model-id"  # e.g. from your provider's model list

def ask(prompt):
    response = client.messages.create(
        model=MODEL,
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}],
    )
    return response.content[0].text

reviews = open("reviews.txt", encoding="utf-8").read()

complaints = ask(
    "List every complaint in the reviews inside the <reviews> tags. Ignore praise. "
    'Return a JSON array of objects with the keys "review" and "complaint". '
    "Return only the JSON, with no code fence.\n\n"
    f"<reviews>\n{reviews}\n</reviews>"
)
json.loads(complaints)  # raises an error here if step 1 did not return valid JSON

themes = ask(
    "Group these complaints into themes. Return only a JSON array with the keys "
    '"theme", "count" and "reviews", sorted by count, highest first.\n\n'
    f"<complaints>\n{complaints}\n</complaints>"
)

note = ask(
    "Write a note of at most four sentences to the product team based on these "
    f"themes. Lead with the most common one.\n\n<themes>\n{themes}\n</themes>"
)
print(note)

La ligne json.loads est la vérification la plus simple possible : si l'étape 1 a répondu en prose, la chaîne s'arrête là au lieu de transmettre une mauvaise entrée. Une chaîne en production vérifierait aussi les champs, relancerait une fois une étape en échec et journaliserait chaque résultat intermédiaire, pour qu'une mauvaise réponse finale puisse être rattachée à l'étape qui l'a causée.

Chaîner dans une application de chat

Pas besoin de code pour chaîner des prompts. Lancez l'étape 1, lisez la réponse, corrigez ce qui est faux, puis collez-la dans le prompt de l'étape 2. Faire chaque étape dans une nouvelle conversation garde l'échange précédent hors du contexte, si bien qu'une consigne écrite pour une étape n'influence pas la suivante. Rester dans une seule conversation va plus vite et marche quand les étapes sont étroitement liées, mais tout l'historique voyage avec chaque nouveau message.

Le chaînage comparé aux techniques voisines

Le chain of thought est un raisonnement écrit dans une seule réponse ; une chaîne de prompts, ce sont plusieurs réponses, et c'est vous qui contrôlez ce qui passe de l'une à l'autre. Les deux se combinent bien : n'importe quelle étape d'une chaîne peut demander un raisonnement étape par étape.

Dans une chaîne, c'est vous qui fixez les étapes à l'avance. Quand le modèle décide lui-même de l'étape suivante, par exemple chercher, lire un résultat puis choisir une autre action, il s'agit plutôt d'une boucle d'agent, décrite dans ReAct. Les chaînes fixes sont plus faciles à tester et à prévoir : c'est donc le meilleur point de départ dès que vous connaissez déjà les étapes.

Questions fréquentes

Qu'est-ce que le chaînage de prompts ?

Le chaînage de prompts (prompt chaining) est une technique où l'on découpe une tâche en plusieurs prompts exécutés l'un après l'autre, la sortie de chaque prompt étant insérée dans le suivant. Par exemple, un prompt extrait les plaintes d'avis clients, un deuxième les regroupe en thèmes, et un troisième rédige un rapport à partir des thèmes.

Quelle est la différence entre le chaînage de prompts et le chain of thought ?

Le chain of thought se passe dans une seule réponse : le modèle écrit son raisonnement avant la réponse. Le chaînage de prompts utilise plusieurs appels distincts, et c'est vous ou votre code qui passez le résultat de l'un au suivant. Vous pouvez inspecter, corriger ou relancer n'importe quelle étape d'une chaîne, ce qui est impossible avec un raisonnement contenu dans une seule réponse.

Peut-on chaîner des prompts dans ChatGPT ou Claude sans coder ?

Oui. Lancez le premier prompt, vérifiez la réponse, puis collez-la dans le prompt suivant, dans la même conversation ou dans une nouvelle. Ouvrir une nouvelle conversation pour chaque étape évite que les brouillons et consignes précédents influencent les étapes suivantes.

Quand chaîner des prompts plutôt qu'utiliser un seul prompt ?

Utilisez une chaîne quand un prompt demande plusieurs types de travail différents, comme extraire, analyser et rédiger, ou quand vous devez vérifier ou réutiliser un résultat intermédiaire. Si un seul prompt donne déjà une réponse fiable, une chaîne ne fait qu'ajouter des appels, du coût et de l'attente.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER