Lorsque vous rĂ©digez un prompt en texte libre, vous dĂ©pendez surtout du langage naturel pour dĂ©crire ce que vous voulez accomplir. Le risque est de laisser place Ă des ambiguĂŻtĂ©s, des imprĂ©cisions ou mĂȘme des contradictions involontaires. Par exemple, si vous demandez «Donne-moi une liste de films que je pourrais regarder ce soir», la formulation peut conduire Ă des rĂ©sultats divers selon la façon dont le modĂšle interprĂšte des notions comme «films que je pourrais regarder» (genre, durĂ©e, popularitĂ©, etc.).
Prompter en Python (ou dans tout autre langage de programmation) permet dâintroduire une structure et une logique supplĂ©mentaire dans vos requĂȘtes. Voici pourquoi câest souvent considĂ©rĂ© comme plus efficaceâŻ:
- Précision et contrÎle
- Avec du code, vous pouvez spécifier trÚs clairement vos critÚres de recherche, appliquer des filtres ou effectuer des calculs (par exemple filtrer une liste par note IMDB minimale, par durée, etc.).
- Vous pouvez enchaĂźner plusieurs opĂ©rations de maniĂšre ordonnĂ©eâŻ: dâabord rĂ©cupĂ©rer un jeu de donnĂ©es, puis le filtrer, puis choisir un format de sortie, etc.
- Réutilisation et reproductibilité
- Le code est rĂ©utilisableâŻ: une fois que vous avez mis au point une sĂ©rie de fonctions ou de scripts, vous pouvez les conserver, les partager et les rejouer pour obtenir des rĂ©sultats cohĂ©rents.
- Dans un contexte de dĂ©veloppement plus vaste, cette reproductibilitĂ© est cruciale pour tester diffĂ©rentes approches, automatiser des tĂąches ou intĂ©grer des appels Ă lâIA dans un flux de production.
- Séparation des responsabilités
- Il est souvent plus clair de sĂ©parer la logique mĂ©tier (programmation) et la formulation du prompt (en texte, souvent dans une variable ou un fichier Ă part). Le dĂ©veloppeur peut ainsi optimiser la partie code (rĂ©cupĂ©ration de donnĂ©es, structure du prompt, etc.), tandis quâun expert domaine peut peaufiner le texte lui-mĂȘme.
- Gestion dâerreurs et robustesse
- En scriptant, vous pouvez mieux gérer les erreurs ou les résultats inattendus, notamment via des structures conditionnelles, des exceptions, etc.
- Les prompts en code peuvent sâadapter automatiquement si le modĂšle renvoie des rĂ©ponses partielles ou diffĂ©rentes de ce qui Ă©tait anticipĂ©, lĂ oĂč un simple prompt en texte peut aboutir Ă un blocage ou Ă un rĂ©sultat difficile Ă interprĂ©ter.
En rĂ©sumĂ©, le prompt au format Python (ou un autre langage) peut ĂȘtre plus efficace parce quâil apporte un cadre plus rigoureux et facilite le contrĂŽle du processus. Il rĂ©duit les ambiguĂŻtĂ©s courantes du langage naturel et autorise lâautomatisation de traitements complexes, garantissant une plus grande fiabilitĂ© et reproductibilitĂ© des rĂ©sultats.
Voici un exemple concret pour illustrer la diffĂ©rence entre un prompt en «âŻtexte libreâŻÂ» et un prompt «âŻpilotĂ© par du codeâŻÂ» (en Python). Dans cet exemple, nous cherchons Ă obtenir une liste de 5 recettes de cuisine facilesâŻ:
- Qui utilisent du poulet,
- Qui se préparent en moins de 20 minutes,
- Avec la liste détaillée des ingrédients,
- Et dans un format de sortie structuré (titre, temps de préparation, ingrédients, etc.).
1) Exemple de prompt en texte libre
Prompt (texte) :
« Donne-moi 5 recettes de cuisine faciles, parfaites pour le déjeuner,
utilisant du poulet, qui se préparent en moins de 20 minutes,
et avec la liste des ingrédients pour chacune. »
Sortie potentielle
Réponse (exemple, texte libre) :
Voici quelques recettes :
- Poulet grillé
- Temps de préparation : 25 minutes
- Ingrédients : poulet, huile, sel, poivre
- Salade de poulet rapide
- Temps de préparation : 15 minutes
- Ingrédients : poulet, laitue, tomates, sauce vinaigrette
- Poulet Ă la crĂšme
- Temps de préparation : 30 minutes
- Ingrédients : poulet, crÚme fraßche, champignons, oignons
- Wrap au poulet
- Temps de préparation : 10 minutes
- Ingrédients : tortilla, poulet, salade, sauce
- Poulet curry
- Temps de préparation : 20 minutes
- Ingrédients : poulet, curry, lait de coco, riz
JâespĂšre que cela vous aidera !
ProblĂšmes potentiels dans cet exempleâŻ:
- Certaines recettes dépassent le temps de préparation demandé (25 ou 30 minutes).
- Aucune structure prĂ©cise nâest garantie (une recette est nommĂ©e «âŻWrap au pouletâŻÂ», une autre «âŻPoulet Ă la crĂšmeâŻÂ», etc.).
- Le format nâest pas systĂ©matiquement uniforme (certains dĂ©tails sont plus ou moins fournis).
Lorsque vous utilisez un prompt en texte libre, vous dĂ©pendez essentiellement du modĂšle pourâŻ:
- Analyser chaque contrainte (moins de 20 minutes, poulet, etc.).
- Structurer la rĂ©ponse comme vous lâaviez imaginĂ©.
- Appliquer correctement tous vos critĂšres (ou risque dâoubli).
2) Exemple de prompt en Python
Ici, au lieu de simplement dire en texte ce que lâon veut, on va contrĂŽler prĂ©cisĂ©ment les donnĂ©es, la logique de filtrage et la mise en forme. Nous allonsâŻ:
- Définir un petit jeu de données (nos recettes).
- Filtrer sur le temps de préparation (< 20 minutes) et un ingrédient particulier (poulet).
- Limiter la sortie à 5 résultats.
- Retourner un format de réponse précis (JSON, par exemple).
Code Python (exemple simplifié) :recipes = [
{
"title": "Poulet grillé à l'huile d'olive",
"ingredients": ["Poulet", "Huile d'olive", "Sel", "Poivre"],
"prep_time": 25,
"description": "Un poulet savoureux rĂŽti au four."
},
{
"title": "Wrap au poulet et salade",
"ingredients": ["Poulet", "Tortilla", "Salade", "Sauce"],
"prep_time": 10,
"description": "Idéal pour un déjeuner rapide."
},
{
"title": "Salade de poulet express",
"ingredients": ["Poulet", "Laitue", "Tomates", "Vinaigrette"],
"prep_time": 15,
"description": "Fraßche et légÚre."
},
{
"title": "Poulet curry minute",
"ingredients": ["Poulet", "Curry", "Lait de coco", "Oignons"],
"prep_time": 20,
"description": "Un curry prĂȘt Ă toute vitesse."
},
{
"title": "Brochettes de poulet et légumes",
"ingredients": ["Poulet", "Poivrons", "Oignons", "Epices"],
"prep_time": 18,
"description": "Parfait pour un barbecue."
},
{
"title": "Poulet Ă la crĂšme et champignons",
"ingredients": ["Poulet", "CrĂšme fraĂźche", "Champignons", "Oignons"],
"prep_time": 30,
"description": "Une sauce onctueuse."
}
]
def filter_recipes(recipes, ingredient, max_prep_time, max_results):
# Filtrer dâabord les recettes sur lâingrĂ©dient
filtered = []
for r in recipes:
# VĂ©rifier si lâingrĂ©dient est dans la liste
if any(ingredient.lower() in i.lower() for i in r["ingredients"]):
# Vérifier si le temps de préparation est inférieur au max
if r["prep_time"] < max_prep_time:
filtered.append(r)
# Ne conserver que le nombre de résultats souhaités
return filtered[:max_results]
# ParamĂštres de notre "prompt Python"
ingredient_to_search = "poulet"
max_time = 20
max_number_of_results = 5
# Récupération des recettes filtrées
filtered_recipes = filter_recipes(recipes, ingredient_to_search, max_time, max_number_of_results)
import json
print(json.dumps(filtered_recipes, indent=4, ensure_ascii=False))
Sortie produite par le code
[
{
"title": "Wrap au poulet et salade",
"ingredients": [
"Poulet",
"Tortilla",
"Salade",
"Sauce"
],
"prep_time": 10,
"description": "Idéal pour un déjeuner rapide."
},
{
"title": "Salade de poulet express",
"ingredients": [
"Poulet",
"Laitue",
"Tomates",
"Vinaigrette"
],
"prep_time": 15,
"description": "Fraßche et légÚre."
},
{
"title": "Brochettes de poulet et légumes",
"ingredients": [
"Poulet",
"Poivrons",
"Oignons",
"Epices"
],
"prep_time": 18,
"description": "Parfait pour un barbecue."
}
]
- Seules 3 recettes rĂ©pondent effectivement aux critĂšres (moins de 20 minutes et contenant «âŻPouletâŻÂ»).
- Le format de sortie est un JSON clair et exploitable par dâautres programmes.
- Aucune marge dâerreur possible sur le temps de prĂ©paration, car câest un filtre strict (strictement infĂ©rieur Ă 20).
Avantages du prompt en Python
- MaĂźtrise des filtres et des critĂšres :
Vous dĂ©finissez exactement ce que vous cherchez. Le langage de programmation vous permet dâappliquer des rĂšgles strictes (par exemple,prep_time < 20
). - Réutilisation et évolutivité :
Le script peut ĂȘtre rejouĂ© avec dâautres paramĂštres (par exemplemax_prep_time = 30
, ouingredient_to_search = "boeuf"
), sans risquer dâoubli ou dâerreur dâinterprĂ©tation. - Structure de la sortie :
Vous pouvez forcer un format (JSON, CSV, etc.), trĂšs utile pour de lâautomatisation ou de lâexport de donnĂ©es. - Logique de contrĂŽle (conditions, boucles, etc.) :
Le langage de programmation vous donne un contrÎle total sur la façon de sélectionner, trier, limiter ou enrichir les données. - Gestion des erreurs :
Vous pouvez gérer les cas particuliers (pas de recette trouvée, données manquantes, etc.) avec des conditionsif/else
ou des exceptions.
Conclusion
- Prompt texte libre : plus rapide à écrire, mais parfois ambigu ou moins fiable. Le modÚle peut ignorer (involontairement) certaines contraintes ou ne pas respecter le format souhaité.
- Prompt en Python : permet de spĂ©cifier et dâappliquer sans ambiguĂŻtĂ© des instructions complexes, dâavoir des sorties formatĂ©es et de rendre le tout rĂ©utilisable et automatisable.
La «âŻsupĂ©rioritĂ©âŻÂ» du prompt Python (ou dâun autre langage) rĂ©side surtout dans cette prĂ©cision et cette automatisation : on Ă©limine un grand nombre dâambiguĂŻtĂ©s liĂ©es au langage naturel, tout en offrant une structure rĂ©plicable pour des tĂąches complexes.
Voici un exemple dâapproche «âŻprompt en PythonâŻÂ» plus avancĂ©e, intĂ©grant divers rĂ©glages de gĂ©nĂ©ration (tempĂ©rature, top-p, top-k, etc.), ainsi que des techniques de dĂ©composition de la requĂȘte (Chain of Thought, auto-vĂ©rification, etc.). Le but est de montrer comment on peutâŻ:
- Assembler un prompt complexe en plusieurs parties (contexte, instruction, exemples, etc.).
- Utiliser des paramĂštres de gĂ©nĂ©ration («âŻhyperparamĂštresâŻÂ» comme la tempĂ©rature, top-p, top-kâŠ).
- ProcĂ©der Ă une dĂ©composition : envoyer une requĂȘte intermĂ©diaire (Chain-of-Thought, ou auto-rĂ©flexion) avant de fournir la rĂ©ponse finale.
- Vérifier ou ré-évaluer la cohérence de la réponse et réitérer si nécessaire.
Remarque : le code ci-dessous se base sur lâAPI OpenAI (ou un mĂ©canisme similaire) pour illustrer la mise en place. Selon la bibliothĂšque ou le service utilisĂ©, les paramĂštres et mĂ©thodes peuvent varier (ex. : Hugging Face Transformers, autre service LLM, etc.).
Extrait de code Python illustratif
import openai
import time
# ------------------------------------------------------------------
# 1) Définir des paramÚtres de configuration (exemples)
# ------------------------------------------------------------------
MODEL_NAME = "gpt-3.5-turbo" # Ou un autre modĂšle selon lâaccĂšs (gpt-4, etc.)
TEMPERATURE = 0.7 # ContrÎle la "créativité". 0 = déterministe, 1 = plus aléatoire
TOP_P = 0.9 # Nucleus sampling. 1 = considérer tout le vocabulaire
TOP_K = None # Certains frameworks gĂšrent top-k (ex. : top-k=40)
MAX_TOKENS = 512 # Longueur max de la réponse
N_RETRIES = 3 # Nombre de tentatives si la premiÚre réponse est insatisfaisante
# (NB : OpenAI ne supporte pas toujours explicitement top_k,
# mais dâautres bibliothĂšques comme HuggingFace Transformers le font.)
# ------------------------------------------------------------------
# 2) Exemple de prompt complexe avec sections
# ------------------------------------------------------------------
def build_prompt(user_query):
"""
Construit un prompt multi-parties, incluant :
- Contexte ou rĂŽle
- Instructions spécifiques
- éventuels exemples
- la question finale
"""
# SECTION "RĂLE" / PERSONA
role_description = (
"Vous ĂȘtes un assistant expert, capable d'expliquer des sujets complexes "
"en langage clair et concis. Vous fournissez des réponses fiables "
"et structurées, et vous justifiez vos raisonnements lorsque c'est pertinent.\n\n"
)
# SECTION "INSTRUCTIONS" / CONSIGNES PRINCIPALES
instructions = (
"Consignes :\n"
"1. Répondez en français.\n"
"2. Fournissez des exemples concrets si possible.\n"
"3. Ăvitez les rĂ©ponses vagues ou non justifiĂ©es.\n"
"4. Donnez la meilleure explication possible.\n\n"
)
# SECTION "EXEMPLES" / FEW-SHOT (facultatif)
# (On peut insérer un ou deux exemples de question-réponse pour guider le modÚle)
examples = (
"Exemple Q : Qu'est-ce que le Machine Learning ?\n"
"Exemple R : Le Machine Learning est ... [exemple de réponse détaillée]\n\n"
)
# SECTION "QUESTION UTILISATEUR"
user_section = f"Question : {user_query}\n\n"
# ASSEMBLAGE FINAL DU PROMPT
prompt_final = role_description + instructions + examples + user_section
return prompt_final
# ------------------------------------------------------------------
# 3) DĂ©composition de la requĂȘte (Chain of Thought, Self-Ask, etc.)
# ------------------------------------------------------------------
def chain_of_thought(query):
"""
ExĂ©cution dâune requĂȘte intermĂ©diaire qui force le modĂšle
à réfléchir étape par étape avant de donner la réponse finale.
*Note* : Dans certains cas, on peut préférer ne pas afficher
cette 'chain-of-thought' Ă lâutilisateur final.
"""
# On prépare un prompt plus directif, demandant explicitement
# une réflexion pas à pas (Self-Ask, Chain-of-Thought).
# ATTENTION : Les politiques de certains fournisseurs (OpenAI)
# peuvent dĂ©conseiller dâafficher mot pour mot
# les "chain of thought" final Ă l'utilisateur.
# Mais pour la démonstration, nous le faisons ici.
cot_prompt = (
"Analyse pas Ă pas la question suivante et explique "
"ton raisonnement avant de donner la réponse finale.\n\n"
f"Question : {query}\n\n"
"Réfléchis étape par étape :\n"
)
# Appel dâAPI ou de fonction interne
response = openai.ChatCompletion.create(
model=MODEL_NAME,
messages=[{"role": "user", "content": cot_prompt}],
temperature=TEMPERATURE,
top_p=TOP_P,
max_tokens=512
)
# Récupération du 'reasoning' (la partie "chain of thought")
chain_of_thought_answer = response["choices"][0]["message"]["content"]
return chain_of_thought_answer
def final_answer(query):
"""
Utilise la sortie chain-of-thought pour générer la réponse finale
(auto-réflexion -> réponse concise).
"""
# On peut injecter le chain-of-thought dans un nouveau prompt,
# puis demander une synthĂšse propre.
cot = chain_of_thought(query)
# Prompt pour la synthĂšse
synthesis_prompt = (
"Tu viens de produire le raisonnement suivant :\n\n"
f"{cot}\n\n"
"Maintenant, fournis la réponse finale résumée, claire et structurée, "
"sans trop divulguer le raisonnement détaillé.\n"
)
response = openai.ChatCompletion.create(
model=MODEL_NAME,
messages=[{"role": "user", "content": synthesis_prompt}],
temperature=TEMPERATURE,
top_p=TOP_P,
max_tokens=MAX_TOKENS
)
return response["choices"][0]["message"]["content"]
# ------------------------------------------------------------------
# 4) Exemple de fonction principale pour gérer les retrys / validation
# ------------------------------------------------------------------
def get_answer_with_retries(user_query):
"""
1. Construit un prompt
2. Tente plusieurs fois si la rĂ©ponse nâest pas satisfaisante
3. IntÚgre un mécanisme de validation basique
"""
prompt = build_prompt(user_query)
for attempt in range(N_RETRIES):
try:
# Appel direct (sans chain-of-thought)
response = openai.ChatCompletion.create(
model=MODEL_NAME,
messages=[{"role": "user", "content": prompt}],
temperature=TEMPERATURE,
top_p=TOP_P,
max_tokens=MAX_TOKENS
)
answer = response["choices"][0]["message"]["content"]
# Vérification basique (exemple : longueur minimale)
if len(answer) < 30:
print(f"[Tentative {attempt+1}] Réponse trop courte, on réessaie...")
continue
# Si la réponse nous semble satisfaisante, on la renvoie
return answer
except Exception as e:
print(f"Erreur lors de la requĂȘte : {e}")
time.sleep(1)
# Si toutes les tentatives Ă©chouent, on renvoie un message dâerreur
return "Désolé, je n'ai pas pu obtenir de réponse satisfaisante aprÚs plusieurs essais."
# ------------------------------------------------------------------
# 5) Exemple d'utilisation
# ------------------------------------------------------------------
if __name__ == "__main__":
# Exemples de requĂȘtes
query1 = "Explique-moi la différence entre la température et le top-p dans les modÚles de génération de texte."
# a) Appel direct avec prompt complet + retrys
print("=== EXEMPLE SANS CHAIN OF THOUGHT ===")
answer_direct = get_answer_with_retries(query1)
print(answer_direct)
# b) Appel avec Chain of Thought suivi dâune synthĂšse
print("\n=== EXEMPLE AVEC CHAIN OF THOUGHT (SELF-ASK) ===")
answer_cot = final_answer(query1)
print(answer_cot)
Explications / Points clés
- ParamÚtres de génération
temperature
âŻ: contrĂŽle lâalĂ©atoire dans le choix des tokens. Plus la tempĂ©rature est Ă©levĂ©e, plus les rĂ©ponses peuvent ĂȘtre crĂ©atives ou variables.top_p
(nucleus sampling) : sitop_p = 0.9
, le modĂšle ne pioche les tokens que dans le groupe reprĂ©sentant 90âŻ% de la probabilitĂ© cumulĂ©e. Cela permet de rĂ©duire les rĂ©ponses trop farfelues.top_k
: limite le nombre de tokens candidats Ă chaque Ă©tape (ex. : top_k = 40). Tous les frameworks ne gĂšrent pas ce paramĂštre de la mĂȘme façon.max_tokens
: longueur maximale de la réponse.
- Décomposition (Chain of Thought / Self-Ask)
- On appelle dâabord le modĂšle pour gĂ©nĂ©rer un raisonnement interne.
- Dans un second temps, on réinjecte ce raisonnement pour obtenir une réponse finale concise.
- Avantage : permet parfois des rĂ©ponses plus fiables et structurĂ©es, car le modĂšle a dĂ©jà «âŻpensĂ©âŻÂ» Ă haute voix avant de rĂ©pondre.
- InconvĂ©nient : câest plus long (2 appels successifs) et, selon la politique du fournisseur, on peut prĂ©fĂ©rer ne pas exposer directement la «âŻchain-of-thoughtâŻÂ» Ă lâutilisateur final.
- Auto-vérification / Réessais
- Exemples de checks possibles :
- Longueur minimale (si la réponse fait moins de X caractÚres, on réessaie).
- Recherche de mots-clĂ©s (par ex. si on veut sâassurer que le mot «âŻExempleâŻÂ» figure dans la rĂ©ponse).
- Raison dâerreur : si lâAPI renvoie un timeout ou une erreur, on retente.
- Exemples de checks possibles :
- Prompt multi-parties
- RÎle / Persona : préciser le registre de langue, la posture (expert, pédagogue, etc.).
- Instructions : directives claires (langue, style, format, points Ă aborder).
- Exemples (few-shot) : montrer au modÚle le type de réponses attendu.
- Question : la requĂȘte finale de lâutilisateur.
- Réutilisabilité
- Une fois votre pipeline Python montĂ© (prompting, chain-of-thought, vĂ©rificationâŠ), vous pouvez lâĂ©tendre Ă dâautres sujets, dâautres projets.
Conclusion
En combinant des prompts structurés (multi-parties), en utilisant des réglages fins de génération (température, top-p, top-k, max_tokens, etc.) et en implémentant des techniques de décomposition (Chain-of-Thought, Self-Ask), vous obtenez :
- Plus de contrÎle sur la forme et la fiabilité de la réponse,
- La possibilité de réessayer automatiquement en cas de réponse incomplÚte ou insatisfaisante,
- Une flexibilitĂ© pour enrichir lâapproche (vĂ©rification, post-traitement, etc.).
Câest toute la force du «âŻprompt PythonâŻÂ» : passer dâun simple texte libre Ă un flux dâinstructions, de filtrage, de vĂ©rification et dâassemblage qui garantit une meilleure reproductibilitĂ© et une plus grande prĂ©cision.
Voici un exemple de script Python qui illustreâŻ:
- Comment poser une question à un LLM (via une API, ici illustrée façon OpenAI) concernant un personnage historique.
- Structurer la réponse (biographie, faits marquants, vérification) avec un prompt complet (rÎle, instructions, etc.).
- Inclure une petite étape de vérification (si la réponse est trop courte, ou ne contient pas certains champs, on refait une tentative).
Remarque : Cet exemple suppose que vous avez des identifiants dâAPI (variable
openai.api_key
) et que vous pouvez appeleropenai.ChatCompletion.create
. Vous pouvez lâadapter Ă dâautres bibliothĂšques ou fournisseurs si besoin.
Script Python dâexemple
import openai
import time
# Assurez-vous d'avoir configuré votre clé API, par exemple :
# openai.api_key = "sk-..."
MODEL_NAME = "gpt-3.5-turbo" # ou "gpt-4", selon vos accĂšs
TEMPERATURE = 0.7
TOP_P = 0.9
MAX_TOKENS = 800
N_RETRIES = 3
def build_prompt_for_historical_figure(figure_name: str) -> str:
"""
Construit un prompt structuré pour demander une présentation
d'un personnage historique donné, avec des exigences claires
sur le format et le contenu.
"""
role_description = (
"Vous ĂȘtes un assistant historique et pĂ©dagogique, spĂ©cialisĂ© "
"dans la présentation claire et fiable de personnages célÚbres.\n\n"
)
instructions = (
"Consignes :\n"
"1. Répondez en français.\n"
"2. Fournissez une structure organisée en sections :\n"
" - Nom et dates clés (naissance, décÚs)\n"
" - BrĂšve biographie\n"
" - Réalisations / faits marquants\n"
" - Influence ou héritage\n"
"3. Vérifiez la cohérence des informations et ne pas inventer de détails.\n"
"4. Restez concis mais précis.\n\n"
)
# On peut donner un exemple de format (facultatif)
example = (
"Exemple de format :\n"
"Nom et dates clés : ...\n"
"Biographie : ...\n"
"Réalisations : ...\n"
"Influence : ...\n\n"
)
user_question = f"Décris le personnage historique suivant : {figure_name}\n\n"
prompt_final = role_description + instructions + example + user_question
return prompt_final
def ask_historical_figure(figure_name: str) -> str:
"""
Interroge le modĂšle sur un personnage historique, en construisant
un prompt structuré et en gérant les éventuels réessais si la réponse
est incomplĂšte ou non conforme.
"""
prompt = build_prompt_for_historical_figure(figure_name)
for attempt in range(N_RETRIES):
try:
response = openai.ChatCompletion.create(
model=MODEL_NAME,
messages=[{"role": "user", "content": prompt}],
temperature=TEMPERATURE,
top_p=TOP_P,
max_tokens=MAX_TOKENS
)
answer = response["choices"][0]["message"]["content"]
# Vérification basique : la réponse contient-elle les sections demandées ?
# (Vous pouvez raffiner ce check)
if ("Nom et dates clés" not in answer or
"Biographie" not in answer or
"Réalisations" not in answer or
"Influence" not in answer):
print(f"[Tentative {attempt+1}] La réponse ne semble pas contenir toutes les sections. On réessaie...\n")
continue
# Vérification longueur minimale
if len(answer) < 200:
print(f"[Tentative {attempt+1}] Réponse trop courte, on réessaie...\n")
continue
# Si tout va bien, on retourne la réponse
return answer
except Exception as e:
print(f"Erreur lors de la requĂȘte : {e}. Tentative {attempt+1} sur {N_RETRIES}.")
time.sleep(1)
# Si on nâa pas obtenu de rĂ©ponse satisfaisante aprĂšs N_RETRIES
return "Désolé, je n'ai pas pu obtenir de réponse satisfaisante aprÚs plusieurs essais."
def main():
# Exemple d'utilisation
print("Entrez le nom du personnage historique :")
figure_name = input("> ")
# Appel de la fonction
structured_answer = ask_historical_figure(figure_name)
print("\n=== RĂPONSE STRUCTURĂE ===\n")
print(structured_answer)
if __name__ == "__main__":
main()
Explications
build_prompt_for_historical_figure
- Construit un prompt structuré : il décrit le rÎle (assistant expert), liste des consignes précises (sections attendues : dates clés, biographie, réalisations, influence), fournit un exemple de format et pose la question.
ask_historical_figure
- Envoie ce prompt au modĂšle via
openai.ChatCompletion.create
. - Implémente un systÚme de retrys (
N_RETRIES
) :- Sâil manque lâune des sections attendues (ex. : âNom et dates clĂ©sâ, âBiographieâ, âRĂ©alisationsâ, âInfluenceâ), on rĂ©essaie.
- Sâil juge la rĂ©ponse trop courte, on rĂ©essaie.
- Si aprĂšs plusieurs tentatives, la rĂ©ponse nâest toujours pas satisfaisante, on renvoie un message dâerreur.
- Envoie ce prompt au modĂšle via
main
- Demande Ă lâutilisateur un nom de personnage historique (par exemple : âNapolĂ©on Bonaparteâ, âClĂ©opĂątreâ, âMartin Luther Kingâ, etc.).
- Appelle
ask_historical_figure
pour obtenir la réponse. - Affiche la réponse structurée.
Paramétrage
- Temperature = 0.7 : le texte reste relativement cohĂ©rent mais un peu crĂ©atif. Pour un contenu historique, vous pouvez baisser la tempĂ©rature (ex. 0.3) si vous souhaitez des rĂ©ponses plus «âŻfactuellesâŻÂ».
- Top-P = 0.9 : on limite les options de tokens Ă 90âŻ% du cumul de probabilitĂ©.
- max_tokens = 800 : limite la longueur de la réponse.
- N_RETRIES = 3 : nombre de tentatives avant dâabandonner.
Vous pouvez affiner ces paramĂštres selon vos besoins.
Conclusion
GrĂące Ă ce prompt Python :
- Lâutilisateur saisit un personnage historique ;
- Le script construit un prompt structuré (rÎle, instructions claires, format) ;
- On vérifie la présence des sections attendues (Dates clés, Biographie, etc.) et on réessaie en cas de réponse incomplÚte ;
- On obtient enfin une réponse fiable, dans un format standardisé.
Ce type de configuration et de vĂ©rification automatique illustre la puissance du «âŻprompt en PythonâŻÂ» : on contrĂŽle la cohĂ©rence et la structure de la rĂ©ponse, plutĂŽt que de sâen remettre simplement Ă un prompt en texte libre.