Логотип
Знания для вашего роста
Бесплатный курс для начинающих
Найдите ошибку в Python-коде и спасите маркетплейс
30 сентября 2026

Как находить и исправлять ошибки в коде, сгенерированном нейросетью

Код от нейросети редко выглядит откровенно плохим. Обычно на простом примере он работает как надо и не вызывает подозрений. Ошибка проявляется позже — когда меняются входные данные, растёт нагрузка или код объединяют с другими частями проекта.

С экономией времени тоже не всё однозначно. Stack Overflow — сайт, где программисты задают вопросы и помогают друг другу разбираться с кодом, — каждый год проводит опрос разработчиков. В 2025 году 66% участников рассказали, что ИИ предлагал им почти правильные решения, которые всё равно приходилось дорабатывать. Ещё 45% назвали отладку такого кода слишком трудоёмкой.

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

Редакция Медиа Нетологии

Код от нейросети редко выглядит откровенно плохим. Обычно на простом примере он работает как надо и не вызывает подозрений. Ошибка проявляется позже — когда меняются входные данные, растёт нагрузка или код объединяют с другими частями проекта.

С экономией времени тоже не всё однозначно. Stack Overflow — сайт, где программисты задают вопросы и помогают друг другу разбираться с кодом, — каждый год проводит опрос разработчиков. В 2025 году 66% участников рассказали, что ИИ предлагал им почти правильные решения, которые всё равно приходилось дорабатывать. Ещё 45% назвали отладку такого кода слишком трудоёмкой.

Разберём, где обычно ошибается ИИ, как проверять сгенерированный код и что сообщить нейросети, чтобы она предложила подходящее исправление.
  • За консультацию при подготовке материала благодарим Владимира Языкова — fullstack-разработчика, эксперта Нетологии.
  • Код от нейросети — это первый вариант решения. Перед использованием его нужно сверить с требованиями задачи.

  • Успешный запуск подтверждает только то, что программа смогла выполнить код. Это не гарантирует правильный результат.

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

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

  • При проверке безопасности важно учитывать, откуда приходят данные, может ли пользователь их изменить и какие действия ему разрешены.

  • Незнакомые пакеты и библиотеки нужно искать в официальных каталогах и сверять с документацией.

  • Работу под нагрузкой проверяют на наборах данных разного размера. Так можно заметить рост времени выполнения, количества запросов и расхода памяти.

  • ChatGPT и GitHub Copilot могут объяснить код и предложить тесты, но требования и ожидаемые результаты проверяет человек.

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

  • После исправления запускают все тесты заново: новая версия нередко решает одну проблему и создаёт другую.

Подробно

Почему ИИ ошибается и какие баги встречаются в сгенерированном коде

Нейросеть может написать функцию или предложить тесты, но не знает задачу так, как разработчик. Поэтому любой код от ИИ лучше воспринимать как черновик, который нужно проверить.

Вот основные причины ошибок:
  • В запросе не хватает условий. Например, пользователь просит написать функцию для расчёта скидки, но не указывает её допустимый размер, правила округления и реакцию на неверные данные. Нейросеть не уточняет эти правила, а сама выбирает один из вероятных вариантов.
  • Нейросеть видит не весь проект. Функция может зависеть от других файлов, настроек и библиотек. Если у модели нет этой информации, она не учитывает её в ответе. В результате новый код работает отдельно, но конфликтует с остальной программой.
  • В обучающих данных встречаются устаревшие и ошибочные примеры. Языки и библиотеки меняются: старые функции исчезают, а правила их использования обновляются. Нейросеть может предложить способ, который раньше работал, но больше не подходит для новой версии.
  • Нейросеть придумывает недостающую информацию. Например, ссылается на функцию или библиотеку, которой не существует. Такие ошибки называют галлюцинациями. В документации GitHub Copilot сказано, что ответы модели могут звучать убедительно, но содержать неточные или выдуманные сведения.
