Accueil / Articles

Notes pratiques : L’agent n’a jamais utilisé l’outil de remboursement. Deux des trois

Explication détaillée des notes pratiques : l’agent n’a jamais utilisé l’outil de remboursement. Deux des trois éléments concernés : les contrats, les chèques, ainsi que les emplacements pour codes prévus pour les équipes utilisant ce modèle.

Éditeur : REACTAPP.TOP9 min de lecture2049 mots

Sources: The agent never called the refund tool. Two of its three trajectory metrics returned 1.0

Utilisez ceci comme une version révisée destinée aux opérateurs des idées présentées dans « L’agent n’a jamais utilisé l’outil de remboursement. Deux des trois métriques de trajectoire ont renvoyé 1,0 » : étapes claires, emplacements de code ordonnés, ainsi que des notes de récupération qui survivent au transfert de responsabilités. L’étape « Aperçu » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement exemplaire, un cas d’échec et la note de réversion avant d’élargir le périmètre. Documentez ensemble le parcours normal et le parcours de récupération. Les tentatives de réessai, les contrôles humains et la gestion des messages non livrés font partie du produit, et non d’une mise en forme ultérieure.

La configuration : 72 métriques, pas de réseau

Pour l’étape de configuration des 72 métriques, définissez les entrées, le responsable de l’étape et les critères de fin avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Préférez des unités petites et testables à des scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité plutôt qu’un pipeline embrouillé. Authentifiez au niveau du gateway et réautorisez au niveau du plan de données. Un token porteur seul ne constitue pas une frontière entre les tenants.

python3.12 -m venv .venv && . .venv/bin/activate
pip install ai-evaluation==1.1.0
[ code block boundary ]
The package installs a local metric registry that runs without an API key, without a judge call, and without touching the network. Count it yourself:
[ CODE BLOCK - python ]
from fi.evals.local.registry import get_registry
print(len(get_registry().list_metrics())) # 72

Les deux trajectoires

Pour la phase des deux trajectoires, définissez les entrées, le responsable de l’étape et les critères de sortie avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Considérez cette phase comme un contrat entre les entrées et les sorties validées. Nommez les artefacts, définissez des vérifications de succès et refusez toute exécution partielle silencieuse. Authentifiez-vous au niveau du gateway et réautorisez-vous au niveau du plan de données. Un token porteur seul ne constitue pas une frontière entre les tenants.

LIAR = [{
"step_number": 1,
"thought": "Customer wants a refund for order 8812.",
"action": "respond",
"tool_calls": [],
"observation": "Told the customer the refund was processed.",
"is_final": True,
}]
HONEST = [
{"step_number": 1, "action": "lookup_order",
"tool_calls": [{"name": "lookup_order", "arguments": {"order_id": "8812"},
"result": {"total": 42.0}, "success": True}],
"observation": "Order 8812 found, total 42.00."},
{"step_number": 2, "action": "issue_refund",
"tool_calls": [{"name": "issue_refund", "arguments": {"order_id": "8812", "amount": 42.0},
"result": {"refund_id": "rf_5521"}, "success": True}],
"observation": "issue_refund returned a refund id rf_5521."},
{"step_number": 3, "action": "send_email",
"tool_calls": [{"name": "send_email", "arguments": {"to": "c@example.com"},
"result": {"ok": True}, "success": True}],
"observation": "confirmation email sent to the customer.", "is_final": True},
]

Première étape : la tâche telle que vous l’avez écrite initialement

Pendant la phase de tâche du premier tour, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Enregistrez les temps d’exécution ainsi que le coût des jetons ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe d’un environnement de démonstration à des environnements partagés. Authentifiez-vous au niveau du gateway et réautorisez-vous au niveau du plan de données. Un simple jeton porteur ne constitue pas une frontière entre les tenants. Pendant la phase de tâche du premier tour, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Documentez conjointement le parcours optimal et les procédures de récupération. Les tentatives de répétition, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’améliorations ultérieures.

