@[TOC](检索增强生成 (RAG) 技术全栈指南 一)

0. 前言

RAG技术(检索增强生成)是大模型应用开发中必用技术之一,本文按照开源项目All in RAG 的目录进行学。
项目文档:https://datawhalechina.github.io/all-in-rag
GitHub: https://github.com/datawhalechina/all-in-rag

进度:

All-in-RAG 技术全栈指南 完整学习清单(带复选框)

第一部分:RAG基础入门

  • 第一章 解锁RAG
    • RAG简介 - RAG技术概述与应用场景
    • 准备工作 - 环境配置与工具准备
    • 四步构建RAG - 快速上手RAG开发
    • 附:环境部署 - Python虚拟环境部署方案补充
  • 第二章 数据准备
    • 数据加载 - 多格式文档处理与加载
    • 文本分块 - 文本切分策略与优化

第二部分:索引构建与优化

  • 第三章 索引构建
    • 向量嵌入 - 文本向量化技术详解
    • 多模态嵌入 - 图文多模态向量化
    • 向量数据库 - 向量存储与检索系统
    • Milvus实践 - Milvus多模态检索实战
    • 索引优化 - 索引性能调优技巧

第三部分:检索技术进阶

  • 第四章 检索优化
    • 混合检索 - 稠密+稀疏检索融合
    • 查询构建 - 智能查询理解与构建
    • Text2SQL - 自然语言转SQL查询
    • 查询重构与分发 - 查询优化策略
    • 检索进阶技术 - 高级检索算法

第四部分:生成与评估

  • 第五章 生成集成
    • 格式化生成 - 结构化输出与格式控制
  • 第六章 RAG系统评估
    • 评估介绍 - RAG系统评估方法论
    • 评估工具 - 常用评估工具与指标

第五部分:高级应用与实战

  • 第七章 高级RAG架构(拓展部分)
    • 基于知识图谱的RAG
  • 第八章 项目实战一
    • 环境配置与项目架构
    • 数据准备模块实现
    • 索引构建与检索优化
    • 生成集成与系统整合
  • 第九章 项目实战一优化(选修篇)
    • 图RAG架构设计
    • 图数据建模与准备
    • Milvus索引构建
    • 智能查询路由与检索策略
  • 第十章 项目实战二(选修篇)
    • 规划中

第六部分:知识拓展

  • 第十一章 Neo4J 简单应用
    • 知识图谱与 Neo4j 安装
    • Neo4j 基本使用

1. 文章目录

在这里插入图片描述

2. 第一章 解锁RAG

2.1 RAG简介 - RAG技术概述与应用场景

https://datawhalechina.github.io/all-in-rag/#/chapter1/01_RAG_intro

2.1.1 什么是RAG

RAG(Retrieval-Augmented Generation),即检索增强生成,其本质是一种 “内外结合” 的技术范式。它巧妙连接了两类知识:一类是 LLM 在训练过程中固化于模型权重的 “参数化知识”—— 就像我们大脑中长久记忆但可能模糊的知识;另一类是来自外部知识库、可随时更新的 “非参数化知识”—— 如同考试时可以查阅的精准参考资料。

简单来说,RAG 的核心逻辑是:在 LLM 生成回答前,先通过检索机制从外部知识库中找到与问题高度相关的信息,将这些 “参考资料” 与用户问题一同交给 LLM,引导其基于真实依据生成内容。这就像让 LLM 从 “闭卷考试” 变成 “开卷考试”,既发挥了模型的语言组织能力,又保证了输出的准确性。

2.1.2 技术原理

RAG 系统的运作的核心,是通过 “检索” 与 “生成” 两个关键阶段,实现内外知识的深度融合:

  1. 检索阶段:精准锁定 “参考资料”
    • 第一步是 “知识向量化”:借助嵌入模型(Embedding Model),将外部知识库中的所有文档都编码成计算机能理解的向量形式,形成向量索引(Index)并存入向量数据库 —— 这相当于给所有资料做了 “语义标签”,方便快速查找。
    • 第二步是 “语义召回”:当用户发起查询时,同样用嵌入模型将问题转化为向量,通过相似度搜索技术,从向量数据库中精准筛选出与问题最相关的文档片段。这个过程就像一位细心的图书管理员,根据你的需求快速从海量书籍中找出核心参考资料。
  2. 生成阶段:融合知识产出答案
    • 首先进行 “上下文整合”:生成模块会接收两部分信息 —— 用户的原始问题和检索到的相关文档片段;
    • 随后进行 “指令引导生成”:按照预设的 Prompt 指令,LLM 会将问题与上下文信息有效结合,在可控范围内生成有理有据的回答,避免凭空捏造。
      在这里插入图片描述

