在 LlamaIndex 中处理文档更新涉及管理源数据的变化,同时确保索引保持准确和高效。当文档被修改时,通常有三种选择:从头重建索引、增量更新特定部分或使用版本控制来跟踪更改。最佳方法取决于数据集的大小、更新发生的频率以及是否需要访问历史数据等因素。LlamaIndex 为每种场景提供了工具,但您需要选择与您的性能和维护要求相符的方法。
对于小型数据集或不频繁的更新,重建整个索引是直接的方法。使用 SimpleDirectoryReader
重新加载文档,检测更改(例如,通过文件修改时间),并使用 VectorStoreIndex.from_documents()
重建索引。然而,对于大型数据集,这会变得低效。对于较大或频繁更新的数据,使用增量更新。LlamaIndex 允许在现有索引中插入或删除文档。例如,在初始索引构建后,使用 index.insert(Document(text="new content"))
添加文档,而无需重建所有内容。如果您的存储后端(例如向量数据库)支持 upsert 操作,您可以更新特定文档的嵌入向量。版本控制是另一种选择:将文档版本作为元数据存储(例如,version=2
或 timestamp=2023-10-01
),并通过版本过滤查询,以确保您正在访问最新数据。这避免了覆盖旧索引,对于审计或回滚很有用。
以下是一个增量更新的实际示例
- 加载您的初始文档并创建一个索引。
from llama_index import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
- 当文档发生更改时,使用其 ID 插入更新后的版本
updated_doc = Document(id="doc_123", text="updated content")
index.insert(updated_doc)
- 如有必要,使用
index.delete("doc_123")
删除过时的条目。对于版本控制,在数据摄入时附加元数据
documents = [Document(text="content", metadata={"version": 1})]
查询时,添加一个过滤器,例如 index.as_query_engine(filters=[{"version": 1}])
。对于小数据量,选择完全重建以简化操作;对于可扩展性,选择增量更新;对于可追溯性,选择版本控制。务必测试性能权衡,因为重新索引大型数据集可能非常耗时。