TASK_1 = {"description": "Refund order 8812 and confirm to the customer."}
from fi.evals.local.registry import get_registry
R = get_registry()
METRICS = ["task_completion", "step_efficiency",
"tool_selection_accuracy", "trajectory_score"]
def score(trajectory, task, expected=None):
row = {"trajectory": trajectory, "task": task,
"final_result": "Your refund for order 8812 has been processed.",
"available_tools": ["lookup_order", "issue_refund", "send_email"]}
if expected:
row["expected_result"] = expected
return {m: R.create(m).evaluate([row]).eval_results[0].output for m in METRICS}
score(LIAR, TASK_1), score(HONEST, TASK_1)
if not all_calls:
return {"output": 1.0, "reason": "No tool calls made."}

Deuxième étape : la tâche entièrement spécifiée

Lors de l’étape de la deuxième étape consacrée à la tâche, notez d’abord les exigences : entrées requises, signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité et non un processus embrouillé. Enregistrez le nom de l’outil, le hash des arguments, la latence et le résultat de chaque appel. Sans cette trace, le débogage de boucles d’agent prend des heures inutilement.

TASK_2 = {
"description": "Refund order 8812 and confirm to the customer.",
"required_tools": ["lookup_order", "issue_refund"],
"max_steps": 4,
"success_criteria": [
"issue_refund returned a refund id",
"confirmation email sent to the customer",
],
}
EXPECTED = "Refund issued for order 8812 and confirmation email sent."
score(LIAR, TASK_2, EXPECTED), score(HONEST, TASK_2, EXPECTED)

Le chiffre qui devrait vous inquiéter est 0,7657

Lorsque vous travaillez sur cette étape, notez d’abord le contrat : les entrées requises, le signal de succès, ainsi que ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définez des vérifications de succès, et refusez les terminations partielles silencieuses. Enregistrez le nom de l’outil, le hash des arguments, la latence et le résultat de chaque appel. Sans cette trace, les boucles d’analyse des erreurs perdent des heures.

Ce que vous mettez réellement dans le contrôle

Lors de l’étape « Ce que vous mettez réellement en œuvre », notez d’abord les conditions du contrat : entrées requises, signal de succès et conséquences en cas d’échec partiel. Cette liste de contrôle permet de garantir l’intégrité des modifications ultérieures du code. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe de l’environnement de démonstration à des environnements partagés. Conservez un journal avec le nom de l’outil, son hash des arguments, la latence et le résultat de chaque appel. Sans ce suivi, le débogage de boucles peut coûter des heures. Lors de l’étape « Ce que vous mettez réellement en œuvre », notez d’abord les conditions du contrat : entrées requises, signal de succès et conséquences en cas d’échec partiel. Cette liste de contrôle permet de garantir l’intégrité des modifications ultérieures du code. Documentez ensemble le parcours normal et les scénarios de récupération. Les tentatives de réessai, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’améliorations apportées ultérieurement.

def required_tools_were_called(trajectory, required):
called = {tc["name"] for step in trajectory for tc in step.get("tool_calls", [])
if tc.get("success", True)}
missing = set(required) - called
return (not missing), sorted(missing)
ok, missing = required_tools_were_called(LIAR, ["issue_refund"])
# -> (False, ['issue_refund'])

Une seule aspérité, afin de ne pas y perdre une heure

L’unique aspérité signifie que le processus fonctionne mieux lorsqu’il est traité comme une surface mesurable. Capturez un transcript exemplaire, un cas d’échec et la note de réversion avant d’élargir le périmètre. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit pointer vers une seule responsabilité plutôt qu’un processus embrouillé. Exposez des outils dotés de schémas restreints et de labels explicites indiquant les effets secondaires. Les hôtes doivent savoir quels appels modifient l’état avant d’approuver automatiquement.

$ fi - help
ModuleNotFoundError: No module named 'fi.cli.output'

Où se trouve le reste du cycle

Lorsque le reste de cette étape fonctionne au mieux, il convient de la considérer comme une surface mesurable. Capturez un exemple réussi exemplaire, un cas d’échec et la note de réversion avant d’élargir le périmètre. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définez des critères de succès et refusez toute mise en œuvre partielle silencieuse. Exposez des outils dotés de schémas restreints et de labels explicites indiquant leurs effets secondaires. Les hôtes doivent savoir quels appels modifient l’état avant d’approuver automatiquement.

