随着大语言模型(LLM)技术的发展,RAG(Retrieval Augmented Generation)技术得到了广泛探讨和研究,越来越多的高级 RAG 检索方法也随之被人发现,相对于普通的 RAG 检索,高级 RAG 通过更深化的技术细节、更复杂的搜索策略,提供出了更准确、更相关、更丰富的信息检索结果。本文首先讨论这些技术,国产 向量数据库并基于 Milvus 给出一个实现案例。
, @' T/ ?# D, G: H0 ?) z0 {7 x
& a* M7 ~8 K9 i; I( t3 u
# X& M, @) l. W- t! { 01.初级 RAG' k% p. }( w! c: T4 F+ E2 ^0 v3 ]; r
# |- o) `, M- I' V3 U2 t
8 S, J7 \/ P6 E9 { 初级 RAG 的定义
2 S; a8 |, Z2 z9 F- N' c4 R) b! P% Q5 \
$ r7 Z' o! \" e" u4 ^+ R) s 初级 RAG 研究范式代表了最早的方法论,在 ChatGPT 广泛采用后不久就取得了重要地位。初级 RAG 遵循传统的流程,包括索引创建(Indexing)、检索(Retrieval)和生成(Generation),常常被描绘成一个“检索—读取”框架,其工作流包括三个关键步骤:
; S2 O0 s2 y6 x5 ~ d- r' L' b" e
* b4 i9 T; K. r
' @7 ~ e3 f0 O0 ^" M 语料库被划分为离散的块,然后使用编码器模型构建向量索引。
( r- p: u; Y' f* j' T% A4 G: U; r5 H7 s2 G& Y; L d1 e8 v8 r' }
$ @* y3 b0 q, h& `6 R2 ]; b6 G" e
RAG 根据查询与索引块(Indexed Chunk)的向量相似度识别并对块进行检索。; C! F: q: C; r6 `3 f k: [+ J
( ^$ l5 ^( I1 s: T B; A& d& C& _1 @
* M0 u$ y" @8 y5 d% I7 R. x
模型根据检索块(Retrieved Chunk)中获取的上下文信息生成答案。- `: [6 g7 W4 T
1 l5 h, K$ k e9 h% f$ P
; Q! V c1 j* C6 q3 U, \" W/ N8 R 初级 RAG 的局限性$ _' P& q% @! e6 E
* [5 ]$ w, i! ]3 X5 Y& g7 v6 n
% c9 h3 _8 y) w& k3 [3 t
初级 RAG 在三个关键领域面临着显著挑战:"检索"、"生成"和"增强"。
# |/ h$ n- E1 W4 |8 K* p5 k. Q6 a5 t# A+ S: \# J
9 z" i3 G; j: _1 J( H 初级 RAG 的检索质量存在许多问题,例如低精度和低召回率等。低精度会导致检索到的块无法对齐,以及幻觉等潜在问题。低召回率会导致无法检索到所有的相关块,从而导致LLM的回复不够全面。此外,使用老旧的信息进一步加剧了问题,可能导致不准确的检索结果。; {9 [! t* |' V! W. ]4 ~
/ A! S* Z6 |0 `& q% {
' t) e1 `2 o+ K+ l" X4 u* Q4 M
生成回复质量面临着幻觉挑战,即 LLM 生成的答案并没有基于所提供的上下文,和上下文不相关,或者生成的回复存在着包含有害或歧视内容的潜在风险。- f% G# X( ~% P4 O5 k3 ]/ q7 K/ U
. z+ n* w5 t r! v9 H5 u8 a
7 Z8 b6 _3 q2 d" ?
在增强过程中,初级 RAG 在如何有效地将检索到的段落的上下文与当前生成任务进行整合方面也面临着不小的挑战。低效的整合可能导致输出不连贯或破碎化。冗余和重复也是一个棘手的问题,特别是当多个检索到的段落包含相似信息时,生成的回复中可能会出现重复的内容。; f' p2 h6 H, y5 f4 w6 B
" z$ Q; x$ o/ f% I: E$ @3 @' z4 \' Y# u7 B) R3 v, O& o
02.高级 RAG
0 l- y7 k6 ]) p- {3 Y6 Q' v& l: Z) }
& U0 Z3 y+ v: L
为了解决初级 RAG 的不足,高级 RAG 诞生了,并有针对性地进行了功能增强。首先讨论这些技术,这些技术可被归类为检索前优化、检索中优化和检索后优化。
" r; w5 k. z& Y; o( d8 i; h% V' k; w$ m6 r% K
* {& }. [9 _" U3 h6 L 检索前优化; o+ c m2 J1 U# w
1 L3 K, L- I; E5 s# l- [; g4 T* r* V" r3 y0 \5 m; B
检索前的优化关注数据索引优化以及查询优化,数据索引优化技术旨在以提高检索效率的方式存储数据:
! o; n+ v; ^, a' v; ]- W9 w
3 }6 _! { |. \
& ~0 o. k' P, ~/ X/ P7 L- e% r6 j 滑动窗口:在数据块之间使用重叠,这是最简单的技术之一。/ Q5 M2 ]4 ~% _( I& H! c
3 I/ w/ g3 F' }: B$ g; J5 m/ X5 v0 A7 I/ K C
增强数据粒度:应用数据清理技术,例如移除不相关信息、确认事实准确性、更新过时信息等。
5 @7 [+ i6 [2 n! B' b( A% K+ A+ [, m3 _
$ }( D4 m5 ^ f! u& O2 Q6 N. V' s. L
( q- U1 a7 _+ O) q6 t. D 添加元数据:如用于过滤的日期、目的或章节信息等。6 w& s3 b4 m: N4 Y4 X
" u7 H) G) I7 R# x# H
, y- H$ [0 U& k B5 G( M: `0 ^
优化索引结构涉及不同的数据索引策略:如调整块大小或使用多索引策略。本文我们将实现的一种技术是句子窗口检索,它在检索时嵌入单个句子,并在推断时用更大的文本窗口替换它们。
% S. i1 ]% E* e J
! }3 E) b' s7 z* x, }+ ~
8 v Z9 {9 |- r& C+ y- G, }# ? 检索中优化8 z0 B" B: N: c: B3 p( ?
/ K7 `3 P. n! s9 K+ [" a% P B; O; t/ q( o7 [: u ^) P0 ?0 C
检索阶段主要是识别最相关的上下文。通常,检索是基于向量搜索,它计算查询和索引数据之间的语义相似性。因此,大多数检索优化技术都围绕着 embedding 模型:4 R) V& F) a0 w% M3 l4 z
' h. c5 n: e3 D3 E9 d5 o' h
1 o: o; D* ^5 z2 _: ~7 l 微调 embedding 模型:定制化 embedding 模型到特定领域上下文,特别是针对具有发展性或罕见术语的领域。例如,BAAI/bge-small-en 是一个高性能 embedding 模型,可以进行微调。
& S% |+ ~5 ]8 J1 P/ T: f' L: f3 g
' a+ q+ a- C/ }5 P7 b% _$ S: L1 P4 Q# T# g. v4 H8 X/ V
动态 embedding:适应词语使用中的上下文,不同于使用每个词一个向量的静态embedding。例如,OpenAI 的 embeddings-ada-02 是一个复杂的动态embedding模型,捕捉到上下文理解。除了向量搜索之外,还有其他检索技术,如混合搜索(hybrid search),通常指的是将向量搜索与基于关键词的搜索相结合的概念。如果检索需要精确的关键词匹配,这种检索技术很有益处。
+ b* f1 V5 {6 _$ _% J$ Y1 w
S9 U; a- y" t1 X& B |