Перейти к содержимому
PD
Вайб-кодинг

Нейросеть для кода на Python: что работает лучше

Чем Python-задачи отличаются с точки зрения ИИ-инструментов, что даётся хорошо, где систематически возникают ошибки и какие приёмы дают лучший результат именно на Python.

Все статьи гида Вайб-кодинг · 11

Python - язык, на котором ИИ-инструменты показывают лучший результат, и одновременно язык, где их ошибки труднее заметить. Разберём и то, и другое.

Особенности Python-задач

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

Динамическая типизация. Оборотная сторона: у модели нет структурной подсказки, которую в типизированных языках даёт компилятор. Она не знает, что придёт в функцию, и ошибка проявится не при написании, а при запуске на реальных данных.

Быстро меняющиеся библиотеки. В обучающих данных больше старых версий, чем новых. Отсюда самая частая проблема: уверенно написанный вызов, актуальный три года назад.

Нет этапа компиляции. Код, который выглядит рабочим, запускается и падает на середине. В типизированном языке часть таких ошибок ловится до запуска.

Что даётся хорошо

  • Скрипты и обвязка. Разовые задачи, обработка файлов, преобразование форматов.
  • Парсинг и работа с данными. Особенно там, где структура известна.
  • Тесты на существующий код. Хорошо получается и легко проверяется.
  • Разбор чужого кода. Объяснить, что делает модуль, - сильная сторона.
  • Рутинный рефакторинг. Переименования, вынесение функций, единообразные правки.

Где систематически ошибается

Четыре механизма, которые стоит узнавать в лицо:

Устаревшие вызовы библиотек. Написан код под API прошлой мажорной версии. Выглядит правильно, падает при запуске или, хуже, работает иначе. Лечится указанием версии в контексте: файл зависимостей должен быть виден.

Широкий перехват исключений. Конструкция, которая ловит всё подряд и проглатывает ошибку, - частый паттерн в сгенерированном коде. Результат: ошибка исчезает из логов, а проблема остаётся.

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

Незакрытые ресурсы. Файлы, соединения, сессии. На короткой задаче незаметно, в долгоживущем процессе накапливается.

Общее у всех четырёх: проявляются не при написании, а на реальных данных, и потому не ловятся при беглом просмотре.

Приёмы, которые работают

По убыванию эффекта:

  1. Аннотации типов. Дают модели структуру, которой в динамическом языке иначе нет, и позволяют статической проверке поймать часть ошибок до запуска. На проекте с типами качество генерации заметно выше.
  2. Тест как постановка задачи. «Напиши функцию, чтобы прошёл этот тест» - проверяемая задача, которую инструмент может закрыть сам, прогнав тест.
  3. Файл зависимостей в контексте. Модель увидит реальные версии и не напишет код под старое API.
  4. Виртуальное окружение и изоляция. Особенно если агент может ставить пакеты - см. песочницу.
  5. Линтер и форматтер в проекте. Часть проблем чинится автоматически и не требует вашего внимания.
  6. Явные соглашения проекта. Где лежат модули, как обрабатываются ошибки, что запрещено. Это то, что стоит записать один раз - см. скиллы.

Отдельно про зависимости

Практическая осторожность, специфичная для Python: модель может предложить пакет, которого не существует или который называется похоже на настоящий. Это не гипотетическая проблема: имена, близкие к популярным пакетам, - известный способ распространения вредоносного кода.

Правило простое: новый пакет в списке зависимостей - повод посмотреть, что это. Особенно если он появился в дифе, который вы просматривали бегло.

Как выбирать инструмент и модель - нейросети для кода и выбор под задачу. Общая механика - как это работает. Обзор - гид по вайб-кодингу.

Вопросы и ответы

Хорошо ли нейросети пишут код на Python?

Лучше, чем на большинстве языков: Python широко представлен в обучающих данных, а типовые задачи однообразны. Обратная сторона в том, что модель уверенно пишет код под версии библиотек многолетней давности, потому что их в данных больше.

Какие ошибки чаще всего возникают в сгенерированном Python-коде?

Устаревшие вызовы библиотек, молчаливое проглатывание исключений широким except, зависимость от порядка элементов там, где его нет, и незакрытые ресурсы. Все четыре выглядят как рабочий код и проявляются на реальных данных, а не в момент написания.

Что помогает получать лучший результат на Python?

Типизация и тесты. Аннотации типов дают модели структуру, которой в динамическом языке иначе нет, а тест превращает задачу в проверяемую. Проект с типами и тестами обрабатывается заметно лучше проекта без них.

Ещё по теме