TIL : contraindre les outils d'un agent vaut mieux que l'instruire
En montant le layering de modèles de mon setup pi, je voulais qu’un preset de traitement en volume évite les appels d’outils complexes — le modèle dessus a un tool-calling fragile. Premier réflexe : l’écrire dans le prompt. « Ne fais que lire et écrire, évite les commandes bash compliquées. »
Mauvaise idée. Un modèle en run long finit toujours par oublier la consigne, ou par la contourner en raisonnant à voix haute (« I need to just output text without tool calls »). La consigne dans le prompt est une intention, pas une garantie.
La bonne façon : restreindre techniquement la liste d’outils. Dans pi, un preset déclare exactement ce à quoi le modèle a accès :
{
"bulk": {
"tools": ["read", "write"]
}
}
Le modèle n’a physiquement pas bash, edit, grep. Il ne peut pas mal les appeler, puisqu’ils n’existent pas pour lui. La contrainte tient, quel que soit ce que le modèle « décide ».
La leçon dépasse le cas : quand un comportement compte vraiment — budget, sécurité, périmètre — applique-le, ne le demande pas. Le même principe vaut pour mes garde-fous rm -rf, qui bloquent la commande au lieu de faire confiance à l’agent pour ne pas la taper. Une limite qu’on espère respectée n’est pas une limite.
Pour aller plus loin