Большинство ошибок — это, скорее, следствие того, как человек ставит задачу. Мы живём в эпоху, когда нужно немного иначе подходить к формулировке промптов — примерно так же, как когда-то учились правильно составлять запросы для поисковых систем. Главный принцип: чем уже и конкретнее, тем лучше.
Большинство ошибок — это, скорее, следствие того, как человек ставит задачу. Мы живём в эпоху, когда нужно немного иначе подходить к формулировке промптов — примерно так же, как когда-то учились правильно составлять запросы для поисковых систем. Главный принцип: чем уже и конкретнее, тем лучше.
  • Владимир Языков
    Fullstack-разработчик, эксперт Нетологии
  • Владимир Языков
    Fullstack-разработчик, эксперт Нетологии
Если нужно изменить одну-две строки в небольшой функции, задачу лучше ограничить этими строками. Запрос «сделай сайт» вынуждает модель самостоятельно достраивать требования. В результате она может неверно понять задачу, добавить лишний код, а на уточнения и исправления уйдут время и токены.

Это особенно заметно при генерации интерфейсов. Даже если модель получает макет из Figma, качество результата зависит от того, насколько чётко в нём определены состояния элементов, ограничения и правила адаптации. Если дизайн ориентирован преимущественно на визуальный эффект, сгенерированная вёрстка может быть некорректной или не работать одинаково в разных браузерах.

Аккуратный вид ответа ничего не доказывает: нейросеть могла составить код как текст и ни разу его не запустить. Поэтому даже понятный и хорошо оформленный фрагмент нужно проверить.
Находить ошибки в коде от нейросетей учат на курсе ↓
• Начнёте использовать ИИ как ассистента: от промпт-генерации кода до настройки CI/CD и создания документации

• Освоите автоматизированное тестирование, интеграцию нейросетей в IDE, рабочие пайплайны и код-ревью

• Разберёте ограничения применения ИИ в сфере информационной безопасности
Подробнее
• Начнёте использовать ИИ как ассистента: от промпт-генерации кода до настройки CI/CD и создания документации

• Освоите автоматизированное тестирование, интеграцию нейросетей в IDE, рабочие пайплайны и код-ревью

• Разберёте ограничения применения ИИ в сфере информационной безопасности
Подробнее
Если только присматриваетесь к профессии ↓
Спасёте маркетплейс во время ИТ-инцидента — попробуете себя в 6 разных ролях и попрактикуетесь на реальных задачах разработчиков и инженеров
Подробнее

Какие баги встречаются в сгенерированном коде

Одни баги сразу останавливают код, другие проявляются только при определённых условиях. Поэтому проверять нужно не только запуск, но и результат работы.

Четыре основные ошибки:
  • Синтаксическая — код нарушает правила языка и не запускается.
  • Ошибка во время выполнения — код запускается, но останавливается на конкретных данных.
  • Логическая — код работает, но выдаёт неверный результат.
  • Ошибка совместимости — фрагмент работает сам по себе, но не подходит проекту.
Посмотрим, как эти ошибки выглядят в коде на Python. Красной чертой отмечена проблемная строка, а под каждым фрагментом показано, что происходит при его выполнении.
Примеры ошибок в Python-коде, сгенерированном нейросетью: пропущенное двоеточие мешает запуску, неверный ввод останавливает программу, а ошибка в формуле и неподходящий тип данных влияют на результат
Синтаксические ошибки и ошибки выполнения обычно сопровождаются сообщением о сбое. Совместимость проверяют, запуская новый код вместе с остальными частями проекта. Логические ошибки могут оставаться незаметными: программа работает, но выдаёт неверный результат. Кроме того, даже корректный расчёт не исключает уязвимостей и замедления при росте нагрузки. Дальше подробнее разберём логические ошибки, безопасность и работу кода под нагрузкой.

Логические ошибки, уязвимости и проблемы с масштабируемостью

