Агенты отлично справляются с узкими, конкретными задачами — например, написать функцию или короткий текст — но начинают буксовать на сложных многошаговых процесАгенты отлично справляются с узкими, конкретными задачами — например, написать функцию или короткий текст — но начинают буксовать на сложных многошаговых процес

Детерминированное поведение и стейт-машины для ваших агентов

2026/02/10 17:05
3м. чтение

Агенты отлично справляются с узкими, конкретными задачами — например, написать функцию или короткий текст — но начинают буксовать на сложных многошаговых процессах. Чем более абстрактна и «высокоуровнева» работа, тем больше ошибок они допускают: путают шаги, пропускают операции, неверно интеретируют инструкции. Такие ошибки накапливаются и усиливают друг друга, приводя к неожиданным результатам. Чем больше задача, которую вы отдаёте агенту, тем выше шанс, что он её провалит.

Помедитировав немного над этим, я пришёл к интересным эвристикам:

  • Большинство высокоуровневой работы более алгоритмично, чем кажется на первый взгляд.

  • Большинство низкоуровневой работы менее алгоритмично, чем кажется на первый взгляд.

Например, существует масса формализованных циклов проектирования (PDCA, OODA, DMAIC, 8D и etc.) — по сути, тривиальных мета-алгоритмов; однако каждый шаг этих алгоритмов — это куда более сложная и нетривиальная задача.

Значит, стоит стремиться давать агентам низкоуровневые задачи с небольшим, ясным контекстом, а высокоуровневые процессы описывать алгоритмически.

После нескольких месяцев экспериментов у меня получилось что-интересное — Donna — https://github.com/Tiendil/donna — утилита, которая делает ровно это.

Donna позволяет агентам выполнять сотни последовательных операций, не отклоняясь от заданного алгоритма работы. Ветвления, циклы, вложенные вызовы, рекурсия — всё возможно.

В отличие от других инструментов, Donna не шлёт агентам мета-инструкции (в виде чистого текста) в надежде, что они будут им следовать. Вместо этого она исполняет стейт-машины: хранит состояние и стек вызовов, управляет потоком исполнения.

В итоге агент выполняет только конкретные «приземлённые» команды, а Donna переключает состояния и отслеживает переходы между ними.

При этом Donna — не оркестратор; это просто утилита: её можно использовать где угодно, без API-ключей, паролей, etc.

Workflow (стейт-машина) в Donna — это Markdown-файл с дополнительными Jinja2 инструкциями. То есть его может написать и человек, и агент.

Поэтому агенты с помощью Donna могут создавать стейт-машины для самих себя и исполнять их. То есть заниматься самопрограммированием.

Например, вместе с Donna поставляется workflow, который:

  1. Выбирает наиболее подходящий workflow для создания документа Request for Change (RFC) и запускает его.

  2. На основе созданного RFC генерирует workflow для реализации изменений, описанных в RFC.

  3. Запускает получившийся workflow.

  4. Выбирает наиболее подходящий workflow для «полировки» кода и запускает его.

  5. Выбирает наиболее подходящий workflow для обновления CHANGELOG и запускает его.

Ниже — упрощённый пример workflow для полировки Python кода.

Схема:

no issues [ run_black ] ──▶ [ run_mypy ] ───────────▶ [ finish ] ▲ │ │ issues fixed │ └────────────────┘

Workflow:

# Polishing Workflow ```toml donna kind = "donna.lib.workflow" start_operation_id = "run_black" ``` Polish and refine the codebase. ## Run Black ```toml donna id = "run_black" kind = "donna.lib.request_action" ``` 1. Run `black .` to format the codebase. 2. `{{ goto("run_mypy") }}` ## Run Mypy ```toml donna id = "run_mypy" kind = "donna.lib.request_action" ``` 1. Run `mypy .` to check the codebase for type annotation issues. 2. If there are issues found that you can fix, fix them. 3. Ask the developer to fix any remaining issues manually. 4. If you made changes `{{ goto("run_black") }}`. 5. If no issues are found `{{ goto("finish") }}`. ## Finish ```toml donna id = "finish" kind = "donna.lib.finish" ``` Polishing is complete.

Более сложный вариант этого workflow можно найти в репозитории Donna.

Donna пока ещё очень молодая и в ней есть много экспериментальных фич — буду очень признателен за любые отзывы и идеи, чтобы сделать её лучше.

Спасибо за ваше время!

Источник

Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу service@support.mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.