Головна / Статті

Практичні зауваження: агент ніколи не використовував інструмент для повернення грошей. Два з трьох

Покроковий опис з практичних нотаток: агент ніколи не використовував інструмент для повернення грошей. Два з трьох елементів: контракти, чеки та положення для коду для команд, які використовують цю схему.

Видавець: REACTAPP.TOP9 хв читання2049 слів

Джерела: The agent never called the refund tool. Two of its three trajectory metrics returned 1.0

Використовуйте це як оновлену версію ідей з тексту „Агент ніколи не викликав інструмент для повернення коштів. Два з трьох показників траєкторії повернули значення 1.0“ для співробітників операторів: чіткі етапи, впорядковані блоки коду та примітки щодо відновлення, які залишаються при передачі обов’язків. Етап Огляду найкраще функціонує, якщо його розглядати як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітки щодо скасування змін перед розширенням обсягу роботи. Документуйте як успішний, так і невдалий сценарії роботи разом. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації.

Налаштування: 72 показники, без мережі

Для етапу налаштування 72 метрик необхідно визначити вхідні дані, відповідальну особу за крок та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись визначити прихований стан. Краще використовувати невеликі, перевірювані одиниці коду замість об’ємних скриптів. Коли крок зазнає невдачі, причина має вказувати на конкретну відповідальність, а не на заплутану структуру обробки даних. Аутентифікуйтеся біля шлюзу та повторно авторизуйтесь на рівні обробки даних. Один лише токен-носій не є межею окремого тенантства.

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

Дві траєкторії

На етапі двох траєкторій необхідно визначити вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не здогадуючись про прихований стан. Розглядайте цей етап як контракт між вхідними даними та перевіреними результатами. Позначте елементи проекту, визначте критерії успіху та не допускайте беззвучного часткового завершення. Аутентифікуйтеся біля шлюзу та повторно авторизуйтесь на рівні обробки даних. Один лише токен-носій не є межею тенантства.

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},
]

Перший етап: завдання у тому вигляді, як ви його спочатку написали

На етапі завдання першого раунду необхідно визначити вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись вгадати прихований стан. Записуйте час виконання та витрати на токени чи запити поруч із функціональними результатами. Візуалізація витрат заздалегідь запобігає несподіваним рахункам під час переходу з демо-середовища у спільні середовища. Аутентифікуйтеся біля шлюзу та повторно авторизуйтесь на рівні обробки даних. Один лише токен-носій не є межею окремого тенанту. На етапі завдання першого раунду необхідно визначити вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись вгадати прихований стан. Документуйте як успішний, так і відновлювальний сценарії роботи разом. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації.

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."}

Другий етап: завдання повністю сформульоване

Під час роботи над другим етапом, фазою завдання, спочатку запишіть умови виконання: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Віддавайте перевагу невеликим, тестованим одиницям коду перед об’ємними скриптами. Якщо якийсь крок зазнає невдачі, причина має вказувати на конкретну відповідальність, а не на складну послідовність операцій. Фіксуйте назву інструменту, хеш аргументів, час виконання та результат кожного виклику. Без цих даних відлагодження може займати години.

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)

Число, яке має вас турбувати, — це 0.7657

Під час роботи над етапом, який має відбутися, спочатку запишіть умови контракту: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Розглядайте цей етап як контракт між вхідними даними та перевіреними результатами. Придумайте назви елементів, визначте критерії успіху та не допускайте беззвучного часткового виконання. Фіксуйте назву інструменту, хеш аргументів, час виконання та результат кожного виклику. Без цих записів дебагування займає години.

Що ви насправді вводите у систему

Під час роботи над етапом «Що ви насправді вводите», спочатку запишіть умови використання: необхідні дані вхіду, сигнал про успіх та те, що відбувається у разі часткової невдачі. Цей перелік допомагає зберігати чесність пізніших змін у коді. Запишіть час виконання та витрати на токени або запити поруч із результатами функціонування. Відображення витрат заздалегідь запобігає несподіваним рахункам, коли процес переходить від демо-версії до спільних середовищ. Записуйте назву інструменту, хеш аргументів, час відгуку та результат кожного виклику. Без цих записів дебагування може займати години. Під час роботи над етапом «Що ви насправді вводите», спочатку запишіть умови використання: необхідні дані вхіду, сигнал про успіх та те, що відбувається у разі часткової невдачі. Цей перелік допомагає зберігати чесність пізніших змін у коді. Одночасно задокументуйте оптимальний та альтернативний шляхи виконання. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації.

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'])

Одна нерівність, щоб не втрачати на це годину

Одна нерівність робить процес ефективнішим, якщо його розглядати як вимірювану поверхню. Запишіть один ідеальний результат, один випадок збою та примітку про скасування дій перед розширенням обсягу роботи. Віддавайте перевагу невеликим, тестованим одиницям перед складними скриптами. Коли якийсь крок зазнає невдачі, причина має вказувати на конкретну відповідальність, а не на заплутану послідовність дій. Використовуйте інструменти з вузькими схемами та чіткими позначеннями побічних ефектів. Хостам потрібно знати, які виклики змінюють стан, перш ніж вони автоматично схвалять їх.

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

Де знаходиться решта циклу