Здесь одного сообщения об ошибке уже недостаточно. Нужно сравнить результат с условиями задачи, попробовать выйти за предусмотренные ограничения и посмотреть, как код ведёт себя при большом объёме данных. Разберём каждую проверку отдельно.

Как находить логические ошибки

Логическая ошибка возникает, когда код выполняется без сбоев, но решает задачу не так, как нужно. Например, нейросеть может не учесть одно из требований или понять его иначе. Программа не покажет сообщение об ошибке, поэтому проблему можно заметить только при проверке результата.

Допустим, интернет-магазину нужна функция — часть программы, которая будет рассчитывать стоимость заказа. Она должна учитывать несколько правил:
  • цена и количество товаров должны быть больше нуля;
  • количество должно быть целым числом;
  • скидка может составлять от 0 до 100%;
  • итоговую сумму нужно округлять до двух знаков после запятой;
  • при неверных данных функция должна остановить расчёт и сообщить об ошибке.
Нейросеть предложила такой код:
def calculate_total(price, quantity, discount_percent):
subtotal = price * quantity
discount = subtotal * discount_percent / 100
return subtotal - discount
В скобках указаны параметры:
  • price — цена одного товара;
  • quantity — количество товаров;
  • discount_percent — размер скидки в процентах.
Код умножает цену на количество, рассчитывает скидку, а команда return возвращает итоговую сумму.

Проверим обычный заказ:
calculate_total(500, 2, 10)
Два товара по 500 рублей стоят 1 000 рублей. После скидки 10% функция вернёт 900 рублей. Формула сработала, но пока только на одном наборе данных.

Теперь передадим значения, которые нарушают правила магазина:
calculate_total(500, -2, 10) # отрицательная сумма
calculate_total(500, 2, 101) # отрицательная сумма
В первом случае количество товаров отрицательное, поэтому функция вернёт −900 рублей. Во втором скидка превышает 100%, а итог составит −10 рублей. Программа выполнит оба расчёта, потому что в функции нет проверок для таких значений. В этом и состоит логическая ошибка.

Подобные проблемы ищут с помощью граничных значений — чисел на границе разрешённого диапазона и сразу за ней. Для скидки это 0, 100, −1 и 101%, для количества — 1, 0 и −1. Так становятся заметны пропущенные проверки и неверные условия.

Отдельно проверяют округление. Тип float хранит некоторые дроби приблизительно: например, 0.1 + 0.2 в Python даёт 0.30 000 000 000 000 004. В учебном примере сумму можно округлить до двух знаков. Для денежных расчётов часто используют Decimal — тип данных из стандартной библиотеки Python. Он позволяет задавать правила округления.

Как находить уязвимости

Уязвимость — это слабое место в коде, с помощью которого можно обойти правила программы, изменить данные или получить доступ к чужой информации.

Нейросеть может написать код, который правильно выполняет основную задачу, но не учитывает, как им могут воспользоваться. Такое часто происходит, если в запросе описан нужный результат, но ничего не сказано о проверке данных и правах пользователей.

Вернёмся к расчёту скидки. Покупатель вводит промокод, а браузер отправляет данные заказа на сервер. Нейросеть может предложить код, в котором браузер передаёт ещё и размер скидки, например 10%, а сервер сразу подставляет это число в формулу. Тогда покупатель теоретически сможет заменить отправляемое значение на 100% через инструменты браузера. Оба значения входят в допустимый диапазон, поэтому проверка границ не обнаружит подмену.
Подмена скидки в запросе браузера: если сервер доверяет переданному проценту, покупатель может заменить 10% на 100% и снизить стоимость заказа до нуля
Чтобы этого избежать, сервер сам находит условия промокода, смотрит, доступен ли он покупателю, и рассчитывает скидку. При проверке кода от нейросети важно выяснить, какие данные приходят из браузера и не доверяет ли им сервер без дополнительной валидации.

