Инжиниринг искусственного интеллекта

- -
- 100%
- +
Практически это уже происходит. Китайские модели (Qwen, DeepSeek) используют токенизаторы, оптимизированные под китайский и английский одновременно, с балансировкой словаря. Русскоязычные модели (GigaChat, YandexGPT) тоже имеют свои особенности токенизации, хотя часто дообучаются поверх «английских» словарей. В специализированных моделях разница в «весе» между языками может быть сведена к минимуму или даже обращена в пользу локального языка.
Вывод для инженера
Если вы строите систему под русский язык и используете «английскую» модель - да, вы будете платить больше за токены. Но это не проклятие языка, а вопрос выбора инструмента. Существуют модели и токенизаторы, где русский «весит» столько же, сколько английский (к примеру, GigaChat и Saiga (адаптированная LLaMA)), а в некоторых случаях - даже меньше. Просто их нужно знать и уметь выбирать.
Давайте теперь посмотрим, как знание о токенах помогает считать бюджет.
Токенизация и опечатки: как модель видит ошибки
Мы только что разобрали, как токенизатор превращает текст в числа. Но что происходит, если в тексте есть опечатка? Для человека слово «следуюет» - это очевидная ошибка, мы её автоматически исправляем и понимаем смысл. Для модели всё иначе.
Посмотрим на примере
Слово: "следуюет" (опечатка, должно быть "следует")
Токены: [сле] [дую] [ет] или [с] [ле] [ду] [ю] [ет] (зависит от токенизатора)
Индексы: [1245] [7890] [3456]
Для модели это просто три числа: 1245, 7890, 3456. Она не знает, что это «неправильное слово». Она видит последовательность токенов, которые могут быть редкими (если опечатка встречается редко) или, наоборот, часто встречаться в корпусе (если люди часто делают эту ошибку).
Два сценария
Сценарий 1: Редкая опечатка
Если слово «следуюет» встречается в обучающих данных редко, токены, на которые оно разобьётся, будут иметь низкую вероятность. Модель может не понять контекст или дать странный ответ. Но если вокруг достаточно контекста, она может догадаться по соседним словам.
Сценарий 2: Частая опечатка
Если ошибка распространена (например, «вообщем» вместо «в общем»), токенизатор может даже выделить для неё отдельный токен. Такое слово становится для модели таким же «нормальным», как и правильный вариант. Она будет обрабатывать его как обычное слово, не подозревая, что это ошибка.
Я, как человек, увидел слово «следуюет» и автоматически сопоставил его с известным мне словом «следует», проигнорировав лишнюю букву «ю». У меня есть ментальная модель языка и знание, что такой ошибки быть не должно.
Модель же видит последовательность токенов. Если эта последовательность достаточно часто встречалась в обучении, она воспримет её как допустимый вариант. Если редко - может «растеряться». Но у неё нет «чувства правильности» - только статистика.
Практический вывод для инженера
При построении систем, которые общаются с пользователями, важно учитывать:
· Токенизатор не исправляет опечатки, он просто кодирует их
· Если ваш продукт работает с неграмотными текстами (чаты, соцсети), стоит подумать о предобработке - нормализации опечаток до токенизации
· Некоторые модели специально дообучают на текстах с ошибками, чтобы они лучше понимали реальных пользователей
Пример предобработки
Вход: "следуюет заменить"
Шаг 1: нормализация опечаток (опционально) → "следует заменить"
Шаг 2: токенизация → [сле] [дует] [за] [ме] [нить]
Без нормализации модель получит редкую последовательность токенов и может ответить хуже. С нормализацией - стандартную последовательность, с которой она училась работать.
Расход токенов и бюджет
Это критически важно для
· расчёта стоимости API (Application Programming Interface)2;
· планирования длины контекста (один и тот же текст на русском займёт больше токенов);
· выбора модели.
Итак, мы превратили текст в последовательность чисел-токенов. Но сами по себе эти числа - просто индексы, они ничего не говорят модели о смысле слов. Чтобы наделить их значением, нужен следующий шаг - эмбеддинги.
1.2 Эмбеддинги
В предыдущем разделе мы превратили текст в последовательность чисел - токенов. Но у этой победы есть обратная сторона: сами по себе эти числа [3245, 67, 8902, ...] ничего не говорят модели о смысле слов. Для компьютера 3245 и 8902 - просто разные индексы3, между которыми нет никакой связи. Как же объяснить машине, что «кот» и «кошка» - это почти одно и то же, а «кот» и «астероид» - нет? Здесь на сцену выходят эмбеддинги.
Эмбеддинги (Embeddings) - это способ объяснить искусственному интеллекту смысл слов на языке цифр.
1. Проблема
Компьютер не понимает слова
Для компьютера текст - это просто набор непонятных значков. Единственный язык, который он реально понимает, - это числа.
Самое простое, что пришло в голову учёным - это присвоить каждому слову номер:
Кот = 1
Собака = 2
Груша = 3
Яблоко = 4
ИИ видит: 1, 2, 3, 4.
В чём здесь проблема?
Для человека очевидно, что Кот и Собака - это животные (похожи), а Яблоко и Груша - это фрукты (тоже похожи).
Но для компьютера числа 1 и 2 - это такая же пара, как и числа 1 и 4. Просто цифры.
Для него «Кот» (1) так же далек от «Собаки» (2), как и от «Груши» (3). Смысл потерян.
Очевидно, что нужен способ не просто присвоить словам номера, а расположить их в пространстве так, чтобы близкие по смыслу слова оказались рядом.
2. Решение
Погружаем слова в «пространство смыслов»
Эмбеддинги решают эту проблему. Они превращают слово не в одно число, а в вектор - длинный список координат (как на карте).
Представьте себе огромное многомерное пространство. Условно, назовем оси этого пространства признаками:
Ось X: «Степень животности» (от -1 (предметность) до +1).
Ось Y: «Степень съедобности».
Ось Z: «Степень пушистости».
Теперь мы можем расставить слова по координатам:
Кот: (Животное: +0.9, Съедобность: -1.0, Пушистость: +0.8)
Собака: (Животное: +0.9, Съедобность: -1.0, Пушистость: +0.5)
Груша: (Животное: -1.0, Съедобность: +0.9, Пушистость: 0.0)
Яблоко: (Животное: -1.0, Съедобность: +0.9, Пушистость: 0.0)
Расстояния:
Кот <-> Собака = 0.3 (близко – похожи)
Кот <-> Груша = 2.3 (далеко – не похожи)
(На самом деле осей там сотни или тысячи, и смысл их гораздо сложнее, но суть та же).
3. Зачем это нужно ИИ?
Когда у каждого слова есть координаты, компьютер начинает видеть геометрию смысла: понимание похожести: Компьютер вычисляет расстояние между точками.
Кот и Собака находятся рядом в пространстве (потому что координаты похожи: оба животные).
Кот и Груша находятся далеко.
Вывод
Компьютер «знает», что кот и собака - это похожие понятия.
Но этим всё не ограничивается. Когда слова выстроены в пространстве, компьютер может не только определять их близость, но и находить направления смысловых переходов. Например, вектор от «плохого» к «хорошему» будет примерно одинаков для разных контекстов - будь то фильмы, погода или настроение. Это позволяет модели обобщать абстрактные понятия и переносить их из одной области в другую.
Важно
Это метафора для понимания принципа. В реальности у эмбеддингов сотни или тысячи измерений, и человек не может присвоить им осмысленные названия вроде «пушистость». Оси не интерпретируемы, важны лишь расстояния между точками.
Но эмбеддинги умеют не только группировать похожие слова. Самое удивительное свойство этого пространства - в нём можно выполнять арифметические операции, и они будут давать осмысленные результаты.
Аналогии (Математика смысла): с векторами можно производить математические операции. Если вы возьмете вектор слова «Король», вычтете вектор «Мужчина» и прибавите вектор «Женщина», вы получите вектор, ближайший к слову «Королева».
Формула выглядит так:
Король - Мужчина + Женщина = Королева.
Аналогия (векторная арифметика):
Король -> [0.8, 0.7, 0.3]
Мужчина -> [0.7, 0.6, 0.2]
Женщина -> [0.2, 0.7, 0.8]
-------------------------------------------------
Королева <- [0.3, 0.8, 0.9] (результат сложения/вычитания)
ИИ учится проводить такие аналогии, просто подбирая координаты.
Подведём итог: что же мы получаем, переводя слова в векторы?
Итог
Эмбеддинги нужны, чтобы перевести текст (который ИИ не понимает) в координаты точек на карте смыслов (потому что с ними можно считать и находить закономерности).
Благодаря им, нейросеть понимает, что:
«Кот» и «кошка» - это почти одно и то же.
«Хороший» и «плохой» - противоположности (векторы смотрят в разные стороны).
Для инженера
Размерность эмбеддингов (например, 4096) напрямую влияет на способность модели различать тонкие оттенки смыслов и на объём памяти, занимаемой моделью.
Итак, эмбеддинги решили проблему «слепоты» модели к смыслу отдельных слов. Теперь компьютер знает, что «кот» и «кошка» - близкие понятия. Но в языке важен не только смысл самих слов, но и их порядок. Фразы «кот укусил собаку» и «собака укусила кота» состоят из одних и тех же слов, но означают прямо противоположное. Как сообщить модели, что порядок имеет значение? Для этого существует следующий механизм - позиционное кодирование.
1.3 Позиционное кодирование (Positional Encoding)
Эмбеддинги наделили каждое слово смыслом, расположив их в пространстве так, что «кот» и «кошка» оказались рядом. Но в языке важен не только смысл самих слов, но и их порядок. Фразы «кот укусил собаку» и «собака укусила кота» состоят из одних и тех же слов, но означают прямо противоположное. Если мы просто сложим эмбеддинги, модель не увидит разницы. Как же сообщить ей, что порядок имеет значение?
Вектор токена сам по себе не содержит информации о его позиции в последовательности. Чтобы модель могла различать порядок слов, к эмбеддингам добавляют специальную метку - позиционное кодирование. Но как именно его реализовать? Здесь инженеры придумали несколько способов, и выбор между ними влияет на то, как модель будет работать с длинными текстами.
За годы развития трансформеров два метода стали самыми популярными - каждый со своей философией и областью применения. Познакомимся с ними поближе.
RoPE
Rotary Position Embedding / вращательное позиционное кодирование (используют в LLaMA, DeepSeek);
Это способ объяснить нейросети порядок слов, не теряя при этом связь между ними. Представьте, каждое слово - это бусинка, нанизанная на длинную нить (это ось предложения). Если мы просто повесим табличку с номером, бусинка так и останется бусинкой. При использовании Rotary мы начинаем закручивать каждую бусинку по мере удаления от начала нити. Первая бусинка чуть-чуть повернута, вторая - еще немного, третья - еще сильнее... В итоге все бусинки закручены в спираль вокруг основной нити.
Почему это круто для связи между словами?
Потому что поворот - это геометрическое свойство. Когда нейросеть смотрит на две бусинки (два слова), она видит не просто их «номера», а угол между ними. Чем дальше слова друг от друга, тем больше этот угол (потому что они сильнее закручены). Модель обучается реагировать на эти углы.
Например, внимание (Attention) модели может быть настроено так: «Мне нужно найти слово, которое повернуто относительно текущего ровно на определенный угол». Это математически эквивалентно фразе «найди слово через два слова слева».
Как это работает
Проблема
Трансформер (мозг GPT) видит все слова сразу. Если не отметить позицию, для него фраза «Мальчик ударил мяч» и «Мяч ударил мальчика» будут одинаковыми.
Обычные методы
Просто добавляют число к смыслу слова (позицию). Это работает, но нейросеть со временем «забывает» числа и путается в длинных текстах.
RoPE (Вращение)
Вместо того чтобы приписывать цифру, RoPE поворачивает вектор смысла слова. Чем дальше слово от начала, тем сильнее оно повернуто вокруг своей оси.
Почему это гениально?
Относительность
Нейросеть видит не только, что слово стоит на 5-м месте, но и угол поворота между словами. Это позволяет ей легко понимать зависимость между «далекими» словами (например, если в начале предложения было "он", а в конце - "потому что").
Затухание
Вращение устроено так, что очень далекие слова «перекручиваются» и их влияние ослабевает (как в реальной жизни - первые слова уже слабо влияют на конец огромной книги).
RoPE - это хитрый способ накрутить на вектор слова спиральку, которая показывает его место в предложении, чтобы нейросеть понимала не только ЧТО сказано, но и в каком ПОРЯДКЕ.
Формула расчета угла поворота
angle_diff = (pos2 - pos1) / (10000 ^ (2i / d)), где

