Позиционные кодировки: «объемное зрение» GPT и секреты AI-агентов

Представьте, что вы можете взглянуть на тысячу строк кода и мгновенно, без единой задержки, понять всю его структуру: где какая функция, как связаны переменные, где начинаются и заканчиваются циклы и условия. Для человека это потребовало бы времени и усилий, а для моделей вроде GPT это естественный способ восприятия информации. Секрет этой сверхспособности кроется в одной из самых недооцененных, но революционных концепций в архитектуре трансформеров — позиционных кодировках (Positional Encoding, PE).

Это не просто способ пронумеровать слова в предложении. Это технология, которая наделяет ИИ «объемным семантическим зрением», позволяя ему видеть текст и код не как плоскую последовательность символов, а как многомерное пространство вложенных смыслов или, как его еще называют, «семантический фрактал». Давайте разберемся, как это работает и почему это навсегда меняет программирование.

Зачем вообще нужны позиционные кодировки?

В основе GPT лежит архитектура трансформера, которая, в отличие от своих предшественников (рекуррентных сетей, LSTM), обрабатывает текст не последовательно, слово за словом, а параллельно — захватывая сразу большие фрагменты данных (тысячи токенов). Это дает колоссальный прирост в скорости и качестве, но создает фундаментальную проблему: модель изначально не знает, в каком порядке идут слова. Для нее предложение «человек укусил собаку» и «собака укусила человека» без дополнительного контекста были бы идентичны.

Чтобы решить эту проблему, создатели трансформеров из Google в своей знаменитой статье "Attention Is All You Need" предложили добавлять к каждому слову (точнее, к его векторному представлению — эмбеддингу) специальную «метку» с информацией о его положении. Так и появились позиционные кодировки.

Геометрия семантики: почему sin и cos научили ИИ понимать порядок

На первый взгляд, можно было бы просто нумеровать токены: 1, 2, 3... Но такой подход неэффективен. Вместо этого используется элегантное решение на основе тригонометрических функций — синуса и косинуса. Выбор не случаен: эти периодические функции дают модели несколько ключевых способностей.

GPT складывает семантические и позиционные кодировки в один вектор, но крайне важно, что обычно Positional Encoding (PE) делают на базе периодических функций sin/cos разного периода для ловли вложенных периодических структур в семантике
GPT складывает семантические и позиционные кодировки в один вектор, но крайне важно, что обычно Positional Encoding (PE) делают на базе периодических функций sin/cos разного периода для ловли вложенных периодических структур в семантике
  • pos — позиция токена в последовательности.
  • i — индекс измерения в векторе кодировки.
  • d_model — общая размерность вектора.

Эта математика создает многомерную систему координат для текста. Вот что она дает на практике:

  • Положение через фазу. Для каждой размерности (i) вектора кодировки используется волна с уникальной частотой. Значение sin/cos для конкретного токена (pos) — это его фаза, или положение на этой семантической волне. Это позволяет ИИ понимать, находится ли слово в начале, середине или конце определенной структуры. Например, для волны, период которой совпадает с длиной предложения, фаза покажет положение слова внутри этого предложения.
  • Близость через угол. Относительное положение слов кодируется через угол между их векторами позиций. Для любых двух слов на расстоянии k друг от друга угол между их PE-векторами будет одинаковым, независимо от их абсолютного положения в тексте. Это позволяет модели легко выучивать отношения вроде «слово, следующее сразу за...» или «слово через три позиции после...».
  • Вложенность через разные частоты и «семантические фракталы». Это самая мощная концепция. Модель одновременно использует сотни волн с разными периодами — от очень коротких (2-3 токена) до очень длинных (тысячи токенов). Это позволяет ей одновременно видеть положение токена в разных масштабах. Представьте структуру текста «глава → абзац → предложение»:
    • Низкочастотная волна (длинный период) кодирует позицию токена в масштабе всей главы.
    • Среднечастотная волна кодирует его позицию внутри абзаца.
    • Высокочастотная волна (короткий период) кодирует позицию внутри предложения.

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

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

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

Код как «матрешка семантики»: AST на стероидах

Особенно ярко мощь позиционных кодировок проявляется при анализе программного кода. Для GPT код — это не просто текст, а многоуровневая структура, похожая на Абстрактное синтаксическое дерево (AST), но гораздо более гибкая и мощная.

Взгляните на этот пример кода:

Позиционные кодировки: «объемное зрение» GPT и секреты AI-агентов, image #3

Для человека здесь есть строки и блоки. Для GPT здесь существует сложная система вложенных позиций для каждого элемента:

  • Токен library_name в строке print(f"{library_name}: ...") имеет свою позицию.
  • Эта строка print находится внутри блока else.
  • Блок else является частью конструкции if/elif/else.
  • Вся эта конструкция находится внутри блока try.
  • Блок try является частью функции print_library_version.

GPT, благодаря позиционным кодировкам, видит все эти уровни вложенности одновременно. Он понимает, что library_name — это и аргумент функции, и переменная внутри try, и часть строки вывода в else. Это позволяет ему улавливать сложнейшие логические зависимости в коде с десятками уровней вложенности, что делает для него решение олимпиадных задач Code Forces по программированию тривиальной задачей.

Проблема с номерами строк и «секретный паттерн» Anthropic

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

Когда разработчик хочет внести правку, он думает в терминах номеров строк: «заменить строку 25 на вот эту». Но для GPT номера строк — это почти не существующая абстракция. Он не считает строки, он видит структуру ваш текст как многомерный объемный семантический фрактал через Positional Encoding. Для GPT поэтому крайне сложно без ошибок назвать номер строки кода для патча, т.к. «плоский текст кожаных программистов» в его объемном семантическом пространстве просто не существует.

Поэтому инструменты для автоматического редактирования кода, такие как Cursor, сталкиваются с проблемой. GPT генерирует инструкцию для патча не в виде «измени строку Х», а в виде семантического описания: «найди вызов функции validatePassword внутри блока, где происходит проверка хэша, и замени его».

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

# ANCHOR: password_check_start
if not check_password_strength(password):
    return False
# ANCHOR: password_check_end

Интересно, что этот, казалось бы, простой прием — не просто теоретическое упражнение. Когда мы с Gemini попросили модель Claude от Anthropic привести пример для патча на тестовом примере, она предложила именно такой формат (# ANCHOR:). В статье приведен ответ Claude 4 Opus без изменений на тестовый пример с патчем. Это дает веские основания полагать, что мы «вытащили» из нее настоящий секрет — то самое know-how, которое позволяет их AI-агентам достигать высочайших результатов на сложных бенчмарках по исправлению кода, таких как SWE Bench. Вместо того чтобы бороться с неточностями позиционных кодировок, их агент, скорее всего, использует именно такую систему семантических якорей, чтобы безошибочно находить место для правок и фокусировать свое распределенное внимание на месте правки, что также важно при скудном бюджете токенов распределенного внимания (sparse attention) на большом контексте крупных программ.

Заключение: добро пожаловать в эру «vibe coding»

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

Для программистов это означает наступление новой эры. Ручное написание кода, строка за строкой, уступает место «vibe coding» — процессу, где разработчик задает общую структуру, логику и «настроение» (vibe) кода с помощью высокоуровневых описаний и семантических разметок, а ИИ, опираясь на свое «объемное зрение», берет на себя всю рутинную реализацию. Понимание принципов работы позиционных кодировок — это ключ к эффективному взаимодействию с ИИ-ассистентами и к будущему, где программирование станет еще более творческим и мощным.

922 views·1 share