llama_index [Bug]: refresh_ref_docs() 未更新文档

knsnq2tg  于 2个月前  发布在  其他
关注(0)|答案(2)|浏览(55)

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)重新运行相同的代码,以检查更新是否有效。

相关日志/回溯

  • 无响应*
elcex8rz

elcex8rz1#

你好!我在这里帮助你解决任何bug、问题或贡献。让我们一起解决这个问题。
要解决在MongoDB中使用refresh_ref_docs()llamaIndexAzureCosmosDBMongoDBVectorSearch处理大型文档时生成重复文档的问题,你可以利用llamaIndex提供的文档去重策略。这些策略通过比较文档存储中存储的哈希值或ID来工作,并需要设置一个文档存储,该存储必须跨管道运行持久化。
以下是如何使用DocstoreStrategy处理重复项的示例:

from llama_index.core.ingestion.pipeline import IngestionPipeline, DocstoreStrategy

pipeline = IngestionPipeline(
    docstore_strategy=DocstoreStrategy.UPSERTS,  # Use upserts to handle duplicates
    # other necessary parameters
)

# Run the pipeline
pipeline.run(documents=documents)

DocstoreStrategy枚举提供了三种处理重复项的策略:

  1. UPSERTS :根据文档的ID检查文档是否已经在文档存储中。如果不在,或者文档的哈希值已更新,它将在文档存储中更新文档并运行转换。
  2. DUPLICATES_ONLY :仅通过检查文档的哈希值是否已经在文档存储中来处理重复项。只有在这种情况下,它才会将文档添加到文档存储并运行转换。
  3. UPSERTS_AND_DELETE :类似于upsert策略,但还会从文档存储中删除不存在的文档。
    通过将docstore_strategy设置为UPSERTS,管道将根据其ID检查现有文档并在必要时进行更新,从而防止重复。
    此外,你还可以使用KVDocumentStore类中的ref_doc_exists方法检查引用文档是否已经存在于存储中:
def ref_doc_exists(self, ref_doc_id: str) -> bool:
    """Check if a ref_doc_id has been ingested."""
    return self.get_ref_doc_info(ref_doc_id) is not None

async def aref_doc_exists(self, ref_doc_id: str) -> bool:
    """Check if a ref_doc_id has been ingested."""
    return await self.aget_ref_doc_info(ref_doc_id) is not None

通过采用这些策略和方法,你可以确保在插入新文档之前,该方法会验证具有相同node_id的文档是否已经存在于集合中。如果存在,则跳过该文档的插入,从而防止重复。

  • 要继续与dosu交流,请提及@dosu。*
2o7dmzc5

2o7dmzc52#

我尝试了update_ref_doc和refresh_ref_docs,两者都在数据库中生成了重复的文档。

相关问题