Aller au contenu

🐍 Prompter en python

Laptop displaying code with reflection, perfect for tech and programming themes.

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 :

  1. 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.
  2. 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.
  3. 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.
  4. 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 :

  1. Poulet grillé
    • Temps de prĂ©paration : 25 minutes
    • IngrĂ©dients : poulet, huile, sel, poivre
  2. Salade de poulet rapide
    • Temps de prĂ©paration : 15 minutes
    • IngrĂ©dients : poulet, laitue, tomates, sauce vinaigrette
  3. Poulet Ă  la crĂšme
    • Temps de prĂ©paration : 30 minutes
    • IngrĂ©dients : poulet, crĂšme fraĂźche, champignons, oignons
  4. Wrap au poulet
    • Temps de prĂ©paration : 10 minutes
    • IngrĂ©dients : tortilla, poulet, salade, sauce
  5. 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

  1. 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).
  2. Réutilisation et évolutivité :
    Le script peut ĂȘtre rejouĂ© avec d’autres paramĂštres (par exemple max_prep_time = 30, ou ingredient_to_search = "boeuf"), sans risquer d’oubli ou d’erreur d’interprĂ©tation.
  3. 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.
  4. 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.
  5. Gestion des erreurs :
    Vous pouvez gérer les cas particuliers (pas de recette trouvée, données manquantes, etc.) avec des conditions if/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 :

  1. Assembler un prompt complexe en plusieurs parties (contexte, instruction, exemples, etc.).
  2. Utiliser des paramĂštres de gĂ©nĂ©ration (« hyperparamĂštres » comme la tempĂ©rature, top-p, top-k
).
  3. 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.
  4. 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

  1. 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) : si top_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.
  2. 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.
  3. 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.
  4. 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.
  5. 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 :

  1. Comment poser une question à un LLM (via une API, ici illustrée façon OpenAI) concernant un personnage historique.
  2. Structurer la réponse (biographie, faits marquants, vérification) avec un prompt complet (rÎle, instructions, etc.).
  3. 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 appeler openai.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

  1. 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.
  2. 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.
  3. 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.