Прикладной AI · разбор

Как обновлять базу знаний RAG, не останавливая систему

Демо живёт на статичном корпусе, продакшн — на меняющемся. Разбираем инкрементальное обновление вместо полной переиндексации, подмену индекса без рестарта, удаление документов и то, какие метрики показывают деградацию поиска раньше, чем о ней сообщат пользователи.

8 мин чтения

Почему обновление — отдельная инженерная задача

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

Поэтому обновление проектируется вместе с поиском, а не добавляется потом. Три вопроса, на которые нужен ответ до запуска: как документ попадает в индекс, как он из него исчезает и что видит пользователь в момент, когда индекс меняется.

Инкрементальное обновление вместо полной переиндексации

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

У этого есть неочевидное следствие: нарезка должна быть детерминированной. Если один и тот же документ режется каждый раз по-разному, хеши не совпадут и «инкрементальное» обновление превратится в полную переиндексацию под другим названием.

Подмена индекса без рестарта

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

Ключевое здесь — проверка до переключения, а не после. Индекс, собранный с ошибкой в конвейере, переключается так же гладко, как правильный, и обнаруживается только по жалобам.

Удаление: то, о чём вспоминают последним

Документ убрали из хранилища, а его куски остались в индексе — и система продолжает отвечать по тому, чего уже нет. В чувствительных доменах это не неудобство, а нарушение: сотрудник видит данные, доступ к которым отозван.

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

Что меняется в качестве поиска при обновлении

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

  • Доля вопросов, где нужный фрагмент попал в топ выдачи, — до и после обновления, на одном и том же наборе.
  • Доля ответов с пустой выборкой: рост означает, что что-то отвалилось на конвейере.
  • Возраст самого свежего документа в индексе — простейший индикатор того, что обновления вообще идут.
  • Стоимость обновления: сколько кусков пересчитано на одну правку документа.

Что достаточно на старте

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

Разница между «раз в сутки» и «в тот же час» — это настройка конвейера, а не другая архитектура. А вот разница между «есть удаление» и «нет удаления» архитектурная, и закладывать её нужно сразу.

// Коротко
Инкрементальное обновление работает только при детерминированной нарезке.
Индекс версионируется и переключается указателем: рестарт ради обновления — отложенная проблема.
Удаление и права доступа идут тем же конвейером, что и добавление, иначе система отвечает по отозванным данным.
Смена модели эмбеддингов — это полная пересборка индекса, а не дозапись.
// Вопросы

Можно ли обновлять индекс без остановки сервиса?

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

Как часто нужно пересобирать индекс целиком?

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

Что происходит с ответами в момент обновления?

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

Как заметить, что после обновления стало хуже?

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

Нужно ли хранить историю версий документов?

В регулируемых доменах — да, и вместе с датой вступления в силу в метаданных куска. Это позволяет отвечать «по состоянию на дату» и объяснять, почему ответ был именно таким, что в спорной ситуации важнее самого ответа.

// Читать дальше

Платформы для AI-агентов 2026: что выбрать бизнесу

Одиннадцать платформ, за что каждая берёт деньги, где у неё потолок и что из этого работает из России. Все цифры — с публичных страниц вендоров, проверены 6 сентября 2026, с указанием источника. Без рейтингов и «топ-10»: выбор зависит от того, что вы строите, а не от места в списке.

n8n или своя разработка: где проходит граница

n8n закрывает больше задач, чем принято думать, и мы сами регулярно советуем начать с него. Но у конструктора есть граница, и проходит она не по сложности сценария, а по цене ошибки, конкурентности и правам доступа. Разбираем, как считать заранее и в какой момент дешевле написать код.

Готовый чат-бот или свой: считаем стоимость владения

Коробочный бот запускается за неделю и выглядит дешевле в десять раз. Разница появляется не в первый месяц, а там, где бот должен посмотреть в вашу систему, ответить по вашим документам и честно передать человеку. Разбираем, из чего складывается счёт на два года и как выбрать, не переплатив ни в одну сторону.

Нарезка документов для RAG: почему чанки важнее модели

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

Нужна база знаний, которая не устаревает через месяц? Спроектируем обновление вместе с поиском.