Anthropic сделали большое дело — опубликовали статью о том, как им удалось добиться лучшего результата в бенчмарке AI-агентов-программистов SWE-bench (см. Verified). Почему дело большое? Потому, что SWE-bench — это поле битвы автономных AI-агентов-программистов, в котором разные компании пытаются зарезловить как можно больше Issues из определенного списка OpenSource проектов. Так вот, Anthropic с их Claude 3.5 Sonnet v2 действительно удалось добиться выдающегося результата, сместив всех предыдущих "Senior AI-инженеров" с пьедестала.
А про SWE-bench недавно был хороший пост в канале Сиолошная (последняя новость в посте). Вот, кстати, емкое определение оттуда же, оно мне понравилось:
SWE-bench — Это бенчмарк оценки способностей LLM по внесению изменений, описанных текстом, в кодовую базу большого существующего проекта (одни из самых популярных Python-фреймворков, например, Django).
В каждом задании бенчмарка ИИ предоставляется настроенная среда Python и копия репозитория в состоянии перед тем, как ошибка была устранена. Модель должна проанализировать, изменить и протестировать код, а затем предложить своё решение.
Для тех, кто хочет глубже, вот подробное описание SWE-bench Verified.
Как это работает
Высокоуровнево, они это сделали через Tool Use (function calling) — это когда разработчик описывает для нейросети список доступных функций и просит ее, когда это уместно, вызывать одну (или несколько) из описанных функций. Например, можно объявить функцию получения текущей даты и времени и когда пользователь спросит текущее время у LLM, она "вызовет" функцию и ответит ему правильно.
Ребята реализовали две функции:
1. Bash Tool для запуска bash комманд.
2. Edit Tool для просмотра, создания и редакирования файлов. А Edit Tool, в свою очередь, состоит из 5-х команд: view, create, str_replace, insert, undo_edit.
Отдельный интерес представляют промпты (в т. ч. описание тулинга) — только посмотрите на сколько они подробные.
В главном промпте хочу обратить внимание на предложение к LLM сначала воспроизвести баг локально (изолированно) и только после этого решать проблему.
Челленджы такого подхода в статье описаны отдельно. Пример так же есть в статье.
Эти 2 функции LLM выполняет последовательно в том порядке и с теми аргументами, которые считает нужными, а результат выполнения передается обратно в LLM и, таким образом, итеративно накапливается довольно большой контекст, состоящий из messages к LLM (для Claude 3.5 контекст все еще ограничен 200к токенами). Если задача решена, либо модель вышла за пределы контекста, цикл останавливается.
Что нам с этого?
В принципе, такой подход можно применить и для решения рабочих задач — взять какой-нибудь баг или даже небольшую фичу из таск трекера и делегировать реализацию описанному агенту. Кстати, вместо Sonnet 3.5 v2 можно использовать и другую LLM, поддерживающую function calling.
Ну что, будем ждать новый еще более мощный тулинг (а-ля aider), реализованный по статье. Еще, опять же, в кач-ве пет проекта можно повторить описанный подход и самостоятельно.
—
Пробелов.NET. Спасибо, что читаете :)