【第三周】RAG与Agent实战24:CSVLoader的使用 —— 结构化数据加载入门

【第三周】RAG与Agent实战24:CSVLoader的使用 —— 结构化数据加载入门 在之前我们处理的数据主要是“对话历史”或“简单的字符串”。但在真实的RAG检索增强生成场景中我们的知识库往往包含大量的文档PDF 报告、Word 合同、Excel 表格、CSV 数据等。LangChain 提供了一个强大的抽象层文档加载器Document Loaders。它可以将各种格式的文件统一转换为LangChain 标准的Document对象方便后续进行切分Splitting和向量化Embedding。今天我们从最常见的表格数据入手学习CSVLoader的使用并掌握加载大文件时的内存优化技巧。 核心概念Document 与 Loader1. 什么是 Document 对象在 LangChain 中无论源文件是 PDF 还是 CSV加载后都会变成统一的Document对象。它主要包含两个属性page_content: 文件的文本内容字符串。metadata: 文件的元数据字典如文件名、页码、行号等。2. BaseLoader 基类所有的加载器如CSVLoader,PyPDFLoader,Docx2txtLoader都继承自BaseLoader类。它们提供了两种加载模式方法返回值特点适用场景load()List[Document]一次性加载。将所有内容读入内存列表。小文件 10MB快速开发测试。lazy_load()Iterator[Document]懒加载/流式加载。返回一个生成器每次只读取一条数据。大文件GB 级避免内存溢出 (OOM)。⚠️注意如果处理几百兆的 CSV 文件使用load()可能会导致程序直接崩溃Memory Error。生产环境推荐始终优先考虑lazy_load()。 实战代码加载学生信息表我们将使用CSVLoader加载一个包含学生姓名、年龄、性别和爱好的 CSV 文件。数据准备 (stu.csv)假设我们有一个stu.csv文件内容如下name,age,gender,hobby 张三,18,男,篮球 李四,19,女,绘画 王五,20,男,编程完整代码实现fromlangchain_community.document_loadersimportCSVLoaderimportos# 确保路径正确这里使用相对路径file_pathos.path.join(.,RAG_Techniques,data,stu.csv)# ---------------------------------------------------------# 1. 初始化 CSVLoader# ---------------------------------------------------------loaderCSVLoader(file_pathfile_path,csv_args{delimiter:,,# 指定分隔符CSV 通常是逗号quotechar:,# 指定引号字符用于包裹含分隔符的文本# fieldnames: [...] # 如果 CSV 没有表头可以在这里手动指定列名# 本例中有表头所以不需要这一行},encodingutf-8# 【关键】指定编码防止中文乱码)print( 开始加载数据...\n)# ---------------------------------------------------------# 2. 方式一批量加载 (load) - 适用于小文件# ---------------------------------------------------------# docs loader.load()# print(f共加载 {len(docs)} 条数据)# for doc in docs:# print(doc)# ---------------------------------------------------------# 3. 方式二懒加载 (lazy_load) - 推荐用于大文件# ---------------------------------------------------------# lazy_load 返回的是一个生成器 (Generator)不会立即占用大量内存fordocumentinloader.lazy_load():# document 是一个 Document 对象# page_content: 格式化后的文本内容# metadata: 包含源文件路径、行号等信息print(f 类型:{type(document)})print(f 内容:\n{document.page_content})print(f️ 元数据:{document.metadata})print(-*30)️ 运行结果解析运行上述代码你会看到类似以下的输出。注意CSVLoader是如何将表格行转换为文本的 开始加载数据... 类型: class langchain_core.documents.base.Document 内容: name: 张三 age: 18 gender: 男 hobby: 篮球 ️ 元数据: {source: .\\RAG_Techniques\\data\\stu.csv, row: 0} ------------------------------ 类型: class langchain_core.documents.base.Document 内容: name: 李四 age: 19 gender: 女 hobby: 绘画 ️ 元数据: {source: .\\RAG_Techniques\\data\\stu.csv, row: 1} ------------------------------ ... 关键点解读自动格式化CSVLoader并没有保留 CSV 的原始格式逗号分隔而是将其转换成了Key-Value 对的形式key: value。这样做的好处是大模型更容易理解这种结构化的文本描述。例如模型能清楚地知道 “张三” 对应的是 “name”。Metadata 的作用注意metadata中的row: 0。这记录了数据来源于第几行。在 RAG 检索时如果用户问“第二个人是谁”我们可以利用这个元数据进行过滤或溯源。编码问题Windows 系统生成的 CSV 有时是GBK编码而 Linux/Mac 通常是UTF-8。如果在page_content中看到乱码如å¼ ä¸‰请尝试修改encodinggbk。 为什么这对 RAG 很重要在构建企业级 RAG 应用时数据源往往非常复杂产品目录通常存储在 CSV 或 Excel 中。客户记录存储在数据库导出文件中。日志数据巨大的文本或 CSV 文件。通过CSVLoader我们将这些结构化数据成功转化为了非结构化文本Document这使得我们可以使用RecursiveCharacterTextSplitter对其进行切分。使用 Embedding 模型将其向量化。存入向量数据库。最终当用户问“喜欢篮球的学生多大”时向量数据库能检索到name: 张三, hobby: 篮球这段文本从而让大模型给出正确答案。 总结本节课我们迈出了 RAG 数据处理的第一步统一标准理解了所有文件加载后都会变成Document对象。性能优化掌握了lazy_load()生成器模式这是处理大规模数据集的必备技能。CSV 处理学会了使用CSVLoader将表格转换为 LLM 友好的 Key-Value 文本格式。现在你已经可以加载 CSV 数据了。但现实世界中还有大量的PDF 文档和Word 文档它们的加载方式略有不同涉及 OCR、排版解析等。