$ sudo teach|
    $ sudo teach|
    IT school
  • Telegram
  • Партнёрам
  • Все курсы
$ sudo teach IT
OOO "SALEPROFIT"Контакты и реквизитыIT-Park Logo

Школа

  • Блог
  • Проверить сертификат

Сотрудничество

  • Стать учителем
  • Партнёрская программа
  • О проекте

Право

  • Оферта
  • Политика конфиденциальности

© 2023–2026 $ sudo teach IT™. All Rights Reserved. Public user contributions licensed under CC BY-SA 4.0 license with attribution required
TelegramGitHubYouTube
ГлавнаяБлогRAG в проде: как проверять качество, кэшировать контекст и отлавливать деградации

RAG в проде: как проверять качество, кэшировать контекст и отлавливать деградации

$ sudo teach IT
·16 августа 2026 г.·12 мин·30
RAG в проде: как проверять качество, кэшировать контекст и отлавливать деградации

Поговорим о том, как сделать retrieval-доставку стабильной: метрики на источниках, контроль релевантности, контроль качества ответа и стратегии повторного извлечения. Рассмотрим, где уместен кэш для контекста и как запускать регрессионные тесты наборами з

Содержание
Архитектура RAG в проде: где “ломается” качествоМетрики: что измерять на источниках и в retrievalЗачем метрики именно “на источниках”Релевантность в retrieval: offline и onlineМетрики качества на уровне “контекст собран правильно”Online-мониторинг без разметкиКонтроль релевантности: как заставить RAG не брать “плохие” чанкиПорог по similarity (но аккуратно)Cross-encoder reranking: контроль “на релевантность”, а не только близостьДедупликация и контроль “разных источников”Контроль качества ответа: оценивать не только “как звучит”, но и “насколько подтверждаемо”Механизмы автоматической оценкиЧек “следует ли ответ контексту”Сегментация качества по типам запросовСтратегии повторного извлечения: когда k недостаточно, а контекст — не монолитЧто такое “повторное извлечение” в RAGКак не взорвать латентностьЧто измерять для re-retrievalКэширование контекста: где уместно и как не сломать корректностьЧто кэшироватьКлюч к корректности: версионированиеПроблема: одинаковый запрос ≠ одинаковая доставкаTTL и инвалидированиеМожно ли кэшировать именно ответ LLM?Регрессионные тесты: как запускать наборы запросов и ловить деградации до пользователейЗачем нужны регрессионные тесты в RAGПостройте golden set и разделите по типамЧто тестировать: retrieval и генерацию раздельноМетрики для регрессионных “порогов”Автоматизация: как делать диффыВстраивание в релизный процессТипичные подводные камни и практические рекомендации1) Чанкинг “выглядит нормально”, но ломает retrieval2) Метрики “про retrieval” и “про ответ” могут расходиться3) Кэш может скрывать деградацию4) Ранжирование и пороги должны быть “привязаны” к версии5) Деградации часто происходят “ступеньками”Как всё собрать в единую практическую схему (рекомендованная “минимальная” зрелость)Вывод: RAG в проде — это дисциплина измерений и управляемых компромиссов

Retrieval-Augmented Generation (RAG) в теории звучит просто: ищем релевантные фрагменты в базе знаний, подмешиваем их в промпт и получаем более точный ответ. На практике же RAG — это распределённая система со множеством “мелких” точек отказа: индексация документов, токенизация и чанкинг, качество векторной модели, ранжирование, формирование контекста, лимиты по контекстному окну, перезапуски процессов, дрейф данных, различия в моделях и даже изменения формата промпта.

Если вы хотите, чтобы RAG стабильно работал в продакшене, нужно смотреть не только на “красивые ответы”, но и на измеримое качество на каждом этапе: retrieval, сбор контекста и генерацию. В этой статье разберём практические стратегии: какие метрики собирать, как контролировать релевантность, как проверять качество ответа, как кэшировать контекст без разрушения корректности и как запускать регрессионные тесты по наборам запросов, чтобы деградации не проходили незамеченными.


