Игорь Градов
Игорь Градов
5 мин
ai

Галлюцинации нейросетей в коде: как геймдев-студия за полгода построила цепочку ловушек

Месяца четыре назад у автора оригинального разбора на ревью прошёл пулл-реквест с вызовом функции, которой в движке никогда не существовало, и сборка под PC не заметила подвоха, потому что макрос на десктопе выбрасывал содержимое в пустоту.

Почему это важно

Галлюцинации нейросетей (когда модель уверенно генерирует код, которого в проекте нет и не было) проходят мимо компилятора, мимо тестов и мимо уставшего ревьювера, а падают только на другой платформе через два дня, и описанный случай показывает, что проблема уже не теоретическая.

Историю и цепочку проверок описал разработчик из геймдев-студии в развёрнутом техническом посте на русском языке. Речь о реальном продакшен-движке, который собирается сразу под PC и консоли несколькими тулчейнами (набор инструментов для сборки кода под конкретную платформу): MSVC для десктопа, clang под две консоли и gcc для серверной части. Запрещать нейросеть в команде не стали, вместо этого за полгода вокруг сборки наросла цепочка автоматических проверок, которая ловит большую часть того, что модель выдумывает.

Что Когда Кто описал Цена
Цепочка проверок кода, сгенерированного нейросетью, для мультиплатформенного движка Примерно за полгода до публикации поста Разработчик геймдев-студии (имя не раскрыто) Ферма сборки обходится примерно вдвое дороже прежнего

Что именно ловит цепочка и как устроены проверки?

  • Сборка всеми тулчейнами сразу, а не по ночам. Раньше консольные билды запускались ночью, и именно в эту щель провалилась выдуманная функция FrameAllocator::TryReclaimTail(). Теперь каждый пулл-реквест (запрос на добавление кода в общий проект) ждёт зелёного статуса от всех платформ, включая консоли.

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

  • Флаг -Wconversion включён для новых файлов. Галлюцинации нейросетей часто проявляются как вызов существующей функции с перепутанным порядком аргументов: int тихо превращается во float, а bool становится индексом массива. На старом коде флаг выдавал тысячи предупреждений, поэтому его включили только для файлов, которые затрагивает конкретный пулл-реквест.

  • Бот проверяет имена, которых раньше не было в репозитории. Из добавленных строк вытаскиваются все идентификаторы и сверяются с индексом (индекс, полный список всех имён в проекте, собираемый ночью). Если имя впервые появилось в том же пулл-реквесте, где его вызывают, но там же не объявлено, бот вешает метку и пишет комментарий.

  • Три дыры, которые бот закрывает, а компилятор нет. Код под ifdef для конфигураций, которые сборка не покрывает. Шаблоны, которые никто ещё не инстанцировал (тело шаблона с выдуманным методом компилируется, пока его не вызовут). Имена в строковых литералах, которых компилятор вообще не видит.

Ложных срабатываний поначалу было столько, что автор собирался отключить проверку. Индекс не видел имён, склеенных макросами через ## (например, из DECLARE_COMPONENT(Health) вырастают HealthComponent, HealthComponentPool и пара служебных структур). Проблему решили, построив индекс по препроцессированным исходникам. Это съело ещё три минуты на ночной сборке и около двух гигабайт на диске.

Как попробовать у себя?

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

  2. Пройдитесь по макросам, которые на каких-то платформах выбрасывают аргументы. Замените их на конструкцию вида ((void)sizeof((expr), 0)), где выражение не вычисляется, но имена внутри обязаны существовать.

  3. Включите -Wconversion (или аналог вашего компилятора) хотя бы для файлов, затронутых текущим пулл-реквестом. Старый код чистится постепенно, новый сразу проходит строгую проверку.

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

Как обстоят дела с аналогичными инструментами в России?

В российских IDE и платформах (JetBrains, которая исторически популярна в РФ, а также YandexGPT и GigaChat как генераторы кода) встроенных цепочек проверки галлюцинаций пока нет. YandexGPT и GigaChat умеют генерировать код, но верификация остаётся на разработчике.

Описанная цепочка не привязана к конкретным коммерческим инструментам: это скрипты вокруг стандартных компиляторов и системы сборки. Для студии в РФ, работающей на Unreal Engine или собственном движке, чек-лист выше применим без адаптации.

Мнение редакции dzen.guru

На мой взгляд, главная ценность этого разбора не в скриптах, а в честном признании: галлюцинации нейросетей в коде опаснее обычных багов именно потому, что выглядят «родными». Модель копирует стиль проекта за пару файлов, но не знает, что в проекте реально существует. Запрещать нейросеть бесполезно, автор прямо сравнивает это с запретом Stack Overflow в 2010 году. А вот четыре конкретных шага (мультиплатформенная сборка на каждый пулл-реквест, починка макросов, -Wconversion для новых файлов, бот-проверка имён) превращают проблему из невидимой в управляемую. Оговорка: ферма стоит вдвое дороже, ложные срабатывания бота требуют ручной настройки, и автор сам говорит, что файл исключений разрастается быстрее, чем его успевают читать. Если вы автор Дзена и пишете про геймдев или ИИ-инструменты для разработчиков, этот кейс даёт конкретный сценарий с цифрами, а не абстрактные страхи. Маркетологу и предпринимателю в студии стоит заложить рост расходов на CI-ферму (систему автоматической сборки и тестирования) при внедрении нейросетевых помощников.

Частые вопросы

Галлюцинации нейросетей бывают только в коде?

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

Можно ли просто запретить нейросети в команде?

Автор разбора прямо говорит: запрет работает так же, как запрет Stack Overflow в 2010 году. Люди продолжают пользоваться, просто перестают признаваться. Проверки на уровне сборки и ботов надёжнее административных запретов.

Подходит ли описанная цепочка для небольшой студии?

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

Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Галлюцинации нейросетей: протокол проверки за 10 минут, который ловит до 33% ошибок
ai

Галлюцинации нейросетей: протокол проверки за 10 минут, который ловит до 33% ошибок

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

8 мин
Кому принадлежит код, который написал ваш ИИ-агент: промпт не считается творчеством
ai

Кому принадлежит код, который написал ваш ИИ-агент: промпт не считается творчеством

Промпт сам по себе не делает вас автором кода, который выдал ИИ-агент, и Пресненский суд Москвы уже показал это на деле с картинками, а с 1 марта 2027 года…

6 мин
ai

ИИ в 1С: $13 365 за полтора месяца, 94% ушло на скрытые расходы

Компания «Инфостарт» в начале июня опубликовала серию материалов о практическом применении ИИ в экосистеме 1С, и среди них оказались расчёт реальной стоимости…

7 мин