一、什么是 RAG?

类比理解:RAG 就像一个图书管理员系统

  • 图书馆 = 外部知识库(大量文档资料)
  • 图书管理员 = 检索系统 + 大模型
  • 读者提问 = 用户查询

我们不直接翻阅整栋图书馆,而是询问"图书管理员",由他快速定位相关资料,再结合知识回答问题。

核心优势

优势

说明

减少幻觉

输出绑定外部可验证数据,有据可查

动态知识更新

无需重新训练模型,即可处理领域特定或最新知识

数据隐私保护

私有数据无需嵌入模型参数,仅在检索时使用

高效计算

仅提供相关信息,节省模型处理整个知识库的成本


二、RAG 标准工作流

详细流程

  1. 预处理阶段:将资料划分为 Chunk(文本块),建立索引
  2. 检索阶段:根据用户输入,检索相关 Chunk
  3. 增强阶段:将检索结果与查询合并,格式化为 Prompt
  4. 生成阶段:LLM 基于增强后的 Prompt 生成最终回答


三、检索方法对比

3.1 稀疏检索:BM25

核心机制:基于词频的离散表示(稀疏向量)

  • BM25 将查询和文档段落转化为一系列离散的词元(稀疏检索),然后进行相似度计算
    • 例如:"信息检索系统可以从文档集合中找到相关资料" → [信息, 检索, 系统, 可以, 从, 文件, 集合, 找到, 相关, 资料]
  • 相似度基于关键词匹配
    • [信息, 检索] 与 [信息, 检索, 系统, 可以, 从, 文件, 集合, 找到, 相关, 资料] → 相似度较高 👍
    • [信息, 检索] 与 [这, 篇, 论文, 探讨, 机器, 学习, 在, 影像, 检索, 领域] → 相似度较低 👎
  • 优点
    • 无需大量领域特定调优即可良好工作
    • 公式相对简单,计算效率高
  • 缺点
    • 默认无法处理同义词或词形变化(例如:地震 vs. 地牛翻身)
    • 无法捕捉语义相关性(例如:只看字面不懂语义,用词不同时找不到相关内容)

3.2 稠密检索:Embedding 模型

核心机制:神经网络将文本编码为语义向量(稠密向量)

  • 嵌入模型将查询和文档段落转化为一系列浮点数(稠密检索),然后进行相似度计算
    • 例如:"信息检索系统可以从文档集合中找到相关资料" → [5.6, 0.8, -7.2, …](嵌入向量)
  • 优点
    • 嵌入能够捕捉短语或句子的语义,而非仅仅是词频
    • 部分嵌入模型支持跨语言或跨模态(如文本–图像)
  • 缺点
    • 训练与推理需要 GPU
    • 若未经领域微调,跨领域的性能可能下降

3.3 典型失败案例对比

查询

文档内容

BM25

Embedding

"如何提升睡眠品质"

"改善失眠的方法"

❌ 失败(无关键词重叠)

✅ 成功(语义相关)

"GPT-4"

出现精确术语 "GPT-4"

✅ 精准命中

⚠️ 可能分散注意力

四、混合检索(Hybrid Retrieval)

4.1 为什么需要混合?

单一检索方式各有盲区,现代 RAG 系统通常同时使用两种方法,取长补短。

检索类型

代表算法

核心机制

擅长场景

稀疏检索

BM25、TF-IDF

词频 × 逆文档频率

精确关键词匹配、罕见术语、ID、专业术语

稠密检索

BERT、Contriever、GTE、M3E

神经网络语义向量

语义理解、同义词、跨语言、上下文含义

4.2 融合策略:倒数排名融合(RRF)

问题场景

  • BM25 排名:[c₁, c₄, c₃, c₅, c₂]
  • Embedding 排名:[c₅, c₁, c₃, c₄, c₂]

RRF 公式

RRF(c)=∑rRk+rankr(c)1

符号

含义

c

某个文本片段(chunk)

R

所有检索模型的集合

k

平滑常数(通常取 60)

rankr(c)

片段 c 在模型 r 中的排名

计算示例

片段

RRF 计算过程

最终得分

最终排名

c1

60+11+60+21=611+621

0.03252

1

c5

60+41+60+11=641+611

0.03202

2

c4

60+21+60+41=621+641

0.03175

3

c3

60+31+60+31=631+631

0.03175

4

c2

60+51+60+51=651+651

0.03077

5

最终融合排名[c₁, c₅, c₄, c₃, c₂]

RRF 核心思想

  • 🥇 排名越靠前 → 倒数越大 → 贡献分数越高
  • 🛡️ 常数 k=60:平滑处理,避免第 1 名和第 2 名差距过大,给靠后排名竞争机会
  • 🎯 无参数融合:不需要训练,不依赖具体相似度分数,仅使用排名位置

五、分块策略优化

5.1 分块大小(Chunk Size)

大小

效果

适用场景

较大分块(512-1024 tokens)

提供更广泛的上下文背景

需要综合理解、跨段落推理的复杂问题

较小分块(128-256 tokens)

更紧凑、聚焦,精确度和相关性更高

事实性查询、精确匹配、降低噪声

5.2 步幅/重叠(Stride / Overlap)

步幅设置

特点

权衡

较大步幅(重叠少)

索引快、存储成本低、查询速度快

可能切断跨边界的关键信息

较小步幅(重叠多,如 50%)

保留上下文连贯性,捕捉跨边界事实

存储成本增加,索引时间延长

5.3 分块策略最佳实践

┌─────────────────────────────────────────────────┐
│  原始文档: "RAG 技术能提升大模型的知识准确性..."   │
└─────────────────────────────────────────────────┘
           │
           ▼
┌─────────────────────────────────────────────────┐
│  Chunk 1: "RAG 技术能提升大模型的知识准确性,通过 │
│           检索外部知识库来..."                    │
│           ▲                              ▲      │
│           └───────── 重叠区域 ───────────┘      │
┌─────────────────────────────────────────────────┐
│  Chunk 2: "检索外部知识库来减少幻觉现象,同时     │
│           保护数据隐私..."                        │
└─────────────────────────────────────────────────┘

建议

  • 语义分块:按段落、章节自然边界分割,而非固定长度
  • 元数据增强:为每个 chunk 添加标题、来源、时间等标签
  • 递归检索:先检索粗粒度文档,再在其内部精确定位段落

Logo

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

更多推荐