Архитектура RAG в проде: где “ломается” качество

Типичный конвейер RAG выглядит так:

  1. Нормализация запроса (язык, морфология, иногда перефразирование).
  2. Получение запроса эмбеддингом.
  3. Поиск по индексу: топ-k кандидатов по векторной близости, иногда плюс фильтры по метаданным.
  4. Ранжирование/переразметка: (опционально) cross-encoder, BM25, hybrid retrieval.
  5. Формирование контекста:
    • выбор нескольких чанков,
    • дедупликация,
    • тримминг по токенам,
    • форматирование (цитаты, заголовки, источники).
  6. Генерация LLM с инструкцией “отвечай по контексту”.
  7. Постобработка: валидация, извлечение фактов/цитат, фильтры отказа, маршрутизация.

В этой цепочке разные виды деградаций проявляются по-разному:

  • Retrieval ухудшился: LLM начинает отвечать “уверенно, но мимо”, потому что контекст систематически не совпадает с вопросом.
  • Контекст неправильно собран: вы отрезаете нужные фрагменты из-за токен-лимита или теряете заголовки/источники.
  • Модель генерации изменилась: то же retrieval даёт другие формулировки, может увеличиться доля галлюцинаций.
  • Данные в индексе дрейфуют: обновления документов, изменения чанкинга, ошибки при переиндексации.
  • Промпт/шаблон изменился: даже небольшие правки могут повлиять на следование инструкциям.

Поэтому контроль качества должен быть многоуровневым.


Метрики: что измерять на источниках и в retrieval

Зачем метрики именно “на источниках”

Если измерять только итоговую метрику ответа (например, user satisfaction), вы узнаете о проблеме поздно и зачастую не сможете локализовать причину. Метрики на retrieval позволяют:

  • быстро отличить “проблема в данных/индексе” от “проблема в генерации”;
  • отследить регрессии при изменениях ранжирования/чанкинга/фильтров;
  • оценить эффект от кэша и стратегий повторного извлечения.

Релевантность в retrieval: offline и online

Для offline-оценки вам нужны наборы запросов (golden set) и эталоны релевантных документов/чанков. Это может быть разметка экспертами, логирование кликов, соответствие “вопрос → правильная статья”, или полуавтоматическая разметка.

Дальше используйте классические информационно-поисковые метрики:

  • Recall@k: доля запросов, где хотя бы один релевантный чанк попал в топ-k.
  • MRR@k (Mean Reciprocal Rank): насколько высоко в выдаче находится первый релевантный.
  • nDCG@k: учитывает не только факт релевантности, но и степень/порядок.

Для RAG особенно полезно смотреть не только “есть ли релевантное”, но и где оно: если оно на позиции 30, а вы берёте топ-5 — LLM никогда его не увидит.

Метрики качества на уровне “контекст собран правильно”

Даже если retrieval релевантный, качество может упасть из-за формирования контекста. Поэтому стоит ввести метрики:

  • Coverage контекста: сколько доли найденных релевантных чанков реально попало в итоговый контекст после дедупликации и тримминга.
  • Token budget utilization: сколько токенов “съели” источники/шум и сколько осталось на полезные фрагменты.
  • Source consistency: соответствие того, что модель цитирует, тому, что реально было в контексте.

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

Online-мониторинг без разметки

В проде полноценную разметку релевантных чанков обычно делать дорого. Поэтому вводят прокси-метрики:

  • Score distribution по retrieval: распределение similarity по top-k. Резкий сдвиг вниз может означать деградацию эмбеддингов, смену модели, проблемы с индексом или дрейф данных.
  • Доля “пустых” ответов/отказов: если вы используете механизм отказа (“если нет уверенности — не отвечаю”), то рост отказов часто коррелирует с ухудшением retrieval.
  • Confidence calibration: если есть сигнал уверенности (например, повторная проверка LLM или отдельный классификатор), мониторьте её распределение.
  • Поведенческие сигналы: клики на источники, жалобы, повторные обращения с уточнением вопроса.

