← Context engineering: beyond the prompt
07 / 07 · 45 min

Measuring context quality

Retrieval metrics, faithfulness, and end-to-end evals: how to prove a context change improved the agent instead of breaking it.

Lesson content is currently available in Russian.

What you will learn

  • →Строить golden set и измерять retrieval отдельно от генерации: recall@k, precision, MRR.
  • →Оценивать groundedness ответов через LLM-судью и калибровать судью по людям.
  • →Встраивать эвалы контекста в CI и классифицировать ошибки по слоям.

Почему «стало вроде лучше» не работает

Изменения контекста коварны нелокальностью эффектов. Вы поменяли размер чанка — и улучшили ответы про API, но сломали ответы про тарифы. Подкрутили компакт-промпт — и агент перестал терять решения, но начал терять числа. Проверка «задал три вопроса, ответы понравились» не ловит таких перекосов: у трёх вопросов нет статистической силы, а память о «как было раньше» у человека короткая и льстивая.

Поэтому базовая гигиена — регрессионный набор: фиксированный список кейсов с ожидаемыми результатами, прогоняемый при каждом изменении контекстного слоя. Меняете промпт компакции, схему чанкинга, порядок сборки контекста — прогоняете набор и смотрите дельту по всем кейсам, а не по трём любимым. Это ровно та же логика, что юнит-тесты при рефакторинге: изменение без прогона набора — не инженерия, а надежда.

Эвалы делятся на офлайн и онлайн. Офлайн — golden set с разметкой, быстрые и дешёвые, гоняются в CI. Онлайн — метрики продакшена: доля эскалаций к человеку, thumbs up/down, доля ответов «не знаю», повторные обращения по тому же вопросу. Офлайн ловит регрессии до релиза, онлайн — то, чего нет в наборе. Работают только вместе: офлайн без онлайна слепнет к реальному распределению запросов, онлайн без офлайна замечает поломку через неделю по жалобам.

Метрики retrieval-слоя

Retrieval измеряется отдельно от генерации, и это принципиально: если нужного фрагмента нет в выдаче, никакая модель не спасёт ответ — она либо откажется, либо сгаллюцинирует. Разделение слоёв позволяет чинить то, что сломано, а не крутить всё сразу.

Основа — golden set: 50–200 реальных запросов, для каждого размечено, какие фрагменты корпуса релевантны. Собирается из логов продакшена (реальные формулировки лучше выдуманных) с ручной разметкой; это скучный день работы, который окупается месяцами. По набору считаются классические метрики: recall@k — доля запросов, где нужный фрагмент попал в топ-k (главная метрика: потерянное на этом этапе не восстановить); precision@k — сколько в топ-k релевантного (низкая точность — это дистракторы в контексте, привет context rot); MRR и nDCG — насколько высоко стоят релевантные результаты, что критично, если в контекст идут только первые позиции.

Практический ориентир: recall@10 ниже 0,8 означает, что каждый пятый ответ строится без нужного источника — начинать надо отсюда, а не с промптов. Инструменты типа Ragas дают готовые реализации context precision и context recall, включая вариант с LLM-разметкой вместо ручной — полезно для быстрого старта, но выборочно сверяйте авторазметку с человеческой.

Groundedness и LLM-судья

Хороший retrieval не гарантирует честный ответ: модель может проигнорировать контекст и ответить «из головы». Для этого измеряют faithfulness (groundedness) — долю утверждений ответа, подтверждённых переданным контекстом. Схема оценки LLM-судьёй в два шага: первый вызов разбивает ответ на атомарные утверждения; второй для каждого утверждения проверяет, следует ли оно из контекста, с вердиктом «подтверждено / не подтверждено / противоречит». Метрика — доля подтверждённых; противоречия весят хуже, чем просто неподтверждённые.

