Débutant
🧠 Fondamentaux
10 XP
0 personnes ont réussi
Function calling : le LLM choisit l'outil
Maintenant que tu sais definir des outils, passons a la partie magique : le LLM decide tout seul quel outil utiliser. Quand un utilisateur demande "Quel temps fait-il a Paris ?", le modele ne cherche pas a inventer une reponse. Il regarde sa liste d'outils, voit qu'il y a un outil "rechercher_meteo", et decide de l'appeler avec le parametre "Paris".
En pratique, tu envoies ta question a l'API OpenAI avec la liste des schemas d'outils. La reponse peut contenir un champ tool_calls au lieu d'un message texte. Ce champ te dit quel outil appeler et avec quels arguments (en JSON).
Voici le flux complet :
1. Tu envoies la question + les schemas d'outils 2. Le LLM renvoie un tool_call (nom de l'outil + arguments JSON) 3. Tu executes l'outil avec les bons arguments 4. Tu renvoies le resultat au LLM 5. Le LLM formule sa reponse finale
Pour simuler ce mecanisme sans API, on va travailler avec des dictionnaires. Un tool_call ressemble a ca :
Remarque que les arguments sont une chaine JSON, pas un dictionnaire. Il faut les parser avec json.loads().
Ecris une fonction executer_tool_call(tool_call, boite_a_outils) qui prend un dictionnaire tool_call et un dictionnaire boite_a_outils (comme celui de l'exercice precedent). Elle doit extraire le nom de la fonction, parser les arguments JSON, appeler la bonne fonction, et renvoyer un dictionnaire avec le resultat.
import json
boite = {"chercher": lambda q: "ok"}
tc = {"id": "call_3", "type": "function", "function": {"name": "outil_inexistant", "arguments": "{}"}}
r = executer_tool_call(tc, boite)
assert "error" in r, "Un outil inconnu doit renvoyer une cle 'error'"
assert "result" not in r, "Un outil inconnu ne doit pas avoir de cle 'result'"
L'id du tool call est preserve
import json
def echo(msg): return msg
boite = {"echo": echo}
tc = {"id": "call_xyz_789", "type": "function", "function": {"name": "echo", "arguments": json.dumps({"msg": "test"})}}
r = executer_tool_call(tc, boite)
assert r["tool_call_id"] == "call_xyz_789", "L'id du tool call doit etre copie dans tool_call_id"
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
import json
def executer_tool_call(tool_call, boite_a_outils):
nom = tool_call["function"]["name"]
arguments_json = tool_call["function"]["arguments"]
arguments = json.loads(arguments_json)
call_id = tool_call["id"]
if nom not in boite_a_outils:
return {"tool_call_id": call_id, "name": nom, "error": f"Outil inconnu : {nom}"}
fonction = boite_a_outils[nom]
resultat = fonction(**arguments)
return {"tool_call_id": call_id, "name": nom, "result": str(resultat)}