文档管理
大多数LlamaIndex索引结构支持插入、删除、更新和刷新操作。
您可以在初始构建索引后,将新文档“插入”到任何索引数据结构中。该文档将被分解为节点并摄取到索引中。
插入操作的底层机制取决于索引结构。例如,对于摘要索引,新文档会作为附加节点插入到列表中。 对于向量存储索引,新文档(及其嵌入向量)会被插入到底层文档/嵌入存储中。
以下是一个示例代码片段:
from llama_index.core import SummaryIndex, Document
index = SummaryIndex([])text_chunks = ["text_chunk_1", "text_chunk_2", "text_chunk_3"]
doc_chunks = []for i, text in enumerate(text_chunks): doc = Document(text=text, id_=f"doc_id_{i}") doc_chunks.append(doc)
# insertfor doc_chunk in doc_chunks: index.insert(doc_chunk)您可以通过指定文档ID从大多数索引数据结构中“删除”文档。(注意:树状索引目前不支持删除操作)。所有与该文档对应的节点都将被删除。
index.delete_ref_doc("doc_id_0", delete_from_docstore=True)delete_from_docstore 将默认设置为 False,以防您在使用相同文档存储的索引之间共享节点。但是,当此设置设为 False 时,这些节点在查询时将不会被使用,因为它们会从索引的 index_struct 中删除,该索引负责跟踪哪些节点可用于查询。
如果文档已存在于索引中,您可以使用相同的文档 id_ 来“更新”文档(例如,当文档中的信息发生变化时)。
# NOTE: the document has a `doc_id` specifieddoc_chunks[0].text = "Brand new document text"index.update_ref_doc(doc_chunks[0])如果在加载数据时为每个文档设置文档 id_,您还可以自动刷新索引。
refresh() 函数仅会更新具有相同文档 id_ 但文本内容不同的文档。索引中完全不存在的任何文档也将被插入。
refresh() 同样返回一个布尔值列表,指示输入中的哪些文档已在索引中更新。
# modify first document, with the same doc_iddoc_chunks[0] = Document(text="Super new document text", id_="doc_id_0")
# add a new documentdoc_chunks.append( Document( text="This isn't in the index yet, but it will be soon!", id_="doc_id_3", ))
# refresh the indexrefreshed_docs = index.refresh_ref_docs(doc_chunks)
# refreshed_docs[0] and refreshed_docs[-1] should be true再次,我们传递了一些额外的关键字参数来确保文档从文档存储中删除。这当然是可选的。
如果你print() refresh()的输出,你将看到哪些输入文档被刷新:
print(refreshed_docs)# > [True, False, False, True]当您正在读取一个不断更新新信息的目录时,这最为有用。
要在使用 SimpleDirectoryReader 时自动设置文档 id_,您可以设置 filename_as_id 标志。您可以在自定义文档中了解更多信息。
任何使用文档存储的索引(即除大多数向量存储集成外的所有索引),您也可以查看已插入文档存储中的文档。
print(index.ref_doc_info)"""> {'doc_id_1': RefDocInfo(node_ids=['071a66a8-3c47-49ad-84fa-7010c6277479'], metadata={}), 'doc_id_2': RefDocInfo(node_ids=['9563e84b-f934-41c3-acfd-22e88492c869'], metadata={}), 'doc_id_0': RefDocInfo(node_ids=['b53e6c2f-16f7-4024-af4c-42890e945f36'], metadata={}), 'doc_id_3': RefDocInfo(node_ids=['6bedb29f-15db-4c7c-9885-7490e10aa33f'], metadata={})}"""输出中的每个条目显示已摄入的文档id_作为键,以及它们被分割成的节点关联的node_ids。
最后,每个输入文档的原始 metadata 字典也会被追踪。您可以在自定义文档中了解更多关于 metadata 属性的信息。