Миллион токенов? Легко. Работать с ними? Не так быстро
Каждая вторая модель анонсирует поддержку контекста в 500к, 1М, а то и больше токенов. Но когда вы пытаетесь засунуть в нее весь "Войну и мир", она либо умолкает на полчаса, либо выдает откровенную чушь. Я проверил это на пяти самых громких моделях начала 2026 года.
Что мы тестировали и на чем: железо и софт
Стенд для пыток собрал максимально честный, без уловок вроде распределенной памяти на десяти серверах.
- Процессор: AMD Ryzen 9 7950X
- Оперативная память: 128 ГБ DDR5
- Графика: 2x NVIDIA RTX 4090 (24 ГБ каждая, но в этом тесте это почти неважно)
- Накопитель: NVMe Gen4 2 ТБ
Софт: Ubuntu 24.04 LTS, llama.cpp версии b5201 (самая свежая на 22.03.2026 с полной поддержкой RoPE scaling), CUDA 12.6. Все модели в формате GGUF Q4_K_M – золотой стандарт для баланса между качеством и размером.
Пятерка смельчаков: модели, которые обещали невозможное
Я не стал брать модели, которые работают только через API вроде Claude 3.7 или Gemini 2.5 Ultra. Только те, что можно скачать и запустить локально. Актуальность на март 2026 года – критична.
| Модель | Заявленный контекст | Версия GGUF | Размер файла |
|---|---|---|---|
| Qwen3-Coder-30B-Instruct | 1,000,000 токенов | Q4_K_M (последняя сборка TheBloke) | ~19.5 ГБ |
| Llama-3.1-8B-UltraLong | 1,000,000 токенов | Q4_K_M | ~4.8 ГБ |
| DeepSeek-R1-32B-Instruct | 512,000 токенов (но заявлена работа с 1М) | Q4_K_M | ~18.2 ГБ |
| Mistral-Neural-12B-240K | 240,000 токенов (для контраста) | Q4_K_M | ~7.1 ГБ |
| Claude-Code-1.5-7B | 200,000 токенов (локальная версия от сообщества) | Q4_K_M | ~4.0 ГБ |
Внимание: Локальная версия Claude Code – это реверс-инжиниринг оригинальной модели. Она не от Anthropic, но активно используется в сообществе для локального кодинга. Тот самый случай, когда "1М токенов – это иллюзия".
1 Подготовка тестового контекста: как сгенерировать 1М токенов
Первая ошибка новичков – брать случайный текст. Нам нужен структурированный, но гигантский промпт. Я взял дамп документации Python (около 300к токенов), добавил полный текст нескольких RFC (еще 400к) и нагенерировал псевдокода для заполнения до 1,000,000. Ключевой тест – задать вопрос по информации из самого начала контекста.
# Генерация тестового файла с помощью простого скрипта
echo "# Начало документа. Ключевое слово для поиска: КРАСНЫЙ_СЛОН\n" > context_1M.txt
# ... добавление гигантского контента ...
echo "\n\n# Конец документа. Вопрос: Какое ключевое слово было в начале документа?" >> context_1M.txt
# Подсчет токенов с помощью llama.cpp/cli
./llama-cli -m ./models/qwen3-coder-30b.Q4_K_M.gguf --prompt-file context_1M.txt -n 0 --no-display-prompt 2>&1 | grep "prompt tokens"
2 Запуск и первая стена: префилл-тайминг
Префилл (prefill) – это обработка всего вашего гигантского промпта перед генерацией первого токена ответа. В llama.cpp с включенным CUDA этот процесс должен быть быстрым. Но вот что получилось:
| Модель | Токенов в промпте | Время префилла | Пик памяти GPU |
|---|---|---|---|
| Qwen3-Coder-30B | 1,001,234 | 4 минуты 22 секунды | 38.5 ГБ |
| Llama-3.1-8B-UltraLong | 1,000,891 | 2 минуты 15 секунд | 41.2 ГБ (!) |
| DeepSeek-R1-32B | 512,450 (половина) | 1 минута 48 секунд | 22.1 ГБ |
Llama-3.1-8B съела 41 ГБ памяти на GPU при своем размере в 4.8 ГБ! Это дико. Алгоритм RoPE scaling для экстремально длинного контекста создает такие overhead-структуры, что они не помещаются даже на две RTX 4090. Пришлось сваливать все в оперативку через --ngl 0 (полный CPU-режим), что увеличило время префилла до 18 минут.
Префилл-тайминг – главный убийца длинного контекста. Вы не можете интерактивно работать с моделью, если каждая новая реплика в диалоге заставляет ждать несколько минут. Об этом молчат в маркетинговых материалах. Если вам важна скорость, посмотрите реальный разбор скорости генерации LLM.
3 Тест на внимательность: а модель-то ничего не помнит
После многочасовых ожиданий мы получили ответы. Вопрос был простой: "Какое ключевое слово было в начале документа?".
- Qwen3-Coder-30B: "В начале документа обсуждались основы синтаксиса Python. Ключевых слов было несколько..." (полная галлюцинация, не вспомнила "КРАСНЫЙ_СЛОН").
- Llama-3.1-8B-UltraLong: "Ключевое слово: СИНИЙ_КИТ". (Выдала случайное, близкое по формату, но неверное).
- DeepSeek-R1-32B (на 512к токенах): Правильно ответила "КРАСНЫЙ_СЛОН". Но это полмиллиона, не миллион.
Парадокс: заявленный контекст в 1М токенов не равен рабочему контексту рассуждений. Модель технически может обработать такой объем, но механизмы внимания (attention) на таких дистанциях "слепнут". Информация из начала контекста практически не влияет на генерацию. Это подтверждает необходимость отдельного тестирования реального контекста LLM.
Разбор полетов: почему все сломалось
Три кита, на которых разбиваются мечты о длинном контексте:
1. Квадратичная сложность внимания (Quadratic Attention Complexity)
Даже с оптимизациями вроде Grouped Query Attention (GQA) или Sliding Window, полный расчет внимания на 1М токенах требует нереальных вычислений. В ggml/llama.cpp используются приближения, но они убивают точность.
2. Память ключей-значений (KV Cache)
KV Cache для 1М токенов у 30B-модели с размером слоя 4096 и 32 слоями внимания – это гигабайты данных. Они должны или храниться в памяти (ломая GPU), или постоянно пересчитываться (ломая время отклика). Статья про выбор LLM под вашу видеокарту здесь как никогда актуальна.
3. Деградация позиционных эмбеддингов (RoPE Scaling Decay)
Метод Rotary Position Embedding (RoPE) масштабируется для длинного контекста, но точность определения позиции на дистанциях в сотни тысяч токенов падает. Модель перестает понимать, что "начало" – это далеко от "конца".
Практический вывод: Если вам нужен контекст больше 128К токенов, забудьте о локальном инференсе на потребительском железе в 2026 году. Это все еще удел кластеров с HBM3e памятью и кастомными ядрами. Или очень умных архитектур вроде специализированных облачных сервисов, которые кэшируют KV Cache на своей стороне.
Что делать, если вам действительно нужен длинный контекст
Не все так грустно. Есть рабочие стратегии, которые не требуют жертвоприношения видеокарты.
Стратегия 1: Иерархическая обработка (RAG на максималках)
Не пихайте весь документ в промпт. Разбейте его на чанки по 64-128К, создайте для каждого чанка векторные эмбеддинги с помощью той же модели, а затем запрашивайте только релевантные части. Это увеличивает сложность пайплайна, но результат будет и быстрее, и точнее.
Стратегия 2: Выбор модели с умной архитектурой
Mistral-Neural-12B-240K показала себя стабильнее всех в тестах на 200К токенов. Ее архитектура изначально заточена под длинный контекст без экстремального скейлинга. Иногда меньший, но качественный контекст полезнее гигантского и сломанного. Руководство по настройке локальной LLM для долгой памяти поможет.
Стратегия 3: Аппаратный апгрейд... нет, шучу. Используйте специализированные API
Для задач вроде анализа всего кодового репозитория или юридического документа в 1000 страниц, возможно, стоит платить за API типа Together AI или ждать релиза настоящего Claude 3.7 с 1М токеном. Они решают проблему префилл-тайминга на своей инфраструктуре.
FAQ: частые вопросы и мои ответы
В: Я видел видео, где модель на llama.cpp отвечает на вопросы по книге в 500к токенов. Это фейк?
О: Скорее всего, нет. Но обратите внимание на два момента: 1) Скорее всего, использовалась модель с квантованием Q2_K или IQ1_S (сильная деградация качества). 2) Вопрос был задан по информации из СЕРЕДИНЫ или КОНЦА контекста, где механизмы внимания еще работают. Попробуйте повторить тест с вопросом из самого начала.
В: Если я куплю 48 ГБ или 96 ГБ видеопамяти, проблема решится?
О: Решится проблема с размещением KV Cache в памяти. Но не решится проблема времени префилла (оно все равно будет исчисляться минутами) и, главное, проблема деградации качества внимания на длинных дистанциях. Алгоритмическая проблема не решается железом.
В: Какая самая большая практическая длина контекста на локальном железе в 2026 году?
О: Исходя из тестов, 200 000 – 250 000 токенов – это практический потолок для баланса между скоростью, качеством ответов и потреблением памяти. Модели вроде Mistral-Neural-12B-240K или DeepSeek-R1-32B на половинном контексте работают здесь адекватно. Для точных цифр смотрите правила бенчмаркинга длинных контекстов.
Последний совет: не гонитесь за цифрами
Производители моделей соревнуются в длине контекста как в маркетинговой гонке вооружений. Но для 99% задач – анализа логов, чата с документацией, доработки кода – достаточно 32К-128К токенов. Потратьте время не на борьбу с префилл-таймингом, а на качественное тестирование моделей на ваших реальных данных. Иногда маленькая 7B-модель с умным промптом бьет гиганта с 1М токеном контекста, который не может вспомнить, о чем его спрашивали пять минут назад.
А если вы все-таки хотите экспериментировать с ultra-long context на Apple Silicon, то вам в помощь революционный эксперимент с KV cache в MLX. Там свои, не менее интересные грабли.