如何让LangChain DirectoryLoader在Heroku部署环境中正常工作
Heroku部署下LangChain DirectoryLoader加载PDF返回空列表的解决方案
问题背景
在Heroku部署环境中,使用LangChain的DirectoryLoader加载指定目录下的PDF文件时,明明目录中存在目标PDF(如CAI2025_paper_6124.pdf),但loader.load()返回空列表,本地测试完全正常,已尝试列出目录内容、使用绝对路径等方法,问题仍未解决。
排查与解决步骤
1. 确保UnstructuredPDFLoader的系统依赖在Heroku上正确安装
UnstructuredPDFLoader依赖poppler系统库,Heroku默认未预装,需通过以下步骤添加:
- 添加Heroku Apt buildpack:
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-apt.git - 在项目根目录创建
Aptfile文件,写入:poppler-utils - 确保
requirements.txt中包含Unstructured的PDF相关依赖:unstructured[pdf]>=0.10.0
2. 验证glob_pattern匹配规则
检查传入的glob_pattern是否准确匹配PDF文件:
- 在代码中添加日志打印
glob_pattern的值,确认是否为**/*.pdf(递归匹配所有PDF):print(f"glob_pattern: {glob_pattern}") - 若文件名存在大小写差异,调整glob为
**/*.{pdf,PDF}来兼容大小写场景。
3. 禁用多线程加载
Heroku dyno资源有限,多线程加载可能引发异常,临时关闭多线程测试:
loader = DirectoryLoader( directory_path_str, glob=glob_pattern, use_multithreading=False, # 改为禁用多线程 show_progress=True, loader_cls=loader_cls, )
4. 直接用单个PDFLoader测试
绕过DirectoryLoader,直接用指定的loader_cls加载单个文件,排查问题来源:
# 替换原DirectoryLoader代码为以下内容测试 single_file_path = os.path.join(directory_path_str, 'CAI2025_paper_6124.pdf') loader = loader_cls(single_file_path) docs = loader.load() print(f"Single file docs: {docs}")
5. 检查文件完整性与权限
- 打印上传文件的大小,对比本地文件确认是否完整:
file_size = os.path.getsize(single_file_path) print(f"File size: {file_size} bytes") - 检查文件权限(Heroku临时目录一般无需额外权限,但可验证):
import stat file_perms = stat.filemode(os.stat(single_file_path).st_mode) print(f"File permissions: {file_perms}")
6. 更换PDFLoader实现
若UnstructuredPDFLoader在Heroku环境存在兼容性问题,替换为其他PDFLoader,比如PyPDFLoader:
from langchain_community.document_loaders import PyPDFLoader # 将loader_cls替换为PyPDFLoader loader = DirectoryLoader( directory_path_str, glob=glob_pattern, loader_cls=PyPDFLoader, )
内容的提问来源于stack exchange,提问作者Wonjae Oh
相关产品推荐
相关产品推荐

