Skip to content

文档管理#

大多数 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)

# 插入
for 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_ 来“更新”文档(例如,如果文档中的信息发生了变化)。

# 注意:文档已指定 `doc_id`
doc_chunks[0].text = "全新的文档内容"
index.update_ref_doc(
    doc_chunks[0],
    update_kwargs={"delete_kwargs": {"delete_from_docstore": True}},
)

在这里,我们传递了一些额外的关键字参数,以确保从文档存储中删除文档。当然,这是可选的。

刷新#

如果在加载数据时为每个文档设置了文档 id_,您还可以自动刷新索引。

refresh() 函数将仅更新具有相同文档 id_ 但文本内容不同的文档。任何根本不在索引中的文档也将被插入。

refresh() 还会返回一个布尔列表,指示输入中哪些文档已在索引中刷新。

# 修改第一个文档,使用相同的 doc_id
doc_chunks[0] = Document(text="全新的文档内容", id_="doc_id_0")

# 添加一个新文档
doc_chunks.append(
    Document(
        text="这个还没有在索引中,但很快会加进来!",
        id_="doc_id_3",
    )
)

# 刷新索引
refreshed_docs = index.refresh_ref_docs(
    doc_chunks, update_kwargs={"delete_kwargs": {"delete_from_docstore": True}}
)

# refreshed_docs[0] 和 refreshed_docs[-1] 应该为 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 属性的更多信息。