В основе современных больших языковых моделей (LLM — Large Language Models: GPT-4o, Claude 3.7 Sonnet, DeepSeek-V3, Llama 3) лежит архитектура Transformer с механизмом внутреннего внимания (Self-Attention). С точки зрения программной инженерии LLM представляет собой не «базу знаний» и не «разумную сущность», а статистический авторегрессионный предсказатель следующего токена.
Получив на вход массив чисел (числовых идентификаторов токенов), нейросеть вычисляет распределение вероятностей по всему словарю (Vocabulary, размер которого составляет от 32 000 до 256 000 уникальных токенов) для выбора одного наиболее правдоподобного следующего токена:
P(token_{t} | token_{1}, token_{2}, ..., token_{t-1})
После выбора токена он дописывается в конец исходной последовательности, и весь цикл повторяется. Этот процесс называется инференсом (Inference) или генерацией.
Для разработчика программных систем понимание физики этого процесса критично по трем причинам:
Взглянем на сквозной конвейер обработки текстового запроса внутри стека инференса LLM:
+-----------------------------------------------------------------------------------+
| МЕНТАЛЬНАЯ МОДЕЛЬ ИНФЕРЕНСА LLM |
+-----------------------------------------------------------------------------------+
| 1. ВХОДНОЙ ТЕКСТ (String): |
| "function calculateTotal(items: CartItem[]): number" |
+-----------------------------------------------------------------------------------+
| | |
| v |
| 2. ТОКЕНИЗАЦИЯ (BPE / Byte-Pair Encoding): |
| Строка разбивается на фрагменты байт / субслова -> [1422, 45211, 2819, ...] |
+-----------------------------------------------------------------------------------+
| | |
| v |
| 3. ПРЯМОЙ ПРОХОД (Transformer Forward Pass & KV Cache): |
| Матричные умножения Attention(Q, K, V) -> Вектор сырых логитов (Logits) |
+-----------------------------------------------------------------------------------+
| | |
| v |
| 4. ТЕМПЕРАТУРНОЕ МАСШТАБИРОВАНИЕ И СЭМПЛИРОВАНИЕ: |
| Logits / Temperature -> Top-P (Nucleus Cutoff) -> Softmax -> Выбор токена ID |
+-----------------------------------------------------------------------------------+
| | |
| v |
| 5. ДЕТОКЕНИЗАЦИЯ (ID -> String Chunk): |
| ID 1823 -> " {\n" (отправляется в сетевой поток стриминга клиенту) |
+-----------------------------------------------------------------------------------+Клиентский текст кодируется токенизатором модели (например, tiktoken для OpenAI). Строка разбивается на массив числовых идентификаторов токенов согласно словарю модели.
Векторы токенов передаются в видеопамять (VRAM GPU/NPU). Для входных токенов однократно вычисляются матрицы Key и Value, сохраняемые в KV-кэше для избежания повторных вычислений.
Блоки трансформера с механизмом Multi-Head Attention прогоняют скрытые состояния и выдают вектор размерности Vocabulary Size с сырыми логитами для позиции t+1.
Логиты делятся на параметр temperature. Применяется усечение хвоста распределения через top_p (Nucleus) или top_k. Функция Softmax нормализует оставшиеся значения в вероятности от 0 до 1.
Случайная величина выбирает токен согласно вероятностям. Токенизатор декодирует ID в байты и сразу передает чанк через Server-Sent Events (SSE) в HTTP-поток.
Почему один и тот же технический текст на русском языке расходует в 2–3 раза больше токенов модели, чем идентичный по смыслу текст на английском языке?
temperature: 0 для извлечения сущностей и парсинга неструктурированных PDF-документов в валидный JSON без вариативности.Токенизатор — это отдельная детерминированная программа, работающая перед нейросетью. Она не использует веса модели. Популярные алгоритмы (BPE, WordPiece, SentencePiece) строят словарь на основе частоты встречаемости последовательностей байт.
import { encoding_for_model, TiktokenModel } from 'tiktoken';
export interface TokenInspectionResult {
text: string;
tokenCount: number;
tokens: Array<{ id: number; text: string }>;
bytesPerToken: number;
}
/**
* Анализирует разбиение текста на токены для моделей OpenAI
*/
export function inspectTokenization(
input: string,
model: TiktokenModel = 'gpt-4o'
): TokenInspectionResult {
const enc = encoding_for_model(model);
const tokenIds = enc.encode(input);
const decoder = new TextDecoder('utf-8');
const tokens = Array.from(tokenIds).map((id) => {
const rawBytes = enc.decode_single_token_bytes(id);
return {
id,
text: decoder.decode(rawBytes),
};
});
// Освобождаем память WASM-модуля tiktoken
enc.free();
const totalBytes = new TextEncoder().encode(input).length;
return {
text: input,
tokenCount: tokenIds.length,
tokens,
bytesPerToken: Number((totalBytes / tokenIds.length).toFixed(2)),
};
}
// Пример поведения:
// inspectTokenization("Hello world") -> 2 токена ["Hello", " world"] (~5.5 байт/токен)
// inspectTokenization("Привет мир") -> 4-5 токенов ["При", "вет", " м", "ир"] (~2.1 байт/токен)Контекстное окно современных моделей достигает от 128k токенов (GPT-4o) до 1M+ токенов (Gemini 1.5 Pro). Однако возможность передать 100 000 токенов не гарантирует, что модель одинаково внимательно прочитает каждый фрагмент.
Исследования (Liu et al., "Lost in the Middle: How Language Models Use Long Contexts") показали, что точность извлечения фактов имеет U-образную форму:
+-------------------------------------------------------------------------+
| U-ОБРАЗНАЯ КРИВАЯ ВНИМАНИЯ LLM |
+-------------------------------------------------------------------------+
| Точность |
| 100% | *** *** |
| | * * |
| 70% | * * |
| | * * |
| 40% | * * |
| | *********************************************** |
| 0% +----------------------------------------------------------------- |
| 0% (Начало промпта) 50% (Середина) 100% (Конец промпта) |
+-------------------------------------------------------------------------+
| Вывод архитектора: |
| 1. Системные инварианты размещайте в НАЧАЛЕ (System Prompt). |
| 2. Большой RAG-контекст размещайте в СЕРЕДИНЕ. |
| 3. Финальный вопрос и ограничения формата размещайте в КОНЦЕ. |
+-------------------------------------------------------------------------+Выходной слой нейросети возвращает вещественный вектор размерности V (размер словаря). Для каждого токена i вычислено значение z_i в диапазоне от -inf до +inf.
Логиты не нормализованы и не являются вероятностями.
Каждый логит делится на скаляр температуры T. При T -> 0 различия между топ-1 и остальными логитами стремятся к бесконечности. При T -> inf все логиты выравниваются.
Деление на T = 0 в рантайме заменяется на операцию argmax без Softmax.
Токены сортируются по убыванию вероятностей. Отбирается минимальное множество токенов, чья сумма вероятностей >= p. Низковероятный «хвост» отбрасывается.
Top-P отсекает мусорные и синтаксически некорректные токены даже при высокой температуре.
К усеченному вектору применяется экспоненциальная нормализация Softmax. Сумма вероятностей отобранных токенов становится строго равной 1.0.
Формула: p_i = exp(z_i / T) / sum(exp(z_j / T)).
Псевдослучайный датчик выбирает итоговый ID токена. Счетчик сгенерированных токенов увеличивается. Проверяется условие stop_sequences или достижение max_tokens.
Если достигнут лимит max_tokens, генерация обрывается даже на середине слова.
Команда разрабатывает модуль извлечения номеров банковских счетов из текста договоров в строгий JSON. Какие параметры инференса обеспечат наивысшую надежность?
Попытка валидировать размер входных данных через input.length <= 4000. Для англоязычного текста 4000 символов — это примерно 1000 токенов. Однако если пользователь пришлет текст на кириллице, фрагмент кода на C++ со специальными символами или японские иероглифы, 4000 символов могут превратиться в 3500–5000 токенов, вызвав ошибку превышения лимита контекста или перерасход бюджета.
Решение: Всегда использовать серверные библиотеки подсчета токенов (например, tiktoken или утилиты провайдеров) перед отправкой запроса к модели.
Многие разработчики считают, что при нулевой температуре модель говорит «только правду». Температура 0 лишь делает модель детерминированной (на один и тот же запрос вы получите один и тот же ответ). Если модель изначально имеет пробел в знаниях или неверную ассоциацию в весах, при temperature: 0 она будет уверенно повторять одну и ту же галлюцинацию при каждом запуске.
Решение: Для борьбы с галлюцинациями используйте RAG (подачу проверенных фактов в контекст) и проверку схемы валидаторами, а не только снижайте температуру.
Передача в API значения max_tokens: 128000 в предположении, что это размер доступного контекста. Параметр max_tokens (или max_completion_tokens) ограничивает исключительно длину генерируемого ответа. Если задать его равным полному контекстному окну, а входной промпт окажется слишком большим, запрос упадет с ошибкой context_length_exceeded (сумма input_tokens + max_tokens превышает физический лимит модели).
Решение: Рассчитывать max_tokens исходя из максимального ожидаемого размера ответа (обычно от 500 до 4096 токенов).
Разработчик загружает в промпт 80 страниц документации API, а в самый центр вставляет директиву: ОТВЕЧАЙ ТОЛЬКО НА РУССКОМ. Из-за эффекта «Lost in the Middle» внимание трансформера рассеивается, и модель отвечает на английском языке.
Решение: Помещать глобальные правила поведения в системный промпт (начало контекста), а целевой запрос и ограничения формата — в финальное сообщение пользователя (конец контекста).