2.1.3 技术演进分类

在这里插入图片描述

在这里插入图片描述

2.1.4 为什么要使用 RAG? 技术选型:RAG vs. 微调

在选择具体的技术路径时,一个重要的考量是成本与效益的平衡。通常,我们应优先选择对模型改动最小、成本最低的方案,所以技术选型路径往往遵循的顺序是 提示词工程(Prompt Engineering) -> 检索增强生成 -> 微调(Fine-tuning)。

我们可以从两个维度来理解这些技术的区别。如下图所示,横轴代表“LLM 优化”,即对模型本身进行多大程度的修改。从左到右,优化的程度越来越深, 其中提示工程和 RAG 完全不改变模型权重,而微调则直接修改模型参数。 纵轴代表“上下文优化” ,是对输入给模型的信息进行多大程度的增强。从下到上,增强的程度越来越高,其中提示工程只是优化提问方式,而 RAG 则通过引入外部知识库,极大地丰富了上下文信息。

在这里插入图片描述

基于此,我们的选择路径就清晰了:

  • 先尝试提示工程:通过精心设计提示词来引导模型,适用于任务简单、模型已有相关知识的场景。
  • 再选择 RAG:如果模型缺乏特定或实时知识而无法回答,则使用 RAG,通过外挂知识库为其提供上下文信息。
  • 最后考虑微调当目标是改变模型“如何做”(行为/风格/格式)而不是“知道什么”(知识)时,微调是最终且最合适的选择。 例如,让模型学会严格遵循某种独特的输出格式、模仿特定人物的对话风格,或者将极其复杂的指令“蒸馏”进模型权重中。

RAG 的出现填补了通用模型与专业领域之间的鸿沟,它在解决如表所示 LLM 局限时尤其有效

在这里插入图片描述

4. 四步构建RAG - 快速上手RAG开发

首先通过Anaconda配置环境

(myenv) ➜  Documents conda create -n all-in-rag python=3.10 -y
Channels:
 - defaults