Важно: online-прокси метрики должны быть привязаны к offline-эталону. Иначе вы будете реагировать “на шум”.


Контроль релевантности: как заставить RAG не брать “плохие” чанки

Порог по similarity (но аккуратно)

Самый простой фильтр — отсекать retrieval по порогу score. Это работает, если:

  • similarity хорошо коррелирует с релевантностью в вашем домене;
  • распределение score стабильно между версиями моделей и индексами.

Но в реальности порог часто “плывёт”: вы сменили embedding model или добавили документы, и порог перестал соответствовать. Поэтому пороги стоит делать версионируемыми и пересчитывать на каждом релизе retrieval-части.

Cross-encoder reranking: контроль “на релевантность”, а не только близость

Если у вас есть возможность запустить более дорогой reranker (cross-encoder или LLM-ранжирование), используйте его для финального отбора, например top-50 → top-5.

Плюсы:

  • выше точность отбора;
  • предсказуемость качества при шумных эмбеддингах.

Минусы:

  • увеличивается латентность;
  • нужна аккуратная кэширование и батчинг.

Хорошая практика: измерять вклад rerank. То есть сравнить Recall@k и nDCG до и после rerank. Если improvement минимален, возможно, тратить ресурсы неэффективно.

Дедупликация и контроль “разных источников”

RAG иногда деградирует не из-за того, что релевантного нет, а из-за того, что retrieval приносит много почти одинаковых чанков из одного и того же документа. Контекст раздувается, а информация “не расширяется”.

Решения:

  • дедупликация по document_id;
  • diversity selection: выбирать чанки с максимальным покрытием по разным документам;
  • MMR-подобный отбор (Maximal Marginal Relevance): баланс между релевантностью и новизной.

Контроль качества ответа: оценивать не только “как звучит”, но и “насколько подтверждаемо”

Механизмы автоматической оценки

Для контроля качества ответа в RAG применяют несколько подходов — часто в комбинации:

  1. LLM-as-a-judge: модель проверяет, отвечает ли текст по фактам, присутствуют ли утверждения в контексте.
  2. Fact extraction + citation check: извлечь утверждения/цифры и проверить, что они поддержаны цитатами.
  3. Answer consistency: повторить генерацию с той же выборкой контекста и проверить согласованность.
  4. Self-check / adversarial prompts: заставить модель найти противоречия (“перечисли, что не подтверждено источниками”).
  5. Guardrails: правила отказа, запреты на “воду”, требования цитирования.

Ключевое — оценка должна коррелировать с пользовательской полезностью. Поэтому перед тем как запускать LLM-judge в прод, сделайте оффлайн-валидацию на размеченных примерах.

Чек “следует ли ответ контексту”

Частая ошибка: даже при хороших чанках LLM иногда формулирует обобщения или добавляет детали, которых нет в источниках. Это проявляется как рост “неподтверждённых утверждений”.

Практика:

  • в промпте требуйте цитирование: “Каждое утверждение должно ссылаться на фрагмент из контекста”.
  • в постпроцессинге проверяйте, что количество ссылок достаточно и что ссылки соответствуют реальным чанкам.

Если вы используете “цитаты по id чанка”, проверка может быть строгой: нет ссылки — считается ошибкой.

Сегментация качества по типам запросов

Одни и те же метрики “в среднем” могут скрыть проблемы. Например:

  • FAQ-тексты короткие и легко достаются → качество высокое.
  • Вопросы с “тонкими” ограничениями (даты, версии, условия) → retrieval нужен более точный, а без него ответы ломаются.

