Stop sequences
Arrêter la génération au bon moment
Par défaut, le modèle génère du texte jusqu’à ce qu’il estime avoir terminé sa réponse (token de fin) ou qu’il atteigne max_tokens. Les stop sequences ajoutent un troisième critère d’arrêt : dès que le modèle produit une séquence de texte spécifique, la génération s’interrompt immédiatement.
C’est un outil de contrôle puissant pour les applications qui ont besoin de réponses structurées et prévisibles.
Fonctionnement du paramètre stop
Le paramètre stop accepte une liste de chaînes de caractères. Dès que le modèle génère l’une d’entre elles, il s’arrête :
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": "user", "content": "Listez les 10 plus grandes villes de France."}
],
stop=["6."] # Arrêter après les 5 premières
)
print(response.choices[0].message.content)
# 1. Paris
# 2. Marseille
# 3. Lyon
# 4. Toulouse
# 5. Nice
La séquence d’arrêt n’est pas incluse dans la réponse. Le finish_reason sera "stop" comme pour un arrêt naturel.
Cas d’usage concrets
Extraction d’une seule réponse
Quand le modèle a tendance à ajouter des explications non désirées :
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{
"role": "system",
"content": "Répondez uniquement par le nom de la ville, rien d'autre."
},
{
"role": "user",
"content": "Quelle est la capitale de l'Italie ?"
}
],
stop=["\n", ".", "Explication"] # Arrêter au premier retour à la ligne ou point
)
print(response.choices[0].message.content.strip())
# Rome
Délimiteurs de section dans un document
Pour générer un document section par section :
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{
"role": "system",
"content": "Rédigez la section Introduction d'un rapport."
},
{
"role": "user",
"content": "Sujet : l'impact de l'IA sur l'emploi en Europe."
}
],
stop=["## ", "---", "Conclusion"] # Arrêter avant la section suivante
)
Parsing de code structuré
Pour extraire du JSON sans texte parasite :
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{
"role": "system",
"content": "Répondez uniquement en JSON valide."
},
{
"role": "user",
"content": "Donnez-moi les infos de Paris : population, pays, fuseau horaire."
}
],
stop=["\n\n", "```"] # Arrêter après le bloc JSON
)
Combiner stop sequences et streaming
Les stop sequences fonctionnent aussi en mode streaming :
stream = client.chat.stream(
model="mistral-large-latest",
messages=[
{"role": "user", "content": "Racontez une courte histoire."}
],
stop=["Fin.", "THE END", "---"]
)
full_text = ""
for chunk in stream:
content = chunk.data.choices[0].delta.content
if content:
full_text += content
print(content, end="", flush=True)
print(f"\n\nTexte : {len(full_text)} caractères")
Le flux s’interrompt dès que l’une des séquences d’arrêt est détectée dans le texte généré.
Limites et bonnes pratiques
Ce qu’il faut savoir
- Vous pouvez fournir jusqu’à 4 stop sequences par requête
- Les stop sequences sont sensibles à la casse :
"fin"ne captera pas"Fin" - La séquence d’arrêt n’est jamais incluse dans la réponse
- Les stop sequences sont vérifiées token par token — si votre séquence est au milieu d’un token, elle ne sera pas détectée
Erreurs courantes
# MAUVAIS : séquence trop courte, arrêts intempestifs
stop=["."] # Arrêtera à chaque phrase !
# BON : séquence spécifique au contexte
stop=[".\n\n"] # Arrête après un point suivi d'un double retour à la ligne
# MAUVAIS : séquence jamais produite par le modèle
stop=["XYZZY"] # N'aura aucun effet
# BON : séquence réaliste basée sur le format attendu
stop=["Question suivante :", "---"]
Exemple complet : Q&A contrôlé
from mistralai import Mistral
import os
client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))
def ask_single_question(question: str) -> str:
"""Pose une question et obtient une réponse concise sans bavardage."""
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{
"role": "system",
"content": "Répondez en une seule phrase, directement et factuellement."
},
{"role": "user", "content": question}
],
max_tokens=100,
stop=["\n\n", "Remarque :", "Note :"],
temperature=0.1
)
return response.choices[0].message.content.strip()
# Test
questions = [
"Quelle est la vitesse de la lumière ?",
"Qui a inventé le téléphone ?",
"Combien de planètes dans le système solaire ?"
]
for q in questions:
print(f"Q: {q}")
print(f"R: {ask_single_question(q)}\n")
Points clés à retenir
- Les stop sequences arrêtent la génération quand le modèle produit un texte spécifique
- Maximum 4 séquences par requête, sensibles à la casse
- La séquence d’arrêt n’est jamais incluse dans la réponse
- Utilisez des séquences suffisamment spécifiques pour éviter les arrêts intempestifs
- Combinables avec le streaming et tous les autres paramètres