← The Practical AI Product Engineering Playbook
01 / 10 · 60 min

How a modern LLM works: tokens, embeddings and inference

What the model sees as tokens, how the context window works, what embeddings are, and why inference is a probabilistic next token rather than a knowledge-base lookup.

Lesson content is currently available in Russian.

What you will learn

  • →Понимать токенизацию, embeddings и контекстное окно, включая их влияние на стоимость.
  • →Объяснять, почему sampling меняет результат без изменения знания модели.
  • →Отделять обучение модели от её инференса и понимать механизм галлюцинаций.

Токены и контекстное окно

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

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

Практические следствия, которые нужно держать в голове при проектировании:

  • Стоимость считается отдельно за input и output токены, причём output обычно в 3–5 раз дороже. Длинный системный промпт вы оплачиваете при каждом запросе.
  • Контекстное окно (128K, 200K, до 1M токенов у разных моделей) — это жёсткая граница: всё, что не влезло, модель просто не видит.
  • Заполнять окно под завязку — антипаттерн: исследование «Lost in the Middle» показало, что модели заметно хуже используют информацию из середины длинного контекста, чем из начала и конца.

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

import tiktoken
enc = tiktoken.get_encoding('o200k_base')
samples = {
    "EN": "Artificial intelligence helps teams solve complex problems.",
    "RU": "Искусственный интеллект помогает командам решать сложные задачи.",
    "UK": "Штучний інтелект допомагає командам розв’язувати складні завдання.",
    "ZH": "人工智能帮助团队解决复杂问题。",
    "ES": "La inteligencia artificial ayuda a los equipos a resolver problemas complejos.",
    "FR": "L’intelligence artificielle aide les équipes à résoudre des problèmes complexes.",
    "DE": "Künstliche Intelligenz hilft Teams, komplexe Probleme zu lösen.",
    "PT": "A inteligência artificial ajuda as equipes a resolver problemas complexos.",
    "JA": "人工知能はチームが複雑な問題を解決するのに役立ちます。",
    "KO": "인공지능은 팀이 복잡한 문제를 해결하는 데 도움을 줍니다.",
}
for language, text in samples.items():
    print(language, len(enc.encode(text)))
# tiktoken 0.9.0: EN 8, RU 15, UK 22, ZH 8, ES 13,
# FR 14, DE 15, PT 12, JA 23, KO 20

В этой выборке ZH совпал с EN, RU совпал с DE, а JA оказался длиннее остальных — это наблюдение о заданных строках, а не закон о языках. Изменение формулировки, нормализации Unicode, версии библиотеки или кодировки изменит результат. Считайте токены на своей стороне до отправки запроса и сохраняйте версию токенизатора рядом с измерением.

Embeddings — координаты смысла, а не ответы

Embedding — это проекция текста в вектор фиксированной размерности (обычно 256–3072 чисел), где геометрическая близость приближённо соответствует смысловой. Косинусная близость между векторами «как вернуть заказ» и «оформить возврат товара» будет высокой, хотя общих слов почти нет. Именно на этом строится семантический поиск, кластеризация обращений, дедупликация тикетов и retrieval для RAG.

Важно понимать, чем embeddings НЕ являются. Это не «понимание» и не ответ — это сжатая статистическая проекция. Отсюда конкретные ограничения:

  • Точные строки embeddings ищут плохо: артикул «AB-1042-X», ИНН или номер договора надёжнее находить лексическим поиском (BM25), а не векторным. Поэтому в проде почти всегда используют гибрид.
  • Отрицания сжимаются с потерями: «платёж прошёл» и «платёж не прошёл» часто оказываются рядом в векторном пространстве, потому что тема одна.
  • Векторы разных моделей несравнимы. Индексировали документы одной моделью, а запросы кодируете другой — поиск молча деградирует до случайного. Версия embedding-модели — часть схемы данных: меняете модель — переиндексируете всё.

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

Инференс: вероятности и sampling

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

