高效加载文档:深入LangChain DirectoryLoader的使用技巧

65 阅读2分钟

引言

在处理大量文件时,自动化读取和解析过程变得尤为重要。LangChain的DirectoryLoader提供了强大的功能,可以将文件系统中的文件加载为LangChain的Document对象。本篇文章将展示如何使用DirectoryLoader从文件系统加载文档,包括使用通配符模式、多线程I/O、自定义加载器处理特定文件类型、以及如何处理解码错误。

主要内容

使用通配符加载文件

通过glob参数可以控制加载哪些文件。例如,仅加载Markdown文件:

from langchain_community.document_loaders import DirectoryLoader

loader = DirectoryLoader("../", glob="**/*.md")
docs = loader.load()
print(f"Loaded {len(docs)} documents")

显示加载进度条

为了实时查看加载进度,可以安装tqdm库并设置show_progress参数:

# !pip install tqdm
loader = DirectoryLoader("../", glob="**/*.md", show_progress=True)
docs = loader.load()

使用多线程加速加载

对于大量文件,可开启多线程:

loader = DirectoryLoader("../", glob="**/*.md", use_multithreading=True)
docs = loader.load()

自定义加载器

若需解析特定格式文件,可通过loader_cls参数指定自定义加载器。例如,加载Python源代码文件:

from langchain_community.document_loaders import PythonLoader

loader = DirectoryLoader("../../../../../", glob="**/*.py", loader_cls=PythonLoader)
docs = loader.load()

解码错误处理

在加载过程中可能会遇到解码错误,DirectoryLoader提供了多种处理方式。

默认行为

默认情况下,解码错误会抛出异常:

try:
    loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader)
    docs = loader.load()
except RuntimeError as e:
    print(f"Error: {e}")

静默失败

通过silent_errors参数,可以跳过不能加载的文件:

loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader, silent_errors=True)
docs = loader.load()

自动检测编码

通过autodetect_encoding参数自动检测文件编码:

text_loader_kwargs = {"autodetect_encoding": True}
loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader, loader_kwargs=text_loader_kwargs)
docs = loader.load()

代码示例

完整的代码示例展示如何使用DirectoryLoader加载Markdown文件,并处理解码错误:

from langchain_community.document_loaders import DirectoryLoader

path = "../../data/"
loader = DirectoryLoader(path, glob="**/*.md", use_multithreading=True, show_progress=True)

# 自动检测编码
text_loader_kwargs = {"autodetect_encoding": True}
loader = DirectoryLoader(path, glob="**/*.txt", loader_cls=TextLoader, loader_kwargs=text_loader_kwargs, silent_errors=True)

docs = loader.load()
for doc in docs:
    print(doc.page_content[:100])  # 仅打印前100个字符

常见问题和解决方案

  • 解码错误:开启自动编码检测或使用silent_errors跳过错误文件。
  • 性能问题:使用多线程加速文件加载。

总结和进一步学习资源

通过DirectoryLoader,我们可以高效加载和解析文件系统中的文档,同时能够处理多种格式和编码问题。若想深入了解,还可以参考官方文档和API手册。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---