llamaindex 文档管理

文档管理

概念解释

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

插入

你可以在初始构建索引后,将新文档“插入”到任何索引数据结构中。这个文档将被分解成节点并被索引吸收。

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

以下是一个代码示例:

from llama_index 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)
删除

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

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

delete_from_docstore 默认设置为False,以防你使用相同的文档存储在索引之间共享节点。然而,当设置为False时,这些节点在查询时不会被使用,因为它们将从索引的index_struct中删除,index_struct跟踪哪些节点可以用于查询。

更新

如果一个文档已经存在于索引中,你可以使用相同的doc id更新文档(例如,如果文档中的信息发生了变化)。

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

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

刷新

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

refresh() 函数只会更新那些具有相同doc 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

同样,我们传递了一些额外的kwargs以确保文档从文档存储中删除。这当然是可选的。

如果你打印refresh()的输出,你会看到哪些输入文档被刷新了:

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

当你从一个不断更新新信息的目录中读取时,这最有用。

要自动设置doc id,当使用SimpleDirectoryReader时,可以设置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={})}
"""

输出中的每个条目显示了已吸收的doc id作为键,以及它们被分割成的节点的关联node_ids。

最后,每个输入文档的原始元数据字典也会被跟踪。你可以在自定义文档中了解更多关于元数据属性的信息。

拓展

文档管理是LlamaIndex中非常重要的功能,它允许你对索引中的文档进行动态管理,包括插入、删除、更新和刷新操作。通过这些操作,你可以确保索引中的数据始终是最新的,从而提高检索的准确性和效率。

在实际应用中,文档管理功能特别适用于需要频繁更新数据源的场景,例如新闻网站、博客平台或实时数据分析系统。通过合理使用这些功能,你可以构建一个高效、可维护的检索系统。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要重新演唱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值