Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compteDans cette partie, nous allons cette fois-ci utiliser l'API d'OpenAI pour converser avec ChatGPT.
Le but de cette partie est de créer des fonctions qui seront utilisées par la suite par le front-end.
Mais pour bien découper les choses et tester notre application, nous allons pour le moment tout faire du côté backend avec Python.
Il est bien important de séparer les différents éléments de notre application. Cela facilite par la suite les tests de ces différentes fonctions.
C'est un des principes SOLID essentiel (Single Responsability).
Générer la conversation
Nous allons commencer par créer une fonction qui prendra en paramètre la liste des échanges entre l'utilisateur et l'IA.
def build_conversation_dict(messages: list) -> list[dict]:
"""Construit une liste de messages formatés pour l'API d'OpenAI.
Prend en entrée une liste de messages et retourne une liste de dictionnaires avec le message
et le rôle (user ou assistant)."""
pass
La fonction prend en paramètre une liste de message et va retourner une liste de dictionnaires.
OpenAI attend en effet un format spécifique pour le paramètre message qui doit prendre le format suivant :
[
{"role": "user", "content": "Contenu de la question de l'utilisateur"},
{"role": "assistant", "content": "Contenu de la réponse de l'IA"},
{"role": "user", "content": "Contenu de la réponse de l'utilisateur"},
]
On remarque donc qu'un message sur deux proviendra de l'utilisateur, et l'autre de l'assistant (l'IA d'OpenAI).
On peut donc utiliser la fonction enumerate pour récupérer l'indice des messages de la liste passée en paramètre et utiliser l'opérateur modulo (%) pour alterner le rôle du message en commençant par l'utilisateur :
def build_conversation_dict(messages: list) -> list[dict]:
"""Construit une liste de messages formatés pour l'API d'OpenAI.
Prend en entrée une liste de messages et retourne une liste de dictionnaires avec le message
et le rôle (user ou assistant)."""
return [
{"role": "user" if i % 2 == 0 else "assistant", "content": message}
for i, message in enumerate(messages)
]
On utilise ici une compréhension de liste pour boucler sur les messages (for i, message in enumerate(messages)) et la fonction enumerate pour récupérer à la fois l'indice du message dans la liste (0, 1, 2, ...) et le message en question.
Pour le rôle, on utilise le modulo et l'indice pour alterner entre "user" et "assistant" en vérifiant si le résultat du modulo est égal à 0. Dans le cas d'un nombre paire (0, 2, 4, ...), le rôle sera donc "user" et dans le cas d'un nombre impaire, "assistant".
Test de la fonction
On peut tester notre fonction de façon isolée en l'important dans un interpréteur Python interactif. On remarque que tout fonctionne comme attendu :
from app import build_conversation_dict
build_conversation_dict(messages=["Bonjour, comment ça va ?", "Ça va bien et toi ?"])
# [{'role': 'user', 'content': 'Bonjour, comment ça va ?'}, {'role': 'assistant', 'content': 'Ça va bien et toi ?'}]
Ce n'est pas fini...
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.