文档管理#
大多数 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)
# insert
for doc_chunk in doc_chunks:
index.insert(doc_chunk)
删除#
通过指定 document_id,可以从大多数索引数据结构中“删除”文档。(注意:树形索引目前不支持删除)。所有与该文档对应的节点都将被删除。
index.delete_ref_doc("doc_id_0", delete_from_docstore=True)
如果您在多个索引之间共享使用同一个 docstore 的节点,delete_from_docstore
将默认为 False
。但是,当设置为 False
时,这些节点在查询时将不会被使用,因为它们会从索引的 index_struct
中删除,而 index_struct
负责跟踪哪些节点可用于查询。
更新#
如果索引中已存在文档,可以使用相同的文档 id_
“更新”该文档(例如,如果文档中的信息已更改)。
# 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()
函数只会更新具有相同文档 id_
但文本内容不同的文档。索引中不存在的任何文档也将被插入。
refresh()
还返回一个布尔值列表,指示输入中哪些文档已在索引中刷新。
# 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 以确保文档从 docstore 中删除。这当然是可选的。
如果您 print()
refresh()
的输出,您会看到哪些输入文档已刷新
print(refreshed_docs)
# > [True, False, False, True]
当您从不断更新新信息的目录中读取时,这非常有用。
使用 SimpleDirectoryReader
时,要自动设置文档 id_
,可以设置 filename_as_id
标志。您可以了解更多关于自定义文档的信息。
文档跟踪#
任何使用 docstore 的索引(即除了大多数向量存储集成之外的所有索引)都可以看到您已插入 docstore 的文档。
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
属性的信息。