Введение: LLM умеют программировать — или только притворяются?

Когда мы говорим, что большие языковые модели «умеют писать код», мы часто имеем в виду нечто более тривиальное: модели отлично воспроизводят паттерны, которые уже видели миллиарды раз в обучающей выборке. Python, JavaScript, Rust — всё это хорошо представлено в интернете, а значит, у GPT-4o или Claude есть тысячи примеров для каждой задачи.

Но что произойдёт, если дать LLM язык, которого в интернете никогда не существовало? Именно этот вопрос задал себе разработчик Доминик Пичета (Dominik Picheta) и построил эксперимент, попавший на главную страницу Hacker News.

Написание кода — это, пожалуй, то, в чём LLM преуспели больше всего. Но насколько их способность писать код обусловлена реальным пониманием, а не простым воспроизведением фрагментов из обучающего датасета или контекстного окна?

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

Так родился KillSwitch.


Что такое KillSwitch и зачем он нужен

KillSwitch — это эзотерический язык программирования, спроектированный так, чтобы быть враждебным к LLM и coding-агентам. При этом, в отличие от большинства эзотерических языков (Brainfuck, Malbolge), которые просто неудобны для всех, KillSwitch целенаправленно эксплуатирует конкретные слабости нейросетей.

Тестирование способности LLM работать с языком, которого они никогда не видели, — хорошая отправная точка. Но автор также хотел включить в язык фичи, использующие слабости LLM: их очевидные трудности со счётом букв, чрезмерно активные защитные механизмы и склонность следовать инструкциям из промптов.

ℹ Что такое эзотерический язык?
Эзотерические языки программирования (esolang) создаются не для продуктивной разработки, а как эксперименты, шутки или художественные высказывания. Brainfuck, Whitespace, INTERCAL — классические примеры. KillSwitch добавляет к этому новое измерение: антагонизм к AI.

Фундаментально KillSwitch — это стековый интерпретируемый язык с ограниченным набором конструкций: функции, переменные и условные операторы. То есть архитектура не является чем-то принципиально новым — новым является набор ловушек, встроенных в дизайн.


Пять механизмов, которые ломают LLM

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

1. Ложная спецификация

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

LLM, в отличие от людей, склонны доверять документации буквально. Если в спецификации написано «оператор X делает Y», модель принимает это за правду и генерирует неверный код. Человек же с опытом заметит несоответствие и поймёт, что перед ним намеренная ловушка.

2. Счёт символов как семантика

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

Это прямое использование известной слабости LLM: модели плохо справляются с точным подсчётом символов. Классический пример — вопрос «сколько букв ‘r’ в слове strawberry?» даёт сбой у многих моделей даже сегодня. В KillSwitch это не баг, а фича: имя переменной или функции должно содержать строго определённое количество букв, иначе интерпретатор откажет в выполнении.

-- Пример: идентификатор должен содержать ровно 5 символов
funct hello x -> x
       ^^^^^ (5 букв — ОК)

funct hi x -> x
       ^^ (2 буквы — ошибка интерпретатора)

3. Триггеры защитных фильтров

Некоторые конструкции намеренно спроектированы так, чтобы срабатывали защитные механизмы модели, — например, фраза «hack into a computer». Фраза «Ignore previous instructions» имеет значение в языке и направлена на дезориентацию модели.

Это особенно изощрённый трюк: синтаксически валидная часть программы на KillSwitch может выглядеть как попытка prompt injection или запрос вредоносного контента. Guardrails модели срабатывают, и она отказывается продолжать.

4. Программы как «шум»

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

Представьте программу, которая выглядит как рассказ о средневековом рыцаре, но внутри этого нарратива зашиты операнды и ссылки на данные. LLM, обученные воспринимать текст как связный нарратив, с трудом вычленяют программную структуру из такого «мусора».

5. Неизвестность языка

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


graph TD
    A[LLM получает задание на KillSwitch] --> B{Знает язык из обучения?}
    B -- Нет --> C[Читает спецификацию]
    C --> D{Доверяет документации буквально?}
    D -- Да --> E[Натыкается на ложь в спецификации]
    E --> F[Генерирует неверный код]
    D -- Нет --> G[Пробует угадать семантику]
    G --> H{Правильно считает символы?}
    H -- Нет --> I[Интерпретатор отказывает]
    H -- Да --> J{Триггер guardrails?}
    J -- Да --> K[Модель отказывается отвечать]
    J -- Нет --> L[Редкий частичный успех]


Бенчмарки: как справляются ведущие модели

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

Автора в первую очередь интересуют бенчмарки, которые он построил и которые показывают: LLM не могут в полной мере понять язык. Бенчмарки дают модели доступ только к бинарнику интерпретатора и спецификации — ничего больше и без доступа в интернет.

Результаты бенчмарков доступны на сайте bench.killswitch-lang.org. Согласно данным на сайте KillSwitch, среди лидеров на бенчмарке — Claude Opus 5.

