В статье рассматривается подход к разработке контекста для RAG — так называемая контекстная инженерия. Её суть в том, чтобы собрать весь необходимый контекст для решения задачи с помощью LLM. Тоби Лютке и Андрей Карпати в 2025 году предложили использовать этот термин вместо «оперативного инжиниринга».
Архитектура включает четыре блока: анализ документов, анализ вопросов, поиск и генерация. Каждый из них создаёт типизированные фрагменты данных, которые объединяются при одном вызове LLM. В процессе синтаксического анализа формируются реляционные таблицы и обобщение на уровне документа. При анализе вопросов получается обработанный вопрос с типизированными полями (ключевые слова, intent, structural_hints и др.). Извлечение данных даёт отфильтрованный набор строк и аудит выбора. Генерация использует собранную полезную нагрузку с фиксированным системным запросом, шаблоном пользовательского контента и агрегатором PromptContext.
Контекстное окно LLM включает несколько типов данных: системную подсказку (роль, правила, примеры), извлечённые документы или строки, историю обсуждений, определения инструментов и их выходные данные, память, структурированные метаданные и пользовательский ввод. В статье подробно разобраны четыре части полезной нагрузки для одного документа:
1. Фиксированное системное приглашение (не меняется при каждом вызове).
2. Отфильтрованные строки, которые фактически читает LLM (диспетчер выбирает метод извлечения данных и возвращает отфильтрованный фрейм плюс аудит).
3. Блок контекста документа в формате compact JSON (обобщение на уровне документа: тип, количество страниц, типичные поля, краткое содержание).
4. Агрегатор PromptContext, который объединяет три предыдущих элемента.
Такой подход позволяет оптимизировать затраты — системное приглашение можно кэшировать, а пользовательский контент сжимать и тщательно отбирать. Также он упрощает аудит: при неверном ответе можно выяснить, что именно попало в контекстное окно для конкретного вызова, и локализовать проблему (неверный doc_context, неправильно выбранные страницы и т. д.).
В статье также упоминаются дальнейшие направления работы: корпусный контекст (когда для ответа нужно читать много документов), история разговоров (предыдущие пары вопрос‑ответ в многооборотном чате) и вызовы инструментов (отображение определений инструментов и промежуточных состояний в контекстном окне).
Доступны записные книжки для запуска на GitHub: doc-intel/notebooks-vol1.