目錄
- 6.3 知識檢索
- 6.3.1 知識庫構建
- 1)數據采集及預處理
- 2)知識庫增強
- 6.3.2 查詢增強
- 1)查詢語義增強
- 2)查詢內容增強
- 6.3.3 檢索器
- 1)判別式檢索器
- 2)生成式檢索器
- 6.3.4 檢索效率增強
- 1)相似度索引算法
- 2)常見軟件庫介紹
- 6.3.5 檢索結果重排
- 1)基于交叉編碼的重排方法
- 2)基于上下文學習的重排方法
6.3 知識檢索
優化檢索過程,提升檢索的效果和效率,對改善 RAG 的性能具有重要意義。
針對優化檢索過程,下面將系統的對知識庫構建、查詢增強、檢索器、檢索結果重排序等關鍵技術進行梳理和介紹。
圖 6.14: 知識檢索流程圖
.
6.3.1 知識庫構建
1)數據采集及預處理
數據采集與預處理為構建知識庫提供“原材料”。
構建文本型知識庫的數據采集過程中,不同渠道的數據被整合、轉換為統一的文檔對象。這些文檔:
-
不僅包含原始的文本信息,
-
還攜帶有關文檔的元信息(Metadata):例如文章標題,分類信息,時間信息,關鍵詞等。
采集到相應的數據后,需通過數據預處理來提升數據質量和可用性。數據預處理主要包括:
-
數據清洗:旨在清除文本中的干擾元素,如特殊字符、異常編碼和無用的 HTML 標簽,以及刪除冗余文檔。
-
文本分塊:是將長文本分割成較小文本塊的過程。兩個好處:適應檢索模型的上下文窗口長度限制、減少長文本中不相關內容。
2)知識庫增強
知識庫增強是通過改進和豐富知識庫的內容和結構,以提升其質量和實用性。
知識庫增強涉及查詢生成、標題生成等多個步驟:
-
查詢生成:指利用大語言模型生成與文檔內容緊密相關的偽查詢。這些偽查詢從查詢的角度來表達文檔的語義,可作為相關文檔的“鍵”,供檢索時與用戶查詢進行匹配。
-
標題生成:指利用大語言模型為沒有標題的文檔生成合適的標題。
.
6.3.2 查詢增強
知識庫涵蓋的知識表達形式是有限的,但用戶的提問方式卻是千人千面的。為解決此問題,對用戶查詢的語義和內容進行擴展,即查詢增強。
將從查詢語義增強和查詢內容增強兩個角度出發,對查詢增強技術進行簡要介紹。
1)查詢語義增強
查詢語義增強旨在通過同義改寫和多視角分解等方法來擴展、豐富用戶查詢的語義。
-
同義改寫:將原始查詢改寫成相同語義下不同的表達方式。
-
多視角分解:將復雜查詢分解為來自不同視角的子查詢。
2)查詢內容增強
通過生成與原始查詢相關的背景信息和上下文,從而豐富查詢內容。
查詢內容增強方法通過引入大語言模型生成的輔助文檔,為原始查詢提供更多維 度的信息支持。
.
6.3.3 檢索器
檢索器旨在找到知識庫中與用戶查詢相關的知識文本。檢索器可分為判別式檢索器和生成式檢索器兩類。
1)判別式檢索器
判別式檢索器通過判別模型對查詢和文檔是否相關進行打分。
判別式檢索器常分為兩類:
-
稀疏檢索器:利用離散的、基于詞頻的 文檔編碼向量進行檢索;
-
稠密檢索器:利用神經網絡生成的連續的、稠密向量對文檔進行檢索。
(1) 稀疏檢索器
稀疏檢索器(Sparse Retriever)指使用稀疏表示方法來匹配文本的模型。這類檢索器通過統計文檔中特定詞項出現的統計特征來對文檔進行編碼,然后基于此編碼計算查詢與知識庫中的文檔的相似度來進行檢索。
典型的稀疏檢索技術包括 TF-IDF 和 BM25 等。它們通過分析詞項的分布和頻率來評估文檔與查詢的相關性。
TF-IDF:
-
基于詞頻(TF)和逆文檔頻率(IDF)來衡量詞語在文檔或語料庫中的重要性,
-
然后用此重要性對文本進行編碼。
詞頻(TF)表示詞語在文檔中的出現頻率,計算公式為:
tf i , j = n i , j ∑ k n k , j \text{tf}_{i,j} = \frac{n_{i,j}}{\sum_{k} n_{k,j}} tfi,j?=∑k?nk,j?ni,j??
其中,
-
n i , j n_{i,j} ni,j? 是詞語 t i t_i ti? 在文檔 d j d_j dj? 中的出現次數,
-
∑ k n k , j \sum_{k} n_{k,j} ∑k?nk,j? 是文檔 d j d_j dj? 中所有詞語的出現次數之和,用于標準化以避免偏向長文檔。
逆文檔頻率(IDF)的計算公式為:
idf i = log ? ∣ D ∣ ∣ { j : t i ∈ d j } ∣ \text{idf}_i = \log \frac{|D|}{|\{j : t_i \in d_j\}|} idfi?=log∣{j:ti?∈dj?}∣∣D∣?
其中,
-
|D| 是總文檔數,
-
∣ { j : t i ∈ d j } ∣ |\{j : t_i \in d_j\}| ∣{j:ti?∈dj?}∣ 是包含詞語 t i t_i ti? 的文檔數。
最終,TF-IDF 值為:
tfidf i , j = tf i , j × idf i \text{tfidf}_{i,j} = \text{tf}_{i,j} \times \text{idf}_i tfidfi,j?=tfi,j?×idfi?
TF-IDF 通過高詞頻和低文檔頻率產生高權重,傾向于過濾常見詞語,保留重要詞 語。
BM25:
- 是一種改進的文本檢索算法,它在 TF-IDF 基礎上通過文檔長度歸一化和詞項飽和度調整,更精確地評估詞項重要性,優化了詞頻和逆文檔頻率的計算,并考慮了文檔長度對評分的影響。
(2) 稠密檢索器
稠密檢索器一般利用預訓練語言模型對文本生成低維、密集的向量表示,通過計算向量間的相似度進行檢索。
按照所使用的模型結構的不同,稠密檢索器分為兩類:交叉編碼類(Cross-Encoder)、雙編碼器類(Bi-Encoder)。
圖 6.15: 不同稠密檢索器對比圖
交叉編碼類:
-
將查詢和文檔拼接在一起,利用預訓練語言模型作為編碼器(例如 BERT)生成一個向量表示。
-
接著,通過一個分類器處理這個向量,最終輸出查詢和文檔之間的相似程度(0 和 1 之間的數值表示)。
其優點在于模型結構簡單,能夠實現查詢和文檔之間的深度交互。然而,由于交叉編碼類模型需要進行高復雜度的交叉注意力操作,計算量大。
雙編碼器類:
-
第一 步,將查詢和文檔各自通過獨立的編碼器生成各自的向量表示;
-
第二步,對這兩個向量之間的相似度進行計算,以評估它們的相關性。
優勢在于允許預先離線計算并存儲所有文檔的向量表示。然而,在這種 分離的處理方式中,查詢與文檔在提取特征向量時缺乏交互。可能會對匹配的精確度產生影響。
DPR(Dense Passage Retriever)[23] 是稠密檢索器的一個代表工作。
-
其使用兩個獨立的 BERT 編碼器,分別將查詢和文檔映射到低維特征向量,然后通過向量點積衡量相似度。
-
為了緩解查詢與文檔缺乏交互的問題,DPR 通過對比學習優化編碼器,最大化查詢與相關段落相似度的同時最小化與負面段落相似度。
為了緩解查詢與文檔在提取特征向量時缺乏交互的問題,可以在雙編碼器的基礎上引入查詢與文檔的交互,以進一步提升雙編碼器的效果。
ColBERT是其中的代表性方法。
- 其以查詢和文檔間的 Token 級的相似度為度量,然后通過對比學習對雙編碼器進行微調,以使雙編碼器編碼的特征向量可以兼顧查詢和文檔。
此外,在 RAG 中,我們有時會對查詢加入大段上下文進行增強。此時,查詢的長度急劇增長,傳統的檢索方法可能難以有效的處理這些長查詢。
為解決此問題,可以采用 Poly-encoder。其模型架構沿用雙編碼器的形 式,但是它使用 m 個向量來捕獲長查詢的多個特征,這 m 個向量隨后與文檔的向量通過注意力 機制進行交互,其中的注意力模塊采用查詢和文檔間的對比學習進行訓練。
2)生成式檢索器
生成式檢索器:通過生成模型對輸入查詢直接生成相關文檔的標識符(即 DocID)。
生成式檢索器通常采用基于 Encoder-Decoder 架構的生成模型,如 T5、BART 等。
生成式檢索器的訓練過程通常分為兩個階段:
-
第一階段,模型通過序列到序列的方法,學習將查詢映射到相關的文檔標識符。主要通過最大似然估計(MLE)優化模型,確保生成的文檔標識符盡可能準確。
-
第二階段,通過數據增強和排名優化進一步提高檢索效率和準確性。數據增強主要通過生成偽查詢或使用文檔片段 作為查詢輸入,以增加訓練數據的多樣性和覆蓋面。排名優化使用特定的損失函數,如對比損失或排名損失,來調整模型生成文檔標識符的順序和相關性,從而更好地匹配查詢的需求。
在生成式檢索器中,DocID 的設計至關重要。其需要在語義信息的豐富性與標識符的簡潔性之間取得平衡。
常用的 DocID 形式分為兩類:
-
基于數字的 DocID:使用數字值或整數字符串來表示文檔。雖然構建簡單,但在處理大量文檔時可能導致標識符數量激增,增加計算和存儲負擔。
-
基于詞的 DocID:直接從文檔的標題、URL 或 N-gram 中提取表示,能更自然地傳達文檔的語義信息。
盡管生成式檢索器在性能上取得了一定的進步,但與稠密檢索器相比,其效果仍稍遜一籌。
此外,生成式檢索器還面臨著一系列挑戰,包括如何突破模型輸入長度的限制、如何有效處理大規模文檔以及動態新增文檔的表示學習等,這些都 是亟待解決的問題。
.
6.3.4 檢索效率增強
為提升檢索效率,可以引入向量數據庫來實現檢索中的高效向量存儲和查詢。
向量數據庫的核心是設計高效的相似度索引算法。
1)相似度索引算法
在向量檢索中,常用的索引技術主要分成三大類:基于空間劃分的方法、基于量化方法和基于圖的方法。
基于空間劃分的方法:將搜索空間劃分為多個區域來實現索引,主要包括:
-
基于樹的索引方法:通過一系列規則遞歸地劃分空間,形成一種樹狀結構,每個葉節點代表一個較小區域,區域內的數據點彼此接近。查詢時,從樹的根節點出發,逐步深入葉節點,最后在葉節點內部進行數據點的相似度比較,以找到最近的向量。常見方法包括KD樹和Ball樹。
-
基于哈希的方法(如局部敏感哈希,LSH):通過哈希函數將向量映射到哈希表的不同桶中,使得相似向量通常位于同一桶內。
基于圖的方法:通過構建一個鄰近圖,將向量檢索轉化為圖的遍歷問題。
-
將數據集中的每個向量表示為圖中的一個節點,并根據向量間的距離或相似性建立邊的連接。
-
其核心思想旨在通過較少步數找到查詢點的最近鄰。
-
代表性方法包括 NSW、IPNSW 和 HNSW。
基于乘積量化的方法:通過將高維向量空間劃分為多個子空間,并在每個子空間中進行聚類得到碼本和碼字,以此作為構建索引的基礎。主要包括:
-
訓練階段:將高維空間劃分為子空間,在每個子空間內進行聚類,生成碼字和碼本。每個子空間內的聚類中心點即為碼字,所有碼字的集合構成碼本。每個訓練樣本的子向量用對應子空間的碼字近似,形成碼字 ID 序列,實現數據量化。
-
查詢階段:將查詢向量劃分為子向量,在每個子空間中找到最近的碼字,得到碼字 ID 序列。計算查詢向量的每個子向量到所有對應子空間的碼字的距離,形成距離表。通過距離表快速計算查詢向量與數據庫向量的近似距離,排序后得到最近鄰結果。
該方法在減少內存占用和加快計算速度方面表現出色,但量化過程會引入誤差。為提高精度,可在 PQ 基礎上進行精確排序或結合優化算法(如 OPQ、IVFPQ)。
2)常見軟件庫介紹
接下來介紹幾種常用于構建和管理向量數據庫的軟件庫,它們支持上述的相似性索引算法。
Faiss是由Meta AI Research開發的一個優化密集向量相似性搜索和聚類的庫,提供多種索引算法,包括基于空間劃分、量化和圖的方法,部分算法支持GPU加速。Faiss專注于高效索引和搜索功能。但不包含數據存儲、管理、分布式支持和安全性措施等功能。
相比之下,向量數據庫是一種更全面的解決方案,整合了相似度索引算法、數據存儲、管理、分布式支持和安全性措施,適用于更復雜的RAG應用場景
表 6.1: 常見的向量數據庫
向量數據庫 | URL | GitHub Star |
---|---|---|
milvus | https://github.com/milvus-io/milvus | 28.4K |
typesense | https://github.com/typesense/typesense | 19.0K |
qdrant | https://github.com/qdrant/qdrant | 18.9K |
chroma | https://github.com/chroma-core/chroma | 13.7K |
weaviate | https://github.com/weaviate/weaviate | 10.4K |
pinecone | https://www.pinecone.io/ | × |
.
6.3.5 檢索結果重排
檢索器可能檢索到與查詢相關性不高的文檔,直接輸入給大語言模型可能降低生成質量。
因此,需在輸入前對文檔進行精選,主要通過對檢索到的文檔進行重新排序實現。重排分為兩類方法:基于交叉編碼的方法和基于上下文學習的方法。
1)基于交叉編碼的重排方法
基于交叉編碼的重排方法利用交叉編碼器(Cross-Encoders)來評估文檔與查詢之間的語義相關性。
2)基于上下文學習的重排方法
基于上下文學習的方法是指通過設計精巧的 Prompt,使用大語言模型來執行重排任務。
.
其他參考:【大模型基礎_毛玉仁】系列文章
聲明:資源可能存在第三方來源,若有侵權請聯系刪除!