news 2026/7/23 15:11:01

002:RAG 入门-LangChain 读取文本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
002:RAG 入门-LangChain 读取文本

002:RAG 入门-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", encoding="utf-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_cls=TextLoader, # 使用 TextLoader 读取每个文件 show_progress=True # 显示进度条)# 步骤2:加载所有文档documents = loader.load()# 步骤3:遍历文档,查看每个文件的开头for i, doc in enumerate(documents): print(f"--- 文档 {i+1} ---") 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),这部分会在后续文章详细讲解,但这里先了解概念。### 懒加载示例(基于 TextLoader):python# 对于超大文件,使用 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 的CSVLoaderJSONLoader能自动解析这些格式。这里简要说明区别:| 加载器 | 读取内容 | 典型用途 ||--------|----------|----------||TextLoader| 原始文本 | 纯文本文件 ||CSVLoader| 每行作为独立 Document | 表格数据 ||JSONLoader| 根据 jq 语法提取字段 | API 响应、配置文件 |## 七、常见问题与调试技巧1.编码错误:遇到UnicodeDecodeError时,尝试修改encoding参数python loader = TextLoader("file.txt", encoding="gbk") # 中文 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()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 15:09:13

AI如何解决学术论文写作三大痛点

1. 论文写作的痛点与AI解决方案去年帮导师审阅研究生论文时,一个现象让我印象深刻:超过60%的初稿都存在结构混乱、表述重复的问题。有位同学甚至把"综上所述"连续用了七次,活生生把学术论文写成了复读机。这正是传统论文写作的典型…

作者头像 李华
网站建设 2026/7/23 15:02:34

CDN行业现状与价格战背后的商业逻辑分析

1. CDN行业的现状与玩家格局 CDN(内容分发网络)作为互联网基础设施的重要组成部分,已经从最初的"奢侈品"变成了如今互联网服务的"必需品"。这个行业的参与者大致可以分为三类:传统CDN厂商、云服务商和新兴边缘…

作者头像 李华
网站建设 2026/7/23 15:01:28

大模型推理优化:昆仑芯M100专用AI芯片部署实战指南

在人工智能算力需求持续爆发的背景下,专用AI推理芯片已成为优化大模型部署成本与性能的关键。百度昆仑芯M100作为一款面向大模型推理场景深度优化的芯片,其首次实物展出标志着国产AI芯片在特定领域已具备与国际厂商同台竞技的工程化能力。对于从事大模型…

作者头像 李华
网站建设 2026/7/23 14:59:53

Transformer编码器架构与优化实践详解

1. 编码器核心架构解析编码器作为序列数据处理的核心组件,其架构设计直接影响模型对输入信息的理解能力。现代编码器通常采用多层Transformer结构,每层包含自注意力机制和前馈神经网络两个核心子层。以典型BERT模型为例,其编码器部分由12-24个…

作者头像 李华
网站建设 2026/7/23 14:59:00

AI操作系统:从意图理解到能力调度的技术演进

1. 从"应用商店"到"意图市场"的范式迁移 当Claude这类AI系统开始直接调用系统底层能力时,传统APP的生存空间正在被压缩。我最近测试了最新版的Claude企业版,发现它已经能绕过应用程序界面,直接操作系统文件、调用摄像头、…

作者头像 李华