Гайд · TNWS AI

Как сохранить кэш индексации LlamaIndex IngestionPipeline

LlamaIndex FrameworkPython#LlamaIndex#Python#RAG
4 мин—

Persist и load кэша преобразований для повторного запуска с неизменными документами без ложных обещаний полной идемпотентности.

Задача и применимость

Поисковый запрос: «как сохранить ingestion cache LlamaIndex между запусками». Факты и синтаксис сверены с официальной документацией LlamaIndex Framework для Python 19 сентября 2026 года. Пример предназначен для актуального Python-пакета llama-index и указанных в коде интеграций; доступность конкретной модели и конфигурация её провайдера зависят от среды запуска. Если код обращается к embeddings или LLM, ключ задаётся через серверное окружение и здесь не приводится. Точный релиз локально не установлен, поэтому перед рабочим запуском фиксируйте номер установленной версии и повторите тест на ней.

IngestionPipeline применяет transformations к входным документам и кеширует пары node + transformation. В официальном руководстве есть pipeline.persist(path) и new_pipeline.load(path). При одинаковых входах и преобразованиях сохранённый кэш может сократить повторную работу. Для прямой записи в vector store требуется embedding-этап; кэширование само по себе не является резервной копией индекса.

Нумерованный порядок работы

  1. Зафиксируйте входной набор и список преобразований, включая размер чанка и модель, если она участвует в pipeline.
  2. Выполните первый run с Document, сохраните количество узлов и содержимое контрольного фрагмента.
  3. Вызовите persist для каталога кэша и создайте новый IngestionPipeline с тем же списком transforms.
  4. Загрузите кэш через load и повторите run на неизменном входе; сравните данные узлов, а также время на вашей среде.
  5. Измените входной текст и убедитесь, что результат не берётся ошибочно из прежней версии.

Готовый шаблон Python

from llama_index.core import Document
from llama_index.core.ingestion import IngestionPipeline
from llama_index.core.node_parser import SentenceSplitter

transforms = [SentenceSplitter(chunk_size=128, chunk_overlap=16)]
docs = [Document(text="Правило R7: срок возврата 14 дней.", id_="R7")]
first = IngestionPipeline(transformations=transforms)
nodes_one = first.run(documents=docs)
first.persist("./ingestion-cache-r7")
second = IngestionPipeline(transformations=transforms)
second.load("./ingestion-cache-r7")
nodes_two = second.run(documents=docs)
print(len(nodes_one), len(nodes_two))

Код ниже в статье предназначен для тестовых источников без персональных сведений. Вызовы SDK не выполнялись в данном окружении с реальной моделью; синтаксис Python проверен отдельно. Не переносите вывод демонстрационного эксперимента на любой корпус и любого провайдера без повторной проверки.

Пример входа и ожидаемого результата

Вход: одна редакция правила R7. Ожидается одинаковый текст извлечённых nodes после сохранения и восстановления кэша; повтор может быть быстрее, но точное ускорение зависит от нагрузки. Если заменить 14 на 10 дней, результат должен отражать новую редакцию. Проверка только количества nodes не выявит устаревшее содержание — сравните строки.

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

Диагностика и границы решения

Кэш экономит повторение дорогостоящих преобразований, но не управляет жизненным циклом опубликованного поискового индекса. Нельзя считать успешный вызов load доказательством того, что удалённый vector store восстановлен: состояние store и кэш — разные сущности. Если вы поменяли длину чанка, модель embeddings или реализацию custom transform, старые результаты не должны подменить новые; сохраните манифест конфигурации и сравните его перед повторным использованием. При работе с документами разных клиентов разносите кэши по границам доступа и проверяйте, что идентификатор tenant не потерян. Каталог кэша тоже может хранить производные персональных данных, поэтому применяйте правила хранения и удаления. Не говорите о гарантированном ускорении без измерения на собственном наборе: для маленького текста накладные расходы на диск могут перевесить пользу.

Дополнительный проверочный сценарий

Проверочный набор должен включать неизменный документ, изменённый документ и документ с тем же текстом, но другой политикой доступа. Повторная обработка первого может использовать кэш; второй обязан дать новый текст; третий не должен наследовать чужие метаданные. Если в pipeline включена внешняя embedding-модель, зафиксируйте модель и версию интеграции до измерений, иначе различия нельзя объяснить корректно. Отдельно прогоните новый процесс после load, а не только повтор в той же памяти. В рабочей системе кэш можно очищать по версии пайплайна, но очищение само по себе не удаляет старые векторы из хранилища; организуйте обновление/удаление узлов отдельно.

Критерии проверки

  • Контрольная фраза сохраняется после load.
  • Изменённый текст не подменяется старым.
  • Отдельно проверено состояние векторного store.

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

Типичные ошибки и что не делать

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

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

FAQ

Как сохранить кэш?

Методом pipeline.persist с каталогом.

Как восстановить?

Создайте pipeline и вызовите load.

Сохраняет ли это внешний vector store?

Нет, его резервирование — отдельная задача.

Официальные источники

Частые вопросы

Как сохранить кэш?

Методом pipeline.persist с каталогом.

Как восстановить?

Создайте pipeline и вызовите load.

Сохраняет ли это внешний vector store?

Нет, его резервирование — отдельная задача.

Читайте также

Комментарии

Пока тихо. Скажите первое слово