当前位置: 首页 > news >正文

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

在之前我们处理的数据主要是“对话历史”或“简单的字符串”。但在真实的
RAG(检索增强生成)场景中,我们的知识库往往包含大量的文档:PDF 报告、Word 合同、Excel 表格、CSV 数据等。

LangChain 提供了一个强大的抽象层:文档加载器(Document Loaders)。它可以将各种格式的文件统一转换为
LangChain 标准的Document对象,方便后续进行切分(Splitting)和向量化(Embedding)。

今天,我们从最常见的表格数据入手,学习CSVLoader的使用,并掌握加载大文件时的内存优化技巧

📦 核心概念:Document 与 Loader

1. 什么是 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_path=os.path.join(".","RAG_Techniques","data","stu.csv")# ---------------------------------------------------------# 1. 初始化 CSVLoader# ---------------------------------------------------------loader=CSVLoader(file_path=file_path,csv_args={"delimiter":",",# 指定分隔符,CSV 通常是逗号"quotechar":'"',# 指定引号字符,用于包裹含分隔符的文本# "fieldnames": [...] # 如果 CSV 没有表头,可以在这里手动指定列名# 本例中有表头,所以不需要这一行},encoding="utf-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} ------------------------------ ...

💡 关键点解读

  1. 自动格式化
    CSVLoader并没有保留 CSV 的原始格式(逗号分隔),而是将其转换成了Key-Value 对的形式(key: value)。

    • 这样做的好处是:大模型更容易理解这种结构化的文本描述。
    • 例如:模型能清楚地知道 “张三” 对应的是 “name”。
  2. Metadata 的作用
    注意metadata中的'row': 0。这记录了数据来源于第几行。

    • 在 RAG 检索时,如果用户问“第二个人是谁?”,我们可以利用这个元数据进行过滤或溯源。
  3. 编码问题
    Windows 系统生成的 CSV 有时是GBK编码,而 Linux/Mac 通常是UTF-8

    • 如果在page_content中看到乱码(如å¼ ä¸‰),请尝试修改encoding="gbk"

🌟 为什么这对 RAG 很重要?

在构建企业级 RAG 应用时,数据源往往非常复杂:

  • 产品目录:通常存储在 CSV 或 Excel 中。
  • 客户记录:存储在数据库导出文件中。
  • 日志数据:巨大的文本或 CSV 文件。

通过CSVLoader,我们将这些结构化数据成功转化为了非结构化文本(Document),这使得我们可以:

  1. 使用RecursiveCharacterTextSplitter对其进行切分。
  2. 使用 Embedding 模型将其向量化。
  3. 存入向量数据库。

最终,当用户问“喜欢篮球的学生多大?”时,向量数据库能检索到name: 张三, hobby: 篮球这段文本,从而让大模型给出正确答案。


🚀 总结

本节课我们迈出了 RAG 数据处理的第一步:

  1. 统一标准:理解了所有文件加载后都会变成Document对象。
  2. 性能优化:掌握了lazy_load()生成器模式,这是处理大规模数据集的必备技能。
  3. CSV 处理:学会了使用CSVLoader将表格转换为 LLM 友好的 Key-Value 文本格式。

现在,你已经可以加载 CSV 数据了。但现实世界中还有大量的PDF 文档Word 文档,它们的加载方式略有不同(涉及 OCR、排版解析等)。

http://www.jsqmd.com/news/491559/

相关文章:

  • 降AI率工具技术原理对比:双引擎vs Pallas引擎vs DeepHelix
  • 单细胞数据分析--质量控制
  • 医疗包装级透明PP母粒炼成记:福尔蒂GMP车间与ISO13647粒子控制
  • 2026年有机肥平模挤压造粒机厂家推荐:柱状造粒机/有机肥造粒生产线专业供应 - 品牌推荐官
  • 在Cherry Studio里快速安装OpenClaw
  • 计算机毕业设计之springboot基于宠物饲养管理APP的设计与实现
  • 【SWM320】学习使用GPIO
  • 华为OD机考双机位C卷 - 智能驾驶(Java Python JS GO C++ C)
  • 利用omnicoder-9b模型编写把扫描版pdf转成文字版pdf的程序
  • 六轴机械臂的轨迹优化就像在迷宫里找最短路线——传统粒子群算法(PSO)容易卡在局部最优里打转。咱们今天搞点野路子,给算法加点特技
  • DVWA 搭建踩坑全记录:卡在 “Invalid database selected” 最后一关(新手求助!Help)
  • GitHub 热榜 Top 10 (316) ​
  • 2026年全屋定制应用白皮书南京装修权威厂家解析 - 优质品牌商家
  • Day01笔记整理
  • 【个人量化必备】:A股全市场5000+股票实时行情获取
  • 受激发射损耗(STED)显微镜
  • CSE-CIC-IDS2018数据集获取
  • VOOHU 沃虎电子_10G Base-T 网络变压器 WHSM24P03-2PG 解决超高清视频传输供电难题
  • 计算机毕业设计之springboot北工国际健身俱乐部
  • AI原生应用领域意图识别的发展现状与未来展望
  • Hexo Butterfly 主题副标题不显示问题解决方案
  • 0 Basic Study Java Day01
  • Winform Modbus 316线程 异步 λ表达式 泛型与数组 Encoding.ASCII.GetBytes bitConverter 大端小端 寄存器与label
  • 大模型连载8:词向量如何表示近义词?
  • VScode快捷键
  • 2026年国标减压阀厂家推荐:煤气阀/液化气减压阀/大火力减压阀/汀鸥减压阀供应企业推荐 - 品牌推荐官
  • 2026年锅炉除氧器厂家专业选型参考:真空/大气式/热力/余热锅炉除氧器供应商推荐 - 品牌推荐官
  • 在idea中配置maven本地仓库
  • 239 滑动窗口最大值
  • gpt-claude-gemini稳定api代理