ALiBi
Attention with Linear Biases / внимание с линейными смещениями.
Еще один способ объяснить нейросети порядок слов, но работает он проще и эффективнее, чем сложное вращение RoPE.
Суть одной фразой
ALiBi наказывает далекие слова, вычитая из их «внимания» штраф, который растет пропорционально расстоянию.
Как это работает
Проблема
Нейросеть (трансформер) пытается понять связь между словами. Связь между близкими словами (например, «я» и «пошел») обычно сильнее, чем между далекими.
Механизм
Когда модель смотрит на два слова и решает, насколько они связаны, ALiBi просто вычитает число из оценки этой связи.
Если слова стоят рядом - штраф маленький (почти ноль).
Если между ними 10 слов - штраф побольше.
Если между ними 1000 слов - штраф огромный, модель понимает: «Они слишком далеко, забудь».
Почему это круто?
Длинные тексты
ALiBi помогает модели работать с очень длинными текстами, потому что она «знает»: на каждый шаг расстояния связь ухудшается.
Простота
Не нужно сложных математических преобразований (вращений), как в RoPE. Просто берем и уменьшаем внимание к дальним словам.
ALiBi - это как линейка, которой модель бьет по рукам за попытку обращать слишком много внимания на слова, которые находятся далеко в тексте. Штраф растет ровно и предсказуемо (линейно), отсюда и название.
RoPE vs ALiBi
RoPE (вращательное кодирование):
Слова закручиваются по спирали, угол поворота = позиция
[Кот]⁰° [съел]⁹⁰° [мышь]¹⁸⁰°
●────────●────────●
(чем дальше, тем больше поворот)
ALiBi (линейные смещения):
Внимание штрафуется за расстояние
Вес внимания = исходная_оценка - расстояние × штраф
Кот → съел: вес 0.9 - 1×0.1 = 0.8
Кот → мышь: вес 0.3 - 2×0.1 = 0.1
Итак, мы добавили к словам информацию об их порядке. Теперь модель знает, кто за кем стоит. Но этого всё ещё недостаточно, чтобы понимать сложные связи между словами. Предложение «кот укусил собаку» - это не просто последовательность слов, это история про то, кто совершил действие, а кто его испытал. Чтобы уловить эти отношения, нужен следующий, самый важный компонент трансформера - механизм самовнимания.
1.4 Механизм самовнимания (Self‑Attention)
Мы наделили слова смыслом с помощью эмбеддингов, указали их порядок через позиционное кодирование, но модель до сих пор не понимает, как слова связаны между собой в предложении. Кто на кого влияет? Какое слово уточняет смысл другого? Без ответов на эти вопросы текст останется для модели просто набором независимых элементов. Механизм самовнимания - это первый шаг к тому, чтобы слова начали «общаться» друг с другом.
Каждый токен «смотрит» на все остальные и вычисляет, насколько они важны для его собственного представления. Но как один токен может «смотреть» на другой? Ведь у него нет глаз. В мире нейросетей это выглядит как математическая операция, для которой каждому слову выдаются три специальные роли:
Q - query (запрос) - что я ищу?
K - key (ключ) - что я могу дать?
V - value (значение) - какую информацию я несу?
Q, K, V - звучит загадочно, почти как код к сейфу. Но на самом деле за этими буквами скрывается простая и элегантная логика, которую легко понять на примере онлайн-кинотеатра.
Представьте, что вы зашли на Netflix и ищете, что посмотреть вечером. Ваш поисковый запрос - это Q (что я хочу?). Вы вводите «комедии с Адамом Сэндлером». Система смотрит на карточки фильмов - это K (ключи): у каждой карточки есть жанр, актёры, год выпуска. Она ищет карточки, которые лучше всего соответствуют вашему запросу. А когда нужные фильмы найдены, вы получаете доступ к их содержимому - это V (значения), то есть сами фильмы, которые можно смотреть.
Теперь представьте, что на сайт зашли одновременно миллионы пользователей. Каждый пользователь (Q) ищет своё, сравнивая свой запрос со всеми карточками фильмов (K). Самые подходящие фильмы (V) система рекомендует каждому. Именно это и происходит в механизме внимания - только вместо пользователей у нас токены, вместо карточек - их ключи, а вместо фильмов - их значения. И все эти сравнения происходят одновременно, за один вычислительный проход.
Разница лишь в том, что в кинотеатре пользователи конкурируют за внимание системы, а в механизме самовнимания каждый токен одновременно является и пользователем (ищет), и карточкой (описывает себя), и фильмом (несёт содержание).
В мире нейросетей всё работает точно так же, только вместо миллионов сайтов у нас - слова в предложении, а вместо поисковика - механизм внимания, который выполняется за доли секунды на GPU (подробно рассмотрено в главе 5.4).
Чтобы превратить нашу метафору в работающий алгоритм, нужно записать её на языке математики.
Технический уровень
Внимание ( Attention(Q, K, V) ) - это взвешенная сумма значений V, где веса определяются сходством Q и K.
Математически
Attention ( Q , K , V ) = softmax (( Q · K ^ T ) / √ d ₖ) · V
Q · Kᵀ (Скалярное произведение)
Мы берем матрицу всех запросов (Q) и умножаем на матрицу всех ключей (K), транспонированную набок. На выходе получается матрица «совместимости» или «сырых весов». На пересечении слова *i* и слова *j* стоит число: насколько запрос слова *i* похож на ключ слова *j*.
/ √dₖ (Масштабирование)
Делим результат на корень из размерности ключей. Это нужно, чтобы числа не были слишком большими и не забили градиент при обучении.
softmax (Нормализация)
Превращаем полученные числа в вероятности, которые в сумме дают 1. Это и есть итоговые веса внимания (например, слово «банка» решило, что на 70% нужно смотреть на слово «открыла», на 20% на «положила», а на 10% на всё остальное).
· V (Умножение на значения)
Умножаем эти вероятности на матрицу значений (V). По сути, мы берем содержимое слов, умножаем на их важность и суммируем.
Результат
Для каждого слова мы получаем новый вектор, который вобрал в себя смысл контекста. В генеративных моделях (Decoder-only) внимание считается только к прошлым токенам, чтобы модель не «подглядывала» в будущее. Это критически важно для понимания разницы с энкодерами и называется каузальным вниманием (causal attention).
Сухие цифры и проценты - это хорошо, но давайте посмотрим на живую картину. Как реально выглядят эти веса внимания в работающей модели? Возьмём простое предложение и заглянем ей в голову.