Ещё один риск связан с пакетами и библиотеками. Нейросеть иногда предлагает пакеты с правдоподобным, но выдуманным названием. Если под этим названием опубликован вредоносный пакет, разработчик может установить его по ошибке.

В исследовании, представленном на конференции USENIX Security 2025, несуществующие пакеты встречались в среднем не менее чем в 5,2% рекомендаций коммерческих моделей и в 21,7% рекомендаций моделей с открытым кодом. Поэтому незнакомый пакет сначала стоит найти в PyPI или npm, а затем сверить его название, автора и назначение с официальной документацией.

Как оценивать работу под нагрузкой

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

Так бывает, когда нейросеть не знает, с каким объёмом данных предстоит работать. Если об этом не сказано в запросе, она может предложить самое простое решение — например, загружать каждый товар из базы отдельно:
for product_id in product_ids:
product = database.get_product(product_id)
Цикл for перебирает список товаров. Для каждого из них команда get_product отправляет отдельный запрос в базу данных. Получается, что для 10 товаров программа сделает 10 запросов, а для 10 000 — уже 10 000. Результат будет правильным, но его придётся ждать дольше.

Вместо отдельных запросов данные можно получать группами. Например, передать базе несколько сотен идентификаторов товаров и получить информацию о них одним запросом. Затем так же обработать следующую группу. Это называют пакетной обработкой.

Чтобы заметить подобные проблемы, код проверяют на разных объёмах данных. Во время проверки сравнивают время работы, количество запросов и расход памяти. Так можно понять, как программа справляется с ростом нагрузки.

Алгоритм проверки: как проводить ревью кода в ChatGPT и GitHub Copilot

Ревью — это проверка кода перед тем, как добавить его в рабочую версию проекта. ИИ-ассистент может объяснить фрагмент и предложить тесты, но правильный результат определяет человек.

Проверку можно разделить на шесть шагов.
  • Записать ожидаемое поведение. Определить, какие данные получает код, какой результат должен вернуть и какие значения считаются недопустимыми.
  • Посмотреть изменения в коде. Открыть diff — сравнение старой и новой версий — и проверить строки, которые нейросеть добавила, удалила или изменила.
  • Попросить нейросеть объяснить решение. Узнать, что делает каждая часть кода, какие данные она использует и на какие предположения опирается.
  • Запустить программу и готовые тесты. Проверить, выполняется ли новый код и не нарушил ли он работу существующих функций.
  • Добавить тесты для нового кода. Проверить обычные, граничные и недопустимые значения, а ожидаемые результаты сверить вручную.
  • Исправить код и повторить проверку. Передать нейросети требования и результаты тестов, а после правки снова запустить все проверки.
Требования можно сразу перевести в тесты, а уже затем просить нейросеть написать реализацию. Так заранее фиксируются ожидаемые результаты для обычных, граничных и недопустимых данных. Сами тесты тоже нужно проверить вручную: модель может заложить в них те же неверные предположения, что и в код.

Более формальный вариант такого подхода — spec-driven development. Сначала описывают требования и пользовательские сценарии, а затем генерируют и проверяют реализацию относительно этой спецификации. Посмотрим, как такой подход работает на функции расчёта заказа. Для проверки используем pytest — инструмент, который запускает тесты для Python.

Предположим, функция хранится в файле order. py, а тесты — в файле test_order.py:
import pytest
from order import calculate_total

def test_regular_order():
assert calculate_total(500, 2, 10) == 900

def test_full_discount():
assert calculate_total(500, 2, 100) == 0

def test_discount_over_100():
with pytest.raises(ValueError):
calculate_total(500, 2, 101)

def test_negative_quantity():
with pytest.raises(ValueError):
calculate_total(500, -2, 10)

def test_rounding():
assert calculate_total(99.99, 3, 10) == 269.97
Команда assert сравнивает результат функции с ожидаемым значением. Если они не совпадают, тест не пройден. Конструкция pytest.raises(ValueError) проверяет, остановит ли функция расчёт при недопустимых данных.

