Гайд · TNWS AI

Как обновить одну редакцию документа в LlamaIndex без смешивания версий

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

Стабильный id_, update_ref_doc и контроль старого и нового правила в поисковой выдаче.

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

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

Документация LlamaIndex поддерживает insert, delete_ref_doc, update_ref_doc и refresh_ref_docs. Для обновления передают Document с тем же id_; refresh_ref_docs сопоставляет id_ и изменённый текст, а неизвестные документы вставляет. Разные типы индексов могут поддерживать удаление по-разному, поэтому пример ограничен VectorStoreIndex.

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

  1. Назначьте правилу устойчивый ID, независимый от текста и даты обновления, и сохраните старую редакцию вне текущего поискового индекса.
  2. Постройте индекс на начальном тексте, проверьте запрос на число 14.
  3. Создайте новый Document с прежним id_ и новым содержимым, затем вызовите update_ref_doc.
  4. Повторите проверку: свежий факт присутствует, старый не выдаётся как действующая версия.
  5. Сохраните индекс согласно используемому backend и протестируйте то же после перезапуска.

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

from llama_index.core import Document, VectorStoreIndex

old = Document(text="Правило R7: срок возврата 14 дней.", id_="R7")
index = VectorStoreIndex.from_documents([old])
new = Document(text="Правило R7: срок возврата 10 дней.", id_="R7")
index.update_ref_doc(new)
results = index.as_retriever(similarity_top_k=3).retrieve("срок возврата R7")
for item in results:
    print(item.node.get_content())

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

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

Вход: два текста одной политики R7 со сроками 14 и 10 дней. После update_ref_doc ожидается поиск актуального правила о 10 днях и отсутствие старого утверждения о 14 днях как активного источника. Проверяйте текст всех вернувшихся узлов, а не только первый ответ генератора.

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

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

Если новую редакцию загрузить как новый ID, индекс может содержать оба противоречащих правила; запрос выберет то, которое лучше совпадает по векторной близости, а не то, которое вступило в силу позднее. Устойчивый id_ решает задачу сопоставления логического документа. При частичном изменении большого договора update_ref_doc может перепарсить его узлы, поэтому контролируйте число старых узлов после обновления. Архив старых редакций держите отдельно с явным статусом и проверкой доступа, если он нужен аудиторам, а не в общем RAG-корпусе. Если приложение распределённое, состояние нескольких реплик и внешнего vector store требует согласованного переключения. Функция refresh_ref_docs полезна при периодическом сравнении входного набора, но не заменяет проверку исчезнувших из нового набора документов. Удаление в некоторых структурах поддерживается не везде, о чём предупреждает официальный источник.

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

Для регрессии держите два вопроса: «каков действующий срок» и «каков был срок в прошлой редакции». Первый должен брать только активный R7, второй — архивную систему с явной датой, если такая функция вообще предусмотрена. В тесте с обновлением добавьте отрицание и исключение, чтобы новая редакция не уничтожила часть важных условий. Сравните список source node IDs до и после: устаревший узел не должен участвовать в рабочей выдаче. Не полагайтесь на хронологическую сортировку метаданных без серверного правила: модель не гарантирует выбор новейшего текста. Перед массовым refresh снимите резервную копию индекса и протестируйте одну запись на отдельной среде.

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

  • Тот же id_ применён к обеим редакциям.
  • Активная выдача показывает 10, но не 14 дней.
  • Результат сохраняется после перезапуска.

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

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

  • Не вставлять новую редакцию с новым ID в общий индекс.
  • Не считать top-1 доказательством отсутствия старых узлов.
  • Не использовать refresh как автоматическое удаление исчезнувших источников.

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

FAQ

Как указать идентичность документа?

Передайте тот же id_ в новый Document.

Что делает update_ref_doc?

Обновляет документ по его ID в индексе.

Удаляются ли любые старые файлы?

Архив и внешние источники управляются отдельно.

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

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

Как указать идентичность документа?

Передайте тот же id_ в новый Document.

Что делает update_ref_doc?

Обновляет документ по его ID в индексе.

Удаляются ли любые старые файлы?

Архив и внешние источники управляются отдельно.

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

Комментарии

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