Контекстная амнезия: почему ваш ИИ-помощник забывает всё через 5 минут
Вы начинаете проект. Claude пишет красивый код для игрового движка. Первые 200 строк — шедевр. Через час модель предлагает создать функцию, которая уже существует. Еще через два часа она забывает архитектуру проекта. К вечеру вы получаете код, который не компилируется, потому что LLM "потеряла" зависимости между модулями.
Это не баг. Это фундаментальная проблема всех современных языковых моделей. Они страдают от того, что в научных кругах называют "Lost in the Middle" — явление, когда модель хуже всего обрабатывает информацию из середины контекста. Наш мозг тоже так работает (попробуйте вспомнить середину списка покупок), но у LLM эта проблема выражена катастрофически.
Деградация контекста — это не постепенное ухудшение. Это обрыв. Однажды модель просто перестаёт "видеть" связи между компонентами, которые она же и создала.
Почему игры убивают контекст быстрее всего
Разработка игр — идеальный шторм для контекстного окна. Вам нужно держать в голове:
- Геймдизайн-документ (1000+ слов)
- Архитектуру движка
- Состояния игровых объектов
- Физику и коллизии
- Графический конвейер
- Систему сохранений
- UI/UX логику
И всё это должно быть связано. Физика влияет на геймплей, UI отражает состояние игрока, система сохранений должна сериализовать всё это хозяйство. Когда контекст переполняется, LLM начинает жертвовать связями. Сначала мелкими. Потом критическими.
Стратегия №1: Разделяй и властвуй (по-новому)
Старое правило "разделяй на модули" не работает с LLM. Модель не видит связи между изолированными контекстами. Нужна новая тактика.
1 Создайте контекстные слои
Не просто разделяйте код. Создайте иерархию контекстов:
| Уровень | Что содержит | Размер | Когда обновлять |
|---|---|---|---|
| Ядро | Архитектура, ключевые интерфейсы, главные константы | 500-1000 токенов | Никогда (или при смене парадигмы) |
| Модуль | Текущий разрабатываемый модуль + его зависимости | 2000-4000 токенов | При переходе к новому модулю |
| Сессия | Текущая задача + связанный код | 1000-2000 токенов | Каждые 10-20 сообщений |
Ядро — это ваш north star. Оно всегда в промпте. Всегда. Даже если занимает драгоценные токены. Без него LLM начинает изобретать новую архитектуру каждые полчаса.
2 Используйте контекстные файлы
Не пишите архитектуру в промпте. Создайте файл ARCHITECTURE.md:
# Архитектура игры "Space Trader"
## Основные компоненты
1. GameStateManager - синглтон, хранит всё состояние игры
2. SectorGenerator - процедурная генерация секторов
3. ShipSystem - управление кораблём игрока
4. EconomySimulator - фоновая симуляция экономики
## Ключевые зависимости
- ShipSystem зависит от GameStateManager
- EconomySimulator обновляет GameStateManager каждые 5 минут игрового времени
- SectorGenerator кэширует сгенерированные секторы в GameStateManager
## Важные константы
MAX_SHIPS_PER_SECTOR = 50
TRADE_ROUTE_UPDATE_INTERVAL = 300 // секунд
Теперь в промпте пишете: "Смотри ARCHITECTURE.md. Добавь в ShipSystem метод calculateJumpCost()."
Файлы — это внешняя память для LLM. Они не занимают место в контекстном окне, но доступны по ссылкам. Как оперативная память vs SSD.
Стратегия №2: Жёсткая дисциплина промптов
Свободный диалог с LLM — прямой путь к контекстной катастрофе. Нужны правила.
3 Системный промпт — ваш конституция
Не начинайте сессию без жёсткого системного промпта:
Ты — senior game developer с 15-летним опытом.
ПРАВИЛА РАБОТЫ:
1. Перед каждым ответом проверяй consistency с архитектурой из ARCHITECTURE.md
2. Если предлагаешь изменение, сначала проверяй, не конфликтует ли оно с существующим кодом
3. Все новые функции должны быть backwards compatible
4. При рефакторинге сохраняй публичные интерфейсы
5. Если не уверен в чём-то — спрашивай, не предполагай
СТИЛЬ КОДА:
- Имена переменных: camelCase
- Константы: UPPER_SNAKE_CASE
- Классы: PascalCase
- Максимальная длина строки: 100 символов
Это не просто рекомендации. Это приказ. LLM будет следовать ему даже при деградации контекста.
4 Контекстные анкеры
Каждые 5-10 сообщений вставляйте в промпт "якоря" — напоминания о ключевых решениях:
[КОНТЕКСТНЫЙ ЯКОРЬ]
Текущая задача: оптимизация рендеринга астероидов
Архитектурное ограничение: GameStateManager должен оставаться синглтоном
Недавнее изменение: добавили LOD систему для дальних объектов
Следующий шаг: implement culling для объектов за камерой
[/КОНТЕКСТНЫЙ ЯКОРЬ]
Да, это ручная работа. Да, это раздражает. Но это работает. Без таких якорей LLM через 20 сообщений забудет, что вы оптимизируете рендеринг, и предложит переписать GameStateManager в мультитон.
Стратегия №3: Технические хаки для продвинутых
5 Используйте RAG для кодовой базы
RAG (Retrieval-Augmented Generation) — не только для документов. Настройте векторный поиск по вашей кодовой базе. Когда LLM начинает терять контекст, система автоматически подставляет релевантные фрагменты кода.
Простейшая реализация:
# Псевдокод для RAG код-базы
import chromadb
from sentence_transformers import SentenceTransformer
class CodeRAG:
def __init__(self):
self.client = chromadb.Client()
self.model = SentenceTransformer('all-MiniLM-L6-v2')
def index_codebase(self, code_files):
# Разбиваем код на логические блоки
chunks = self._chunk_code(code_files)
# Создаём эмбеддинги
embeddings = self.model.encode(chunks)
# Сохраняем в векторную БД
self.client.add(embeddings=embeddings, documents=chunks)
def retrieve_relevant(self, query, top_k=3):
# Ищем релевантные фрагменты
query_embedding = self.model.encode(query)
results = self.client.query(query_embeddings=[query_embedding], n_results=top_k)
return results['documents'][0]
Теперь вместо "я забыл, как работает система диалогов" вы получаете автоматическую вставку релевантного кода.
6 Применяйте технику "контекстного сжатия"
Когда контекст переполняется, не выбрасывайте всё. Сжимайте. Заменяйте подробные описания на summaries:
# Вместо 1000 строк кода в промпте
[СЖАТЫЙ КОНТЕКСТ]
PhysicsSystem: обрабатывает коллизии (реализовано), гравитацию (реализовано), снаряды (в процессе)
RenderSystem: отвечает за 2D спрайты, камеру, слои
AudioSystem: проигрывает звуки по событиям
[/СЖАТЫЙ КОНТЕКСТ]
Затем, когда нужно работать с PhysicsSystem, разжимаете только его:
[РАЗЖАТЫЙ PhysicsSystem]
class PhysicsSystem:
- Метод checkCollision(entity1, entity2): bool
- Метод applyGravity(entity): void
- Метод updateProjectiles(): void
- Зависит от: TimeManager, EntityManager
- Константы: GRAVITY = 9.81, COLLISION_THRESHOLD = 0.1
[/РАЗЖАТЫЙ PhysicsSystem]
Это ручная работа. Но она спасает проекты.
Стратегия №4: Обнаружение и лечение деградации
Деградация контекста — как высокое давление. Вы не чувствуете её, пока не случится инсульт. Нужны индикаторы.
7 Тест на контекстную амнезию
Каждые 50 сообщений проводите простой тест:
Быстрый тест:
1. Какая архитектурная парадигма используется в проекте? (MVC, ECS, и т.д.)
2. Назови три ключевых класса из ядра игры
3. Какой паттерн используется для GameStateManager?
4. Какая система отвечает за генерацию мира?
Если LLM ошибается в 2+ ответах — контекст деградировал. Нужна перезагрузка.
8 Контекстная перезагрузка
Не начинайте новую сессию с нуля. Используйте structured context reload:
[КОНТЕКСТНАЯ ПЕРЕЗАГРУЗКА]
ШАГ 1: Экспорт текущего состояния
- Архитектура: ECS (Entity-Component-System)
- Текущий модуль: CombatSystem
- Последнее изменение: добавлен урон от окружения
- Активные задачи: балансировка урона, AI для врагов
ШАГ 2: Очистка контекста
[Очищаю историю диалога]
ШАГ 3: Импорт ядра
[Вставляю ARCHITECTURE.md]
[Вставляю текущий CombatSystem код]
[Вставляю последние 3 задачи из TODO.md]
ШАГ 4: Восстановление связей
CombatSystem зависит от: HealthSystem, AnimationSystem
CombatSystem влияет на: GameState.players, GameState.enemies
[/КОНТЕКСТНАЯ ПЕРЕЗАГРУЗКА]
Это занимает 2 минуты. Экономит 2 часа дебаггинга.
Ошибки, которые убивают контекст (и как их избежать)
| Ошибка | Почему это плохо | Решение |
|---|---|---|
| Длинные объяснения в промпте | Съедают токены, модель их всё равно забудет | Пишите кратко. Детали — в файлах |
| Отсутствие version control для промптов | Нельзя откатиться к работающему контексту | Храните промпты в git вместе с кодом |
| Смешивание задач в одной сессии | Контекст перегружается несвязанными концепциями | Одна сессия = одна задача |
| Игнорирование первых признаков деградации | Приводит к полному краху контекста | Тестируйте каждые 50 сообщений |
Инструменты, которые реально помогают
Не пытайтесь делать всё вручную. Используйте специализированные инструменты:
- Cursor IDE — встроенный AI понимает контекст проекта, работает с файлами
- Windsurf — специализирован на управлении контекстом для больших проектов
- Continue.dev — открытый инструмент с продвинутым контекстным менеджментом
- Claude Desktop — позволяет загружать файлы в контекст без копирования
Но помните: инструменты не заменяют дисциплину. Они её усиливают. Если вы не следуете принципам из этой статьи, даже самый продвинутый IDE не спасёт.
Когда всё равно ничего не помогает
Бывают ситуации, когда контекстная деградация неизбежна. Проект слишком большой. Слишком сложный. Слишком взаимосвязанный.
В этом случае применяйте ядерный вариант: микросервисная архитектура для промптов.
- Разбейте игру на независимые модули
- Для каждого модуля создайте отдельную LLM-сессию
- Определите чёткие интерфейсы между модулями
- Каждая сессия знает только свой модуль + интерфейсы
- Вы выступаете в роли интегратора
Да, это медленнее. Да, это требует больше ручной работы. Но это работает даже для проектов в 50к строк кода.
Главный секрет: LLM — не волшебная палочка. Это инструмент с ограничениями. Признать эти ограничения — первый шаг к их преодолению.
Что делать прямо сейчас
Не откладывайте. Контекстная деградация накапливается как технический долг. Чем дольше ждёте, тем дороже лечение.
- Создайте ARCHITECTURE.md для текущего проекта
- Напишите жёсткий системный промпт
- Установите правило: одна сессия — одна задача
- Начните делать контекстные якоря каждые 10 сообщений
- Проведите тест на амнезию прямо сейчас
Если вы работаете над особенно сложным проектом, изучите техники из статьи про Lost in the Middle. Там подробно разбирается, почему LLM теряет информацию в середине контекста и как с этим бороться на архитектурном уровне.
И помните: лучший способ победить деградацию контекста — не допускать её. Каждый новый промпт, каждая сессия, каждый файл — это кирпичик в стене между вами и хаосом. Стройте стену осознанно.
Потому что альтернатива — это 3 часа дебаггинга в 2 часа ночи, когда вы понимаете, что LLM забыла, как работает собственная система сохранений. А завтра дедлайн.