
002RAG 入门-LangChain 读取文本一、从 RAG 到文本读取为什么需要这一步在构建 RAG检索增强生成系统时第一步往往被低估如何将原始文本数据加载到可处理的格式中。RAG 的核心流程是“检索 → 增强 → 生成”而“检索”的前提是我们需要先把文档拆解成机器能理解的小块。LangChain 作为最流行的 RAG 框架之一提供了丰富的文档加载器Document Loaders帮助我们轻松读取各种格式的文本。想象一个场景你想让 AI 回答关于公司内部政策的问题但政策文档是 PDF 或网页格式。直接让大模型处理原始文件是不现实的——它需要结构化、分段的文本。今天我们就从最简单的文本读取开始一步步掌握 LangChain 的文档加载能力。## 二、基础概念什么是 Document Loader在 LangChain 中Document是核心数据结构包含两个字段-page_content字符串存储实际文本内容-metadata字典存储来源、页码等辅助信息而Document Loader就是负责将不同来源的数据如文本文件、PDF、网页转换为Document对象的工具。LangChain 内置了超过 100 种加载器覆盖了从本地文件到云存储的多种场景。## 三、实战第一段读取纯文本文件让我们从最基础的文件类型开始.txt文件。假设我们有一个名为company_policy.txt的文件内容如下公司假期政策1. 年假员工每年享有15天带薪年假。2. 病假每年12天带薪病假需提供医疗证明。3. 事假每年3天无薪事假需提前申请。### 代码示例 1使用 TextLoader 读取文本python# 首先安装 LangChain 核心库# pip install langchain-communityfrom langchain_community.document_loaders import TextLoader# 步骤1创建 TextLoader 实例指定文件路径# 注意文件路径可以是相对路径或绝对路径loader TextLoader(company_policy.txt, encodingutf-8)# 步骤2调用 load() 方法加载文档# 返回一个 Document 对象的列表即使只有一个文件documents loader.load()# 步骤3查看加载结果print(f文档数量{len(documents)})print(f文档内容预览前100字符\n{documents[0].page_content[:100]})print(f文档元数据{documents[0].metadata})输出示例文档数量1文档内容预览前100字符公司假期政策1. 年假员工每年享有15天带薪年假。2. 病假每年12天带薪病假需提供医疗证明。3. 文档元数据{source: company_policy.txt}关键要点-TextLoader是最简单的加载器适合处理纯文本文件-encoding参数很重要中文文本建议使用utf-8- 元数据自动包含source字段记录文件来源## 四、进阶用法批量读取与路径处理实际项目中我们经常需要处理多个文件。LangChain 提供了DirectoryLoader来批量读取整个目录的文本文件。假设我们有一个docs文件夹包含多个.txt文件。### 代码示例 2使用 DirectoryLoader 批量加载pythonfrom langchain_community.document_loaders import DirectoryLoader# 步骤1创建 DirectoryLoader 实例# 第一个参数目录路径# glob匹配模式这里只加载 .txt 文件# loader_cls指定使用哪种加载器默认 TextLoader# show_progress显示加载进度条适合大量文件loader DirectoryLoader( path./docs, # 文档目录 glob**/*.txt, # 递归匹配所有 .txt 文件 loader_clsTextLoader, # 使用 TextLoader 读取每个文件 show_progressTrue # 显示进度条)# 步骤2加载所有文档documents loader.load()# 步骤3遍历文档查看每个文件的开头for i, doc in enumerate(documents): print(f--- 文档 {i1} ---) print(f来源{doc.metadata[source]}) # 只显示前50个字符 print(f内容预览{doc.page_content[:50]}\n)输出示例--- 文档 1 ---来源docs/meeting_notes.txt内容预览2024年第一季度会议纪要------ 文档 2 ---来源docs/company_policy.txt内容预览公司假期政策1. 年假员工每年享有15天重要参数解析| 参数 | 作用 ||------|------||path| 要扫描的目录 ||glob| 文件匹配模式**表示递归子目录 ||loader_cls| 自定义每个文件使用的加载器 ||show_progress| 是否显示 tqdm 进度条 |## 五、处理大文件懒加载与分块当处理超大文本文件如日志文件或整本书时直接全部加载到内存可能导致溢出。LangChain 提供了懒加载Lazy Loading机制通过lazy_load()方法逐条返回文档。此外阅读文本后通常需要分块Chunking这部分会在后续文章详细讲解但这里先了解概念。### 懒加载示例基于 TextLoaderpython# 对于超大文件使用 lazy_load() 替代 load()loader TextLoader(large_log.txt)# lazy_load() 返回一个迭代器逐个生成 Documentfor chunk in loader.lazy_load(): # 每次只处理一个文档内存友好 process_chunk(chunk) # 假设的处理器 if some_condition: break # 可以提前终止何时使用懒加载- 文件超过 100MB- 需要流式处理- 内存受限的环境如服务器函数## 六、特殊格式CSV 与 JSON 的读取虽然本文聚焦“文本读取”但实际项目中常遇到结构化文本。LangChain 的CSVLoader和JSONLoader能自动解析这些格式。这里简要说明区别| 加载器 | 读取内容 | 典型用途 ||--------|----------|----------||TextLoader| 原始文本 | 纯文本文件 ||CSVLoader| 每行作为独立 Document | 表格数据 ||JSONLoader| 根据 jq 语法提取字段 | API 响应、配置文件 |## 七、常见问题与调试技巧1.编码错误遇到UnicodeDecodeError时尝试修改encoding参数python loader TextLoader(file.txt, encodinggbk) # 中文 Windows 常用2.文件路径问题使用pathlib确保跨平台兼容python from pathlib import Path loader TextLoader(Path(data) / docs / policy.txt)3.元数据自定义可以通过继承加载器来添加自定义元数据python class CustomTextLoader(TextLoader): def load(self): docs super().load() for doc in docs: doc.metadata[custom_field] value return docs## 八、总结文本读取是 RAG 的基石通过本文你学会了- 使用TextLoader读取单个文本文件- 使用DirectoryLoader批量处理目录中的文件- 理解Document对象的结构内容 元数据- 掌握懒加载处理大文件的方法进阶思考文本读取只是 RAG 管线的第一环。下一篇文章我们将学习如何将读取的文本分割成适当大小的块Chunking这是决定检索质量的关键步骤。记住好的开始是成功的一半正确读取文本能避免后续许多调试痛苦。现在打开你的编辑器试着读取几个.txt文件吧如果遇到问题可以检查文件编码和路径是否正确。RAG 的世界从这一行代码开始TextLoader(my_doc.txt).load()。