Ментальная модель LLM
Прежде чем применять AI в разработке, нужно понять, как он устроен — не на уровне математики трансформеров, а на уровне, достаточном чтобы предсказывать поведение: почему одинаковый промпт даёт разные ответы, почему длинный контекст работает иначе чем короткий, почему температура 0 не гарантирует одинаковый вывод. Эта статья — фундамент раздела: токены, контекстное окно, температура и latency. Остальные темы — практическое применение этих знаний. Для каждого понятия разберём, почему оно важно именно фронтендеру, работающему с AI-агентами.
Содержание
- Что такое токен и почему это важно разработчику
- Контекстное окно: что в него попадает и в каком порядке
- Температура и детерминизм
- Latency: TTFT vs полное время ответа
- Практические следствия для работы с агентами
- Когда что выбирать
- Case study: почему агент «изменил поведение»
- Ключевые тезисы для интервью
- Заключение
- Полезные ссылки
Что такое токен и почему это важно разработчику
Токены — не слова и не символы
LLM работают с токенами — подсловными единицами. Токен — это фрагмент текста, который встречался достаточно часто в обучающем корпусе, чтобы получить собственный идентификатор в словаре.
// Примерная токенизация
"Hello" → ["Hello"] // 1 токен
"unprecedented" → ["un", "prece", "dented"] // 3 токена
// 1 токен ≈ 4 символа в английском, ≈ 2-3 символа в русском
Токенизация не совпадает ни со словами, ни с символами, ни с морфемами. Это эмпирический результат обучения: модель разбивает текст на куски, которые максимизируют частоту попаданий в словаре. Отсюда несколько неочевидных следствий.
Почему это важно
- Стоимость считается в токенах. Входные токены + выходные. Выходные обычно дороже в 3–5 раз. Длинный системный промпт при каждом запросе — реальные деньги.
- Контекстное окно — тоже токены. В него влезает ограниченное количество кода и истории.
- Язык влияет на стоимость. Токенизация оптимизирована под английский: русский текст занимает ~1.5× больше токенов при том же содержании.
// Выходные токены дороже входных (условные числа)
const pricing = {
inputTokensPer1M: 3.00, // $3 за миллион входных
outputTokensPer1M: 15.00, // $15 за миллион выходных — в 5x дороже
};
Таблица: как язык и формат влияют на токены
| Текст | Примерная токенизация | Токенов |
|---|---|---|
| Английский текст | ~4 символа на токен | 1000 слов ≈ 1300 |
| Русский текст | ~2-3 символа на токен | 1000 слов ≈ 2000-2500 |
| Код (TS/JS) | Идентификаторы целиком или крупными частями | Компактно |
| JSON с длинными ключами | Похоже на код | Компактно |
| Base64/хэши | Каждый символ — токен | Расточительно |
Практическое следствие для работы с агентами: передавайте в контекст код и структурированные данные (компактно), а не пересказ на русском. Один и тот же смысл в виде кода стоит дешевле и занимает меньше окна, чем в виде прозы. Текстовые дампы логов и Base64-строки — худший вариант: они раздувают и стоимость, и контекст.
Контекстное окно: что в него попадает и в каком порядке
Модель stateless
LLM не помнит предыдущих запросов. Каждый вызов — отдельный независимый запрос, в котором передаётся всё, что модель должна знать: системный промпт, история диалога, текущее сообщение.
// Вот что реально отправляется в API при "продолжении разговора"
const request = {
model: "claude-sonnet-4-6",
messages: [
{ role: "user", content: "Привет! Как дела?" },
{ role: "assistant", content: "Хорошо, спасибо!" },
{ role: "user", content: "Расскажи про токены" },
{ role: "assistant", content: "Токены — это..." },
{ role: "user", content: "А что такое контекстное окно?" }, // текущее
],
system: "Ты — помощник-разработчик...",
};
Приложение само хранит историю и вставляет её в каждый запрос. Когда история вырастает за пределы окна — нужно решать: обрезать, сжать или использовать RAG.
Из чего состоит контекст и как им управлять
| Компонент | Что это | Риск |
|---|---|---|
| System prompt | Постоянные инструкции, роль, ограничения | Занимает окно в каждом запросе |
| История диалога | Прошлые сообщения | Растёт линейно с каждым обменом |
| Контекстные файлы | AGENTS.md, README, открытые файлы | Может раздуть окно незаметно |
| Текущее сообщение | Конкретная задача | Самое важное для ответа |
| Вложенные документы/код | Данные для анализа | Быстро упирается в лимит |
Почему начало и конец важнее середины
Феномен «lost in the middle»: модели хуже обрабатывают информацию в середине длинного контекста, чем в начале и конце.
[ начало — высокое внимание ] ← system prompt: критические инструкции
[ середина — сниженное внимание ] ← "lost in the middle"
[ конец — высокое внимание ] ← текущее сообщение: конкретное задание
Практическое следствие для работы с агентами:
- Критические инструкции и ограничения — в начало (AGENTS.md, system prompt)
- Конкретное задание — в конец (текущее сообщение)
- Историю и документы модель прочитает, но может не акцентировать
Таблица: стратегии, когда окно переполняется
| Стратегия | Что делает | Когда использовать | Трейдофф |
|---|---|---|---|
| Обрезка | Отбрасывает старые сообщения | История — контекст, а не данные | Теряет ранний контекст задачи |
| Сжатие | Резюмирует старую историю | Диалог длинный, суть нужно сохранить | Резюме теряет детали |
| RAG | Достаёт релевантные фрагменты по запросу | Большая база знаний | Нужна инфраструктура, не подходит для диалога |
| Дубликат сообщения | Повторить ключевой факт в текущем | Критичное требование в середине | Тратит токены |
Температура и детерминизм
Как модель выбирает токен
Модель генерирует текст последовательно, токен за токеном. На каждом шаге вычисляется распределение вероятностей по всему словарю, и следующий токен выбирается из этого распределения.
Температура: управление случайностью
- temperature = 0: жадный выбор — всегда самый вероятный токен
- temperature = 1: выборка из исходного распределения
- temperature > 1: распределение более равномерное, больше случайности
// Практические значения
codeGeneration: { temperature: 0 }, // код, JSON, извлечение данных
brainstorming: { temperature: 0.8 }, // вариативность
Температура vs top-p: как они работают вместе
| Параметр | Что контролирует | Пример |
|---|---|---|
| temperature | «Сглаживает» распределение вероятностей | 0.2 — почти детерминизм, 1 — полная выборка |
| top-p | Отсекает хвост маловероятных токенов | p=0.9 — берём только топ-90% массы вероятности |
| seed | (не у всех провайдеров) Начальное состояние генератора | Не гарантирует воспроизводимость |
Рекомендация: не крутите оба параметра одновременно. Стандартный приём — зафиксировать top-p (0.9–1.0) и менять только temperature, либо наоборот. Совместное агрессивное изменение обоих даёт непредсказуемое поведение.
Таблица: что выбрать для каких задач
| Задача | temperature | Почему |
|---|---|---|
| Код, JSON, извлечение данных | 0 | Нужен детерминированный предсказуемый вывод |
| Тесты, спецификации | 0–0.2 | Точность важнее вариативности |
| Имена переменных, формулировки | 0.3–0.5 | Немного свободы при сохранении структуры |
| Брейншторм, идеи, варианты | 0.7–1.0 | Нужна вариативность |
| Креативный текст, сценарии | 1.0+ | Максимальная свобода |
Почему температура 0 не гарантирует детерминизм
Распространённое заблуждение: temperature=0 означает одинаковый ответ всегда. На практике это не так:
- Параллельная обработка — порядок суммирования float влияет на результат
- Разное железо — GPU/CUDA дают разные результаты
- Обновления моделей — провайдеры периодически меняют модели
Вывод: не полагайтесь на детерминизм. Для проверки качества используйте golden dataset и нечёткое сравнение, а не точное совпадение строк.
Latency: TTFT vs полное время ответа
Два измерения задержки
TTFT (Time to First Token) — время до первого токена. Это время, когда пользователь видит «пустой экран» или спиннер.
Total Latency — полное время до последнего токена. При стриминге пользователь уже читает ответ пока он генерируется.
Запрос ─────────────────────────────────────────────────► Время
│ │ │
отправка первый токен последний токен
│ │ │
└──TTFT──►│◄────── время генерации ───────────►│
└─────────────── total latency ────────────────►│
Что влияет на TTFT
| Фактор | Влияние |
|---|---|
| Размер входного контекста | Длиннее промпт — дольше TTFT |
| Загруженность сервера | Время в очереди |
| География | Сетевая задержка до дата-центра |
| Размер модели | Большие модели медленнее начинают |
Что влияет на полное время
Total latency = TTFT + (количество выходных токенов × время на токен). Длина ответа — главный рычаг. Инструкция «отвечай кратко» — не только про удобство чтения, но и про latency.
Таблица: оптимизация latency
| Рычаг | Что оптимизирует | Трейдофф |
|---|---|---|
| Укоротить промпт | TTFT | Меньше контекста — хуже качество |
| Стриминг | Воспринимаемое время | Не ускоряет генерацию |
| Инструкция «отвечай кратко» | Total latency | Риск потерять детали |
| Модель поменьше | TTFT + генерация | Ниже качество |
| География деплоя | Сетевая задержка | Инфраструктура |
Streaming как UX-решение
Стриминг не ускоряет генерацию — TTFT и total latency те же. Но воспринимаемое время резко снижается: пользователь начинает читать сразу после TTFT. Для большинства интерфейсов стриминг — не оптимизация, а обязательное требование. Подробно — в статье AI UI: стриминг и generative UI.
Практические следствия для работы с агентами
Соберём ментальную модель в конкретные правила для работы с AI-агентами:
| Правило | Откуда взялось | Что делать |
|---|---|---|
| Не держите лишнее в контексте | Токены = деньги, окно ограничено | Открывайте агенту только нужные файлы |
| Критичное — в начало и конец | «Lost in the middle» | Инструкции в system/AGENTS.md, задачу — в текущее сообщение |
| История растёт — планируйте | Модель stateless, окно конечно | Обрезать/сжимать историю заранее |
| Код в контексте — не пересказ | Токенизация | Давайте файлы, а не описание на русском |
| Не ждите детерминизма | temperature=0 не гарантирует | Проверяйте результат, не предполагайте |
| Латенси контролируется длиной | Total latency = TTFT + токены | «Отвечай кратко» — реальная оптимизация |
Когда что выбирать
Когда temperature=0, а когда нет
- 0 — всегда для кода, JSON, спецификаций и тестов: предсказуемость критична, вариативность вредна.
- 0.3–0.5 — формулировки, где допустимо несколько равнозначных вариантов: имена, описания, документация.
- 0.7+ — брейншторм и генерация идей: нужна вариативность, а не «один правильный ответ».
Правило: если вы потом проверяете результат тестом — temperature 0. Если результат субъективный — можно повыше.
Когда RAG вместо полного контекста
- ✅ База знаний больше окна, документы релевантны по запросу
- ✅ Нужно не «помнить», а «находить» — ретрив по смыслу
- ❌ Диалог, где важен полный контекст предыдущих сообщений
- ❌ Небольшая база, которая влезает в окно целиком
Case study: почему агент «изменил поведение»
Сценарий, знакомый каждому, кто работает с агентами: вчера агент делал задачу «правильно», сегодня — иначе. Ментальная модель объясняет это без мистики.
Ситуация. Команда использует агента для генерации тестов. Неделю всё работало, потом агент начал «забывать» edge cases. Разработчик подозревает, что модель «деградировала».
Разбор по слоям ментальной модели:
| Гипотеза | Проверка | Вывод |
|---|---|---|
| Модель обновилась у провайдера | Сравнить ответы с прежними на одном промпте | Возможно: провайдеры меняют модели без анонса |
| Контекст вырос | Посчитать токены промпта | История диалога + вложенные файлы превысили комфортный размер, и edge cases «утонули» в середине |
| Задача стала менее конкретной | Сравнить спецификацию с той, что была | Edge cases раньше были явно перечислены, теперь — «покрой все кейсы» |
| Температура изменилась | Проверить параметры запроса | Случайно включён ненужный параметр |
Реальные причины (по частоте):
- Спецификация стала хуже. «Покрой все кейсы» — не критерий. Раньше был явный список edge cases — и агент его закрывал. Ментальная модель здесь ни при чём — проблема в качестве входа.
- Контекст раздулся. В диалог добавили лишние файлы — и edge cases попали в «lost in the middle». Решение: вынести edge cases в текущее сообщение (конец контекста) или в system prompt (начало).
- Провайдер обновил модель. Ответ стал «немного другим» при том же промпте — это нормально, детерминизма нет. Решение: golden dataset и нечёткое сравнение, а не «оно работает иначе».
Вывод кейса: «изменение поведения» агента почти всегда объясняется одним из трёх факторов ментальной модели — качеством входа (спецификация), размером/порядком контекста или отсутствием детерминизма. Диагностика по таблице выше даёт ответ быстрее, чем подозрение «модель сломалась».
Ключевые тезисы для интервью
- Токен — базовая единица обработки LLM: не слово и не символ, а подсловный фрагмент; стоимость и лимиты считаются в токенах, русский текст стоит ~1.5× английского.
- Модель stateless: приложение само хранит историю и передаёт её целиком в каждом вызове; при переполнении окна — обрезка, сжатие или RAG.
- «Lost in the middle»: модели хуже обрабатывают середину длинного контекста; критическое — в начало (system prompt), конкретное задание — в конец (текущее сообщение).
- Temperature управляет «сглаживанием» распределения, top-p — отсечением хвоста; temperature=0 даёт почти детерминированный вывод, но не гарантирует абсолютную воспроизводимость (параллелизм, железо, обновления моделей).
- TTFT — время до первого токена (воспринимаемая скорость); total latency = TTFT + время генерации, а длина ответа — главный рычаг её управления.
- Стриминг не ускоряет генерацию, но улучшает воспринимаемую скорость; для большинства интерфейсов — обязательное требование.
- Ментальная модель объясняет «изменение поведения» агента: качество спецификации, размер/порядок контекста или отсутствие детерминизма — а не «деградацию модели».
Заключение
Ментальная модель LLM — это не знание математики, а понимание нескольких фундаментальных вещей:
- Модель работает с токенами, не со словами. Всё что вы пишете — это деньги и лимиты.
- Каждый запрос — полный снимок состояния: системный промпт + вся история + текущий ввод.
- Результат вероятностный. Температура управляет «разбросом», но детерминизм — иллюзия.
- Задержка двухкомпонентная: TTFT влияет на ощущение скорости, total latency — на реальное время.
Это знание позволяет предсказывать поведение модели и принимать правильные решения при работе с AI-агентами: что класть в контекст и куда, какую температуру ставить, где ждать «одинаковости», а где нет. Остальные статьи раздела — практическое применение этой модели.
Полезные ссылки
- OpenAI Tokenizer — визуализация токенизации текста
- «Lost in the Middle» (paper) — исследование феномена внимания в середине контекста
- Latency optimization guide (Anthropic) — практические советы по снижению задержек
- OpenAI Sampling parameters — temperature, top_p, seed в параметрах API