Зачем разбираться в теме

Freshness в RAG: incremental indexing без полного reindex — это не отдельный трюк, а часть production-архитектуры LLM-приложения. Ниже — практический способ внедрить подход так, чтобы качество можно было измерить, а изменения безопасно откатить.

Свежесть — отдельный SLO

Если документы меняются каждый час, nightly full reindex уже недостаточен. Определите допустимый lag между изменением источника и появлением новой версии в retrieval.

Event-driven ingestion

Webhook, queue или CDC позволяют запускать обработку только изменившихся объектов. Событие должно быть идемпотентным и содержать source ID/version.

Upsert и delete

Нужно обрабатывать не только новые тексты, но и удаления. Tombstones помогают быстро исключить старую версию до физической очистки векторного индекса.

Переиндексация безопасно

Сначала создавайте chunks новой версии, затем атомарно переключайте active version. Это уменьшает окно, когда retrieval видит смесь старых и новых данных.

Failed ingestion

Очередь retry и dead-letter обязательны: иначе один сбой парсинга навсегда оставит устаревший документ. Ошибку привязывайте к source/version.

Метрики

Следите за ingestion lag, failed documents, stale-hit rate, queue depth и временем от source update до searchable state.

Production checklist

  • Зафиксируйте исходный baseline и dataset.

  • Версионируйте конфигурацию и данные.

  • Логируйте ключевые входы, решения и ошибки.

  • Измеряйте качество вместе с latency и cost.

  • Не передавайте модели права, которые можно проверить детерминированно.

  • Запускайте изменения через feature flag или контролируемый cutover.

  • Держите rollback path до завершения наблюдаемого периода.

Вывод

Хорошая реализация отличается не количеством компонентов, а управляемостью: понятный контракт, измеримые метрики, безопасные границы и возможность воспроизвести результат. Начинайте с простого baseline и усложняйте систему только там, где evals показывают реальный выигрыш.