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
相关产品推荐
相关产品推荐

