← Production RAG: retrieval systems that do not hallucinate
07 / 07 · 50 min

Capstone: production RAG with an SLO, budget, and rollback

Choose a vector store, model capacity and cost, design tenant-safe caches and degradation, then prove canary and rollback in a game day.

Lesson content is currently available in Russian.

What you will learn

  • →Выбирать vector DB и топологию индекса по объёму, фильтрам, SLA и операционной модели, а не по маркетинговому чек-листу.
  • →Считать стоимость одного RAG-запроса по стадиям и ставить кеши там, где они не нарушают свежесть и tenant isolation.
  • →Проектировать SLO, деградацию, canary и rollback для индекса, retrieval-конфига и генерации.
  • →Собрать проверяемый архитектурный пакет, по которому другая команда сможет развернуть и принять систему.

Vector DB выбирают по ограничениям, а не по логотипу

Финальная архитектура начинается не со списка продуктов, а с workload sheet. Зафиксируйте число векторов сегодня и через год, размерность и тип вектора, средний размер metadata, частоту обновлений, долю удалений, требования к фильтрам, top-k, p95 latency, доступность и региональность. Добавьте операционную модель: managed-сервис, собственный кластер или локальный индекс в одном процессе. Без этих чисел сравнение Qdrant, Weaviate, Pinecone, pgvector или FAISS превращается в спор по скриншотам.

Память индекса оценивайте до загрузки данных. Грубая нижняя граница для dense-векторов float32 — N × dimensions × 4 bytes; к ней добавляются граф HNSW, payload-индексы, реплики и запас на compaction. Миллион 1536-мерных векторов — уже около 6.1 GB только сырого массива. Квантизация уменьшает footprint, но её влияние на recall измеряют на вашем golden-наборе, а не принимают на веру.

Решение оформите ADR с критериями и rejected alternatives. Например: pgvector разумен, если корпус умеренный, транзакционные данные уже в Postgres и важны сложные relational-фильтры; специализированная vector DB выигрывает при большом индексе, высокой параллельности, распределённой репликации и сложном hybrid retrieval. FAISS — библиотека, а не готовая распределённая база: persistence, репликация, фильтры и контроль доступа останутся вашей ответственностью.

Экономика запроса и безопасное кеширование

Стоимость RAG-запроса раскладывается по стадиям: embedding запроса, vector/lexical search, reranker, входные токены генерации, выходные токены, сетевые переходы и инфраструктура индекса. Считайте не только среднее, но и стоимость p95-сценария: multi-hop может сделать три retrieval-цикла, а длинный контекст — умножить самую дорогую часть. В трассу записывайте retrieval_candidates, reranked_count, context_tokens, output_tokens, стоимость каждой модели и версию конфигурации — тогда бюджет объясним, а не вычислен постфактум по общему счёту провайдера.

Кеши ставятся на разных уровнях и имеют разные ключи. Embedding-cache безопасно ключевать хешем нормализованного запроса плюс версия модели. Retrieval-cache обязан включать tenant, ACL-срез, версию индекса и параметры поиска; иначе быстрый кеш становится каналом межклиентской утечки. Response-cache допустим только для публичных или строго детерминированных ответов и также должен учитывать права и версию корпуса. Semantic cache по близости запросов экономит больше, но может вернуть правдоподобный ответ на другой вопрос — его порог и классы исключений проверяются отдельным eval-набором.

Freshness — часть контракта. Каждое изменение документа увеличивает версию корпуса или инвалидирует связанные ключи; TTL — дополнительная страховка, а не основной механизм корректности. Отдельно измеряйте hit rate, долю stale-hit, экономию токенов и ошибки изоляции. Кеш, для которого команда не умеет доказать инвалидацию и tenant boundary, в production не включается.

SLO и деградация: что произойдёт при отказе каждой ступени

Определите пользовательский SLO, а не только uptime отдельных сервисов. Для внутреннего ассистента это может быть: 99% ответов быстрее 4 секунд, 99.9% запросов без межтенантной утечки, recall@10 не ниже базовой линии минус 2 пункта и не менее 95% ответов с проверенными цитатами. Latency, correctness и safety — разные SLI; объединять их в один «quality score» нельзя, потому что при инциденте он не показывает, что именно нарушено.