Найкраще розглядати цю стадію як вимірювану поверхню для подальшої роботи. Запишіть один ідеальний результат, один випадок невдачі та примітку про скасування змін перед розширенням обсягу роботи. Розглядайте цю стадію як контракт між вхідними даними та перевіреними результатами. Позначте всі елементи, визначте критерії успіху та не допускайте мовчазного часткового виконання завдань. Використовуйте інструменти з вузькими схемами та чіткими позначеннями побічних ефектів. Адміністраторам потрібно знати, які виклики змінюють стан системи, перш ніж вони автоматично схвалять їх.

Що потрібно перевірити спочатку

Етап «Що потрібно перевірити» функціонує найкраще, якщо його розглядати як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітку про скасування змін перед розширенням обсягу роботи. Записуйте час виконання та витрати на токени чи запити поруч із функціональними результатами. Візуалізація витрат заздалегідь запобігає несподіваним рахункам, коли процес переходить від демо-середовища до спільних. Використовуйте інструменти з вузькими схемами та чіткими позначеннями побічних ефектів. Хостам потрібно знати, які виклики змінюють стан, перш ніж вони автоматично схвалюють їх. Етап «Що потрібно перевірити» функціонує найкраще, якщо його розглядати як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітку про скасування змін перед розширенням обсягу роботи. Документуйте як успішний, так і відновлювальний сценарії роботи разом. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації.

Чек-лист операцій

Під час роботи над етапом перевірки операційних процедур спочатку запишіть умови контракту: необхідні вхідні дані, сигнал про успішне виконання та наслідки часткової несправності. Такий перелік допомагає зберігати чесність подальших змін у коді.

Зберігайте конфігурацію окремо від коду додатку. Файли середовища, сховища конфіденційних даних та флаги функцій мають знаходитися в одному місці, яке оператори можуть перевіряти, не читаючи весь код.

Фіксуйте назву інструменту, хеш аргументів, час відгуку та результат кожного виклику. Без цих записів процес дебаггінгу займає години.

Зберігайте стан схеми у вигляді простих структур із чіткими типами даних. Вкладені структури приховують інформацію про те, який вузол заповнив яке поле, що ускладнює продовження роботи після перерв.

Коли дозволяє бюджет, додавайте тест на базову функціональність, який перевіряє критичний шлях у процесі CI за допомогою фікстур, а не реальних платних API.

Розглядайте цей етап як контракт між вхідними даними та перевіреними результатами. Назвіть створювані елементи, визначте критерії успіху та не допускайте мовчазного часткового виконання.

Перш ніж переходити до наступного етапу, заморозьте версії, зафіксуйте ідеальний запис для критичного шляху та підтвердьте кроки для скасування змін. У спільних середовищах необхідні обмеження на частоту використання, перевірки прав доступу та чіткий власник для зміни секретів. Віддавайте перевагу надійності перед креативними одноразовими демонстраціями.

Примітка для пакету f1a3840e1466: не включайте ключі постачальника до репозиторію, встановіть ліміт токенів на сеанс та зберігайте записи поруч із фіксами для оцінки, щоб подальша заміна моделей залишалася порівнянною.

Для етапу 0 заходів з посилення безпеки необхідно визначити вхідні дані, відповідальну особу за крок та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не здогадуючись про прихований стан. Конфігурацію слід зберігати окремо від коду додатку. Файли середовища, сховища конфіденційних даних та флаги функцій мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь код.

Деталь посилення безпеки 0/765: вимірюйте час виконання, клас помилки та кількість витрачених токенів для цього етапу, а потім вирішуйте, чи залишити зміни, ґрунтуючись на фіксованому наборі питань, а не на індивідуальних спостереженнях.

Під час виконання першого етапу додаткових заходів зпрочнення спочатку запишіть умови контракту: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Віддавайте перевагу невеликим, тестованим одиницям коду перед об’ємними скриптами. Коли якийсь крок зазнає невдачі, причина має вказувати на конкретну відповідальність, а не на складну послідовність операцій.

Деталь зпрочнення 1/765: виміряйте час виконання, клас помилки та кількість витрачених токенів для цього етапу, а потім вирішіть, чи залишити зміни, ґрунтуючись на певному наборі критеріїв, а не на індивідуальних спостереженнях.

Другий етап додаткових заходів зпрочнення найкраще працює, якщо його розглядати як вимірювану поверхню. Збережіть один ідеальний зразок виконання, один випадок невдачі та запис про скасування змін перед розширенням обсягу роботи. Записуйте час виконання та витрати на токени чи запити поруч із функціональними результатами. Чітке бачення витрат заздалегідь запобігає несподіваним витратам під час переходу з демо-середовища до спільних середовищ.

Деталь посилення безпеки 2/765: виміряйте час виконання, клас помилки та кількість витрачених токенів для цього запису, а потім вирішіть, чи залишити зміни, ґрунтуючись на фіксованому наборі питань, а не на окремих випадках.

Для 3-го етапу запису про посилення безпеки визначте вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не здогадуючись про прихований стан. Документуйте як успішний, так і відновлювальний сценарії. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації.

Деталь посилення безпеки 3/765: виміряйте час виконання, клас помилки та кількість витрачених токенів для цього запису, а потім вирішіть, чи залишити зміни, ґрунтуючись на фіксованому наборі питань, а не на окремих випадках.