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

Вопрос, с которого всё началось

Когда LLM отвечает вам, она выдаёт токены — кусочки слов. Слева направо, по одному. Но до того, как родился токен, внутри сети прокатывается волна чисел — скрытые состояния, 3584 числа на каждом слое, 28 слоёв. Вопрос, который не давал мне покоя: А есть ли там, под токенами, свой язык? Не английский, не код — а язык мыслей?

Интуиция говорила «да». Инженерный подход требовал доказать. Не «мне кажется», а: найти конкретный концепт, доказать, что он причинно управляет поведением, и прочитать его.

Ручка громкости для мыслей

Возьмём конкретную «мысль»: фазу «сначала проверь, потом действуй» (verify). Хороший инженер, прежде чем чинить баг, сначала запускает тесты. Есть ли внутри модели «направление», отвечающее за это? Способ проверить называется activation steering. Берём два набора задач «проверочные» и «прямые», смотрим, чем отличаются скрытые состояния, и получаем вектор-направление. А потом вживляем его обратно в модель во время генерации и смотрим, изменится ли поведение. Если изменится сильнее, чем от случайного вектора той же длины, — мы нашли настоящую ручку.

На маленьких моделях (0.5B, 3B) ручки нет — крутишь, ничего осмысленного. А вот на 7B появляется чистая знаковая ось: — модель начинает «сначала проверять», −α — рубит с плеча. Эффект специфичный: случайные и ортогональные векторы той же длины так не умеют (steer на 8 сигм вне случайного шума). Значит, способность думать о «проверке-перед-действием» как об отдельной управляемой сущности эмерджентна, она рождается с масштабом.

Слово, которого не было там, где я искал

Окей, ручка есть. Но я хотел прочитать мысль. У трансформера для этого есть готовый декодер: матрица lm_head которая превращает скрытое состояние в токены. Приём называется logit lens: умножаешь вектор-мысль на lm_head и смотришь, какие слова загораются. Я взял своё verify-направление со слоя 18 (там, где ручка работает), спроецировал — и получил мусор. Случайные обрывки кода, иероглифы без смысла. Проверил, не баг ли у меня: взял реальное скрытое состояние и спросил — а какой токен модель тут реально сгенерировала следующим? Слой 18 угадал 0 из 40.

Вывод оказался важнее провала: на середине стека мысль ещё не записана словами. Слой 18 до-лексичен. Концепт там есть и причинно работает, но он не «текст», он - абстракция. Ручка крутит смысл, который ещё не проговорён.

Развязка: читаем по слогам на последнем слое

Если мысль становится словами позже — надо смотреть туда, ближе к выходу. Я взял последний слой (27-й), где logit lens уже не приближение, а ровно та арифметика, которой модель сама выбирает токен. Проверка: на последнем слое реальный следующий токен угадывается 15 из 15. Декодер честный. Посмотрел, какие токены ручка (к verify) продвигает по сравнению с нейтральной генерацией. Вот мыслеобраз verify, прописанный токенами:

Смысловой кластер | Токены, которые загорелись

before / first | Before, @Before, before, , まずは, 먼저, 第一步

preliminary / initial | preliminary, prelim, Initial, 初步, 先行, 前置

assess / gather / confirm | Assess, Gathering, Understanding, 确认, 准备工作

А подавляет ручка — change, modify, 修改, different: «просто меняй напрямую».

Концепт «сначала, предварительно, оцени, подготовься, подтверди прежде чем действовать» загорелся одновременно на четырёх языках: английском, китайском, японском, корейском. И отдельно — @Before, аннотация из JUnit «выполнить перед тестом».

Это не токен. Это мыслеобраз

«Слово» внутри модели не один токен, и не одно слово какого-то языка. Это концепт, завязанный на целое облако токенов-кандидатов, мыслеобраз, если хотите. Дальше работает контекст: из облака кандидатов один токен перетягивает одеяло на себя. Его выбирают «боковые концепты», то есть всё, что модель уже сказала вокруг.

Это и есть softmax с вниманием: распределение-облако схлопывается в одно слово под весом контекста. А середина стека, где концепт живёт абстрактно и ещё не проговорён, — это, по сути, уже встроенный JEPA (Joint Embedding Predictive Architecture — идея Яна ЛеКуна о том, что думать надо в пространстве смыслов, а не в пространстве пикселей и букв). Никто не вставлял в модель отдельный JEPA-модуль — она в процессе обучения вырастила слой, где предсказание идёт в пространстве абстрактных концептов, и только потом рендерит их в токены. Мысль сначала образ, и лишь у выхода речь.

Что это значит

У большой модели есть слой смыслов, не привязанный к конкретному языку. Verify — это не слово «verify», это идея «сначала-удостоверься», и она одна на все языки. Этой идеей можно причинно управлять — она настоящая сущность, а не выдумка. Идея до-лексична в середине и проявляется в речь к выходу:  «мысль → образ → слово».

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

Как это проверить самому

Нужны: открытая модель (я брал Qwen2.5-Coder-7B), её матрица lm_head, пара десятков контрастных промптов на любую «фазу» и сто строк кода, чтоб собрать направление, вживить хук, спроецировать последний слой.

На эксперимент потрачено пару вечеров за клодом и около тысячи рублей на аренду vps с gpu. Я не открыл Америку, просто хотел разобраться самостоятельно. Опубликовал результат на хабре, чтоб следующий человек, задавшийся вопросом "Существует ли у LLM собственный язык?" наткнулся на эту статью и мог начать своё исследование не с нуля)