LLM без загадок
Ты здесь, чтобы управлять агентами. Начать стоит с обоснованного представления о движке внутри агента.
Чтобы пользоваться LLM, необязательно понимать их устройство. Чтобы пользоваться ими хорошо — необходимо. Следующие несколько глав дают ровно столько знаний об их работе и сбоях, сколько нужно, чтобы выбрать подходящую модель, оставаться в области её сильных сторон и замечать проблемы до того, как они дорого обойдутся.
LLM — не магия, не коллега и не разум. Это система предсказания токенов, обученная на масштабных закономерностях в текстах, коде, изображениях, аудио или других данных — в зависимости от модели. Такое упрощённое представление помогает понять, почему LLM полезны, почему ошибаются и почему «лучшей модели» не существует.
Позиция оператора проста:
Относись к каждой LLM как к мощному вероятностному инструменту с определёнными рабочими границами. Выбирай её, направляй к ней запросы и ограничивай её так же, как любую другую зависимость в промышленной системе.
Что на самом деле представляет собой LLM
Большая языковая модель — это статистический механизм распознавания закономерностей на основе архитектуры трансформера. Получив промпт, она снова и снова выполняет один цикл:
- Кодирует входные данные в токены, специфичные для модели
- С помощью механизма внимания анализирует связи в текущем контексте
- Оценивает вероятные следующие токены
- Выбирает один из них
- Добавляет его к контексту
- Повторяет цикл
Здесь контекст — всё, что сейчас доступно модели: инструкции, входные данные, результаты инструментов и уже сгенерированный вывод. Токены — единицы этой последовательности.
Внутри модели каждый токен превращается в числа, с которыми она может работать, и получает информацию о своём положении в последовательности. Механизм внимания использует соседние токены для интерпретации каждого из них: bank рядом с river несёт не ту же информацию, что рядом с account.
На выходе получается один предсказанный следующий токен, который сразу становится частью следующего контекста. Этот цикл — основной механизм, стоящий за каждым связным абзацем, патчем кода, вызовом инструмента или последовательностью шагов, которую выдаёт модель.
Для инженерной работы это подходит потому, что большая часть разработки ПО уже представлена в форме токенов: код, диффы, логи, команды оболочки, задачи, документация, ошибки тестов, замечания ревью и схемы инструментов. Мультимодальные модели расширяют тот же механизм: кодируют скриншоты, схемы, аудио, PDF и графики в потоки токенов, на которые модель может опираться.
Механика LLM
Модель предсказывает следующий токен
Токены — единицы, которые модель обрабатывает и выдаёт: слово, часть слова, знак препинания, фрагмент изображения, аудиокадр или структура вызова инструмента — в зависимости от модальности. Приблизительное правило для английского: 1 токен ≈ 0,75 слова.
Токены определяют бюджет ввода и вывода модели: провайдеры выставляют счёт за токены, окно контекста измеряется токенами, а больше токенов означает большую стоимость и задержку. Выходные токены стоят в 4–8 раз дороже входных (morphllm), но в задачах программирования соотношение объёмов меняет картину: если для правки на 200 токенов передать 50 000 токенов контекста, на ввод приходится 70–85% счёта.
Механизм внимания связывает токены внутри текущего контекста; это не постоянная память и не поиск информации. Чем больше контекст, тем больше материала для установления связей, но это не гарантирует, что на ответ повлияют нужные свидетельства. Это важно для стоимости, задержки и надёжности работы с длинным контекстом.
Что на самом деле представляет собой рассуждение
Каждый проход через модель — один и тот же фиксированный конвейер. На один токен приходится фиксированный объём вычислений: это жёсткий предел сложности задачи, решаемой за один шаг.
Деление столбиком на бумаге — такая же ситуация. Ты не можешь удержать все промежуточные результаты в голове, поэтому записываешь их: каждый частичный результат затем читается и используется на следующем шаге. Токены рассуждения — та самая бумага. Они добавляются к контексту и считываются при последующих проходах, позволяя модели переносить частично выполненную работу вперёд и решать задачи, с которыми не справиться за один токен.
Компромисс тот же, что и на бумаге: больше промежуточных шагов — больше мест, где может появиться ошибка. Неверный шаг влияет на всё, что на нём построено, а сама цепочка ничего не проверяет.1
Почему один и тот же промпт даёт разные ответы
Каждый проход цикла — случайный выбор, а не поиск готового значения. Модель оценивает токены, которые правдоподобно могут идти следующими, и выбирает один: преимущество получают верхние позиции списка, но побеждает не всегда первая. Другой выбор уводит всё последующее в другую сторону: один промпт, одна модель, два разных ответа, и оба можно обосновать.
Раньше предсказуемость можно было обменивать на разнообразие с помощью настройки температура. Передовые API больше её не предоставляют: она осталась только у старых размещённых моделей и у моделей с открытыми весами, которые ты запускаешь сам. На смену пришёл другой регулятор: сколько промежуточных шагов запрос может потратить перед ответом (reasoning.effort, effort, thinking_level). Это не более аккуратная версия случайного выбора. Это более длинная цепочка собственных рабочих шагов модели, и каждый дополнительный шаг даёт ещё одну возможность: больше пространства найти верный путь — и больше пространства для одного неверного поворота, который закрепится во всём последующем. Производители продают это как качество, купленное ценой задержки и токенов, и на сложных задачах такой обмен обычно оправдан. Ключевое слово — обычно. Точность достигает пика при промежуточной длине рассуждения, а затем снижается: тот же урок, который даёт длинный контекст, — после определённой точки больше не значит лучше. И хотя самый частый ответ улучшается по мере увеличения объёма рассуждений, каждый отдельный запуск становится менее предсказуемым.2
Стохастичность заложена в устройстве
Стохастическая система не сходится к одному ответу. Детерминированные инструменты формализуют конкретные случаи: компилятор, регулярное выражение и линтер кодируют точное правило, а новый случай требует нового кода. Проектирование модели данных, чтение трассировки стека, разбор отчёта об ошибке, обобщение недельных заметок — ничто из этого не сводится к точному правилу. Здесь нужно приближённо воспроизвести закономерность, а не следовать правилу, и два запуска делают это по-разному.
Именно для этого нужна случайность. Каждый запуск выбирает правдоподобное обобщение, поэтому модель можно направить на задачу вместо перечисления всех случаев. Зафиксировав единственный вывод, ты просишь механизм обобщения закономерностей работать как таблица соответствий: каждый раз один ответ, правильный или нет, без возможности обобщать и исследовать.
Попытки — ещё не ответы. У стохастической системы нет инвариантов, которые можно проверить, есть только распределение. Надёжность обеспечивают окружающие её защитные ограничения: схемы, тесты, диффы, повторные попытки, ревью, контур управления, — а не сама модель. Ни за чем из этого у неё не стоит намерение, поэтому она инструмент, а не авторитет.
Всё описанное в этой главе происходит в момент формирования ответа. Откуда берутся эти вероятности — тема следующей главы: как обучение закрепляет закономерности в весах и как постобучение превращает этот движок в продукт за API.