RAG学习之- RAG 数据导入完整指南

RAG 数据导入完整指南

从 TXT 到 CSV 再到网页,全面掌握 RAG 系统的数据导入技术

文档日期:2026-04-17


目录

  1. 概述
  2. TXT 文件导入(#二 txt 文件导入)
  3. CSV 表格导入(#三 csv 表格导入)
  4. 网页加载
  5. 方案对比与选型
  6. 最佳实践

一、概述

1.1 RAG 数据导入的核心流程

复制代码
┌─────────────────────────────────────────────────────────┐
│                 RAG 数据导入流程                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  原始数据 → 读取 → 转换 → 分块 → 向量化 → 存储           │
│     │                                                  │
│     ├─ TXT 文件 → 直接读取                              │
│     ├─ CSV 文件 → 结构化转换                            │
│     └─ 网页 → HTML 解析 + 正文提取                       │
│                                                         │
└─────────────────────────────────────────────────────────┘

1.2 为什么需要不同的加载器?

数据类型 特点 挑战
TXT 非结构化 分块策略
CSV 结构化 如何转成自然语言
网页 半结构化 HTML 标签清理、动态内容、反爬

二、TXT 文件导入

2.1 基础方法

python 复制代码
# 最简单的方式
with open('data.txt', 'r', encoding='utf-8') as f:
    text = f.read()

2.2 分块策略

方法 说明 适用场景
固定长度 按字符数切分 均匀文本
按段落 保持段落完整 访谈录、文章
按章节 保持章节结构 技术文档、书籍
句子边界 在句子结束处分 需要语义完整

2.3 推荐配置

python 复制代码
CHUNK_SIZE = 400       # 每块 400 字符
CHUNK_OVERLAP = 200    # 重叠 50%,保持上下文连贯

三、CSV 表格导入

3.1 核心挑战

CSV 是结构化数据,RAG 需要非结构化文本

复制代码
┌─────────────────────────────────────────┐
│  CSV 原始数据                            │
│  name,age,city,job                      │
│  小明,25,北京,工程师                    │
│  小红,30,上海,设计师                    │
└─────────────────────────────────────────┘
            ↓ 转换
┌─────────────────────────────────────────┐
│  自然语言描述                            │
│  "小明是一位 25 岁的北京工程师"              │
│  "小红是一位 30 岁的上海设计师"            │
└─────────────────────────────────────────┘

3.2 三种加载器对比

加载器 所属生态 优点 缺点 适用场景
pandas 独立 轻量、完全控制 需手动转换 轻量级项目
LangChain CSVLoader LangChain 返回 Document,无缝集成 依赖重,格式固定 LangChain 项目
UnstructuredCSVLoader unstructured 自动编码检测,metadata 丰富 安装复杂,需转换返回值 多格式统一处理

3.3 详细对比

LangChain CSVLoader
python 复制代码
from langchain_community.document_loaders import CSVLoader

loader = CSVLoader(
    file_path="data.csv",
    source_column="标题",
    metadata_columns=["分类", "作者"],
    encoding="utf-8"
)

docs = loader.load()
# 直接返回 Document 对象

优点:

  • ✅ 开箱即用,返回 Document 对象
  • ✅ 与 LangChain 无缝集成
  • ✅ 支持自定义 metadata 列

缺点:

  • ❌ 依赖重(~200MB)
  • ❌ 编码需手动指定
  • ❌ 转换方式固定(列名:值格式)

UnstructuredCSVLoader
python 复制代码
from unstructured.csv import UnstructuredCSVLoader

loader = UnstructuredCSVLoader(
    file_path="data.csv",
    encoding=None,        # 自动检测
    include_headers=True
)

elements = loader.load()
# 返回 Element 对象,需转换

优点:

  • ✅ 自动编码检测(中文不乱码)
  • ✅ 统一 API 处理 20+ 格式
  • ✅ metadata 丰富(语言、编码等)

缺点:

  • ❌ 安装复杂(需要 libmagic)
  • ❌ 返回值需手动转换
  • ❌ 文档相对较少

pandas(推荐用于轻量级项目)
python 复制代码
import pandas as pd

df = pd.read_csv("data.csv", encoding="utf-8")

# 自定义转换逻辑
chunks = []
for _, row in df.iterrows():
    text = f"问题:{row['问题']}\n答案:{row['答案']}"
    chunks.append(text)

优点:

  • ✅ 依赖小(或无需额外依赖)
  • ✅ 完全控制转换逻辑
  • ✅ 符合轻量级风格

缺点:

  • ❌ 需手动编写转换代码
  • ❌ 不自动检测编码

3.4 CSV 转换策略

数据类型 转换策略 示例输出
问答对 逐行转换 "问题:X 答案:Y"
人员信息 字段组合 "小明是一位 25 岁的工程师"
产品目录 模板生成 "产品【iPhone 15】售价 6999 元"
知识库 标题 + 内容 "【标题】RAG【内容】..."

四、网页加载

4.1 核心挑战

挑战 说明 解决方案
HTML 标签 需要清理 BeautifulSoup/trafilatura
动态内容 JavaScript 渲染 Selenium/Firecrawl
反爬虫 User-Agent/频率限制 代理/商业服务
编码问题 GBK/Big5 等 自动检测

4.2 十种加载方案完整对比

方案 静态 动态 反爬 文章提取 递归 依赖 成本 推荐度
requests+bs4 ⚠️ 免费 ⭐⭐⭐
WebBaseLoader ⚠️ 免费 ⭐⭐⭐
Unstructured HTMLLoader ⚠️ 免费 ⭐⭐⭐
Selenium 免费 ⭐⭐
Playwright 免费 ⭐⭐
trafilatura ⚠️ ✅✅✅ 免费 ⭐⭐⭐⭐
RecursiveURLLoader ⚠️ 免费 ⭐⭐⭐⭐
SitemapLoader ⚠️ ⚠️ 免费 ⭐⭐⭐⭐
Firecrawl ✅✅✅ 付费 ⭐⭐⭐⭐⭐
Scrapfly/ScraperAPI ✅✅✅ ⚠️ ⚠️ 付费 ⭐⭐⭐

4.3 方案详解

4.3.1 trafilatura(文章提取首选)
python 复制代码
import trafilatura

url = "https://example.com/article"
downloaded = trafilatura.fetch_url(url)
text = trafilatura.extract(downloaded)

优点:

  • ✅ 专业文章提取,效果最好
  • ✅ 自动过滤导航、广告
  • ✅ 依赖小,速度快
  • ✅ 支持中文

缺点:

  • ❌ 只适合文章类网页
  • ❌ 无法处理动态内容

4.3.2 RecursiveURLLoader(文档站首选)
python 复制代码
from langchain_community.document_loaders import RecursiveURLLoader

loader = RecursiveURLLoader(
    url="https://python.langchain.com/docs",
    max_depth=2,
    exclude_dirs=["/api/"]
)

docs = loader.load()

优点:

  • ✅ 自动递归爬取整个网站
  • ✅ 深度可控
  • ✅ 自动去重

缺点:

  • ❌ 依赖 LangChain
  • ❌ 无法处理动态网页

4.3.3 SitemapLoader(博客/新闻站)
python 复制代码
from langchain_community.document_loaders import SitemapLoader

loader = SitemapLoader(
    web_path="https://example.com/sitemap.xml",
    filter_urls=lambda url: "/blog/" in url
)

docs = loader.load()

优点:

  • ✅ 通过官方 sitemap 获取 URL
  • ✅ 覆盖全面
  • ✅ 效率高

缺点:

  • ❌ 依赖 sitemap
  • ❌ 可能过期

4.3.4 Firecrawl(动态网页/反爬)
python 复制代码
from firecrawl import FirecrawlApp

app = FirecrawlApp(api_key="xxx")

# 爬取整个网站
result = app.crawl_url(
    url="https://example.com",
    params={"limit": 100}
)

优点:

  • ✅ 处理 JavaScript 渲染
  • ✅ 绕过反爬机制
  • ✅ 返回 Markdown 格式
  • ✅ 无需维护基础设施

缺点:

  • ❌ 需要 API Key
  • ❌ 付费服务(免费额度 500/月)
  • ❌ 数据发送到第三方

4.4 选型决策树

复制代码
                    ┌─────────────────┐
                    │  你要爬什么网站? │
                    └────────┬────────┘
                             │
         ┌───────────────────┼───────────────────┐
         │                   │                   │
         ▼                   ▼                   ▼
   ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
   │  静态文档站  │    │  动态网页    │    │  新闻文章   │
   └──────┬──────┘    └──────┬──────┘    └──────┬──────┘
          │                  │                  │
    ┌─────┴─────┐      ┌─────┴─────┐     ┌─────┴─────┐
    │           │      │           │     │           │
    ▼           ▼      ▼           ▼     ▼           ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│Recursive│ │Sitemap │ │Fire-  │ │Selenium│ │trafila-│
│URL     │ │Loader  │ │crawl  │ │        │ │tura    │
└────────┘ └────────┘ └────────┘ └────────┘ └────────┘
 免费       有 sitemap   付费       免费       效果最好

五、方案对比与选型

5.1 数据类型 vs 推荐方案

数据类型 首选方案 备选方案
TXT 直接读取 + 分块 -
CSV(轻量项目) pandas UnstructuredCSVLoader
CSV(LangChain) CSVLoader -
静态网页 trafilatura requests+bs4
文档站 RecursiveURLLoader SitemapLoader
动态网页 Firecrawl Selenium/Playwright
新闻文章 trafilatura Unstructured
多格式混合 Unstructured ww-

5.2 依赖大小对比

方案 安装大小 安装命令
requests + bs4 ~5MB pip install requests beautifulsoup4
trafilatura ~10MB pip install trafilatura
pandas ~15MB pip install pandas
Unstructured ~50MB pip install unstructured + libmagic
LangChain 系列 ~200MB+ pip install langchain-community
Selenium ~20MB + 浏览器 pip install selenium
Firecrawl ~5MB pip install firecrawl-py

5.3 成本对比

方案 免费额度 付费价格
requests + bs4 ✅ 完全免费 -
trafilatura ✅ 完全免费 -
pandas ✅ 完全免费 -
LangChain 系列 ✅ 完全免费 -
Unstructured ✅ 完全免费 -
Firecrawl 500 credits/月 $16/月 起
ScraperAPI 5000 请求/月 $29/月 起

六、最佳实践

6.1 轻量级项目(如 naive_rag.py)

复制代码
推荐组合:pandas + trafilatura + requests

依赖:
pip install pandas trafilatura requests beautifulsoup4

理由:

  • 总依赖 < 30MB
  • 覆盖 CSV + 网页
  • 完全免费
  • 效果优秀

6.2 LangChain 项目

复制代码
推荐组合:CSVLoader + WebBaseLoader + RecursiveURLLoader

依赖:
pip install langchain-community

理由:

  • 无缝集成
  • API 统一
  • 文档丰富

6.3 生产环境

复制代码
推荐组合:Firecrawl + Unstructured

依赖:
pip install firecrawl-py unstructured

理由:

  • 处理动态网页
  • 绕过反爬
  • 多格式统一
  • 有商业支持

6.4 编码处理最佳实践

python 复制代码
# CSV 编码检测
import chardet

with open('data.csv', 'rb') as f:
    result = chardet.detect(f.read(10000))
    encoding = result['encoding']

df = pd.read_csv('data.csv', encoding=encoding)

6.5 网页加载 Fallback 策略

python 复制代码
def load_webpage(url: str) -> str:
    # 方案 1:trafilatura(优先)
    try:
        downloaded = trafilatura.fetch_url(url)
        text = trafilatura.extract(downloaded)
        if text:
            return text
    except:
        pass
  
    # 方案 2:requests + bs4(fallback)
    try:
        response = requests.get(url, headers={
            'User-Agent': 'Mozilla/5.0'
        }, timeout=10)
        soup = BeautifulSoup(response.content, 'html.parser')
        for tag in soup(['script', 'style']):
            tag.decompose()
        return soup.get_text()
    except:
        raise Exception("网页加载失败")

七、总结

7.1 核心要点

知识点 内容
CSV 导入核心 结构化 → 自然语言转换
网页加载核心 HTML 清理 + 正文提取
动态网页 需要浏览器渲染(Selenium/Firecrawl)
文章提取 trafilatura 效果最好
全站爬取 RecursiveURLLoader / Firecrawl
轻量级推荐 pandas + trafilatura
生产环境 Firecrawl + Unstructured

7.2 选型口诀

TXT 直接读,CSV 要转换
文章提取 trafilatura,文档站用 RecursiveURL
动态网页 Firecrawl,轻量项目 pandas + requests
有 sitemap 用 Sitemap,反爬严重用商业服务


文档整理日期:2026-04-17
基于 RAG 学习项目整理

相关推荐
Rocky Ding*6 分钟前
Latent Consistency Models:一篇读懂扩散模型的少步生成核心基础知识
人工智能·深度学习·机器学习·ai作画·stable diffusion·aigc·ai-native
大山佬8 分钟前
AI 边缘部署:MCU 上的轻量级目标检测,从 YOLO 到 TFLite Micro 的全链路优化
人工智能
旅僧8 分钟前
Π环境部署(运行 且 无理论讲解)
学习
数睿数据无代码开发9 分钟前
深度解析smardaten数据大屏:六大核心功能重塑可视化开发
人工智能·信息可视化
陈猪的杰咪10 分钟前
GitHub Copilot 2026计费新规:AI Credits消耗解析与节省策略
人工智能·ai·架构·github·copilot
jushi899911 分钟前
Lucas Chess R国际象棋、中国象棋、日本将棋、五子棋训练学习工具游戏软件
学习
贤哥哥yyds11 分钟前
GBK转UTF\-8编码自动转换工具 使用文档
python
学术头条18 分钟前
清华团队开源SCAIL-2:角色动画告别骨骼依赖,端到端还原视频中动作细节
人工智能·科技·机器学习·ai·开源·音视频·agi
لا معنى له18 分钟前
世界模型的功能分类法——Renderers, Simulators, Planners, and the Loop That Connects Them
人工智能
数量技术宅19 分钟前
2026量化前沿:从Reddit热帖到Python实战,如何用赫斯特指数(Hurst)狙击虚假突破?
开发语言·python