В наборе есть обычный заказ, скидка на границе разрешённого диапазона, два неверных значения и расчёт с округлением. Исходная функция не пройдёт тесты со скидкой 101% и отрицательным количеством: она выполнит расчёт вместо того, чтобы сообщить об ошибке.

Теперь ассистенту можно передать функцию, требования и результаты тестов:
  • Измени только функцию calculate_total. Цена и количество должны быть больше нуля, количество — целым числом, скидка — находиться в диапазоне от 0 до 100%. Итог нужно округлять до двух знаков. Не меняй параметры функции и тесты. Кратко объясни исправление.
После правки функция может выглядеть так:
def calculate_total(price, quantity, discount_percent):
if price <= 0:
raise ValueError("Цена должна быть больше нуля")

if not isinstance(quantity, int) or quantity <= 0:
raise ValueError(
"Количество должно быть целым числом больше нуля"
)

if not 0 <= discount_percent <= 100:
raise ValueError("Скидка должна быть от 0 до 100%")

return round(
price * quantity * (1 - discount_percent / 100),
2,
)
Функция проверяет данные до расчёта: isinstance(quantity, int) отличает целое количество, а ValueError сообщает о недопустимом значении. После изменения нужно снова запустить все тесты и убедиться, что функция правильно обрабатывает каждый сценарий.
Чем выше финансовая ценность задачи и цена ошибки, тем строже должно быть ревью. Особенно внимательно стоит проверять новый функционал, изменения в критических частях системы и технологии, с которыми ещё никто не работал.
Чем выше финансовая ценность задачи и цена ошибки, тем строже должно быть ревью. Особенно внимательно стоит проверять новый функционал, изменения в критических частях системы и технологии, с которыми ещё никто не работал.
  • Владимир Языков
    Fullstack-разработчик, эксперт Нетологии
  • Владимир Языков
    Fullstack-разработчик, эксперт Нетологии
Даже если код прошёл автоматические проверки, его стоит показать разработчику, который понимает архитектуру проекта и может оценить последствия правки.

Инструменты автоматического тестирования и статического анализа

Ручное ревью, тесты и анализаторы решают разные задачи. Человек сверяет код с требованиями, тесты проверяют сценарии, а статический анализ изучает код без запуска. OWASP рекомендует сочетать автоматические проверки с ручным ревью безопасности.

Для небольшого проекта на Python подойдут пять инструментов:
  • pytest запускает тесты и показывает неуспешный сценарий;
  • Ruff находит типовые дефекты, неиспользуемые импорты и подозрительные конструкции;
  • mypy сравнивает типы данных, если в коде есть аннотации — пометки о том, какие значения ожидает функция;
  • Bandit ищет известные небезопасные конструкции;
  • pip-audit проверяет установленные библиотеки на известные уязвимости.
Для учебного примера хватит pytest и Ruff, но ниже покажем команды для всех пяти инструментов. Их запускают в терминале из папки проекта:
python -m pip install pytest ruff mypy bandit pip-audit
pytest
ruff check .
mypy .
bandit -r .
pip-audit
Инструменты указывают тест, строку или пакет, где нашли проблему. Это сужает поиск, но не заменяет проверку требований.
Результаты проверки Python-кода в терминале: pytest показывает, что функция не отклонила отрицательное количество товаров, а Ruff находит неиспользуемый импорт
Для JavaScript и TypeScript похожие задачи решают Jest или Vitest, ESLint и npm audit.

Перед коммитом или отправкой изменений в репозиторий можно автоматически запускать такие проверки:
  • Форматирование — расставляет отступы и пробелы по правилам проекта.
  • Линтинг — находит типичные недочёты в коде, например неиспользуемые переменные.
  • Проверку типов — сообщает, если функции передали текст вместо ожидаемого числа.
  • Ключевые тесты — запускают важные сценарии и сравнивают результат с ожидаемым.
  • Сборку — сообщает, удалось ли подготовить новую версию программы к запуску.
