🎯 课程主题
梳理 RAG 的完整工作流程(Source → Load → Transform → Embed → Store → Retrieve),并完成本章所需的环境依赖安装与数据资源准备。
📝 核心知识点
RAG 六大核心环节
| 环节 | 英文 | 说明 |
|---|---|---|
| 数据源 | Source | Markdown、JSON、CSV、Word、HTML 等多格式数据 |
| 加载 | Load | 使用不同 Loader 将数据加载为 Document 对象 |
| 转换 | Transform | 文本切分(核心)、冗余过滤、元数据提取、多语言翻译等 |
| 嵌入 | Embed | 将文本转化为向量,依赖 Embedding Model |
| 存储 | Store | 向量持久化存储到向量数据库 |
| 检索 | Retrieve | 基于相似度搜索召回相关内容 |
关键概念详解
Document 对象:所有 Loader 加载后的统一数据结构,有两个核心属性:
page_content:存储核心文本内容metadata:存储文档元数据(如来源路径)
Transform 环节不只有文本切分(Text Splitter),还包括:
- 冗余过滤器:过滤重复文档
- 元数据提取器:提取结构化元数据
- 多语言转换器:机器翻译
- 对话→问答格式转换
Embedding 模型有别于大语言模型(LLM),专门做文本→向量转换。不同 Embedding 模型维度不同(1536 维、3072 维等),维度越高信息量越丰富,收费也不同。
检索的两条技术路线:
- 基于 LangChain 提供的检索 API
- 基于向量数据库自带的检索 API → 本课程选用此方案(更贴近实际生产环境)
🏗️ 架构与工作流
Source Load Transform Embed
┌─────────┐ ┌─────────────┐ ┌─────────────┐ ┌──────────┐
│ Markdown │ │ MarkdownLoader│ │ Text Splitter│ │ Embedding │
│ JSON │ → │ JSONLoader │ → │ Redundancy │ → │ Model │
│ CSV │ │ CSVLoader │ │ Filter │ │ │
│ Word │ │ DocxLoader │ │ Metadata │ │ 文本→向量 │
│ HTML │ │ HTMLLoader │ │ Extractor │ └────┬─────┘
└─────────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │
▼ ▼ ▼
Document对象 Chunk片段 Vector
(page_content + (小块文本) (多维向量)
metadata)
Store Retrieve
┌──────────────┐ ┌───────────────────────┐
│ Vector DB │ │ 用户问题 → 向量化 │
│ (持久化存储) │ → │ → 相似度搜索 │
│ │ │ → 取 Top-K 结果 │
└──────────────┘ │ → 拼装上下文 → LLM 生成 │
└───────────────────────┘
💻 环境准备
步骤一:安装依赖
pip install -r requirements_for.txt
说明:前面章节已安装的库不再重复安装(已包含在 requirements.txt 中),
requirements_for.txt仅包含本章新增的库。安装后可用pip check检查依赖冲突。
步骤二:复制数据资源
将资料中的以下内容复制到当前工程目录:
knowledge.txt:知识库文件asset/目录:包含多种格式的演示文件(TXT、CSV、JSON 等)
⚠️ 常见问题与避坑指南
- 不要把整个文档直接塞进向量数据库:检索时会返回整篇文档,无效信息过多,token 浪费严重,回答不精准
- 必须先切分再存储:切成小 Chunk 后再向量化存储,检索时才精准
- 向量数据库选择:本课程不再使用 LangChain 内置检索 API,而改用向量数据库原生 API(更贴近实际开发)
- 依赖安装:务必在正确的虚拟环境下执行 pip install
💡 个人总结与延伸
- Loader 体系的核心设计模式是共同父类 + 标准化接口:所有 Loader 继承自 BaseLoader,均提供
load()方法返回List[Document] - 文本切分(Text Splitter)是 Transform 环节中最重要的子环节,后续将重点展开
- 选择向量数据库原生 API 而非 LangChain 封装 API 是更务实的工程选择——LangChain 可用可不用,但向量数据库必须用