Поэтому ведите витрины качества по сегментам:

  • длина запроса,
  • наличие сущностей (названия, версии),
  • тип намерения (как сделать / что это / сравнение / устранение ошибки),
  • доля запросов, где контекст “перекрывает” релевантные чанки.

Стратегии повторного извлечения: когда k недостаточно, а контекст — не монолит

Что такое “повторное извлечение” в RAG

Повторное извлечение (re-retrieval) — это динамическое изменение retrieval-части, если модель/проверка признаёт, что ответ слабый или контекст неполон.

Сценарии:

  1. Initial retrieval → generation → check
    Если judge говорит “не подтверждено” или обнаружены неподдержанные утверждения, делаем повторный поиск с другим параметром.
  2. Query rewriting
    Перефразируем запрос (или извлекаем ключевые сущности) и повторяем retrieval.
  3. Adaptive k / rerank
    Увеличиваем k или включаем reranking, если уверенность низкая.
  4. Multi-hop
    Для сложных вопросов иногда нужно сделать два шага: сначала найти документ-обзор, затем уже в нём уточняющий запрос.

Как не взорвать латентность

Повторное извлечение — это дорого. Поэтому используйте:

  • лимиты: максимум 1-2 попытки;
  • условия: триггеры должны быть строгими (например, судья выявил >N неподтверждённых утверждений);
  • экономные варианты: вместо полного rerank можно расширить k или использовать более дешёвый reranker.

Что измерять для re-retrieval

Обязательно меряйте:

  • доля запросов, где сработала повторная попытка;
  • delta качества: насколько улучшились успешные запросы;
  • trade-off: насколько выросло время ответа и стоимость.

Если re-retrieval почти всегда срабатывает, значит проблема системная: возможно, нужен пересмотр чанкинга/индекса или контроль порогов.


Кэширование контекста: где уместно и как не сломать корректность

Что кэшировать

Есть несколько уровней:

  1. Эмбеддинги запроса: почти всегда кэшируются по нормализованному запросу (и версию модели эмбеддинга).
  2. Результаты retrieval (список чанков + scores): часто лучший кандидат на кэш.
  3. Сформированный контекст (уже тримминг + форматирование): тоже можно, но нужно аккуратно.

Обычно самый полезный эффект даёт кэш retrieval-результатов, потому что он дорог в вычислении и повторяется между похожими запросами.

Ключ к корректности: версионирование

Если вы кэшируете контекст, в ключ кэша обязательно добавляйте:

  • версию embedding model;
  • версию индекса (или hash набора документов/чанков);
  • параметры retriever (k, фильтры по метаданным, пороги);
  • версию шаблона промпта/контекстного форматтера;
  • желательно — версию reranker (если есть).

Без этого “старый контекст” может быть несогласован с новой логикой ранжирования.

Проблема: одинаковый запрос ≠ одинаковая доставка

В проде запрос может иметь разные “контекстные” ограничения: пользовательский доступ к документам, язык, регион, актуальность (дата среза). Поэтому если у вас есть доступ/фильтры, они обязаны входить в ключ.

Пример: один и тот же вопрос “Как вернуть товар?” для разных сегментов может требовать разные источники (региональные правила).

TTL и инвалидирование

Кэш retrieval результатов обычно имеет смысл хранить ограниченное время (TTL), особенно если документы часто обновляются. Более строгое решение:

  • инвалидация по версии индекса: когда индекс пересобран, вы просто меняете version_id, и старые кэши становятся недействительными.

TTL при этом можно ставить умеренный (например, часы), чтобы защититься от неожиданных обновлений.

Можно ли кэшировать именно ответ LLM?

Обычно это сложнее и рискованнее: ответы зависят от температуры, контекста, системных инструкций и иногда могут требовать персонализации. Для “доставки контекста” кэширование безопаснее, чем для генерации.


Регрессионные тесты: как запускать наборы запросов и ловить деградации до пользователей

Зачем нужны регрессионные тесты в RAG

