Как автоматически поддерживать вашу базу знаний RAG в актуальном состоянии
TL;DR
Свежесть RAG имеет три временных параметра: свежесть источника, свежесть индекса и свежесть ответа. Измеряйте их отдельно.
Постройте манифест URL и сравните хэши нормализованного контента; повторно встраивайте только измененные страницы и сохраняйте карту страница-кусков для замены и удаления.
Неудачный обход — это неизвестное состояние, а не доказательство того, что страница была удалена. Подтвердите 404, редиректы и изменения в карте сайта, прежде чем удалять индексированные записи.
Nstdata Crawl в настоящее время документирует опрос задач, а не исходящие вебхуки, поэтому ваш планировщик или рабочий должны отвечать за проверки статуса и восстановление.
Введение: RAG устаревает, когда индекс перестает обновляться
Nstdata Crawl является слоем сбора в этом рабочем процессе; его обзор продукта описывает получение страниц и сайтов для последующих потоков данных.
Система RAG может запрашивать свою векторную базу данных по каждому запросу и при этом возвращать устаревшую информацию. Исходная страница могла измениться, но индекс мог не быть повторно оброшен. Или новые векторы могут существовать, в то время как кэш извлечения все еще содержит старые результаты. Таким образом, "свежесть" описывает больше, чем время ответа модели.
Этот гайд проектирует запланированный конвейер обновления для публичной документации и страниц знаний: инвентаризация → обход → проверка → сравнение → кусок/встраивание → обновление/удаление → проверка. Предполагается, что ваше приложение контролирует список разрешенных источников и векторную базу данных. Nstdata Crawl обрабатывает извлечение и возвращает результаты задач/страниц; оно не решает, устарел ли документ для вашего продукта. Смотрите документацию API Crawl для получения актуальных конечных точек задач и результатов.
Попробуйте Nstproxy Crawl - Начните Бесплатно Уже Сегодня
Вопрос
Пример временной метки
Свежесть источника
Когда страница последний раз изменялась?
source_updated_at, если доступно
Свежесть индекса
Когда ваше принятое содержание достигло векторного хранилища?
last_indexed_at
Свежесть ответа
Какой снимок источника информировал этот ответ?
извлеченное crawled_at
Временная метка обхода не доказывает, что страница была обновлена, а временная метка индекса не доказывает, что был извлечен последний источник. Храните только те временные метки, которые ваша система действительно может наблюдать; не выдумывайте source_updated_at, если сайт его не предоставляет.
Архитектура автоматически обновляемой базы знаний
Рабочая задача имеет планировщик, долговечную запись задачи, рабочего для обхода, нормализатор, сравнение хэша контента, этап встраивания, запись в векторное хранилище и проверку валидации. Каждый шаг требует ключа идемпотентности и видимого результата. Запуск должен быть безопасен для повторения после сбоя рабочего.
Для любой страницы храните по крайней мере canonical_url, last_attempt_at, last_success_at, content_hash, version, status и текущие идентификаторы кусков. Храните исторические артефакты обхода отдельно, если важна их аудируемость. Манифест является контролем, который сообщает конвейеру, какие записи нужно заменить.
Шаг 1: Создайте инвентаризацию URL
Начните с явного списка разрешенных публичных страниц или ограниченного процесса обнаружения. Карта сайта помогает перечислить вероятные URL-адреса; ссылки помогают найти страницы, исключенные из нее. Нормализуйте фрагменты и параметры отслеживания, но не объединяйте строку запроса, если они изменяют содержимое страницы. Версионированные документы должны оставаться отдельными (/v1/ и /v2/), если у приложения нет четкого правила для их удаления.
Минимальная таблица манифеста может выглядеть следующим образом:
Сохраните инвентаризацию перед крупным запуском. Если новый обход будет прерван, вы можете продолжить с последнего завершенного URL, а не заново открывать то, что задача уже выполнила.
Шаг 2: Запланируйте повторный обход с нужным интервалом
Расписание обновления должно отражать волатильность источника и бизнес-риски. Цены или поведение API могут оправдывать более короткий интервал, чем страница архивной истории компании. Начните с расписания, наблюдайте за процентом изменившихся страниц и корректируйте его. Избегайте "повторного обхода всего каждую минуту" по умолчанию: это увеличивает количество запросов, не обязательно улучшая ответы.
Для простых развертываний запись cron может вызывать одну идемпотентную задачу:
Управляемый планировщик или очередь предпочтительнее, когда задачам нужны повторные попытки, ограничения параллелизма, время выполнения по сайту или долговечные контрольные точки. Текущие документы Nstdata показывают асинхронные идентификаторы задач Crawl и запросы статуса; они сообщают, что вебхуки в настоящее время не поддерживаются. Пусть рабочий опрашивает статус с дедлайном и увеличением времени ожидания, а не ждет вечно внешнего колбэка.
Полный повторный обход против инкрементального повторного обхода
Полное повторное сканирование может упростить обнаружение, когда сайт мал и ограничен. Инкрементальная обработка сокращает запись встраиваний и векторов, когда большинство страниц не изменены, но это требует манифеста URL и надежного хеш-сравнения. Многие системы комбинируют оба подхода: повторно открывают URL по более медленному расписанию, а затем чаще повторно сканируют известные страницы высокого приоритета.
Шаг 3: Обнаружение измененных, новых и удаленных страниц
Хешируйте нормализованный контент, а не сырой HTML-байты. Сырой разметка может изменяться из-за идентификаторов запросов, временных меток или макета, в то время как полезный текст остается прежним. Храните канонический URL и нормализованный текст вместе с хешем, чтобы вы могли воспроизвести сравнение.
from hashlib import sha256
import re
defnormalize_for_hash(markdown:str)->str: text = markdown.replace("\r\n","\n") text = re.sub(r"\n{3,}","\n\n", text)return text.strip()defcontent_hash(markdown:str)->str:return sha256(normalize_for_hash(markdown).encode("utf-8")).hexdigest()
Если хеш совпадает с последней успешной записью, пропустите встраивание. Если он отличается, создайте набор заменяющих элементов и проверьте их перед снятием старых идентификаторов. Если страница новая, создайте ее начальную запись. Если URL исчезает из карты сайта, отметьте его как кандидата на удаление; просто отсутствие в карте сайта недостаточно для удаления документа.
Обработка удаленных страниц и перенаправлений безопасно
Относитесь к условиям ответа по-разному:
Успешная страница: проверьте содержание, сравните хеш, затем обновите, если изменено.
404 или 410: зафиксируйте статус и подтвердите в соответствии с вашей политикой сайта перед удалением.
301 или 302: сохраняйте оригинальное сопоставление URL и оценивайте каноническое направление; не дублируйте обе версии без проверки.
403, 429, таймаут или ошибка сети: отметьте попытку как неудавшуюся/неизвестную и сохраните последний известный хороший индекс.
Страница может быть временно недоступна. Используйте окно подтверждения или вторую независимую проверку перед удалением. Когда перенаправление объединяет две страницы, обновите ссылки и упоминания преднамеренно.
Шаг 4: Переупаковка и повторное встраивание только новой версии
Переупаковывайте, когда нормализованный текст изменяется или алгоритм упаковки изменяется. Повторно встраивайте, когда текст изменяется или модель встраивания изменяется. Записывайте embedding_model, chunker_version и хеш содержимого страницы с генерацией индекса, чтобы можно было сделать откат и определить, какие записи совместимы.
Руководство по встраиваниям OpenAI описывает API ввода-вектора. Храните очередь или таблицу повторных попыток для временных сбоев встраивания, чтобы один неудавшийся пакет не привел к повторению всех успешно обработанных URL.
Шаг 5: Замена векторов без оставления дубликатов
Используйте детерминированные идентификаторы чанков и манифест страницы. С Chroma upsert заменяет существующие идентификаторы, а delete удаляет записи; его текущее справочное руководство по API коллекции документирует эти операции. С Pinecone сохраняйте идентификаторы на странице или префикс страницы и используйте его руководство по upsert и удалению. Для любой из систем не предполагайте, что upsert удаляет старые чанки, идентификаторы которых больше нет в новой версии страницы.
Безопасная последовательность замены:
Запишите кандидата для генерации под новыми идентификаторами или в версионном пространстве имен.
Запросите кандидатские записи и подтвердите, что ожидаемые источники и фрагменты доступны.
Переключите активную генерацию приложения или замените указатель манифеста.
Удалите предыдущие идентификаторы после проверки новой генерации.
Если ваш векторный хранилище не может предоставить удобный переключатель версий, храните старые идентификаторы в манифесте и заменяйте их только после успешного завершения полного upsert. Компромисс заключается в коротком окне перекрытия, которое вы можете обработать путем фильтрации по метаданным активной версии.
Шаг 6: Проверка свежести с известными изменениями
Используйте несколько страниц, которые вы можете безопасно редактировать или которые изменяются предсказуемо. Запишите запрос, правильный ответ на который зависит от новой формулировки. После приема данных проверьте, что последний чанк доступен и что старый чанк отсутствует в активном пространстве имен. Также протестируйте одну страницу, которая недоступна, чтобы подтвердить, что конвейер не удаляет ее предыдущую хорошую запись.
Отслеживайте как минимум:
Метрика
Определение
Задержка между сканированием и индексированием
last_indexed_at - last_successful_crawl_at
Коэффициент обнаружения изменений
измененные страницы / успешно просканированные страницы
Коэффициент неудачных страниц
неудачные попытки страницы / отправленные попытки страницы
Коэффициент устаревших чанков
известные старые версии, все еще активные / выборка измененных страниц
Возраст цитирования
время ответа минус время сканирования найденной записи
Это операционные метрики, а не гарантия качества ответа. Сопоставляйте их с маркированным набором для тестирования извлечения и цитирования.
Шаг 7: Мониторинг, восстановление и затраты
Запишите одну запись запуска с run_id, количеством обнаруженных, попытанных, успешных, измененных, удаленных, токенов встраивания, записей векторов, неудачных URL и временным интервалом. Удалите токены и любую конфиденциальную информацию о страницах из журналов. Используйте ограниченные повторные попытки с экспоненциальным откатом для временных ошибок и долговременные ошибки «мертвого письма» для обзора. Добавьте блокировку запуска, чтобы два планировщика не заменяли одну и ту же страницу одновременно.
Для корпуса из 10 000 страниц с гипотетической ежедневной ставкой изменения 5% набор изменений составляет около 500 страниц до уровневых сбоев страницы и эффектов повторного обнаружения. Оцените стоимость обхода для страниц, которые вы фактически запрашиваете, затем стоимость встраивания для измененного текста, записи/хранения векторов, прокси-трафика, если используется, и операций работников/планировщиков. Это модель, а не котируемая цена. Проверьте последние цены на обход Nstdata и документы по выставлению счетов вашего поставщика встраивания/векторов перед составлением бюджета.
Обновления, основанные на событии, против запланированных обновлений
CMS, Git-репозиторий или платформа документации могут генерировать событие, когда контент изменяется. Используйте это событие для постановки URL в очередь только в том случае, если система-источник может надежно идентифицировать страницу и событие авторизовано. Периодическая задача согласования по-прежнему полезна для пропущенных событий и удалений. Событийный триггер в вашем приложении не означает, что API обхода сам предоставляет вебхуки; действующая документация по обходу направляет пользователей к проверке статуса задачи.
Общие ошибки обновления
Наиболее разрушительные ошибки - это удаление страницы после тайм-аута, хеширование нестабильной навигации вместо нормализованного контента, создание новых идентификаторов при каждом запуске, изменение модели встраивания без новой генерации индекса и забывание удалить старые части после правок. Кэшированный ответ также может выглядеть устаревшим, даже если индекс актуален; аннулируйте кэширование получения/применения или включите генерацию индекса в ключ кэша.
Полный контрольный список автоматического обновления
Храните инвентаризацию канонических URL и манифест страниц-частей.
Разделяйте успешные, неудавшиеся, перенаправленные и удаленные состояния.
Хешируйте нормализованный контент и пропускайте неизмененные встраивания.
Сохраняйте последнюю известную хорошую версию до того, как новые векторы пройдут проверку.
Тестируйте известные изменения, удаления, перенаправления и временные сбои.
Следите за задержкой обхода до индекса, уровнем неудач, устаревшими версиями, цитированием и расходами.
Поддержание актуальности базы знаний RAG является проблемой жизненного цикла данных. Планировщик начинает работу, но свежесть зависит от надежной идентичности, внимательного обнаружения изменений, безопасной замены векторов и проверки реальных вопросов. Рассматривайте сбои как неизвестные, а не удаления, и фиксируйте временные метки, необходимые для объяснения того, что система знала, когда она ответила.
Q: Как я могу автоматически обновлять базу знаний RAG?
Запланируйте задачу инвентаризации URL, обходите и проверяйте страницы, сравнивайте хеши нормализованного контента, повторно встраивайте измененные страницы и безопасно заменяйте старые записи векторов.
Q: Как часто следует обновлять данные RAG?
Установите интервал на основе темпа изменения каждого источника и риска устаревших ответов, затем отрегулируйте его, опираясь на наблюдаемые изменения и задержку обхода до индекса.
Q: Что такое инкрементальная индексация RAG?
Инкрементальная индексация обрабатывает только новые, измененные или удаленные записи источника, а не перестраивает весь индекс при каждом запуске.
Q: Как мне удалить устаревшие встраивания?
Храните манифест идентификаторов страниц-частей, проверяйте записи замены, а затем удаляйте старые идентификаторы или отключайте предыдущую генерацию индекса.
Q: Может ли RAG обновляться автоматически?
Да, когда ваше приложение выполняет запланированную или триггерную задачу внедрения, которая извлекает, проверяет и индексирует изменения источников.
Понимание семи измерений качества данных RAG и того, как проверять проиндексированные страницы, сравнивать чистые и сырые данные, сохранять происхождение и диагностировать ошибки извлечения. Это разделяет ошибки извлечения, получения и генерации, чтобы команды могли отлаживать правильный этап.
Lena Zhou
Oct. 20th 2026
Сканируйте целые сайты одним API-запросом
Успешность 99,8% с рендерингом JavaScript
Получайте чистые данные для LLM в разных форматах
Преобразуйте любой сайт в Markdown, HTML, JSON, ссылки, PDF и другие форматы без управления инфраструктурой сканирования.