Цветовая легенда
Красный (>0.5) - сильная связь
Желтый (0.2-0.5) - средняя связь
Синий (<0.2) - слабая связь
Что мы видим:
"Она" и "бросила" - сильная связь (подлежащее-глагол)
"ей" и "Она" - сильная связь (оба об одном человеке)
"мяч" и "бросила" - сильная связь (глагол-объект)
Итак, мы разобрали, как слова общаются внутри одного слоя внимания. Но в настоящем трансформере таких слоёв не один, а десятки - от 32 до 128 и больше. Каждый следующий слой получает на вход результат работы предыдущего и строит всё более сложные абстракции. Первый слой видит только отдельные слова и их простые связи. Десятый слой уже понимает роли в предложении - кто действует, на кого направлено действие. Тридцатый слой способен уловить настроение текста, иронию, скрытые смыслы.
Но внимание - не единственный компонент в этом конвейере. Между слоями происходят и другие важные операции, которые помогают модели не забывать прошлое и глубже перерабатывать информацию. Как устроен этот конвейер целиком и зачем нужны все его детали - разберём в следующем разделе.
1.5 Трансформерные блоки (Transformer Blocks)
В предыдущем разделе мы увидели, как слова общаются друг с другом внутри одного механизма внимания. Но в реальном трансформере такой «разговор» происходит не один раз, а многократно - и каждый раз с разных точек зрения. Больше того, одного внимания недостаточно: услышанное нужно осмыслить, переработать и передать дальше. Именно так устроен трансформерный блок - базовый «станок» на конвейере производства смысла. Сырье заходит с одной стороны (просто числа - токены), а на выходе получается готовое «понимание» контекста.