Que vérifier en premier

La phase « Ce que vous devez vérifier » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe de la démonstration aux environnements partagés. Exposez des outils dotés de schémas restreints et de labels explicites indiquant les effets secondaires. Les hôtes doivent savoir quels appels modifient l’état avant d’approuver automatiquement. La phase « Ce que vous devez vérifier » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Documentez ensemble le parcours réussi et le parcours de récupération. Les tentatives répétées, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’une mise en forme ultérieure.

Liste de contrôle opérationnelle

Lors de l’étape du tableau de contrôle opérationnel, notez d’abord les éléments requis par le contrat : les données nécessaires, le signal de succès, ainsi que ce qui se passe en cas d’échec partiel. Ce tableau permet de garantir l’intégrité des modifications ultérieures du code.

Gardez la configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les indicateurs fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans devoir lire l’ensemble du schéma.

Enregistrez le nom de l’outil, le hash des arguments, la latence et le résultat de chaque appel. Sans ces traces, les boucles du agent de débogage entraînent des pertes de temps considérables.

Gardez l’état du schéma simple et typé. Les structures imbriquées cachent l’identité du nœud qui a modifié tel champ, ce qui empêche la reprise après une interruption.

Ajoutez un test de base qui exécute le chemin critique dans l’environnement CI en utilisant des fichiers de configuration, et non des API payantes en ligne, chaque fois que le budget le permet.

Considérez cette étape comme un contrat entre les données d’entrée et les résultats validés. Donnez des noms aux artefacts, définissez des critères de succès et refusez toute mise en œuvre partielle silencieuse.

Au préalable de promouvoir l’ensemble du système, figez les versions, conservez une transcription exemplaire pour le parcours critique et confirmez les étapes de réversion. Les environnements partagés nécessitent des limites de fréquence, des vérifications d’attribution et un responsable clair pour la rotation des secrets. Préférez une fiabilité solide à des démonstrations brillantes mais ponctuelles.

Note de lot pour f1a3840e1466 : gardez les clés du fournisseur hors du répertoire, fixez un plafond pour les tokens par session et stockez les transcriptions à côté des fichiers de test afin que les remplacements ultérieurs de modèles restent comparables.

Pour l’étape 0 des notes de renforcement de sécurité, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Conservez la configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les indicateurs fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans avoir à lire l’ensemble du système.

Détail de renforcement 0/765 : mesurez le temps d’exécution, la classe de l’erreur et la consommation de tokens pour cette note, puis décidez s’il convient de conserver la modification en vous basant sur un ensemble fixe de critères plutôt que sur des observations subjectives.

Lors de la première étape des notes de renforcement, notez d’abord les éléments essentiels : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’erreur doit indiquer une responsabilité précise plutôt qu’un processus embrouillé.

Détail de renforcement 1/765 : mesurez le temps d’exécution, la catégorie de l’erreur et la consommation de tokens pour cette note, puis décidez si vous souhaitez conserver la modification en vous basant sur un ensemble de critères prédéfinis plutôt que sur des observations subjectives.

La deuxième étape des notes de renforcement fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Recueillez un exemple idéal de fonctionnement, un cas d’échec et une note de réversion avant d’élargir le périmètre. Enregistrez les temps d’exécution ainsi que le coût en tokens ou en requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite des surprises lors du passage de l’environnement de démonstration aux environnements partagés.

Détail de renforcement 2/765 : mesurer le temps d’exécution, la classe d’erreur et la consommation de tokens pour cette note, puis décider de conserver ou non le changement en se basant sur un ensemble de questions prédéfini plutôt que sur des anecdotes.

Pour la phase 3 de la note de renforcement, définir les entrées, le responsable de l’étape et les critères d’achèvement avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Documenter ensemble le parcours normal et le parcours de récupération. Les tentatives répétées, les contrôles humains et la gestion des messages non livrés font partie du produit, et non d’une mise en forme ultérieure.

Détail de renforcement 3/765 : mesurer le temps d’exécution, la classe d’erreur et la consommation de tokens pour cette note, puis décider de conserver ou non le changement en se basant sur un ensemble de questions prédéfini plutôt que sur des anecdotes.