AI-инжиниринг
Как работают LLM изнутри: токены, embeddings, attention
Цели урока
- Понять как LLM генерирует текст (autoregressive generation) и почему это объясняет галлюцинации
- Разобраться в токенизации (BPE, tiktoken) и почему она прямо влияет на стоимость
- Освоить embeddings: как смысл становится вектором и почему king - man + woman = queen
- Понять attention: Query-Key-Value, multi-head, KV-cache, FlashAttention
- Научиться выбирать temperature и sampling strategy для разных задач
Предварительные знания
- Карта AI-индустрии: модели, провайдеры и их различия
- Понимание роли AI Backend Engineer
2017 год. Google Brain. Восемь авторов публикуют paper на 15 страниц - "Attention Is All You Need". Через три года выходит GPT-3 с 175 миллиардами параметров, и few-shot learning возникает сам собой, без специального обучения. Одно правило: угадай следующий токен из 50 257 вариантов. Этот механизм сейчас пишет код в каждом редакторе планеты - и понимать его изнутри это разница между AI-магией и AI-инженерией.
- **GitHub Copilot** генерирует токен за токеном - autoregressive в реальном времени прямо в редакторе
- Русский промпт в 500 слов - примерно 1500 токенов; тот же текст на EN - примерно 600 токенов. Разница в цене - 2.5x
- **RAG в Perplexity**: документы как embeddings в Qdrant, cosine similarity при каждом запросе к 100M+ пользователей
- Собеседование на AI Engineer: "Объясни attention mechanism" - вопрос номер один во всех компаниях
Attention Is All You Need
2017 год. Google Brain. 8 авторов - Vaswani, Shazeer, Parmar, Uszkoreit, Jones, Gomez, Kaiser, Polosukhin. Один paper: **"Attention Is All You Need"**. До него - RNN и LSTM: текст обрабатывался последовательно, слово за словом. Долгосрочные зависимости терялись. Transformer уничтожил эту парадигму: все токены параллельно, через механизм self-attention. Обучение ускорилось на порядки. Через год - BERT. Ещё через год - GPT-2. 2020: Brown et al. опубликовали GPT-3 с 175B параметрами - и few-shot learning возник сам собой, без специального обучения. Из 8 авторов 6 ушли из Google и основали собственные стартапы: Aidan Gomez создал Cohere, Noam Shazeer - Character.AI (Google потом выкупил за 2.7 млрд долларов).
LLM - машина предсказания следующего слова
LLM не понимает текст. Она распределяет вероятности по 50 257 вариантам следующего токена. Каждый раз. На каждом шаге. И это работает.
**Large Language Model** - нейросеть, обученная на терабайтах интернет-текста. Одна задача: **предсказать следующий токен**. Не понять. Не запомнить. Предсказать - на основе статистических паттернов, встреченных миллиарды раз.
Затем "Париж" добавляется к контексту - и всё начинается снова. Следующий токен. Ещё один forward pass через все слои нейросети. Это называется **autoregressive generation**: каждый шаг строит на предыдущем, токен за токеном.
**Галлюцинации - не баг.** Это прямое следствие принципа работы. Модель генерирует правдоподобное продолжение, а не истинное. Если в обучающих данных тысячи раз встречалась фраза "Эйнштейн открыл теорию относительности в 1905" - она воспроизводит паттерн. Неважно, правда это или нет в данном контексте.
LLM генерирует ответ:
Токенизация: как текст превращается в числа
Нейросеть не работает с буквами. Ей нужны числа. Между текстом и нейросетью стоит **токенизатор** - и именно он определяет, сколько стоит каждый запрос.
Токен - не слово и не буква. Это **кусок текста**, оптимальный с точки зрения частотности. GPT-4 использует `cl100k_base` токенизатор с **50 257 токенами в словаре** - результат BPE (Byte Pair Encoding): алгоритм слияния частых пар символов до нужного размера словаря. Частые слова - один токен. Редкие - собираются из нескольких.
**Правило большого пальца:** 1 токен - примерно 4 символа на английском, примерно 1-2 символа на русском. Русские промпты "дороже" - за тот же объём текста тратится больше токенов, а платить придётся за каждый.
GPT-4o стоит USD 2.50 за миллион input-токенов. Кажется немного - пока не посчитаешь: 100 000 запросов по 500 токенов = 50M токенов = USD 125 в месяц только на input. Раздутые промпты с лишними пояснениями могут удвоить счёт.
| Модель | Input (за 1M токенов) | Output (за 1M) | Контекст |
|---|---|---|---|
| GPT-4o | USD 2.50 | USD 10.00 | 128K |
| GPT-4o-mini | USD 0.15 | USD 0.60 | 128K |
| Claude 3.5 Sonnet | USD 3.00 | USD 15.00 | 200K |
| Llama 3 70B (self-hosted) | ~USD 0.50 | ~USD 1.00 | 8K |
Текст на русском языке обычно занимает больше токенов чем аналогичный на английском потому что:
Embeddings: смысл как вектор
Число-токен поступает в нейросеть. Но число 15339 само по себе ничего не значит - нужно дать ему **смысл**. Для этого существует embedding layer: таблица, где каждому из 50 257 токенов сопоставлен вектор из чисел с плавающей точкой.
В GPT-2 это 768 чисел на токен. В GPT-3 - 12 288. В современных моделях - тысячи измерений. Эта таблица обучается вместе с остальной нейросетью: градиенты текут назад, каждое использование токена чуть-чуть сдвигает его вектор. Миллиарды микро-сдвигов - и структура языка закодировалась в геометрии пространства.
Это не феномен и не трюк. Это побочный эффект линейной алгебры на масштабе. Та же математика живёт в рекомендательных системах Spotify и Netflix - там треки и фильмы тоже представлены векторами, и "похожесть" - это косинусное расстояние. Один принцип, разные домены.
**Embeddings - основа RAG.** В Retrieval-Augmented Generation документы превращаются в вектора через `text-embedding-3-small` (1536 измерений) и кладутся в vector database (Qdrant, pgvector, Pinecone). Поиск - по cosine similarity. Модель получает найденный контекст и пересказывает его. Об этом - в уроке про RAG.
Cosine similarity между embeddings текстов "JavaScript - язык программирования" и "JS - ЯП для веба" будет:
Attention: как модель понимает контекст
Embeddings кодируют токены изолированно. Но "банк реки" и "банк денег" - одно слово, разный смысл. Статичные embeddings не различают их. Эта проблема не имела чистого решения - до появления механизма attention.
**Self-Attention** позволяет каждому токену "посмотреть" на все остальные и обновить своё представление с учётом контекста. Технически: для каждого токена считаются три вектора - Query, Key, Value. Q умножается на все K, результат - веса важности. Weighted sum по V - обновлённый embedding. Это один "головной" attention.
GPT-4 использует **multi-head attention**: не одна такая операция, а 96 параллельных "голов" на каждом из 120 слоёв. Каждая голова учится смотреть на разные аспекты - одна на синтаксис, другая на кореференцию, третья на факты. При inference хранятся **KV-cache** - чтобы не пересчитывать attention для уже обработанных токенов. Именно KV-cache делает длинные контексты дорогими по памяти.
**O(n²) по токенам.** Attention сравнивает каждый токен с каждым. 128K токенов контекста = 16 миллиардов пар. FlashAttention (используется в vLLM и большинстве инференс-серверов) оптимизирует это через tiling - вычисляет блоками, не материализуя полную матрицу. Но квадратичный рост памяти фундаментален - полностью не устраняется.
Зачем нужен механизм attention в Transformer?
Temperature и sampling: управление выводом
После всех слоёв нейросеть выдаёт вектор из 50 257 чисел - logits. Softmax превращает их в вероятности. Остался один вопрос: как выбрать токен? Взять самый вероятный (greedy decoding)? Или сэмплировать?
Greedy decoding детерминирован, но тупиковый: модель застревает в повторяющихся паттернах. Поэтому введён **temperature** - параметр, который масштабирует logits перед softmax. Меньше temperature - распределение острее (один вариант доминирует). Больше - равномернее (все варианты конкурентны). Temperature=1.0 - оригинальное распределение модели, то на чём она обучалась.
**top_p (nucleus sampling)** - альтернативный подход: берём минимальный набор токенов, чья суммарная вероятность >= p, и сэмплируем только из них. При `top_p=0.9` отрезаются редкие токены-аутсайдеры. **top_k** - ещё проще: оставляем только k самых вероятных. В production: не используй temperature и top_p одновременно - выбери что-то одно.
| Задача | Temperature | Почему |
|---|---|---|
| JSON extraction | 0 | Нужен точный, воспроизводимый результат |
| Классификация | 0 | Один правильный ответ |
| Чат-бот / ассистент | 0.5-0.7 | Разнообразно, но адекватно |
| Креативный текст | 0.8-1.2 | Нужна вариативность и неожиданность |
| Brainstorming | 1.0-1.5 | Максимум разнообразия идей |
**Для production:** начни с temperature=0 для всех задач. Увеличивай только если ответы слишком однообразны. Speculative decoding (используется в vLLM) позволяет ускорить inference до 3x: маленькая модель-драфтер предлагает несколько токенов, большая верифицирует пачкой - оба sampling режима совместимы.
При построении API, которое извлекает structured data (имя, email, телефон) из текста. Какой temperature выбрать?
LLM "знает" ответы - у неё есть база знаний
LLM воспроизводит статистические паттерны из обучающих данных. Нет базы данных - только веса нейросети
Это разница между поиском и генерацией. Google ищет - LLM генерирует правдоподобное продолжение. Именно поэтому модель уверенно выдаёт несуществующие ссылки: статистически "автор + название + год + URL" - это правдоподобный паттерн. RAG решает эту проблему: кладёт реальный контекст перед генерацией.
Temperature = случайность. Выше temperature - хуже ответы
Temperature управляет распределением вероятностей. Для разных задач нужны разные значения
При temperature=0 модель всегда выбирает самый вероятный токен. Это детерминировано, но может приводить к repetition loop. При temperature=1.0 сэмплируем из оригинального распределения модели - это то, на чём она обучалась. Значения выше 1.0 делают распределение более равномерным - полезно для brainstorming, опасно для фактических задач.
Ключевые концепции
- LLM = autoregressive token predictor: 50 257 вариантов, каждый шаг - один forward pass через всю нейросеть
- Токенизация (BPE, cl100k_base): токен != слово. Русский текст в 2-3x дороже английского в токенах
- Embeddings: вектора смысла. text-embedding-3-small = 1536 измерений, cosine similarity = семантическая близость
- Attention (QKV, multi-head, KV-cache): каждый токен видит всех. O(n²) - поэтому длинный контекст дорог
- Temperature + nucleus sampling: 0 для extraction, 0.7 для диалогов, 1.0+ для креатива
- От GPT-1 (117M параметров) до GPT-4 (~1.8T) - тот же принцип. Масштаб породил нечто похожее на интеллект
Вопросы для размышления
- Если LLM генерирует по одному токену - почему streaming API выглядит так плавно? Что происходит между каждым токеном?
- Embeddings позволяют искать по смыслу. Почему тогда поиск в Google до сих пор часто проигрывает RAG-системам по качеству?
- При temperature=0 модель детерминирована. Значит два одинаковых запроса всегда дадут одинаковый ответ?
Что дальше
Механизм понятен. Следующий шаг - управлять им через API и строить production-системы.
- Интеграция с LLM API — От теории к практике - подключаем GPT к Node.js
- Embeddings и Vector DB — Embeddings из этого урока - основа RAG и semantic search
- Токены и контекстное окно — Глубже про KV-cache, ограничения контекста и стратегии работы с ними
Связанные уроки
- aie-02-ai-landscape — Ландшафт моделей и провайдеров - фундамент для понимания LLM
- aie-04-tokens-context-window — KV-cache и лимиты контекста следуют из механики токенов
- aie-09-embeddings — Embeddings из этого урока - основа RAG и vector search
- aie-12-rag-fundamentals — RAG использует embeddings и attention механику напрямую
- nlp-01 — NLP-фундамент: токенизация и языковые модели пересекаются
- aie-06-prompt-patterns — Prompt engineering строится поверх понимания temperature и sampling
- dl-03 — Архитектура нейросетей - контекст для понимания Transformer слоёв
- ml-01