Если автоматическая проверка нашла ошибку, её исправляют до добавления изменений в основную ветку.

Как составить запрос, чтобы нейросеть исправила ошибку

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

Полезный запрос похож на короткое сообщение коллеге: что делает код, что произошло и что разрешено менять.

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

Что сообщить нейросети об ошибке

В запрос полезно включить:
  • назначение функции;
  • версии языка и библиотек;
  • код, входные данные и полный текст ошибки;
  • ожидаемый и фактический результат;
  • уже выполненные проверки;
  • части кода, которые нельзя менять.
В публичный ИИ-сервис нельзя отправлять ключи API, пароли, токены доступа и другие данные, связанные с безопасностью. Также из запроса стоит убрать персональные данные, внутренние пути файловой системы, фрагменты под NDA и сведения, которые раскрывают устройство корпоративной инфраструктуры. Закрытый код можно передавать модели только в том случае, если это разрешено правилами компании. Перед отправкой секретные значения заменяют нейтральными примерами.
Если утечка конкретного фрагмента кода или данных может негативно повлиять на безопасность или работу системы, его лучше не отправлять в модель.
Если утечка конкретного фрагмента кода или данных может негативно повлиять на безопасность или работу системы, его лучше не отправлять в модель.
  • Владимир Языков
    Fullstack-разработчик, эксперт Нетологии
  • Владимир Языков
    Fullstack-разработчик, эксперт Нетологии

Пример запроса к нейросети

Для функции расчёта заказа запрос может выглядеть так:
  • Функция calculate_total написана на Python 3.12 и рассчитывает стоимость заказа. Цена и количество должны быть больше нуля, количество — целым числом, а скидка — находиться в диапазоне от 0 до 100%.

    Код функции: [вставить код]

    Входные данные: price=500, quantity=-2, discount_percent=10.

    Ожидаемый результат: функция вызывает ValueError.
    Фактический результат: функция возвращает -900.

    Тест обычного заказа проходит, а тест с отрицательным количеством — нет.

    Объясни причину ошибки и предложи минимальное исправление в формате diff. Не меняй параметры функции и не добавляй библиотеки. После исправления перечисли тесты, которые нужно запустить повторно.

Когда проще исправить код самостоятельно

Стоит остановиться, если модель не может воспроизвести ошибку, несколько раз предлагает правки, которые не устраняют её причину, или для каждого следующего ответа требует всё больше контекста и токенов. То же касается случаев, когда сначала нужно самостоятельно разобраться в архитектуре и связях между частями проекта.
В какой-то момент эффективнее остановить диалог с моделью, самому разобраться в причине бага и только после этого, при необходимости, вернуться к ней с более конкретной задачей.
В какой-то момент эффективнее остановить диалог с моделью, самому разобраться в причине бага и только после этого, при необходимости, вернуться к ней с более конкретной задачей.
  • Владимир Языков
    Fullstack-разработчик, эксперт Нетологии
  • Владимир Языков
    Fullstack-разработчик, эксперт Нетологии

Как научиться проверять код от нейросети

Чтобы находить ошибки в коде от нейросети, нужно понимать, как она работает, уметь писать тесты и замечать уязвимости. Эти навыки можно получить на курсе «Нейросети для разработчиков». Участники используют ИИ для отладки и тестирования кода, проводят код-ревью и тренируются включать проверки в процесс разработки.

Если опыта программирования пока нет, начать можно с бесплатного курса «ИТ в действии: как создаются и живут цифровые продукты». Он предлагает познакомиться с работой ИТ-команды и попробовать найти ошибку в Python-коде на примере сбоя системы заказов маркетплейса.
Читать также
Мнение автора и редакции может не совпадать.

Чтобы быть в курсе всех новостей и не пропускать новые статьи, присоединяйтесь к Telegram-каналу Нетологии.
Редакция Медиа Нетологии
Оцените статью