Comment un modèle peut utiliser vos fonctions
Un modèle de langage ne sait qu’écrire du texte. Il ne peut pas chercher un prix dans votre boutique, car il n’exécute pas votre code. L’appel de fonctions, aussi appelé appel d’outils, comble ce manque.
Vous décrivez une fonction au modèle. Il répond par une demande d’appel, et c’est votre programme qui fait l’appel.
À la fin de cette leçon
Remarque
Je peux décrire une fonction pour qu’un modèle puisse la demander.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Outil | une fonction que votre programme propose à un modèle | |
| Appel d’outil | la demande du modèle d’exécuter un outil | |
| Schéma | une description de la forme de données | |
| Arguments | les valeurs qu’un appel passe à la fonction | {"article": "poire"} |
| Description | des mots qui disent au modèle à quoi sert un outil |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un outil : un nom et des entrées
Pour proposer une fonction, vous envoyez trois choses. Le nom est celui que le modèle utilisera. La description dit ce qu’elle fait et quand l’utiliser. Les paramètres disent quels arguments elle prend, écrits sous forme de schéma JSON.
Le modèle ne voit jamais votre code. Il lit seulement cette description : une description vague donne de mauvaises demandes.
Exemple travaillé : un outil, partie par partie
| Partie | Ce qu’elle contient | Dans notre outil |
|---|---|---|
| name | Le nom donné par le modèle | prix_de |
| description | Ce que fait l’outil | Donne le prix en centimes d’un article. |
| parameters | Les arguments, sous forme de schéma | un texte nommé article |
| required | Les arguments obligatoires | article |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Afficher la description d’un outil
docker exec -w /home/node/project agent node -e "const outil={type:'function',function:{name:'prix_de',description:'Donne le prix en centimes d’un article.',parameters:{type:'object',properties:{article:{type:'string',description:'Le nom de l’article, par exemple pomme'}},required:['article']}}};console.log(JSON.stringify(outil,null,2))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le modèle répond par une demande
Quand le modèle veut un outil, sa réponse contient une liste nommée tool_calls au lieu de mots. Chaque appel a un id, le name de la fonction et les arguments.
Les arguments arrivent dans une seule chaîne de JSON, pas dans un objet. Votre programme doit lire cette chaîne avant d’utiliser les valeurs.
Demander un appel d’outil à un modèle
docker exec -w /home/node/project agent node -e "const u=(process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions';const poser=async(m,t)=>{const r=await fetch(u,{method:'POST',headers:{'content-type':'application/json',authorization:'Bearer lab'},body:JSON.stringify({model:'lab',messages:m,tools:t,tool_choice:'required',max_tokens:80})});const j=await r.json();if(r.ok)return j.choices[0].message;throw Error(r.status+' '+j.error.message)};const outil={type:'function',function:{name:'prix_de',description:'Donne le prix d’un article.',parameters:{type:'object',properties:{article:{type:'string'}}}}};(async()=>{let c;try{c=(await poser([{role:'user',content:'Prix d’une poire ?'}],[outil])).tool_calls[0]}catch(e){console.log('Refus ('+e.message+'). Exemple enregistré :');c={function:{name:'prix_de',arguments:JSON.stringify({article:'poire'})}}}const f=c.function;console.log('Nom : '+f.name);console.log('Arguments : '+f.arguments+' -> article '+JSON.parse(f.arguments).article)})()"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur courante
Attention
Beaucoup pensent que le modèle exécute la fonction. Ce n’est pas le cas. Il écrit seulement une demande. Votre programme lit la demande, exécute la fonction et décide quoi faire du résultat.
Pour aller plus loin : améliorer une description
Changez la description dans l’exécution qui interroge un modèle, par exemple en Donne un prix. Lancez-la trois fois et notez si l’appel change.
Le schéma de cette exécution n’a pas de liste required. Ajoutez required:['article'] à côté de properties, puis écrivez ce que cela change pour le modèle.