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
Sources