Обновить

Комментарии 6

Очень очень абстрактно... можно какой-нибудь красивый пример, который бы показал, вот классический подход (алгоритм задается текстом) дает вот такой косяк, а вот 'мой подход' в такой задаче работает стабильно?!

Хм, похоже я перестарался с редактированием поста и удалил пару релевантных абзацев.

Упрошённый пример.

Допустим мы сделали правки в своём коде и хотим, чтобы агент поправил наши мелкие косяки: синхронизировал типы, починил тесты и так далее.

Для этого ему надо итерационно запускать тесты, линтеры, форматтеры и так далее (и править проблемы), пока все ошибки не будут исправлены.

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

Можно сделать один скрипт, который прогоняет все утилиты и сказать агенту запускать его по кругу. Это в целом работает, на мой взгляд, довольно неопрятно и создаёт трудности. Например, для такого скрипта нуно будет рядом держать большую спеку о том как реагировать на разные типы ошибок.

А можно сделать стейт машину, которая управляет последовательностью запуска утилит (как в посте, но больше шагов) и знает как реагировать на каждую ошибку.

Например:

  • агент запускает workflow, вызывая что-то в духе donna sessions run project:work:polish

  • Donna начинает интерпретировать FSM

  • Первой оперцией идёт запуск, допустим, mypy и Donna это и делает (нет взаимодействия с агентом).

  • Если mypy отработал без ошибок, то FSM переходит к шагу с запуском следующей утилиты.

  • Если mypy отработал с ошибками, то FSM переходит к шагу, который отвечает за обработку ошибок mypy. На этом шаге Donna отображает сообщение агенту с описанием конкретной ошибки и правилами её исправления (специфичными для mypy).

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

  • Когда агент решает, что исправил ошибку, он говорит Donna продолжать, и та переключает FSM на следующий шаг (например, на форматирование кода).

Вот пример большого workflow для полировки кода: https://github.com/Tiendil/donna/blob/main/.donna/project/work/polish.md

И вот как выглядит шаблон сообщения для агента от конкретного шага FSM (исправление ошибок от flake8):

{{ donna.lib.task_variable("flake8_output") }}

1. Fix the flake8 issues based on the output above.
2. Ensure your changes are saved.
3. {{ donna.lib.goto("run_autoflake_script") }}

Instructions on fixing special cases:

- E800 Found commented out code — remove the commented out code.
- CCR001 Cognitive complexity is too high — ignore by adding # noqa: CCR001 at the end of the line.
- F821 undefined name when there are missing imports — add the necessary import statements at the top of the file.
- F821 undefined name in all other cases — ask the developer to fix it manually.

То есть вместо больших инструкций агент всегда имеет короткие и чёткие шагии (в данном случае 3 шага).

можно сделать стейт машину

кто создает этот алгоритм? разработчик хардкодит в агенте? или агент формирует детерменированный алгоритм (вместо human readable план) и запускает его на выполнение?

Стейт-машина описывается читаемым текстом в Markdown формате.

Поэтому создать её может и человек и агент. Можно и совместно — попросить агента сгенерировать workflow, а потом его отревьювить.

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

В целом, предполагаемую стратегию использования Donna я вижу так:

  • Постоянные workflow делаются человеком с помощью агента.

  • Workflow для выполнения разовой задачи генерируются агентом (при выполнении workflow из предыдущего пункта, например) и выполняются без участия человека. Полная автоматизация может потребовать некоторой работы (создать спеки по проекту, создать правильные meta-workflow, etc.).

Изменения в саму утилиту, например, мой агент сейчас вносит в основном самостоятельно: создаёт workflow и исполняет его.

К openclaw легко прикручивается?

Должна прикручиваться настолько же легко, как любая другая CLI утилита.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации