Почему ваши нейросети так ужасно врут: вся проблема в контексте
Разбираем главные ошибки и учимся заставлять LLM работать как надо, а не как получится.
Основные идеи
Мнение автора
Многие разработчики пытаются решить проблему, просто увеличивая контекстное окно. На практике это тупик. Гораздо эффективнее внедрить семантическую разбивку и отправлять модели только то, что действительно нужно. Качество, а не количество — вот главный принцип работы с LLM.
Все говорят о промпт-инжиниринге, но почти никто не задумывается о том, что по-настоящему важно — о контексте. Именно умение управлять контекстом, то есть информацией, к которой модель обращается при генерации ответа, часто определяет разницу между посредственным и выдающимся ИИ-приложением.
За годы работы с большими языковыми моделями (LLM) мы поняли главное: контекст — это не просто попытка запихнуть в промпт как можно больше информации. Задача — построить стратегическую информационную архитектуру, которая выжмет из модели максимум производительности в рамках технических ограничений.
Техническая реальность контекстных окон
Современные LLM работают с контекстными окнами от 8 000 до 200 000 токенов, а некоторые разработчики заявляют и о больших объемах. Однако есть несколько технических нюансов, которые заставляют нас по-другому взглянуть на работу с контекстом:
Эффект «потери в середине». Исследования постоянно показывают, что нейросети теряют внимание в середине длинных контекстов. Модели лучше всего работают с информацией, которую разместили в начале или в конце контекстного окна. Это не баг, а особенность того, как архитектура трансформеров обрабатывает последовательности.
Эффективная и теоретическая емкость. Модель с контекстным окном в 128 000 токенов не обрабатывает все эти 128 000 с одинаковой точностью. Когда вы превышаете определенные пороги (часто это 32-64 тысячи токенов), точность заметно падает. Представьте, что это похоже на человеческую рабочую память. Мы технически можем держать в голове много всего, но лучше всего работаем с небольшим, сфокусированным набором данных.
Вычислительные затраты. Длина контекста влияет на задержку и стоимость, причем во многих архитектурах зависимость квадратичная. Контекст на 100 000 токенов стоит не в 10 раз дороже, чем на 10 000. В плане вычислений он может быть дороже в 100 раз, даже если провайдеры не перекладывают все расходы на пользователей.
Чему мы научились в работе с контекстом
Наш опыт создания CRM на базе ИИ преподал нам четыре важных урока по инжинирингу контекста:
- Актуальность и релевантность важнее объема
- Структура так же важна, как и содержание
- Иерархия контекста улучшает извлечение данных
- Отсутствие состояния — это фича, а не баг
Давайте разберем каждый из этих пунктов, а затем я поделюсь практическими советами, полезными шаблонами и типичными ошибками, которых стоит избегать.
Урок 1: Актуальность и релевантность важнее объема
Самый главный вывод: больше контекста — не значит лучше. В реальных системах мы добивались значительных улучшений, когда уменьшали размер контекста и повышали его релевантность.
Например, когда мы извлекали детали сделки из почты, отправка каждого письма от контакта приводила к худшим результатам, чем отправка только тех писем, которые семантически связаны с текущей возможностью. Мы видели, как модели выдумывали даты закрытия сделки, потому что вытаскивали информацию из другого, не связанного дела, которое упоминалось полгода назад. Они просто не могли отличить полезный сигнал от шума.
Урок 2: Структура так же важна, как и содержание
Нейросети лучше реагируют на структурированный контекст, а не на свалку из данных. XML-теги, заголовки в markdown и четкие разделители помогают моделям анализировать информацию и обращать внимание на нужные детали.
Плохая структура контекста:
Вот информация о пользователе: Иван Петров, 35 лет, из Москвы, любит пиццу, работает в ООО «Ромашка», зарегистрировался в 2020 году, последний вход вчера…
Хорошая структура контекста:
<user_profile>
<identity>
<name>Иван Петров</name>
<age>35</age>
<location>Москва</location>
</identity>
<account>
<signup_date>2020-03-15</signup_date>
<last_login>2024-10-16</last_login>
</account>
<preferences>
<food>Пицца</food>
</preferences>
</user_profile>
Структурированная версия помогает модели быстро находить нужную информацию без необходимости анализировать описание на естественном языке.
Урок 3: Иерархия контекста улучшает извлечение данных
Организуйте контекст по важности и релевантности, а не по хронологии или алфавиту. Размещайте самую важную информацию в начале и в конце контекстного окна.
Оптимальный порядок:
- Системные инструкции (начало)
- Текущий запрос пользователя (начало)
- Наиболее релевантная извлеченная информация (начало)
- Вспомогательный контекст (середина)
- Примеры и крайние случаи (середина-конец)
- Финальные инструкции или ограничения (конец)
Урок 4: Отсутствие состояния — это фича, а не баг
Каждый вызов LLM не сохраняет состояние предыдущего. Это не ограничение, которое нужно преодолеть, а архитектурный выбор, который стоит принять. Вместо того чтобы пытаться поддерживать огромную историю разговоров, внедряйте умное управление контекстом:
- Храните полное состояние диалога в своем приложении
- Отправляйте только релевантную историю для каждого запроса
- Используйте семантическое разделение, чтобы определить, что действительно важно
- Применяйте суммирование для длинных диалогов
Практические советы для рабочих систем
Совет 1: Внедряйте семантическое разделение (чанкинг)
Не отправляйте целые документы. Разбивайте контент на семантические части (по теме, разделу или концепции) и используйте эмбеддинги, чтобы извлекать только релевантные фрагменты.
Схема реализации:
Запрос → Генерация эмбеддинга → Поиск по сходству → Извлечение топ-k фрагментов → Переранжирование (если нужно) → Формирование контекста → Вызов LLM
Типичное улучшение: размер контекста сокращается на 60–80%, а качество ответа улучшается на 20–30%.
Совет 2: Используйте прогрессивную загрузку контекста
Для сложных запросов начинайте с минимального контекста и постепенно добавляйте больше, если это необходимо:
- Первая попытка: основные инструкции плюс запрос
- Если модель не уверена: добавьте релевантную документацию
- Если все еще не уверена: добавьте примеры и крайние случаи
Это снижает среднюю задержку и стоимость, при этом сохраняя качество для сложных запросов.
Совет 3: Техники сжатия контекста
Три метода могут сжать контекст без потери информации:
- Извлечение сущностей: Вместо полных документов извлекайте и отправляйте ключевые сущности, связи и факты.
- Суммаризация: Для истории диалогов суммируйте старые сообщения, а не отправляйте их дословно. Для создания таких сводок можно использовать сами LLM.
- Применение схем: Используйте структурированные форматы (JSON, XML), чтобы минимизировать количество токенов по сравнению с естественным языком.
Совет 4: Внедряйте контекстные окна
Для диалоговых систем поддерживайте скользящие окна разных размеров:
- Мгновенное окно (последние 3–5 реплик): полные дословные сообщения.
- Недавнее окно (последние 10–20 реплик): краткое изложение ключевых моментов.
- Историческое окно (более старые сообщения): общая сводка обсуждавшихся тем.
Совет 5: Кэшируйте с умом
Многие провайдеры LLM теперь предлагают кэширование промптов. Структурируйте свой контекст так, чтобы стабильные части (системные инструкции, справочные документы) шли первыми и могли быть кэшированы, а динамические (запросы пользователя, извлеченный контекст) — после границы кэша.
Типичная экономия: затраты на входные токены для повторяющихся контекстов снижаются на 50–90%.
Совет 6: Измеряйте использование контекста
Внедрите в свою систему отслеживание следующих показателей:
- Средний размер контекста на запрос
- Коэффициент попадания в кэш
- Оценки релевантности извлечения
- Соотношение качества ответа и размера контекста
Эти данные помогут найти возможности для оптимизации. Мы обнаружили, что многие рабочие системы используют в 2–3 раза больше контекста, чем необходимо.
Совет 7: Корректно обрабатывайте переполнение контекста
Когда контекст превышает лимиты:
- Отдавайте приоритет запросу пользователя и критически важным инструкциям
- В первую очередь усекайте средние части
- Внедрите автоматическое суммирование
- Возвращайте четкие ошибки, а не усекайте контекст молча
Продвинутые подходы
Управление многоходовым контекстом
Для агентных систем, которые совершают несколько вызовов LLM:
Шаблон: Поддерживайте «накопитель контекста», который растет с каждым шагом, но внедрите умное суммирование после N шагов, чтобы предотвратить бесконтрольный рост.
- Шаг 1: Полный контекст
- Шаг 2: Полный контекст + Результат шага 1
- Шаг 3: Полный контекст + Суммарно(Шаги 1-2) + Шаг 3
Иерархическое извлечение контекста
Для систем RAG (генерация с дополненным извлечением) внедрите многоуровневое извлечение:
- Извлеките релевантные документы
- Внутри документов извлеките релевантные разделы
- Внутри разделов извлеките релевантные абзацы
Каждый уровень сужает фокус и повышает релевантность.
Контекстно-зависимые шаблоны промптов
Создавайте шаблоны, которые адаптируются в зависимости от доступного контекста:
if размер_контекста < 4000:
шаблон = детальный_шаблон # Есть место для примеров
elif размер_контекста < 8000:
шаблон = стандартный_шаблон # Краткие инструкции
else:
шаблон = минимальный_шаблон # Только самое необходимое
Частые ошибки, которых стоит избегать
- Антипаттерн 1: Отправлять всю историю переписки дословно. Это тратит токены на приветствия, подтверждения и болтовню не по теме.
- Антипаттерн 2: Выгружать записи из базы данных без фильтрации. Отправляйте только те поля, которые относятся к запросу.
- Антипаттерн 3: Повторять инструкции в каждом сообщении. Вместо этого используйте системные промпты или кэшированные префиксы.
- Антипаттерн 4: Игнорировать эффект «потери в середине». Не прячьте критически важную информацию в длинных контекстах.
- Антипаттерн 5: Чрезмерно полагаться на максимальный размер окна. То, что вы можете использовать 128 000 токенов, не означает, что вы должны это делать.
Что дальше
Контекстный инжиниринг останется ключевым навыком по мере развития моделей. Появляются новые подходы:
- Модели с «бесконечным» контекстом: Техники для обработки произвольно длинных контекстов через дополненное извлечение.
- Модели сжатия контекста: Специализированные модели, которые сжимают контекст для основной LLM.
- Обучаемый выбор контекста: Модели машинного обучения, которые предсказывают оптимальный контекст для запросов.
- Мультимодальный контекст: Бесшовная интеграция изображений, аудио и структурированных данных.
Эффективный инжиниринг контекста требует понимания как технических ограничений LLM, так и информационной архитектуры вашего приложения. Цель не в том, чтобы максимизировать контекст, а в том, чтобы предоставить правильную информацию в правильном формате и в правильном месте.
Начните с измерения текущего использования контекста, внедрите семантическое извлечение, четко структурируйте свой контекст и вносите изменения на основе показателей качества. Побеждают не те системы, которые отправляют максимум контекста, а те, которые отправляют самый релевантный контекст.
Будущее LLM-приложений — это не про гигантские контекстные окна, а про умный инжиниринг контекста.
Искусственный интеллект – искусственный пузырь? Экономист бьёт тревогу: крах неизбежен














