Гайд · TNWS AI
Как обновить одну редакцию документа в LlamaIndex без смешивания версий
Стабильный 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.
Нумерованный порядок работы
- Назначьте правилу устойчивый ID, независимый от текста и даты обновления, и сохраните старую редакцию вне текущего поискового индекса.
- Постройте индекс на начальном тексте, проверьте запрос на число 14.
- Создайте новый Document с прежним id_ и новым содержимым, затем вызовите update_ref_doc.
- Повторите проверку: свежий факт присутствует, старый не выдаётся как действующая версия.
- Сохраните индекс согласно используемому 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 в индексе.
Удаляются ли любые старые файлы?
Архив и внешние источники управляются отдельно.
Читайте также
Как измерить hit rate и MRR поиска в LlamaIndex RetrieverEvaluator
Размеченный вопрос, expected_ids и оценка позиции релевантного узла до тестирования ответов генератора.
Как ограничить размер пакета при индексации в LlamaIndex VectorStoreIndex
insert_batch_size при from_documents: контролируем память и задержки загрузки, не путая пакет с размером чанка.
Как показывать ответ LlamaIndex по мере генерации через streaming
streaming=True, response_gen и проверка полного ответа, отмены запроса и ограничений streaming-модели.
Комментарии
Пока тихо. Скажите первое слово