llama_index [Bug]:使用s3fs的S3Reader简单目录读取器无法上传文件

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

Bug描述

使用llama索引的最新版本,上传到s3后加载失败:
文件 "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/fsspec/spec.py",第373行,_ls_from_cache函数中引发FileNotFoundError(path)异常。
根据调查,上游的注解llamaindex.core.readers.file.base.py有助于解决问题,但需要一个理想的解决方案:
第211-218行:

if input_files:
           self.input_files = []
           for path in input_files:
               print(input_files)
               if not self.fs.isfile(path): #### Comment
                   raise ValueError(f"File {path} does not exist.") ### Comment
               input_file = _Path(path)
               self.input_files.append(input_file)

版本

最新版本 0.10.33

重现步骤

从S3获取知识源

  1. 首先将第一个文件上传到s3 - > 运行正常
  2. 从s3加载索引 - > 运行正常
  3. 从s3(知识源)删除文件 - > 运行正常
  4. 使用S3Reader将新文件上传到s3 - > 运行正常
  5. document_data = loader.load_data(),抛出异常:
    文件 "/Users/kish/Library/Caches/pypoetry/virtualenvs/backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/fsspec/spec.py",第373行,_ls_from_cache函数中引发FileNotFoundError(path)异常。

相关日志/回溯

/Users/ksundaravarathan/Documents/test/backend/src/loader/awsS3Loader.py", line 87, in uploadDocument
document_data = self.loader.load_data()
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/llama_index/readers/s3/base.py", line 118, in load_data
documents = self.load_s3_files_as_docs()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/llama_index/readers/s3/base.py", line 100, in load_s3_files_as_docs
return loader.load_data()
^^^^^^^^^^^^^^^^^^
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/llama_index/core/readers/file/base.py", line 484, in load_data
SimpleDirectoryReader.load_file(
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/llama_index/core/readers/file/base.py", line 385, in load_file
metadata = file_metadata(str(input_file))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/llama_index/core/readers/file/base.py", line 117, in __call__
return default_file_metadata_func(file_path, self.fs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/llama_index/core/readers/file/base.py", line 84, in default_file_metadata_func
stat_result = fs.stat(file_path)
^^^^^^^^^^^^^^^^^^
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/fsspec/spec.py", line 1515, in stat
return self.info(path, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/fsspec/asyn.py", line 118, in wrapper
return sync(self.loop, func, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/fsspec/asyn.py", line 103, in sync
raise return_result
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/fsspec/asyn.py", line 56, in _runner
result[0] = await coro
^^^^^^^^^^
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/s3fs/core.py", line 1352, in _info
out = self._ls_from_cache(fullpath)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/ksundaravarathan/Library/Caches/pypoetry/virtualenvs/test-backend-pA5nAHO2-py3.11/lib/python3.11/site-packages/fsspec/spec.py", line 373, in _ls_from_cache
raise FileNotFoundError(path)
FileNotFoundError: test-ks-demo/kiran-test/official-resume-template.pdf
cfh9epnr

cfh9epnr1#

看起来在使用 S3Reader 从 S3 存储桶加载数据时遇到的 FileNotFoundError 可能是由于几个因素导致的,包括 AWS S3 的最终一致性、错误的文件路径、权限问题,或者在文件上传或删除后立即尝试读取需要重试机制。
要解决这个问题,可以考虑实现一个带有指数退避的重试机制。这种方法可以帮助缓解与 S3 的最终一致性相关的问题,尤其是在上传新文件或删除现有文件之后。以下是一个简化的示例,说明如何实现这样的机制:

import time
from botocore.exceptions import ClientError

def load_data_with_retry(loader, retries=5, delay=5):
    for i in range(retries):
        try:
            return loader.load_data()
        except FileNotFoundError as e:
            if i < retries - 1:
                time.sleep(delay)  # wait before trying again
                continue
            else:
                raise

loader = S3Reader(
    bucket=self.bucket,
    aws_access_id=self.access_key_id,
    aws_access_secret=self.secret_access_key,
    key=self.prefix+fileName
)

try:
    document_data = load_data_with_retry(loader)
except ClientError as e:
    print(f"Failed to load data: {e}")

这段代码尝试多次加载数据,并在每次尝试之间设置延迟,这在你处理文件上传或删除后的即时影响时可能特别有用。
此外,确保你在 S3Reader 初始化中指定的文件路径与 S3 存储桶中文件的位置完全匹配,因为 S3 路径区分大小写。还要验证你的应用程序使用的 IAM 角色或用户凭据是否具有从 S3 存储桶读取的必要权限,特别是 s3:GetObject
如果问题仍然存在,为你的应用程序和 AWS SDK 启用详细日志记录可以提供进一步的洞察力,帮助识别路径、权限问题或其他异常中的任何潜在不匹配。
这种方法应该帮助你解决 FileNotFoundError 并确保从 S3 更可靠地加载数据。

细节

来源

这个响应旨在帮助你节省时间并提高效率。它不是 精确的解决方案,而是你自己研究的一个起点。
请帮助我变得更有用!如果你觉得这个回答有帮助,请留下一个 👍 如果没有帮助的话就请留下一个 👎 。

bgtovc5b

bgtovc5b2#

我认为这个问题不能通过重试逻辑来解决。我可以确认文件确实存在于s3中,甚至在调用reader和load_data()之前尝试获取对象。它在使用simpleDirectoryReader或valueError时与fs.stat(file_path)存在问题。

复现步骤已经在描述中提到。

相关问题