Platform: osx-arm64
Collecting package metadata (repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /opt/anaconda3/envs/all-in-rag

  added / updated specs:
    - python=3.10


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    packaging-25.0             |  py310hca03da5_1         164 KB
    python-3.10.19             |       hf701271_0        11.5 MB
    setuptools-80.10.1         |  py310hca03da5_0         1.3 MB
    wheel-0.46.3               |  py310hca03da5_0          54 KB
    ------------------------------------------------------------
                                           Total:        13.0 MB

The following NEW packages will be INSTALLED:

  bzip2              pkgs/main/osx-arm64::bzip2-1.0.8-h80987f9_6
  ca-certificates    pkgs/main/osx-arm64::ca-certificates-2025.12.2-hca03da5_0
  expat              pkgs/main/osx-arm64::expat-2.7.3-h50f4ffc_4
  libcxx             pkgs/main/osx-arm64::libcxx-21.1.8-hb4ce287_0
  libexpat           pkgs/main/osx-arm64::libexpat-2.7.3-h50f4ffc_4
  libffi             pkgs/main/osx-arm64::libffi-3.4.4-hca03da5_1
  libzlib            pkgs/main/osx-arm64::libzlib-1.3.1-h5f15de7_0
  ncurses            pkgs/main/osx-arm64::ncurses-6.5-hee39554_0
  openssl            pkgs/main/osx-arm64::openssl-3.0.19-ha0b305a_0
  packaging          pkgs/main/osx-arm64::packaging-25.0-py310hca03da5_1
  pip                pkgs/main/noarch::pip-25.3-pyhc872135_0
  python             pkgs/main/osx-arm64::python-3.10.19-hf701271_0
  readline           pkgs/main/osx-arm64::readline-8.3-h0b18652_0
  setuptools         pkgs/main/osx-arm64::setuptools-80.10.1-py310hca03da5_0
  sqlite             pkgs/main/osx-arm64::sqlite-3.51.1-hab6afd1_0
  tk                 pkgs/main/osx-arm64::tk-8.6.15-hcd8a7d5_0
  tzdata             pkgs/main/noarch::tzdata-2025c-he532380_0
  wheel              pkgs/main/osx-arm64::wheel-0.46.3-py310hca03da5_0
  xz                 pkgs/main/osx-arm64::xz-5.6.4-h80987f9_1
  zlib               pkgs/main/osx-arm64::zlib-1.3.1-h5f15de7_0



Downloading and Extracting Packages:

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate all-in-rag
#
# To deactivate an active environment, use
#
#     $ conda deactivate

(myenv) ➜  Documents
(myenv) ➜  Documents
(myenv) ➜  Documents conda env list
# conda environments:
#
base                     /opt/anaconda3
all-in-rag               /opt/anaconda3/envs/all-in-rag
myenv                 *  /opt/anaconda3/envs/myenv
myenv1                   /opt/anaconda3/envs/myenv1
myenv2                   /opt/anaconda3/envs/myenv2
newenv                   /opt/anaconda3/envs/newenv

(myenv) ➜  Documents conda activate all-in-rag
(all-in-rag) ➜  Documents python -m pip install --upgrade pip setuptools wheel
Requirement already satisfied: pip in /opt/anaconda3/envs/all-in-rag/lib/python3.10/site-packages (25.3)
Collecting pip
  Downloading pip-26.0-py3-none-any.whl.metadata (4.7 kB)
Requirement already satisfied: setuptools in /opt/anaconda3/envs/all-in-rag/lib/python3.10/site-packages (80.10.1)
Collecting setuptools
  Downloading setuptools-80.10.2-py3-none-any.whl.metadata (6.6 kB)
Requirement already satisfied: wheel in /opt/anaconda3/envs/all-in-rag/lib/python3.10/site-packages (0.46.3)
Requirement already satisfied: packaging>=24.0 in /opt/anaconda3/envs/all-in-rag/lib/python3.10/site-packages (from wheel) (25.0)
Downloading pip-26.0-py3-none-any.whl (1.8 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 4.3 MB/s  0:00:00
Downloading setuptools-80.10.2-py3-none-any.whl (1.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 3.4 MB/s  0:00:00
Installing collected packages: setuptools, pip
  Attempting uninstall: setuptools
    Found existing installation: setuptools 80.10.1
    Uninstalling setuptools-80.10.1:
      Successfully uninstalled setuptools-80.10.1
  Attempting uninstall: pip
    Found existing installation: pip 25.3
    Uninstalling pip-25.3:
      Successfully uninstalled pip-25.3
Successfully installed pip-26.0 setuptools-80.10.2
(all-in-rag) ➜  Documents pip install -r /Users/fanzhen/Documents/all-in-rag/code/requirements.txt

Collecting torch==2.6.0 (from -r /Users/fanzhen/Documents/all-in-rag/code/requirements.txt (line 1))
  Downloading torch-2.6.0-cp310-none-macosx_11_0_arm64.whl.metadata (28 kB)
Collecting torchvision==0.21.0 (from -r /Users/fanzhen/Documents/all-in-rag/code/requirements.txt (line 2))
  Downloading torchvision-0.21.0-cp310-cp310-macosx_11_0_arm64.whl.metadata (6.1 kB)
Collecting torchaudio==2.6.0 (from -r /Users/fanzhen/Documents/all-in-rag/code/requirements.txt (line 3))
  Downloading torchaudio-2.6.0-cp310-cp310-macosx_11_0_arm64.whl.metadata (6.6 kB)
Collecting huggingface-hub>=0.33.4 (from -r /Users/fanzhen/Documents/all-in-rag/code/requirements.txt (line 4))
  Downloading huggingface_hub-1.3.5-py3-none-any.whl.metadata (13 kB)
Collecting transformers>=4.40.0 (from -r /Users/fanzhen/Documents/all-in-rag/code/requirements.txt (line 5))
  Downloading transformers-5.0.0-py3-none-any.whl.metadata (37 kB)

注意这里swig qpdf安装失败了,通过下面走了一次代理才成功的!

(all-in-rag) ➜  Documents env http_proxy=http://127.0.0.1:7890 \
    https_proxy=http://127.0.0.1:7890 \
    HOMEBREW_NO_AUTO_UPDATE=1 \
    brew install swig qpdf

还有faiss-cpu 使用pip会失败 我通过conda安装的

 6959  conda install -c conda-forge faiss-cpu
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