Bug描述
我正在使用llamaIndex和AzureCosmosDBMongoDBVectorSearch作为向量存储。我尝试插入文档,doc_id总是事先知道的。我使用refresh_ref_docs()来插入或更新文档。当文档不太长时,这工作得很好。如果doc_id不存在,则在数据库中创建一个新文档,如果它存在,则会更新它。
对于大型文档,由于插入操作在数据库中创建了多个文档,因此如果我运行此代码两次,那么mango数据库中的文档将生成两次。
documents = [
Document(
text=long_text,
doc_id= "2caaaf25-5ca5-49b6-9f4a-0ddf5c8d734f",
metadata={
"library": "dummy",
},
)
]
index.refresh_ref_docs(documents)
版本
0.10.26
重现步骤
使用refresh_ref_docs()插入非常长的文档,该文档将在数据库端创建许多文档。
使用相同的文档(和相同的doc_id)重新运行相同的代码,以检查更新是否有效。
相关日志/回溯
- 无响应*
2条答案
按热度按时间elcex8rz1#
你好!我在这里帮助你解决任何bug、问题或贡献。让我们一起解决这个问题。
要解决在MongoDB中使用
refresh_ref_docs()
与llamaIndex
和AzureCosmosDBMongoDBVectorSearch
处理大型文档时生成重复文档的问题,你可以利用llamaIndex
提供的文档去重策略。这些策略通过比较文档存储中存储的哈希值或ID来工作,并需要设置一个文档存储,该存储必须跨管道运行持久化。以下是如何使用
DocstoreStrategy
处理重复项的示例:DocstoreStrategy
枚举提供了三种处理重复项的策略:UPSERTS
:根据文档的ID检查文档是否已经在文档存储中。如果不在,或者文档的哈希值已更新,它将在文档存储中更新文档并运行转换。DUPLICATES_ONLY
:仅通过检查文档的哈希值是否已经在文档存储中来处理重复项。只有在这种情况下,它才会将文档添加到文档存储并运行转换。UPSERTS_AND_DELETE
:类似于upsert策略,但还会从文档存储中删除不存在的文档。通过将
docstore_strategy
设置为UPSERTS
,管道将根据其ID检查现有文档并在必要时进行更新,从而防止重复。此外,你还可以使用
KVDocumentStore
类中的ref_doc_exists
方法检查引用文档是否已经存在于存储中:通过采用这些策略和方法,你可以确保在插入新文档之前,该方法会验证具有相同
node_id
的文档是否已经存在于集合中。如果存在,则跳过该文档的插入,从而防止重复。2o7dmzc52#
我尝试了update_ref_doc和refresh_ref_docs,两者都在数据库中生成了重复的文档。