Для каждой зависимости задайте явную деградацию. Vector DB недоступна — не просить LLM ответить из памяти, а вернуть честный отказ или переключиться на разрешённый lexical fallback. Reranker превысил deadline — использовать top-k первой ступени и пометить трассу. Генератор недоступен — отдать найденные документы, если продуктовый контракт это допускает. Judge упал — в высокорисковом домене блокировать ответ, в низкорисковом показать предупреждение. Deadline распределяется по стадиям заранее; бесконечные retry только превращают частичный отказ в каскадный.

Наблюдаемость связывает запрос с версиями embedding-модели, индекса, chunker, retrieval-конфига и промпта. Алерт строится по burn rate error budget, а не по одиночному всплеску p95. Runbook рядом с алертом отвечает на три вопроса: как подтвердить симптом, как безопасно деградировать и какую версию откатить.

Canary и rollback: индекс тоже является релизом

Изменение chunking, embedding-модели или metadata-схемы нельзя выкатывать поверх живого индекса. Создайте новый versioned index, полностью заполните его, прогоните integrity-проверки и offline eval, затем запустите shadow traffic: новый retrieval получает копию запросов, но пользователь ещё видит старый результат. Сравните recall, overlap top-k, latency, zero-result rate и стоимость по одинаковым запросам.

После shadow идёт canary на малой доле пользователей или tenants с автоматическим стопом по SLO. Переключатель маршрутизации должен позволять вернуть старый индекс без повторной индексации. Старую версию не удаляют до завершения окна наблюдения и проверки обратимости новых документов. Dual-write во время перехода требует метрики рассинхронизации и очереди повторов — «пишем в оба и надеемся» не является стратегией.

Итоговый production blueprint состоит из диаграммы потока, ADR выбора хранилища, схемы данных и ACL, таблицы стоимости, eval-baseline, SLO/error budget, dashboard, runbook и пошагового rollback. Перед приёмкой проведите game day: искусственно отключите reranker или новый индекс и докажите, что система переходит в запланированный режим, алерт срабатывает, а оператор возвращает предыдущую версию по инструкции.

Practice

Production blueprint и game day

На корпусе минимум из 100 документов соберите индекс и retrieval baseline. Подготовьте ADR выбора хранилища, расчёт памяти и стоимости на 1K запросов, ключи и инвалидацию кешей, SLO и dashboard. Разверните две версии индекса или retrieval-конфига, проведите shadow-сравнение и canary, затем намеренно отключите одну зависимость и выполните rollback по runbook.

Deliverable

Репозиторий или технический пакет: воспроизводимый ingest/retrieval, versioned index, eval-отчёт, cost sheet, SLO/dashboard, runbook и журнал game day с измеренным временем обнаружения и восстановления.

Checkpoint

Команда хочет заменить embedding-модель и одновременно включить semantic cache. Опишите безопасный план релиза, критерии остановки и отката так, чтобы не смешать влияние двух изменений.

  • ✓ Изменения разделены: сначала новый versioned index с offline eval, shadow и canary; semantic cache включается отдельным этапом после стабилизации.
  • ✓ Для кеша ключ включает tenant/ACL и версии модели/индекса, описаны инвалидация, TTL и метрики stale-hit или semantic mismatch.
  • ✓ Названы stop conditions по retrieval quality, latency, safety и стоимости, а старый индекс сохранён для мгновенного переключения.
  • ✓ Есть трассировка версий и runbook, позволяющие доказать причину регрессии и восстановить сервис.

Check yourself

Какова нижняя оценка памяти только для миллиона dense-векторов размерности 1536 в float32?

01Какова нижняя оценка памяти только для миллиона dense-векторов размерности 1536 в float32?

Почему retrieval-cache нельзя ключевать только текстом запроса?

02Почему retrieval-cache нельзя ключевать только текстом запроса?

Как безопасно выпустить индекс на новой embedding-модели?

03Как безопасно выпустить индекс на новой embedding-модели?

Reranker превысил свой deadline. Как выглядит контролируемая деградация?

04Reranker превысил свой deadline. Как выглядит контролируемая деградация?

Зачем embedding migration и semantic cache выпускать разными этапами?

05Зачем embedding migration и semantic cache выпускать разными этапами?

Sources

Capstone: production RAG with an SLO, budget, and rollback · Production RAG: retrieval systems that do not hallucinate · VORCL