Параметры sampling управляют формой этого выбора:

  • temperature масштабирует распределение: около 0 — почти всегда самый вероятный токен, 0.7–1.0 — заметная вариативность. Temperature не добавляет и не убирает знание, она меняет только степень случайности выбора.
  • top_p (nucleus sampling) отсекает хвост маловероятных токенов: выбор идёт только из ядра, суммарная вероятность которого равна p.
  • Штрафы за повторы (frequency_penalty, presence_penalty) полезны против зацикливания в длинной генерации.

Рабочие дефолты: extraction, классификация, tool calls — temperature 0–0.3; брейншторм и тексты — 0.7–1.0. И важный нюанс: temperature 0 не гарантирует бит-в-бит одинаковый ответ. Недетерминизм приносят параллельные вычисления с плавающей точкой, батчинг на стороне провайдера и MoE-маршрутизация. Если ваш пайплайн ломается от того, что два одинаковых запроса дали разные ответы, — проблема в пайплайне, а не в модели: снаружи всегда должна стоять валидация результата, а не надежда на детерминизм.

Галлюцинации и граница знания

Обучение и инференс — разные фазы. Всё «знание» модели зафиксировано на момент окончания обучения (knowledge cutoff) и сжато в веса с потерями. На инференсе модель не сверяется ни с какой базой — она продолжает текст наиболее правдоподобным образом. Отсюда механизм галлюцинаций: когда фактической опоры в весах мало (редкий факт, свежие события, точные цифры), модель всё равно обязана выдать следующий токен — и выдаёт правдоподобную выдумку тем же уверенным тоном, что и правду. Уверенность стиля не коррелирует с достоверностью: это свойство генерации текста, а не индикатор истины.

Чем это лечится на уровне системы, а не промпта:

  • Grounding: давать факты в контексте (retrieval, инструменты) и требовать опоры на них с цитатами — модель гораздо реже выдумывает то, что лежит перед ней.
  • Structured refusal: «данных недостаточно» должно быть валидным, ожидаемым и измеряемым ответом, а не провалом.
  • Верификация критичных фактов внешним инструментом: суммы, даты, идентификаторы перепроверяются кодом или запросом к источнику, никогда — «на глаз».

Антипаттерн — спрашивать модель «насколько ты уверена?» и использовать это как единственную защиту: самооценка модели откалибрована слабо. Правильная рамка: модель — генератор гипотез, система вокруг — механизм проверки. Все следующие уроки курса, по сути, разворачивают эту рамку в архитектуру.

Practice

Мини-калькулятор контекста

Соберите страницу или CLI-скрипт на tiktoken: пользователь вставляет текст, выбирает кодировку, видит число токенов, стоимость и остаток контекстного окна. Добавьте зафиксированный набор эквивалентной фразы на EN, RU, UK, ZH, ES, FR, DE, PT, JA и KO; выводите версию библиотеки и имя кодировки.

Deliverable

Работающий счётчик и таблица десяти языков для точных строк с `o200k_base`; вывод формулируется только про измеренный пример и не объявляет универсальный рейтинг языков.

Checkpoint

Почему два одинаковых запроса могут вернуть разные ответы и что с этим делать в проде?

  • ✓ Студент упоминает sampling / temperature и источники недетерминизма (батчинг, floating point).
  • ✓ Есть объяснение, что модель не хранит «правильный ответ» как базу данных, а генерирует токен за токеном.
  • ✓ Предложена системная защита: валидация вывода, а не надежда на детерминизм.

Check yourself

Как корректно сравнивать токенизацию эквивалентных фраз на разных языках?

01Как корректно сравнивать токенизацию эквивалентных фраз на разных языках?

Вы выставили temperature: 0, но два одинаковых запроса дали разные ответы. Что это означает?

02Вы выставили temperature: 0, но два одинаковых запроса дали разные ответы. Что это означает?

Для какой задачи векторный поиск по embeddings — плохой основной инструмент?

03Для какой задачи векторный поиск по embeddings — плохой основной инструмент?

В чём корневой механизм галлюцинации LLM?

04В чём корневой механизм галлюцинации LLM?

Почему нельзя сравнивать векторы, полученные разными embedding-моделями?

05Почему нельзя сравнивать векторы, полученные разными embedding-моделями?

Sources

How a modern LLM works: tokens, embeddings and inference · The Practical AI Product Engineering Playbook · VORCL