В RAG регрессии возникают часто: меняется чанкинг, обновляется эмбеддинговая модель, оптимизируется retrieval, перерабатывается промпт, добавляются новые документы. Без регрессии вы ловите проблемы только через отзывы или “внезапное ухудшение”.

Задача регрессионных тестов — заранее определить, что “качество упало” по измеримым критериям.

Постройте golden set и разделите по типам

Набор запросов должен отражать:

  • самые частые пользовательские сценарии;
  • критичные домены (где ошибка дорогая);
  • сложные случаи (много сущностей, длинные вопросы, сравнения, уточнения).

Обычно удобно группировать запросы на категории и хранить для каждой категории минимальные требования:

  • Recall@k должен быть не ниже X,
  • доля неподтверждённых утверждений не выше Y,
  • доля отказов не должна резко расти,
  • время ответа не превышает бюджет.

Что тестировать: retrieval и генерацию раздельно

Рекомендация: разделить тесты на два слоя.

Layer 1 — retrieval tests (быстрые):

  • запуск retrieval на фиксированном индексе и параметрах;
  • проверка Recall@k/MRR/nDCG по размеченным “правильным” чанкам;
  • проверка статистики score distribution.

Layer 2 — end-to-end tests (дороже):

  • прогон LLM с фиксированными параметрами (температура, шаблоны);
  • проверка judge/цитирования/доли неподтверждённых утверждений;
  • иногда — ручная инспекция небольшого числа кейсов по диффу.

Метрики для регрессионных “порогов”

Установите guardrails:

  • Абсолютные пороги (например, Recall@5 ≥ 0.72).
  • Относительные пороги (например, падение MRR@10 более чем на 10% недопустимо).
  • Стабильность (например, не допускается рост доли отказов > 2x).

Самая частая ошибка — ставить только средние значения. Нужно ловить хвосты: если качество резко упало на “сложных” категориях, среднее может почти не измениться.

Автоматизация: как делать диффы

В практической системе полезны:

  • сравнение результатов retrieval топ-кандидатов до/после (какие чанки выпали/появились);
  • сравнение “цитируемость” ответа: число ссылок, покрытие чанков;
  • кластеризация ошибок: например, “не нашло нужное”, “нашло не то”, “нашло то, но LLM добавила лишнее”.

Так вы ускоряете расследование: не просто “качество упало”, а “упало из-за X”.

Встраивание в релизный процесс

Идеально: при каждом релизе retrieval/индекса/ранжировщика запускать suite и блокировать выкладку, если срабатывают критерии. Для модели LLM можно запускать отдельный тестовый прогон из-за стоимости, но хотя бы retrieval-layer должен быть всегда.


Типичные подводные камни и практические рекомендации

1) Чанкинг “выглядит нормально”, но ломает retrieval

Слишком крупные чанки → модель получает шум, хуже точность; слишком мелкие → релевантный фрагмент “теряется” среди других. Тестируйте варианты чанкинга и оценивайте Recall@k и качество end-to-end.

Практический подход:

  • выбрать базовый размер и overlap,
  • провести небольшой A/B на golden set,
  • зафиксировать параметры, которые улучшают не только retrieval, но и подтверждаемость ответа.

2) Метрики “про retrieval” и “про ответ” могут расходиться

Бывает, что Recall@k неплохой, но ответы хуже — значит проблема в генерации (промпт, ограничения, требования к цитированию) или в формировании контекста (тримминг, дедупликация).

Поэтому держите раздельные метрики и диффы по слоям.

3) Кэш может скрывать деградацию

Если вы кэшируете контекст или retrieval, то после изменения индекса вы можете некоторое время “получать старые результаты” и не увидеть проблему. Решение — версионирование ключей кэша и быстрые инвалидации.

4) Ранжирование и пороги должны быть “привязаны” к версии

