Débutant
🧠 Fondamentaux
10 XP
0 personnes ont réussi
Premier appel a l'API OpenAI
Tu demarres un projet concret : construire un assistant FAQ pour une entreprise. Le genre d'outil que tu peux montrer en entretien et qui fait la difference. A la fin de cette serie d'exercices, tu auras un chatbot RAG fonctionnel avec interface web.
Premiere etape : parler a un LLM. Avant de faire du RAG, de la recherche semantique ou du chunking, il faut savoir envoyer une question a l'API OpenAI et recuperer la reponse. C'est la brique de base de tout projet IA moderne.
Pour commencer, installe la librairie :
pip install openai
Ensuite, cree une cle API sur platform.openai.com. Tu la stockeras dans une variable d'environnement OPENAI_API_KEY (jamais en dur dans le code, c'est une regle d'or en production).
Voici comment ca marche. La librairie openai te donne un client. Tu lui passes une liste de messages (on verra ca en detail a l'exercice suivant), et il te renvoie une reponse. Le modele gpt-4o-mini est le moins cher, parfait pour apprendre.
Ecris une fonction appeler_llm(prompt, model="gpt-4o-mini") qui prend un texte (le prompt) et un nom de modele, envoie la requete a l'API OpenAI, et renvoie la reponse sous forme de string.
Pour que les tests fonctionnent dans le sandbox (sans cle API), ta fonction doit accepter un parametre optionnel client=None. Si client est None, elle cree un vrai client OpenAI(). Sinon, elle utilise le client fourni. Ca permet de tester la logique sans appel reel.
Exemple :
appeler_llm("Dis bonjour en une phrase") renvoie quelque chose comme "Bonjour ! Comment puis-je vous aider ?"
appeler_llm("Quelle est la capitale de la France ?", model="gpt-4o-mini") renvoie quelque chose comme "La capitale de la France est Paris."
La reponse exacte varie a chaque appel puisque le LLM genere du texte, mais c'est toujours un string non vide.
Tests (3/4)
Retourne un string avec un faux client
class FakeMessage:
def __init__(self):
self.content = "Bonjour, je suis un assistant."
class FakeChoice:
def __init__(self):
self.message = FakeMessage()
class FakeResponse:
def __init__(self):
self.choices = [FakeChoice()]
class FakeCompletions:
def create(self, **kwargs):
return FakeResponse()
class FakeChat:
def __init__(self):
self.completions = FakeCompletions()
class FakeClient:
def __init__(self):
self.chat = FakeChat()
r = appeler_llm("Dis bonjour", client=FakeClient())
assert isinstance(r, str), f"La fonction doit retourner un string, pas {type(r)}"
assert len(r) > 0, "La reponse ne doit pas etre vide"
Utilise le prompt fourni
class FakeMessage:
def __init__(self):
self.content = "Reponse test"
class FakeChoice:
def __init__(self):
self.message = FakeMessage()
class FakeResponse:
def __init__(self):
self.choices = [FakeChoice()]
class FakeCompletions:
def create(self, **kwargs):
assert 'messages' in kwargs, "Tu dois passer un parametre messages"
assert any(m['content'] == 'Ma question' for m in kwargs['messages']), "Le prompt doit apparaitre dans les messages"
return FakeResponse()
class FakeChat:
def __init__(self):
self.completions = FakeCompletions()
class FakeClient:
def __init__(self):
self.chat = FakeChat()
r = appeler_llm("Ma question", client=FakeClient())
assert r == "Reponse test"
Accepte un modele personnalise
class FakeMessage:
def __init__(self):
self.content = "OK"
class FakeChoice:
def __init__(self):
self.message = FakeMessage()
class FakeResponse:
def __init__(self):
self.choices = [FakeChoice()]
class FakeCompletions:
def create(self, **kwargs):
assert kwargs.get('model') == 'gpt-4o', f"Le modele doit etre gpt-4o, pas {kwargs.get('model')}"
return FakeResponse()
class FakeChat:
def __init__(self):
self.completions = FakeCompletions()
class FakeClient:
def __init__(self):
self.chat = FakeChat()
r = appeler_llm("Test", model="gpt-4o", client=FakeClient())
assert r == "OK"
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
def appeler_llm(prompt, model="gpt-4o-mini", client=None):
if client is None:
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content