AI / LLM
Агенты: собрать ограниченного, наблюдаемого агента
Читать про трейс на $12 — не то же самое, что не дать ему случиться. Соберите небольшого ReAct-агента над парой инструментов, намеренно загоните его в режимы отказа из юнита — runaway-цикл, thrash на идентичном вызове, переполнение контекста — и докажите, что ваши guardrails ловят каждый, пока вы всё же решаете задачу.
Превратить ментальную модель юнита в воспроизводимый инженерный цикл: собрать агента, инструментировать цикл так, чтобы его стоимость и поведение были наблюдаемы, добавить независимые выходы termination и input/output guardrails, затем оценить успешность задачи и доказать, что защиты держат под состязательным вводом.
Собрать ReAct-агента над 2–3 реальными инструментами, который выполняет многошаговую задачу, полностью наблюдаем на каждой итерации цикла и не может выйти из-под контроля: он всегда завершается в пределах жёсткого бюджета по шагам, wall-clock и токенам, никогда не молотит идентичный вызов и никогда молча не роняет собственные инструкции — что доказано трейсами и eval успешности задачи.
- Трейс цикла для одного нормального и одного состязательного прогона, каждый показывает токены на итерацию (виден накопленный рост) и точную причину сработавшего выхода.
- Сравнение до/после: тот же агент БЕЗ защит (или со снятым лимитом) на состязательном вводе уходит в runaway или thrash; С защитами он завершается ограниченно в пределах бюджета по шагам/wall-clock/токенам.
- Таблица eval: доля решений по 8–12 задачам плюс средние шаги, средние токены и средняя стоимость на задачу — измеренные, а не оценённые на глаз.
- Доказательство, что защита контекста работает: долгий прогон, остающийся под окном с системными/задачными сообщениями, всё ещё присутствующими на финальном шаге (без молчаливой обрезки инструкций).
- Абзац-разбор: какой выход защищает какой режим отказа, почему одного лимита шагов мало и одна задача, где скрипт бьёт агента.
- Добавьте динамический лимит шагов/ходов, подстраивающийся под оценочную сложность задачи вместо фиксированного, и измерьте компромисс стоимость/доля решений против фиксированного лимита.
- Добавьте on-call runbook: как читать трейс цикла, сигнатуры runaway / thrash / overflow и какую защиту проверить или ужесточить для каждой.
- Добавьте тест guardrail против prompt-injection: подайте результат инструмента, который пытается переопределить системные инструкции, и покажите, что агент его игнорирует; залогируйте попытку.
- Реализуйте шаг памяти «суммаризировать середину» и сравните успешность задачи и стоимость против наивной обрезки на тех же долгих задачах.
Это цикл, который вы прогоняете на каждом реальном агенте: соберите голый движок ReAct, сделайте каждую итерацию наблюдаемой, чтобы квадратичный рост был виден, затем добавьте независимые выходы — естественный stop, лимит шагов, бюджет wall-clock/токенов, dedup — чтобы ни одна отсутствующая дверь не стала runaway. Закрепите инструкции и обрезайте середину, чтобы агент не забывал задачу; защищайте ввод инструментов и относитесь к их выводу как к недоверенным данным; и оценивайте успешность задачи средними шагами, токенами и стоимостью, чтобы «работает» было числом, а не ощущением. Сделав это однажды на игрушечном агенте, вы доводите продакшен-версию до мышечной памяти.