在当今数据驱动的世界中,管理和处理文档已经成为一个重要的任务。LlamaIndex 提供了一套强大且灵活的工具来执行各种文档管理操作,包括插入、删除、更新和刷新文档。本文将详细介绍这些操作,并提供相应的示例代码,帮助你更好地理解和应用这些功能。
插入 (Insertion)
可以在构建索引之后,将新的文档插入到任何索引数据结构中。这个文档将被分解成节点并被引入到索引中。
以下是一个插入文档的示例代码:
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)
上述代码会将 text_chunk_1
、text_chunk_2
和 text_chunk_3
这三个文档片段插入到索引中。
删除 (Deletion)
可以通过指定 document_id
从大多数索引数据结构中删除文档。所有对应于该文档的节点将被删除。
例如:
index.delete_ref_doc("doc_id_0", delete_from_docstore=True)
在这种情况下,delete_from_docstore
参数控制是否从文档存储中删除文档。
更新 (Update)
如果文档已存在于索引中,可以通过相同的 doc_id_
来更新文档(例如,文档中的信息发生了变化)。
示例代码:
# 注意:文档需要指定 `doc_id`
doc_chunks[0].text = "Brand new document text"
index.update_ref_doc(
doc_chunks[0],
update_kwargs={"delete_kwargs": {"delete_from_docstore": True}},
)
我们传递了一些额外的 kwargs
以确保文档从文档存储中删除,这当然是可选的。
刷新 (Refresh)
可以使用文档的 doc_id_
来自动刷新索引。如果文档中的内容有变化,该方法将更新文档;如果文档不在索引中,该方法将插入文档。
示例代码:
# 修改第一个文档,使用相同的 `doc_id`
doc_chunks[0] = Document(text="Super new document text", id_="doc_id_0")
# 添加一个新文档
doc_chunks.append(
Document(
text="This isn't in the index yet, but it will be soon!",
id_="doc_id_3",
)
)
# 刷新索引
refreshed_docs = index.refresh_ref_docs(
doc_chunks, update_kwargs={"delete_kwargs": {"delete_from_docstore": True}}
)
print(refreshed_docs) # 输出:[True, False, False, True]
refresh()
函数将返回一个布尔值列表,指示哪些文档在索引中被刷新。
文档跟踪 (Document Tracking)
使用 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={})}
"""
每条输出显示被引入的 doc_id_
作为键,以及它们被分解成的节点的 node_ids
。
遇到的可能错误:
- 文档不存在:尝试更新或删除一个不存在的文档会引发错误。
- 重复的
doc_id_
:在插入时使用了重复的doc_id_
可能会覆盖已有文档。 - 参数错误:提供给函数的参数不符合预期类型或格式。
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料: