You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda中用LangChain加载S3文档遇只读文件系统及依赖错误

问题解决指南

1. 只读文件系统错误(OSError: [Errno 30] Read-only file system)

原因

nltk默认会将punkt等数据包下载到Lambda的用户主目录(/home/sbx_user1051),但该目录是只读的,导致无法创建目录存储数据包。

解决方法

方法一:指定nltk数据目录到可写的/tmp

在代码开头添加配置,强制nltk将数据包下载到Lambda唯一可写的/tmp目录:

import nltk
# 设置nltk数据路径到/tmp
nltk.data.path.append("/tmp")
# 提前下载所需数据包(避免运行时动态下载触发错误)
nltk.download("punkt", download_dir="/tmp")

方法二:Docker镜像中预安装nltk数据包

如果用Docker部署,直接在镜像构建时安装数据包,避免运行时下载:

# 在Dockerfile中添加
RUN python -m nltk.downloader punkt -d /usr/share/nltk_data

然后在代码中指定路径:

import nltk
nltk.data.path.append("/usr/share/nltk_data")

2. soffice命令未找到错误(FileNotFoundError: soffice command was not found)

原因

Unstructured处理部分文档格式(如doc、ppt、xls等)时,依赖LibreOffice的soffice命令进行格式转换,而Lambda官方Python镜像未预装LibreOffice。

解决方法

在Dockerfile中通过yum安装LibreOffice(基于Amazon Linux 2的镜像):

FROM public.ecr.aws/lambda/python:3.11

# 安装LibreOffice及依赖
RUN yum update -y && \
    yum install -y libreoffice-headless libreoffice-writer libreoffice-calc libreoffice-impress && \
    yum clean all && \
    rm -rf /var/cache/yum

# 复制依赖文件和代码
COPY requirements.txt ${LAMBDA_TASK_ROOT}
RUN pip install --no-cache-dir -r requirements.txt

COPY lambda_handler.py ${LAMBDA_TASK_ROOT}

CMD ["lambda_handler.handler"]

3. 加载任意类型文档的优化建议

  • 按文件类型选择对应Loader:根据S3文件后缀自动匹配合适的LangChain Loader,示例代码:
    from langchain_community.document_loaders import (
        UnstructuredWordDocumentLoader,
        PyPDFLoader,
        TextLoader,
        UnstructuredPowerPointLoader
    )
    
    def get_loader(file_path):
        if file_path.endswith(".docx"):
            return UnstructuredWordDocumentLoader(file_path)
        elif file_path.endswith(".pdf"):
            return PyPDFLoader(file_path)
        elif file_path.endswith(".txt"):
            return TextLoader(file_path)
        elif file_path.endswith(".pptx"):
            return UnstructuredPowerPointLoader(file_path)
        # 可扩展更多格式
        else:
            raise ValueError(f"不支持的文件格式: {file_path}")
    
    # 使用示例
    local_path = f"/tmp/{s3_key}"
    s3.download_file(s3_bucket, s3_key, local_path)
    loader = get_loader(local_path)
    docs = loader.load()
    
  • 所有临时操作限制在/tmp:Lambda仅/tmp目录具备可写权限,下载文件、临时处理文件都需放在该目录下。

内容的提问来源于stack exchange,提问作者Santosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:26:29