langchain各类文档加载

张开发
2026/4/21 1:09:52 15 分钟阅读

分享文章

langchain各类文档加载
LangChain文档加载器提供了两种核心加载方式load()一次性加载全部文档和lazy_load()延迟流式加载文档后者特别适合处理大型数据集以避免内存溢出问题。一、文档加载器核心加载方法两种加载模式详解load() - 一次性加载模式将所有文档一次性加载到内存中返回完整的Document对象列表适合小型数据集如单个PDF、小型文本文件代码示例fromlangchain_community.document_loadersimportPyPDFLoader loaderPyPDFLoader(./data/small.pdf)documentsloader.load()# 一次性加载所有页面print(f共加载{len(documents)}个文档)lazy_load() - 延迟流式加载模式按需加载文档仅在迭代时才实际加载内容返回一个生成器对象避免一次性占用大量内存特别适合大型数据集如GB级日志文件、大型PDF文档集代码示例fromlangchain_community.document_loadersimportTextLoader loaderTextLoader(./data/large_log.txt,encodingutf-8)fordocinloader.lazy_load():# 逐块加载而非一次性加载print(f处理文档块{doc.page_content[:100]})# 可在此处进行分块处理、向量化等操作两种加载方式的底层关系LangChain的BaseLoader基类中定义了这两种方法的关系defload(self)-List[Document]:一次性加载所有文档returnlist(self.lazy_load())deflazy_load(self)-Iterator[Document]:延迟加载文档生成器iftype(self).load!BaseLoader.load:returniter(self.load())# 向后兼容如果子类实现了load但没实现lazy_loadraiseNotImplementedError(f{self.__class__.__name__}does not implement lazy_load())这种设计确保了新代码推荐使用lazy_load()更内存友好旧代码兼容性如果子类只实现了load()lazy_load()会自动调用它灵活性开发者可以根据数据规模选择合适的加载方式二、各种文档类型的具体加载方法1、PDF文档加载PyPDFLoader最常用fromlangchain_community.document_loadersimportPyPDFLoader# 一次性加载所有页面loaderPyPDFLoader(./data/document.pdf,modepage)pagesloader.load()# 返回每页一个Document对象# 或使用延迟加载推荐大型PDFforpageinloader.lazy_load():print(f第{page.metadata.get(page,未知)}页:{len(page.page_content)}字符)关键参数说明modepage默认每页生成一个Documentmetadata包含页码 modesingle将整个PDF作为单个Document对象 password用于解锁加密PDF2、文本文件加载TextLoaderTXT/Markdown等纯文本fromlangchain_community.document_loadersimportTextLoader# 一次性加载loaderTextLoader(./data/sample.txt,encodingutf-8)documentsloader.load()# 延迟加载推荐大型文件loaderTextLoader(./data/large_file.md,encodingutf-8)fordocinloader.lazy_load():print(f文档内容预览:{doc.page_content[:200]}...)print(f来源:{doc.metadata[source]})3、目录批量加载DirectoryLoader批量处理文件夹fromlangchain_community.document_loadersimportDirectoryLoader# 一次性加载所有txt文件loaderDirectoryLoader(./documents/,glob**/*.txt,show_progressTrue,use_multithreadingTrue)documentsloader.load()# 延迟加载推荐大型目录fordocinloader.lazy_load():print(f处理文件:{doc.metadata[source]})# 可在此处进行分块、向量化等操作4、网页内容加载WebBaseLoader抓取网页内容fromlangchain_community.document_loadersimportWebBaseLoader# 一次性加载loaderWebBaseLoader(https://example.com)dataloader.load()# 延迟加载推荐抓取多个网页urls[https://example.com/page1,https://example.com/page2]loaderWebBaseLoader(urls)fordocinloader.lazy_load():print(f网页标题:{doc.metadata.get(title,未知)})print(f内容长度:{len(doc.page_content)}字符)5、结构化数据加载CSVLoader表格数据fromlangchain_community.document_loadersimportCSVLoader loaderCSVLoader(file_path./data/sales.csv,csv_args{delimiter:,,quotechar:,fieldnames:[Product,Sales,Region]})# 一次性加载dataloader.load()# 延迟加载推荐大型CSVforrowinloader.lazy_load():print(f产品:{row.metadata.get(Product,未知)})print(f销售额:{row.metadata.get(Sales,未知)})JSONLoaderJSON数据fromlangchain_community.document_loadersimportJSONLoader loaderJSONLoader(file_path./data/products.json,jq_schema.products[],text_contentFalse)# 一次性加载dataloader.load()# 延迟加载forproductinloader.lazy_load():print(f产品名称:{product.metadata.get(name,未知)})print(f描述:{product.page_content})三、加载方法选择的最佳实践何时使用load() vs lazy_load()场景推荐方法原因小型文档10MBload()简单直接代码简洁大型文档10MBlazy_load()避免内存溢出流式处理更高效需要随机访问文档load()一次性加载后可随机索引仅需顺序处理文档lazy_load()内存效率高适合管道式处理大文件处理的高级技巧结合lazy_load()的流式处理管道fromlangchain.text_splitterimportRecursiveCharacterTextSplitter# 创建分块器text_splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50,separators[\n\n,\n,。,,,,、,])# 流式处理大型文档loaderTextLoader(./data/very_large_file.txt,encodingutf-8)fordocinloader.lazy_load():# 逐块分块处理chunkstext_splitter.split_documents([doc])# 将每个块向量化并存入数据库forchunkinchunks:vector_db.add_documents([chunk])使用多线程加速目录加载fromlangchain_community.document_loadersimportDirectoryLoader loaderDirectoryLoader(./documents/,glob**/*.txt,use_multithreadingTrue,# 启用多线程threads_per_worker4# 每个worker使用4个线程)# 延迟加载结合多线程fordocinloader.lazy_load():# 处理文档...pass四、常见问题解决方案内存溢出问题当处理GB级文件时即使使用lazy_load()也可能遇到内存问题解决方案进一步减小分块大小将chunk_size从500降低到200-300增加分块重叠度设置chunk_overlap100确保语义连贯使用更轻量级的模型选择小型嵌入模型如BAAI/bge-small-zh-v1.5中文文档处理技巧指定正确编码TextLoader(…, encoding“utf-8”)自定义分隔符针对中文文本使用separators[“\n\n”, “\n”, “。”, “”, “”, “”, “、”, “”]启用元素模式对于Markdown使用UnstructuredMarkdownLoader(…, mode“elements”)扫描件PDF处理普通PyPDFLoader无法处理扫描件PDF需使用OCR方案fromlangchain_community.document_loadersimportUnstructuredPDFLoader loaderUnstructuredPDFLoader(./data/scanned.pdf,strategyocr,# 启用OCRmodepage)通过合理选择load()或lazy_load()方法结合适当的分块策略和处理技巧您可以高效地加载各种类型的文档为RAG系统构建坚实的知识库基础。对于大型数据集强烈推荐使用lazy_load()方法以避免内存问题并结合流式处理管道实现高效的知识库构建。

更多文章