Пороги similarity, которые работали на одной версии эмбеддингов, могут быть неверными на другой. Не храните параметры “в проде по умолчанию” — сделайте их частью конфигурации и версионируйте.

5) Деградации часто происходят “ступеньками”

Например:

  • после переиндексации изменилась токенизация → score distribution сдвинулось,
  • после обновления промпта LLM начала цитировать меньше,
  • после изменения лимита контекста обрезается ключевая часть.

Регрессионные тесты и online-мониторинг distribution ловят такие эффекты.


Как всё собрать в единую практическую схему (рекомендованная “минимальная” зрелость)

Если вы хотите начать без огромного инженерного проекта, можно выстроить разумный минимум:

  1. Golden set: 200–1000 запросов по ключевым сценариям.
  2. Retrieval метрики: Recall@k/MRR/nDCG для чанков.
  3. End-to-end оценка: judge или citation-check для подсчёта неподтверждённых утверждений.
  4. Online мониторинг:
    • score distribution,
    • доля отказов/низкокачественных ответов,
    • доля ошибок в валидации цитат.
  5. Кэш retrieval результатов с версионированием ключей.
  6. Регрессионный suite в CI/CD: retrieval-layer всегда, end-to-end — по расписанию/по релизу с лимитом.

Дальше зрелость растёт: добавляются multi-hop, более умный adaptive retrieval, better query rewriting, кэширование на уровне сформированного контекста, и т.д.


Вывод: RAG в проде — это дисциплина измерений и управляемых компромиссов

RAG перестаёт быть “демо-технологией”, когда вы начинаете относиться к retrieval и генерации как к системе, где качество нужно контролировать на каждом этапе. Практика показывает: большинство “необъяснимых” падений качества связаны не с моделью LLM напрямую, а с retrieval-параметрами, формированием контекста, порогами и кэш-стратегиями. Поэтому:

  • измеряйте релевантность на уровне источников (Recall@k/MRR/nDCG) и контролируйте coverage контекста;
  • оценивайте качество ответа через подтверждаемость и согласованность с тем, что реально было в контексте;
  • используйте повторное извлечение точечно, по сигналам неуверенности, а не “вслепую”;
  • кэшируйте retrieval/контекст только с строгим версионированием ключей и понятным инвалидированием;
  • держите регрессионные тесты наборами запросов и запускайте их в релизном цикле, чтобы деградации ловились до пользователей.

Если хочется быстрее структурировать подход к retrieval и качеству на практике, полезно посмотреть дополнительные материалы по RAG-системам — например, тематический курс по этой зоне знаний: [ /course/ ].


Войдите, чтобы поставить лайк и оставить комментарий.

Автор

$ sudo teach IT

Продолжите обучение

Все курсы
Python – для начинающих!

Python – для начинающих!

С нуля до профессионального уровня. Подходит для всех. Учитесь каждый день и овладейте самым популярным языком программирования.

Перейти к курсу

Приложения для iPhone и Apple Watch на SwiftUI

Разработка приложений для iPhone и Apple Watch на SwiftUI: навигация, SwiftData, виджеты, часы, выпуск. Нужен Mac с Xcode 27, сами устройства не нужны.

Перейти к курсу
Ботостроение Telegram

Ботостроение Telegram

Лёгкий, быстрый и доступный способ познакомиться с миром ботостроения в Telegram. Видео, конспекты, практика и помощь – всё у нас на курсе.

Перейти к курсу

Приложения для macOS на SwiftUI

Разработка приложений для Mac на SwiftUI: окна и меню, Liquid Glass, SwiftData, сеть, выпуск. Нужен Mac с macOS 27 и Xcode 27.

Перейти к курсу

Другие статьи

Качество данных в пайплайнах: валидация на входе и «контракты» в обработчиках
качество

Качество данных в пайплайнах: валидация на входе и «контракты» в обработчиках

Научимся выявлять плохие данные раньше: схемы, строгие типы, проверки инвариантов и алертинг. Покажем практики, которые снижают число инцидентов в проде.

