跳转至

文档管理

文档管理

大多数 LlamaIndex 索引结构允许 插入删除更新刷新 操作。

插入

我们可以在初始构建索引后将新文档 “插入” 到任何索引数据结构中。该文档将被分解为节点并被插入索引中。

插入背后的底层机制取决于索引结构。例如,对于摘要索引,会将新文档作为列表中的附加节点插入。对于向量存储索引,会将新文档(和嵌入)插入到底层文档/嵌入存储中。

下面给出了一个示例代码片段:

Python
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)

# insert
for doc_chunk in doc_chunks:
    index.insert(doc_chunk)

删除

我们可以通过指定 document_id 从大多数索引数据结构中 “删除” 文档。(注意:树索引目前不支持删除)。与文档对应的所有节点都将被删除。

Python
index.delete_ref_doc("doc_id_0", delete_from_docstore=True)

如果您在使用相同文档库的索引之间共享节点,delete_from_docstore 默认为False。但是,当设置为False时,查询时不会使用这些节点,因为它们将从 index_struct 索引中删除,索引会跟踪哪些节点可用于查询。

更新

如果文档已存在于索引中,则可以使用相同的文档“更新”文档 id_(例如,如果文档中的信息已更改)。

Python
# NOTE: the document has a `doc_id` specified
doc_chunks[0].text = "Brand new document text"
index.update_ref_doc(doc_chunks[0])

刷新

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

refresh() 函数只会更新具有相同 doc_id_,但不同文本内容的文档。索引中不存在的任何文档也将被插入。

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

Python
# modify first document, with the same doc_id
doc_chunks[0] = Document(text="Super new document text", id_="doc_id_0")

# add a new document
doc_chunks.append(
    Document(
        text="This isn't in the index yet, but it will be soon!",
        id_="doc_id_3",
    )
)

# refresh the index
refreshed_docs = index.refresh_ref_docs(doc_chunks)

# refreshed_docs[0] and refreshed_docs[-1] should be true

再次,我们传递了一些额外的 kwargs 来确保文档从文档库中删除。这当然是可选的。

如果您print()输出refresh(),您将看到哪些输入文档已被刷新:

Python
print(refreshed_docs)
# > [True, False, False, True]

当您从不断更新新信息的目录中读取数据时,这非常有用。

id_若要在使用时自动设置文档SimpleDirectoryReader,您可以设置filename_as_id标志。您可以了解有关自定义文档的更多信息。

文档追踪

任何使用文档存储的索引(即除了大多数向量存储集成之外的所有索引),您还可以看到已插入到文档存储中的文档。

Python
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在自定义文档中阅读有关该属性的更多信息。