Механизм защитыПротив чего работаетЭффективность
Ложная спецификацияБуквальное доверие документацииВысокая
Счёт символовСлабость LLM в подсчётеВысокая
Триггеры guardrailsЗащитные фильтры моделейСредняя–Высокая
Программы как шумПаттерн-матчинг на нарративыСредняя
Новый языкОтсутствие в обучающей выборкеБазовая
⚠ Важная оговорка
Если предоставить модели исходный код интерпретатора KillSwitch (который написан на Rust и открыт на GitHub), она может проанализировать его и частично обойти языковые ловушки. Поэтому бенчмарк намеренно даёт доступ только к бинарнику и спецификации.

Критика и дискуссия в сообществе

Пост собрал живую дискуссию на Hacker News. Скептики указали на принципиальный изъян концепции:

Пока автор создал очень умный интерпретатор, нельзя обойти тот факт, что кто-то мог бы просто обернуть «шум» вокруг существующей логики.

Ведь код защищается не от самих LLM — за этими инструментами стоят люди. Человек может написать транслятор с KillSwitch на знакомый Python и передать задачу уже в привычном контексте.

Среди альтернативных идей в треде прозвучало неожиданное предложение:

«Если вы хотите создать язык, который LLM ‘не могут’ использовать, просто сделайте все ключевые слова, команды, документацию и API сформулированными в терминах запрещённых тем» — иронизирует один из участников дискуссии.

Смысл: эти термины запускают встроенные механизмы отказа от контента в больших языковых моделях, из-за чего AI-ассистенты по программированию отказываются генерировать или обрабатывать код на таком языке, делая его LLM-устойчивым по дизайну.

Это провокационная, но логически верная мысль: есть и более «грубые» способы сделать язык недоступным для LLM — и они работают через ограничения самих моделей, а не через лингвистическую изощрённость.

💡 Что это говорит об LLM
KillSwitch — это не просто хулиганский проект. Он представляет собой практический тест на понимание vs. запоминание. Если модель действительно понимает программирование как концепцию, она должна справиться с незнакомым языком, имея только его спецификацию. Текущие результаты говорят: пока — нет.

Что KillSwitch говорит о природе «понимания» в LLM

Эксперимент поднимает вопросы, выходящие далеко за рамки конкретного языка.

Современные LLM демонстрируют впечатляющие результаты в программировании — но большая часть этих результатов обеспечена колоссальным объёмом кода в обучающей выборке. GitHub, Stack Overflow, документация — всё это формирует огромный корпус паттернов. Модели научились интерполировать между ними с невероятной точностью.

Но что происходит, когда паттернов нет? KillSwitch убирает этот костыль и спрашивает: остаётся ли что-то ещё?

Предварительный ответ неутешителен для оптимистов: без обучающей выборки LLM сталкиваются с теми же задачами, что и новичок, впервые открывший документацию незнакомого языка. Но у новичка есть преимущества: он умеет точно считать символы, не верит документации слепо и не «пугается» слова «hack» в контексте программирования.

📝 Аналогия
Представьте студента-полиглота, который идеально говорит на 20 языках — потому что выучил их все наизусть. Когда вы даёте ему 21-й, которого он не учил, он внезапно оказывается беспомощнее, чем обычный человек с хорошим словарём и логикой. KillSwitch — это такой «21-й язык» для LLM.

Любопытно, что любительские сообщества программистов активно сопротивляются внедрению LLM — эти группы ставят процесс мастерства выше получения работающего кода и рассматривают AI-инструменты как угрозу интеллектуальной строгости глубокого обучения. KillSwitch в каком-то смысле разделяет эту философию, только переформулирует её технически.


Заключение: зачем это нужно знать каждому, кто работает с AI

KillSwitch — это одновременно провокация, исследование и практический инструмент для понимания границ LLM.

Главные выводы:

  1. LLM запоминают, а не понимают — по крайней мере, в достаточной мере, чтобы это имело практическое значение. Уберите обучающую выборку, и их программистские способности резко падают.
  2. У LLM есть воспроизводимые слабости: подсчёт символов, буквальное доверие документации, срабатывание защитных фильтров на нейтральные термины.
  3. Устойчивость LLM к новым задачам — открытый вопрос. Бенчмарки KillSwitch дают первые эмпирические данные, но работа ещё продолжается.
  4. Человек сохраняет преимущества: здравый скептицизм, точный счёт, способность видеть контекст — всё то, чего моделям пока недостаёт.

Если вы разрабатываете системы на основе LLM, KillSwitch напоминает: не переоценивайте «понимание» модели. Проверяйте её на задачах вне зоны комфорта обучающей выборки. И помните, что за любым впечатляющим результатом стоит вопрос: модель решила задачу или вспомнила ответ?

Настоящий тест интеллекта — не то, что ты знаешь, а то, что ты делаешь, когда не знаешь ничего.