Aller au contenu principal

N Completions et Stop Sequences

Mis à jour le 28 juillet 2026

Générer plusieurs réponses en une seule requête

Pour clore cette section sur les paramètres de génération, nous abordons deux outils de contrôle plus opérationnels : le paramètre N completions, qui permet de demander au modèle plusieurs réponses à partir d’un même prompt en un seul appel API, et les stop sequences, qui décident où la génération s’arrête. Le premier sert à comparer des alternatives, à augmenter vos chances d’obtenir une réponse optimale ou à alimenter un processus de sélection automatique ; les secondes vous donnent la main sur la longueur et le format des sorties.

Le paramètre n : comment ça marche

Lorsque vous définissez n=5, le modèle génère 5 réponses indépendantes pour votre prompt, chacune retournée comme un choix (choice) distinct dans l’objet de réponse. Un point de facturation mérite votre attention avant de vous en servir massivement : les tokens d’entrée — votre prompt — ne sont facturés qu’une seule fois, mais les tokens de sortie le sont pour chaque completion. Avec n=5, vous payez donc cinq fois les tokens de sortie, mais une seule fois le prompt : pour un prompt long et des réponses courtes, c’est nettement plus économique que cinq appels séparés.

from mistralai import Mistral

client = Mistral(api_key="votre-cle-api")

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {"role": "user", "content": "Proposez un slogan pour une marque de café bio français."}
    ],
    n=5,
    temperature=0.8
)

for i, choice in enumerate(response.choices):
    print(f"Option {i+1} : {choice.message.content}")

Ce code produit 5 slogans différents, parmi lesquels vous choisissez le meilleur. C’est le premier grand usage de n : la génération créative, où obtenir plusieurs options pour un slogan, un titre ou un nom de produit vaut mieux qu’une seule tentative. Le deuxième est la classification avec vote : on génère N classifications du même texte et on retient la réponse majoritaire, ce qui lisse les erreurs occasionnelles. On s’en sert aussi pour l’exploration — tester plusieurs approches d’un même problème — et pour le contrôle qualité, en vérifiant la cohérence du modèle par comparaison de ses propres réponses.

Trois limites à connaître avant de déployer. D’abord, tous les modèles Mistral ne supportent pas n supérieur à 1 : vérifiez la documentation du modèle que vous utilisez. Ensuite, la latence augmente avec n, puisque le modèle génère plus de tokens au total. Enfin — et c’est l’erreur classique du débutant — combinez toujours n > 1 avec une température suffisante (0.5 et plus) : à température 0, vos cinq réponses seront quasi identiques et vous aurez payé cinq fois la même phrase.

Les stop sequences : contrôler la fin de la génération

Les stop sequences sont des chaînes de caractères qui forcent le modèle à s’arrêter dès qu’il les génère. C’est un mécanisme essentiel pour contrôler la longueur et le format des réponses. Commençons par un exemple volontairement simpliste pour fixer l’idée :

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {"role": "user", "content": "Listez les jours de la semaine, un par ligne."}
    ],
    stop=["Samedi"]
)

Ici, le modèle s’arrête dès qu’il génère le mot « Samedi », produisant une liste tronquée. En pratique, les stop sequences sont surtout utiles avec des délimiteurs structurels. Premier cas d’usage : extraire une seule section d’une réponse structurée. Si votre prompt demande une analyse en trois parties, arrêter la génération au titre de la deuxième vous donne uniquement la première :

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {"role": "user", "content": """Analysez ce produit :
## Points forts
(votre analyse ici)
## Points faibles
(votre analyse ici)
## Conclusion
(votre analyse ici)"""}
    ],
    stop=["## Points faibles"]
)
# Le modèle s'arrête après les points forts

Deuxième cas : limiter la génération à un bloc JSON, en combinant la stop sequence avec un pré-remplissage du message assistant qui ouvre l’accolade :

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {"role": "user", "content": "Retournez les métadonnées de cet article en JSON."},
        {"role": "assistant", "content": "{"}
    ],
    stop=["}"]
)
# Le modèle génère le contenu JSON et s'arrête à la fermeture

Troisième cas : empêcher le modèle de continuer après sa réponse. Pour une question fermée, arrêter au premier retour à la ligne garantit un « OUI » ou un « NON » sec, sans paragraphe de justification que vous n’avez pas demandé :

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {"role": "user", "content": "Répondez à la question suivante par OUI ou NON uniquement.\nLa Terre est-elle ronde ?"}
    ],
    stop=["\n"]
)

Le paramètre max_tokens

Complémentaire aux stop sequences, max_tokens fixe une limite dure sur le nombre de tokens de sortie :

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {"role": "user", "content": "Résumez l'histoire de France."}
    ],
    max_tokens=200
)

Attention à son comportement : max_tokens coupe la réponse brutalement, potentiellement au milieu d’une phrase — votre résumé peut se terminer sur « et c’est ainsi que Napoléon ». Traitez-le comme un filet de sécurité contre les réponses interminables, pas comme le moyen principal de contrôler la longueur. Pour cela, préférez les instructions dans le prompt (« répondez en 3 phrases ») combinées à un max_tokens généreux.

Combiner les paramètres

Ces mécanismes prennent toute leur valeur ensemble. L’exemple suivant génère 5 titres d’articles différents, chacun limité à une seule ligne grâce à la stop sequence, avec un plafond de 50 tokens en garde-fou :

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": "Vous générez des titres d'articles de blog. Un seul titre par réponse."
        },
        {
            "role": "user",
            "content": "Thème : productivité au travail en 2026"
        }
    ],
    n=5,
    temperature=0.8,
    max_tokens=50,
    stop=["\n"]
)

titres = [choice.message.content.strip() for choice in response.choices]
for i, titre in enumerate(titres):
    print(f"{i+1}. {titre}")

Points clés à retenir

  • Le paramètre n génère plusieurs réponses en un seul appel (tokens d’entrée facturés une fois)
  • Combinez n > 1 avec une température suffisante pour obtenir de vraies variations
  • Les stop sequences arrêtent la génération à un délimiteur précis
  • max_tokens est un filet de sécurité, pas un contrôle de longueur principal
  • Combinez ces paramètres pour un contrôle fin de la génération