Судью нельзя принимать на веру — его калибруют. Возьмите 50 случаев, разметьте людьми, посчитайте согласие судьи с человеком. Согласие ниже 80% — чините промпт судьи (типовые причины: судья засчитывает парафраз как противоречие или прощает «общеизвестные» вставки). Правила гигиены: судья работает на другой модели или минимум на другом промпте, чем оцениваемая система; критерии в промпте судьи конкретны («утверждение подтверждено, если следует из контекста без внешних знаний»); шкала — бинарная или трёхуровневая, дробные баллы вроде «7 из 10» нестабильны.

Парная метрика — answer relevancy: отвечает ли ответ на заданный вопрос. Вместе faithfulness и relevancy ловят два главных провала генерации: «красиво, но не по контексту» и «по контексту, но не про то».

End-to-end эвалы и цикл улучшения

Метрики слоёв необходимы, но недостаточны: пользователь видит только конечный результат. End-to-end эвал прогоняет всю систему на реалистичных сценариях, включая multi-turn: «спроси про X, уточни Y, попроси сравнить с Z» — именно на длинных сценариях всплывают проблемы компакции и памяти, невидимые в одиночных вопросах. Синтетические тесты вроде «иголки в стоге» для этого непригодны: как показал отчёт о context rot, модели проходят их почти идеально, продолжая проваливать реальные длинные задачи. Для длинного контекста есть специализированные наборы вроде LongBench, но свои сценарии на своих данных всегда информативнее.

Когда эвал нашёл провалы, начинается главное — анализ ошибок с классификацией по слоям: нужный фрагмент не был извлечён (чинить retrieval); извлечён, но проигнорирован (раскладка окна, дистракторы); инструкция потерялась в длинном диалоге (компакция, позиция инвариантов); память протухла (политика обновления); ответ не обоснован контекстом (промпт генерации). Пара десятков размеченных так провалов почти всегда показывает: 70% ошибок сидят в одном-двух слоях — туда и направляются усилия, вместо интуитивного кручения всего подряд.

Замыкает цикл автоматизация: эвал-набор живёт в репозитории рядом с кодом, гоняется в CI на каждое изменение контекстного слоя, и падение метрик блокирует релиз так же, как красные тесты. С этого момента контекст-инжиниринг становится тем, чем должен быть, — измеримой инженерной дисциплиной.

Practice

Golden set и судья для своего RAG

Соберите golden set из 15 реальных запросов к вашему ассистенту с разметкой релевантных фрагментов. Посчитайте recall@5 и precision@5, затем оцените faithfulness ответов LLM-судьёй и сверьте судью с собственной разметкой на 10 случаях.

Deliverable

Набор кейсов с разметкой, скрипт подсчёта метрик, значения recall@5 / precision@5 / faithfulness и таблица согласия судьи с человеком.

Checkpoint

После смены схемы чанкинга пользователи жалуются на ответы «не по теме». Опишите, какими метриками вы локализуете слой поломки и почему нельзя начинать с правки промпта.

  • ✓ Первым шагом измерен retrieval по golden set: recall@k и precision@k до и после смены чанкинга.
  • ✓ Разведены случаи «фрагмент не извлечён» и «извлечён, но проигнорирован» с разными исправлениями.
  • ✓ Сформулировано правило: изменение контекстного слоя без прогона регрессионного набора не выкатывается.

Check yourself

Почему retrieval измеряют отдельно от генерации?

01Почему retrieval измеряют отдельно от генерации?

Что измеряет recall@k?

02Что измеряет recall@k?

Что такое faithfulness (groundedness) ответа?

03Что такое faithfulness (groundedness) ответа?

Зачем калибровать LLM-судью по человеческой разметке?

04Зачем калибровать LLM-судью по человеческой разметке?

Почему высокий результат на «иголке в стоге» не гарантирует качество на реальных задачах?

05Почему высокий результат на «иголке в стоге» не гарантирует качество на реальных задачах?

Sources

Measuring context quality · Context engineering: beyond the prompt · VORCL