Log in to leave a comment
No posts yet
Такие инструменты, как Cursor или Devin, удобны. Однако трудно понять, что именно происходит внутри, и иногда они «шинкуют» код совсем не так, как хотелось бы. Для бэкенд-разработчика создание собственного оптимизированного агента путем сочетания стандартной библиотеки Python и API больших языковых моделей (LLM) — гораздо более экономичный и надежный путь.
Чтобы агент вышел за рамки простого написания кода и мог напрямую выполнять терминальные команды, необходимо грамотно работать с модулем subprocess. Бездумное использование опции shell=True подвергает систему риску командных инъекций, а процессы могут превращаться в «зомби», не завершаясь при таймаутах.
При самостоятельной реализации устанавливайте shell=False при вызове subprocess.run() и передавайте команды в виде списка. Устанавливайте короткий таймаут (около 30 секунд), а при возникновении исключения TimeoutExpired немедленно вызывайте process.kill() для освобождения ресурсов. Передавая результаты выполнения модели, не обязательно отправлять весь вывод. Если текст превышает 1000 символов, обрежьте его, оставив, например, последние 20 строк. Это экономит токены, предоставляя при этом достаточно информации для понимания причины ошибки.
Чем длиннее диалог, тем больше данных накапливается в контекстном окне, что оборачивается огромными счетами. Согласно анонсу Anthropic, использование маркеров cache_control в моделях Claude 3.5 позволяет сэкономить до 90% стоимости чтения кэшированных данных. Это обходится примерно в 0,30 доллара за 1 миллион токенов.
Чтобы снизить расходы, строго разделяйте системные сообщения и ввод пользователя. Неизменяемую информацию, такую как структура дерева файлов проекта, фиксируйте в верхней части системного промпта и устанавливайте там точку кэширования. Когда история диалога разрастается, полезно использовать метод иерархического суммаризирования: подсчитывайте объем с помощью tiktoken и обобщайте старые сообщения отдельным вызовом LLM. Применяя скользящее окно (sliding window), где сохраняется только суммаризированный контекст и последние сообщения, можно сократить расходы более чем на 40% даже в длительных сессиях разработки, сохраняя при этом точность рассуждений модели.
Заставлять агента заново выводить весь файл целиком — неэффективно и медленно. Чем больше выходных токенов, тем выше вероятность того, что модель пропустит часть кода или начнет «галлюцинировать». Метод, называемый «трюком редактирования» (Edit Trick), побуждает модель находить и заменять только нужные фрагменты текста вместе с их окружением (Anchor). Эта техника позволяет сократить объем выходных токенов на реальных данных до 86%.
Реализуйте функционал применения изменений к локальным файлам, используя re.sub() в Python для обработки специфических XML-тегов или регулярных выражений, переданных моделью. Также вместо того, чтобы впихивать всю техническую документацию в промпт, подключите легковесную векторную БД (например, LanceDB), чтобы извлекать только необходимые фрагменты документов. Такая архитектура ускоряет процесс правки файлов более чем на 79% и решает хроническую проблему путаницы модели при работе с крупными файлами.
Нужно прекратить вручную копировать сообщения об ошибках и вставлять их в чат с моделью. Заставьте агента сначала писать тесты на базе pytest, прежде чем он приступит к основному коду.
Создайте цикл обратной связи, в котором полный текст Traceback, возникающий при провале теста, без правок отправляется обратно модели для самоисправления. При этом для опасных команд, таких как rm или deploy, обязательно вставьте «гардрайл» в виде функции input(), требующей подтверждения пользователя. Когда эта циклическая структура будет готова, разработчику останется лишь проверять краткое резюме git diff и нажимать кнопку коммита.
В конечном счете, ключ к созданию эффективного агента — это не использование вычурных фреймворков, а то, насколько ювелирно вы очищаете и кэшируете данные между терминалом и LLM. 600 строк вашего собственного кода на Python будут отражать ваши намерения гораздо лучше, чем «черный ящик» из десятков тысяч строк готового инструмента.