Exercices Projets guidés Construire un system prompt efficace
🎉

Bravo!

Débutant 🧠 Fondamentaux 10 XP 0 personnes ont réussi

Construire un system prompt efficace

Quand tu utilises un chatbot comme ChatGPT, tu lui parles directement. Mais en coulisses, il y a un message invisible que toi l'utilisateur ne vois jamais : le system prompt. C'est les instructions secretes du developpeur. "Tu es un assistant specialise en droit du travail. Reponds toujours en francais. Ne donne jamais de conseil medical."

L'API OpenAI utilise trois roles pour structurer une conversation :

system : les instructions du developpeur (le cadre, le ton, les limites)
user : ce que l'utilisateur tape
assistant : ce que le LLM a repondu precedemment

Chaque message est un dictionnaire avec deux cles : "role" et "content". Une conversation complete, c'est une liste de ces dictionnaires. L'ordre compte : le system en premier, puis les echanges user/assistant.

Voici un exemple :

[
{"role": "system", "content": "Tu es un expert RH."},
{"role": "user", "content": "Combien de jours de conges ?"},
]

Ecris une fonction creer_messages(system_prompt, question) qui prend un system prompt et une question utilisateur, et renvoie la liste de messages au format attendu par l'API OpenAI. La liste doit contenir exactement deux messages : le system prompt en premier, la question en second.

Ecris aussi une fonction creer_messages_avec_historique(system_prompt, historique, question) qui prend en plus un historique (une liste de tuples (question, reponse) representant les echanges precedents). Elle construit la liste complete : system, puis les paires user/assistant de l'historique, puis la nouvelle question.

Exemple :

creer_messages("Tu es un assistant FAQ.", "Comment poser un conge ?")
renvoie [
{"role": "system", "content": "Tu es un assistant FAQ."},
{"role": "user", "content": "Comment poser un conge ?"}
]

creer_messages_avec_historique("Tu es un assistant.", [("Bonjour", "Salut !")], "Ca va ?")
renvoie [
{"role": "system", "content": "Tu es un assistant."},
{"role": "user", "content": "Bonjour"},
{"role": "assistant", "content": "Salut !"},
{"role": "user", "content": "Ca va ?"}
]

Tests (4/5)

Format de base avec system et user
r = creer_messages("Tu es un assistant.", "Bonjour")
assert isinstance(r, list), "La fonction doit retourner une liste"
assert len(r) == 2, f"La liste doit contenir 2 messages, pas {len(r)}"
assert r[0] == {"role": "system", "content": "Tu es un assistant."}
assert r[1] == {"role": "user", "content": "Bonjour"}
Chaque message a les bonnes cles
r = creer_messages("Sys", "Question")
for msg in r:
    assert "role" in msg, "Chaque message doit avoir une cle 'role'"
    assert "content" in msg, "Chaque message doit avoir une cle 'content'"
    assert len(msg) == 2, "Chaque message ne doit avoir que 'role' et 'content'"
Historique vide
r = creer_messages_avec_historique("Sys", [], "Question")
assert len(r) == 2, "Avec un historique vide, il ne doit y avoir que system et user"
assert r[0]["role"] == "system"
assert r[1]["role"] == "user"
assert r[1]["content"] == "Question"
Historique avec deux echanges
historique = [("Q1", "R1"), ("Q2", "R2")]
r = creer_messages_avec_historique("Sys", historique, "Q3")
assert len(r) == 6, f"Attendu 6 messages (1 system + 2*2 historique + 1 user), obtenu {len(r)}"
assert r[0]["role"] == "system"
assert r[1] == {"role": "user", "content": "Q1"}
assert r[2] == {"role": "assistant", "content": "R1"}
assert r[3] == {"role": "user", "content": "Q2"}
assert r[4] == {"role": "assistant", "content": "R2"}
assert r[5] == {"role": "user", "content": "Q3"}

+ 0 tests cachés

Indices (3 disponibles)

solution.py