Галлюцинации нейросетей в коде: как геймдев-студия за полгода построила цепочку ловушек
Месяца четыре назад у автора оригинального разбора на ревью прошёл пулл-реквест с вызовом функции, которой в движке никогда не существовало, и сборка под PC не заметила подвоха, потому что макрос на десктопе выбрасывал содержимое в пустоту.
Галлюцинации нейросетей (когда модель уверенно генерирует код, которого в проекте нет и не было) проходят мимо компилятора, мимо тестов и мимо уставшего ревьювера, а падают только на другой платформе через два дня, и описанный случай показывает, что проблема уже не теоретическая.
Историю и цепочку проверок описал разработчик из геймдев-студии в развёрнутом техническом посте на русском языке. Речь о реальном продакшен-движке, который собирается сразу под PC и консоли несколькими тулчейнами (набор инструментов для сборки кода под конкретную платформу): MSVC для десктопа, clang под две консоли и gcc для серверной части. Запрещать нейросеть в команде не стали, вместо этого за полгода вокруг сборки наросла цепочка автоматических проверок, которая ловит большую часть того, что модель выдумывает.
| Что | Когда | Кто описал | Цена |
|---|---|---|---|
| Цепочка проверок кода, сгенерированного нейросетью, для мультиплатформенного движка | Примерно за полгода до публикации поста | Разработчик геймдев-студии (имя не раскрыто) | Ферма сборки обходится примерно вдвое дороже прежнего |
Что именно ловит цепочка и как устроены проверки?
-
Сборка всеми тулчейнами сразу, а не по ночам. Раньше консольные билды запускались ночью, и именно в эту щель провалилась выдуманная функция
FrameAllocator::TryReclaimTail(). Теперь каждый пулл-реквест (запрос на добавление кода в общий проект) ждёт зелёного статуса от всех платформ, включая консоли. -
Макросы переделаны так, чтобы не прятать ошибки. Около сорока макросов в движке на отдельных платформах выбрасывали свои аргументы целиком. Их переписали: выражение внутри больше не вычисляется, но все имена в нём обязаны существовать. В пяти макросах уже лежали вызовы несуществующих функций, причём два из них положили туда люди, а не модель.
-
Флаг
-Wconversionвключён для новых файлов. Галлюцинации нейросетей часто проявляются как вызов существующей функции с перепутанным порядком аргументов: int тихо превращается во float, а bool становится индексом массива. На старом коде флаг выдавал тысячи предупреждений, поэтому его включили только для файлов, которые затрагивает конкретный пулл-реквест. -
Бот проверяет имена, которых раньше не было в репозитории. Из добавленных строк вытаскиваются все идентификаторы и сверяются с индексом (индекс, полный список всех имён в проекте, собираемый ночью). Если имя впервые появилось в том же пулл-реквесте, где его вызывают, но там же не объявлено, бот вешает метку и пишет комментарий.
-
Три дыры, которые бот закрывает, а компилятор нет. Код под
ifdefдля конфигураций, которые сборка не покрывает. Шаблоны, которые никто ещё не инстанцировал (тело шаблона с выдуманным методом компилируется, пока его не вызовут). Имена в строковых литералах, которых компилятор вообще не видит.
Ложных срабатываний поначалу было столько, что автор собирался отключить проверку. Индекс не видел имён, склеенных макросами через ## (например, из DECLARE_COMPONENT(Health) вырастают HealthComponent, HealthComponentPool и пара служебных структур). Проблему решили, построив индекс по препроцессированным исходникам. Это съело ещё три минуты на ночной сборке и около двух гигабайт на диске.
Как попробовать у себя?
-
Включите сборку каждого пулл-реквеста всеми тулчейнами проекта одновременно. Если консольные или серверные билды сейчас ездят только по ночам, перенесите их в пайплайн пулл-реквеста. Да, ферма будет стоить дороже.
-
Пройдитесь по макросам, которые на каких-то платформах выбрасывают аргументы. Замените их на конструкцию вида
((void)sizeof((expr), 0)), где выражение не вычисляется, но имена внутри обязаны существовать. -
Включите
-Wconversion(или аналог вашего компилятора) хотя бы для файлов, затронутых текущим пулл-реквестом. Старый код чистится постепенно, новый сразу проходит строгую проверку. -
Напишите бота, который сверяет новые идентификаторы с индексом репозитория. Индекс лучше строить по препроцессированным исходникам, иначе макросы с
##дадут поток ложных срабатываний.
Как обстоят дела с аналогичными инструментами в России?
В российских IDE и платформах (JetBrains, которая исторически популярна в РФ, а также YandexGPT и GigaChat как генераторы кода) встроенных цепочек проверки галлюцинаций пока нет. YandexGPT и GigaChat умеют генерировать код, но верификация остаётся на разработчике.
Описанная цепочка не привязана к конкретным коммерческим инструментам: это скрипты вокруг стандартных компиляторов и системы сборки. Для студии в РФ, работающей на Unreal Engine или собственном движке, чек-лист выше применим без адаптации.
На мой взгляд, главная ценность этого разбора не в скриптах, а в честном признании: галлюцинации нейросетей в коде опаснее обычных багов именно потому, что выглядят «родными». Модель копирует стиль проекта за пару файлов, но не знает, что в проекте реально существует. Запрещать нейросеть бесполезно, автор прямо сравнивает это с запретом Stack Overflow в 2010 году. А вот четыре конкретных шага (мультиплатформенная сборка на каждый пулл-реквест, починка макросов, -Wconversion для новых файлов, бот-проверка имён) превращают проблему из невидимой в управляемую. Оговорка: ферма стоит вдвое дороже, ложные срабатывания бота требуют ручной настройки, и автор сам говорит, что файл исключений разрастается быстрее, чем его успевают читать. Если вы автор Дзена и пишете про геймдев или ИИ-инструменты для разработчиков, этот кейс даёт конкретный сценарий с цифрами, а не абстрактные страхи. Маркетологу и предпринимателю в студии стоит заложить рост расходов на CI-ферму (систему автоматической сборки и тестирования) при внедрении нейросетевых помощников.
Частые вопросы
Галлюцинации нейросетей бывают только в коде?
Нет. Галлюцинация (когда модель уверенно выдаёт несуществующую информацию) встречается в любом типе контента: текстах, ответах на вопросы, юридических ссылках. В коде она опаснее тем, что может пройти компиляцию на одной платформе и упасть только на другой через дни.
Можно ли просто запретить нейросети в команде?
Автор разбора прямо говорит: запрет работает так же, как запрет Stack Overflow в 2010 году. Люди продолжают пользоваться, просто перестают признаваться. Проверки на уровне сборки и ботов надёжнее административных запретов.
Подходит ли описанная цепочка для небольшой студии?
Первые два шага (мультиплатформенная сборка и починка макросов) не требуют специальных инструментов и работают на стандартных компиляторах. Бот проверки имён сложнее: нужен ночной индекс и файл исключений. Для студии из пяти человек бот может оказаться избыточным, но сборка всеми тулчейнами сразу окупается на первом же пойманном выдуманном вызове.

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

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

Кому принадлежит код, который написал ваш ИИ-агент: промпт не считается творчеством
Промпт сам по себе не делает вас автором кода, который выдал ИИ-агент, и Пресненский суд Москвы уже показал это на деле с картинками, а с 1 марта 2027 года…
ИИ в 1С: $13 365 за полтора месяца, 94% ушло на скрытые расходы
Компания «Инфостарт» в начале июня опубликовала серию материалов о практическом применении ИИ в экосистеме 1С, и среди них оказались расчёт реальной стоимости…
Комментарии