
纲要数据加载器的作用与 LangChain 中的定位常见加载器实战PyPDFLoader解析文本型 PDF多模态图文 PDF 解析结合视觉模型与 base64WebBaseLoader网页内容提取UnstructuredURLLoader非结构化网页解析CSVLoaderCSV 文件加载Excel 加载Azure Document Intelligence自定义加载器开发继承BaseLoader实现lazy_load方法使用yield返回Document对象完整可运行代码整合 Text、CSV 和自定义 Loader 的本地演示引言在 RAG检索增强生成系统中第一步就是将多源异构的原始数据“摄入”到标准化流水线中。LangChain 通过统一的Document对象和丰富的Loader生态让开发者可以像搭积木一样加载 PDF、网页、CSV、Excel 甚至多媒体内容。本文将以实战代码的形式逐一拆解常见加载器的用法并带你动手开发一个支持逐行读取的自定义加载器为后续的切片、嵌入和检索打下坚实基础。文档加载器从原始数据到DocumentLangChain 中的所有加载器都遵循一个简单契约输入文件路径或 URL输出Document列表。每个Document包含page_content文本内容和metadata来源、页码等。这种统一的设计让下游的切片器、嵌入模型可以无缝对接。常见加载器实战PDF 加载文本型 PDFPyPDFLoader是最常用的 PDF 解析工具它依赖pypdf库可以按页提取文本。fromlangchain_community.document_loadersimportPyPDFLoader loaderPyPDFLoader(example.pdf)# 替换为实际路径pagesloader.load()forpageinpages:print(page.metadata[page],page.page_content[:200])多模态图文 PDF对于包含图表、图像的 PDF纯文本提取会丢失视觉信息。这时可以将 PDF 页面转为 base64 编码的图片再交给多模态模型如 GPT-4o进行图像理解。importbase64fromlangchain_core.messagesimportHumanMessagefromlangchain_openaiimportChatOpenAIdefpdf_to_base64_images(pdf_path):# 实际项目中使用 pdf2image 或 PyMuPDF 转换pass# 构建多模态消息image_base64...# 转换后的 base64 字符串modelChatOpenAI(modelgpt-4o-mini)responsemodel.invoke([HumanMessage(content[{type:text,text:图中一线城市消费者占比是多少},{type:image_url,image_url:{url:fdata:image/png;base64,{image_base64}}}])])print(response.content)网页加载WebBaseLoaderWebBaseLoader基于requests和BeautifulSoup可从指定 URL 提取清洗后的文本。支持自定义解析参数只抓取特定 CSS 类的内容。fromlangchain_community.document_loadersimportWebBaseLoader loaderWebBaseLoader(https://example.com)docsloader.load()print(docs[0].page_content[:500])只提取特定部分loaderWebBaseLoader(https://example.com,bs_kwargs{parse_only:SoupStrainer(class_main-content)})非结构化网页UnstructuredURLLoader当网页结构复杂或未知时可使用UnstructuredURLLoader它利用unstructured库自动解析无需关心 HTML 标签。fromlangchain_community.document_loadersimportUnstructuredURLLoader loaderUnstructuredURLLoader([https://example.com])docsloader.load()CSV 加载CSVLoaderCSVLoader将 CSV 文件的每一行转换为一个Document可指定要加载的列。fromlangchain_community.document_loadersimportCSVLoader loaderCSVLoader(file_pathdata.csv,source_columnTitle)docsloader.load()Excel 加载推荐使用 Azure Document Intelligence 服务它能够智能解析 Excel 表格结构。本地轻量方案也可通过pandas读取后手动转换。自定义加载器逐行读取文件当内置加载器无法满足需求时只需继承BaseLoader并实现lazy_load方法。下面的示例创建了一个逐行读取文件的自定义加载器每行生成一个Document并记录行号和来源。fromlangchain_core.document_loadersimportBaseLoaderfromlangchain_core.documentsimportDocumentfromtypingimportIteratorclassLineDocumentLoader(BaseLoader):def__init__(self,file_path:str):self.file_pathfile_pathdeflazy_load(self)-Iterator[Document]:withopen(self.file_path,r,encodingutf-8)asf:forline_no,lineinenumerate(f,start1):yieldDocument(page_contentline.strip(),metadata{line_number:line_no,source:self.file_path})完整可运行代码以下代码整合了TextLoader、CSVLoader和自定义LineDocumentLoader使用临时文件演示无需外部 API 即可运行。安装依赖pipinstalllangchain langchain-communityimporttempfile,osfromlangchain_community.document_loadersimportTextLoader,CSVLoaderfromlangchain_core.document_loadersimportBaseLoaderfromlangchain_core.documentsimportDocumentfromtypingimportIterator# ---------- 自定义逐行加载器 ----------classLineDocumentLoader(BaseLoader):def__init__(self,file_path:str):self.file_pathfile_pathdeflazy_load(self)-Iterator[Document]:withopen(self.file_path,r,encodingutf-8)asf:forline_no,lineinenumerate(f,start1):yieldDocument(page_contentline.strip(),metadata{line_number:line_no,source:self.file_path})# ---------- 创建临时文件 ----------withtempfile.TemporaryDirectory()astmpdir:# 文本文件txt_pathos.path.join(tmpdir,sample.txt)withopen(txt_path,w,encodingutf-8)asf:f.write(LangChain 是一个强大的 LLM 框架。\n它支持链式调用和 RAG。\n)# CSV 文件csv_pathos.path.join(tmpdir,data.csv)withopen(csv_path,w,encodingutf-8)asf:f.write(title,content\nAI Agent,智能体\nRAG,检索增强生成\n)# 1. TextLoader 加载text_loaderTextLoader(txt_path)text_docstext_loader.load()print(--- TextLoader 结果 ---)fordocintext_docs:print(doc.page_content)# 2. CSVLoader 加载csv_loaderCSVLoader(csv_path)csv_docscsv_loader.load()print(\n--- CSVLoader 结果 ---)fordocincsv_docs:print(doc.page_content)# 3. 自定义 LineDocumentLoader 加载line_loaderLineDocumentLoader(txt_path)line_docslist(line_loader.lazy_load())print(\n--- 自定义逐行加载器结果 ---)fordocinline_docs:print(f第{doc.metadata[line_number]}行:{doc.page_content})运行该脚本你将看到三种加载器依次工作输出统一的Document列表。这展示了 LangChain 加载器生态的灵活性和可扩展性无论是内置的还是自定义的最终都产出相同的标准格式为后续处理铺平道路。总结本文通过实际代码演示了 LangChain 中从 PDF、网页、CSV 到自定义文件的多种加载方式。掌握这些加载器你就可以将任何结构或非结构化的数据源快速接入 RAG 流水线。下一步这些Document对象将经过文本切片和向量嵌入最终存入向量数据库为智能检索和增强生成做好准备。