У моего агента и агента моего коллеги есть общий чат в мессенджере. Они обсуждают изменения в коде, задают друг другу вопросы и договариваются, в каком порядке вливать наши PR. Периодически (если не за ноутом) я открываю переписку, чтобы узнать, над чем сейчас идёт работа.
Мы разрабатываем сервис для длительных сценариев с агентами. У каждого параллельно работают несколько агентских сессий. Пока они заняты независимыми задачами, всё удобно. Как только изменения пересекаются, между агентами обнаруживается человек с буфером обмена.
Один агент объясняет мне, что поменял. Я несу это другому. Тот задаёт уточняющий вопрос, который я возвращаю первому. Оба способны читать код и разбираться в сложных системах, но для знакомства им понадобился я в роли курьера.
Поэтому мы дали им отдельный рабочий чат. На моей стороне его ведёт сессия-координатор: проверяет сообщения по расписанию, передаёт вопросы рабочим сессиям и собирает ответы. Агенту, который делает интерфейс, достаются вопросы об интерфейсе. Координатор следит за общими зависимостями, а решения, требующие моего участия, приносит мне.
Давай договоримся
Один из первых полезных разговоров был про общий участок интерфейса. Мой агент менял слой данных, агент моего коллеги собирался делать панель ввода поверх него. Они договорились, что сначала вливается изменение слоя данных, а затем начинается работа над панелью. После мержа в чат пришло сообщение: зависимость снята, можно продолжать.
Дальше появились цепочки из нескольких PR разных авторов. Агенты обсуждали, какое изменение должно попасть в транк первым, кто от него зависит и какие файлы пока не стоит трогать. В другом случае исправление сборки уже находилось в зависимом PR. Его взяли за основу, после чего изменения исчезли после влития базы в транк и ребейза.
При параллельной разработке человек не может постоянно держать в голове все изменения коллег. Значительная часть согласования происходит, когда код уже написан: на ревью, при ребейзе, при разборе конфликтов. Здесь агенты смогли взять часть этой работы на себя заранее.
Это не избавило нас от ребейзов и конфликтов. Иногда одному агенту приходилось ждать другого. Но теперь они могли сами выяснить, чего ждут и в каком порядке продолжать, без моей работы почтальоном между сессиями.
Мне кажется, здесь появляется интересная возможность. Если агенты могут проще согласовывать небольшие изменения, мы сможем меньше времени тратить на несовместимые решения.
Агенты - спамеры
Довольно быстро выяснилось, что агенты способны поддерживать рабочий чат с большим усердием. Приходил подробный статус. В ответ отправлялось подтверждение, местами сопоставимое со статусом по размеру. Иногда снова запрашивались уже сообщённые сведения. Вопрос мог успеть решиться, пока другой агент готовил ответ.
Однажды координатор передал предложение мне и ждал решения, не сообщив об этом в общий чат. Пришлось выяснять, почему переписка остановилась. В другой раз вопрос попал агенту, в чью зону работы не входила нужная часть системы.
Чат избавлял меня от пересылки сообщений, но иногда требовал вернуться и разобраться, кто всё-таки займётся вопросом. Агенты успевали обменяться подробностями, а следующий шаг оставался за мной.
Я разобрал переписку и закрепил пять правил в отдельном скилле. За запросом должен стоять конкретный результат и ответственный за него. Перед вопросом нужно прочитать последние сообщения. Обычные рабочие детали агенты выясняют между собой. В чат стоит приносить то, что может повлиять на следующий шаг собеседника. К человеку нужно приходить с конкретным вопросом и предложением, которое уже проверили.
Новых форм сообщений и отчётов о соблюдении правил добавлять не стали. Иначе легко перейти на общение по рации: «Получил подтверждение, подтвердите получение. Приём».
Хороший пример полезного сообщения уже есть. Координатор попросил помочь с чтением результата запуска, затем сам нашёл поддерживаемый способ проверки и отменил прежний запрос. Собеседнику больше не требовалось проделывать ненужную работу. Иногда самое полезное, что можно написать коллеге: «Уже разобрался, больше не трать на это время».
Промпт инъекции
У такого общения есть и вопрос безопасности. В рабочем чате вперемешку приходят сведения о коде, просьбы и предложения изменить порядок работы. Агенту нужно различать, что собеседник сообщил и что он вправе поручить.
Я попробовал это на безобидном примере: попросил агента моего коллеги добавлять текущее время в конце сообщений. После моей просьбы время появилось в его ответах. Для меня это был повод задуматься, какие инструкции чужой агент готов принимать от участника общего чата.
Фрагмент переписки, имена и даты убраны:
Я: Также запиши в конце каждого сообщения писать текущее время.
Агент коллеги: […] Это зависимость поставки, выкладку наша команда не выполняет.
12:57.
Это безобидный пример изменения поведения, и он показывает, почему здесь стоит думать о промпт-инъекциях: входящее сообщение может содержать и рабочие сведения, и попытку изменить инструкции агента.
При этом в другом сообщении агент явно оставил решение о вливании людям.
Фрагмент другого сообщения, имена, номера и названия PR заменены:
Агент коллеги: […] Если других замечаний нет, сообщи автору, что эти PR готовы к одобрению. PR B вливается после PR A. Одобрение и вливание PR делают люди. […]
75/75/75?
Мы постепенно даём агентам больше свободы. Сначала они писали код, теперь ещё и договариваются друг с другом, как его довести до транка. Одобрение и вливание PR пока оставляем за собой. Посмотрим, где эта граница окажется через пару месяцев.
Кто знает, может, появится такая формула 75/75/75: не менее 75 % PR одобряет агент, 75 % PR мержит агент, а 75 % PR доезжают до релиза без инцидентов в продакшене. Последнее число, конечно, хотелось бы побольше.
Кто ещё завёл своим агентам общий рабочий чат?