24 июля 2026 г.
430
Ошибки HTTP в проде: как строить понятный клиентский контракт (код, причина, поле и ретраи)
ошибки

Ошибки HTTP в проде: как строить понятный клиентский контракт (код, причина, поле и ретраи)

Покажем, как проектировать ошибки так, чтобы фронтенд и интеграции могли принимать решения: что ретраить, какие поля считать виноватыми, как различать 4xx/5xx и как стабилизировать формат ответа.

28 июля 2026 г.
420
Создание Telegram бота в 2026 легко и просто! Полный курсы!
создание

Создание Telegram бота в 2026 легко и просто! Полный курсы!

19 июня 2026 г.
1171
Нужно ли мне знать математику, чтобы начать программировать?
знать

Нужно ли мне знать математику, чтобы начать программировать?

Разберём, где математика реально нужна (и где нет) для новичка: основы Python/веб/автоматизация/аналитика. В конце составим понятный маршрут обучения без лишней теории и подскажем, что повторить, если вы чувствуете пробелы.

28 сентября 2026 г.
20
FastAPI и фоновые задачи: когда лучше использовать BackgroundTasks, а когда очередь
fastapi

FastAPI и фоновые задачи: когда лучше использовать BackgroundTasks, а когда очередь

Поймём различия между синхронной обработкой, BackgroundTasks и внешними очередями. Разберём idempotency, ретраи и мониторинг фоновых процессов.

22 июля 2026 г.
810
Что такое переменная простыми словами: примеры из жизни и первый код
такое

Что такое переменная простыми словами: примеры из жизни и первый код

Разберём, что такое переменная без терминов: как “хранить” значение в памяти и как читать/менять его в программе. Дальше — мини-примеры на вводе/выводе и задания для новичка, чтобы закрепить понимание прямо в коде.

25 сентября 2026 г.
60

Комментарии

Пока нет комментариев

Содержание

Архитектура RAG в проде: где “ломается” качествоМетрики: что измерять на источниках и в retrievalЗачем метрики именно “на источниках”Релевантность в retrieval: offline и onlineМетрики качества на уровне “контекст собран правильно”Online-мониторинг без разметкиКонтроль релевантности: как заставить RAG не брать “плохие” чанкиПорог по similarity (но аккуратно)Cross-encoder reranking: контроль “на релевантность”, а не только близостьДедупликация и контроль “разных источников”Контроль качества ответа: оценивать не только “как звучит”, но и “насколько подтверждаемо”Механизмы автоматической оценкиЧек “следует ли ответ контексту”Сегментация качества по типам запросовСтратегии повторного извлечения: когда k недостаточно, а контекст — не монолитЧто такое “повторное извлечение” в RAGКак не взорвать латентностьЧто измерять для re-retrievalКэширование контекста: где уместно и как не сломать корректностьЧто кэшироватьКлюч к корректности: версионированиеПроблема: одинаковый запрос ≠ одинаковая доставкаTTL и инвалидированиеМожно ли кэшировать именно ответ LLM?Регрессионные тесты: как запускать наборы запросов и ловить деградации до пользователейЗачем нужны регрессионные тесты в RAGПостройте golden set и разделите по типамЧто тестировать: retrieval и генерацию раздельноМетрики для регрессионных “порогов”Автоматизация: как делать диффыВстраивание в релизный процессТипичные подводные камни и практические рекомендации1) Чанкинг “выглядит нормально”, но ломает retrieval2) Метрики “про retrieval” и “про ответ” могут расходиться3) Кэш может скрывать деградацию4) Ранжирование и пороги должны быть “привязаны” к версии5) Деградации часто происходят “ступеньками”Как всё собрать в единую практическую схему (рекомендованная “минимальная” зрелость)Вывод: RAG в проде — это дисциплина измерений и управляемых компромиссов