Гайд · TNWS AI
Как сохранить кэш индексации LlamaIndex IngestionPipeline
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-этап; кэширование само по себе не является резервной копией индекса.
Нумерованный порядок работы
- Зафиксируйте входной набор и список преобразований, включая размер чанка и модель, если она участвует в pipeline.
- Выполните первый run с Document, сохраните количество узлов и содержимое контрольного фрагмента.
- Вызовите persist для каталога кэша и создайте новый IngestionPipeline с тем же списком transforms.
- Загрузите кэш через load и повторите run на неизменном входе; сравните данные узлов, а также время на вашей среде.
- Измените входной текст и убедитесь, что результат не берётся ошибочно из прежней версии.
Готовый шаблон 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?
Нет, его резервирование — отдельная задача.
Читайте также
Как измерить hit rate и MRR поиска в LlamaIndex RetrieverEvaluator
Размеченный вопрос, expected_ids и оценка позиции релевантного узла до тестирования ответов генератора.
Как ограничить размер пакета при индексации в LlamaIndex VectorStoreIndex
insert_batch_size при from_documents: контролируем память и задержки загрузки, не путая пакет с размером чанка.
Как обновить одну редакцию документа в LlamaIndex без смешивания версий
Стабильный id_, update_ref_doc и контроль старого и нового правила в поисковой выдаче.
Комментарии
Пока тихо. Скажите первое слово