【大模型基礎_毛玉仁】6.3 知識檢索


目錄

    • 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-IDFBM25 等。它們通過分析詞項的分布和頻率來評估文檔與查詢的相關性。

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: 常見的向量數據庫

向量數據庫URLGitHub Star
milvushttps://github.com/milvus-io/milvus28.4K
typesensehttps://github.com/typesense/typesense19.0K
qdranthttps://github.com/qdrant/qdrant18.9K
chromahttps://github.com/chroma-core/chroma13.7K
weaviatehttps://github.com/weaviate/weaviate10.4K
pineconehttps://www.pinecone.io/×

.

6.3.5 檢索結果重排

檢索器可能檢索到與查詢相關性不高的文檔,直接輸入給大語言模型可能降低生成質量。

因此,需在輸入前對文檔進行精選,主要通過對檢索到的文檔進行重新排序實現。重排分為兩類方法:基于交叉編碼的方法和基于上下文學習的方法。

1)基于交叉編碼的重排方法

基于交叉編碼的重排方法利用交叉編碼器Cross-Encoders)來評估文檔與查詢之間的語義相關性。

2)基于上下文學習的重排方法

基于上下文學習的方法是指通過設計精巧的 Prompt,使用大語言模型來執行重排任務。

.


其他參考:【大模型基礎_毛玉仁】系列文章


聲明:資源可能存在第三方來源,若有侵權請聯系刪除!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900083.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900083.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900083.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

靜態方法和實例方法

在 Java 中,?靜態方法(static method)?和?實例方法(instance method)?是兩種不同類型的方法,它們在調用方式、內存分配和訪問權限上有顯著區別。以下是詳細對比: ?1. 靜態方法(…

Lua環境搭建+Lua基本語法

前期準備: 搜索并下載安裝LuaForWindows,例: 安裝完成后開啟cmd窗口,輸入lua 出現版本號證明成功下載安裝 使用Sublime Text編輯器編寫Lua 使用瀏覽器或CSDN搜索Sublime Text下載并安裝,安裝成功后打開編輯器,編輯…

FFmpeg錄制屏幕和音頻

一、FFmpeg命令行實現錄制屏幕和音頻 1、Windows 示例 #include <cstdlib> #include <string> #include <iostream>int main() {// FFmpeg 命令行&#xff08;錄制屏幕 麥克風音頻&#xff09;std::string command "ffmpeg -f gdigrab -framerate 3…

【數據集】多視圖文本數據集

多視圖文本數據集指的是包含多個不同類型或來源的信息的文本數據集。不同視圖可以來源于不同的數據模式&#xff08;如原始文本、元數據、網絡結構等&#xff09;&#xff0c;或者不同的文本表示方法&#xff08;如 TF-IDF、詞嵌入、主題分布等&#xff09;。這些數據集常用于多…

C++ 繼承方式使用場景(極簡版)

1. 公有繼承&#xff08;public&#xff09; 什么時候用&#xff1f; “是一個”&#xff08;is-a&#xff09;關系&#xff1a;派生類 是 基類的一種。 例&#xff1a;class Dog : public Animal&#xff08;狗是動物&#xff09; 最常見&#xff0c;90%的繼承都用它。 2. 保…

Ubuntu 系統 Docker 中搭建 CUDA cuDNN 開發環境

CUDA 是 NVIDIA 推出的并行計算平臺和編程模型&#xff0c;利用 GPU 多核心架構加速計算任務&#xff0c;廣泛應用于深度學習、科學計算等領域。cuDNN 是基于 CUDA 的深度神經網絡加速庫&#xff0c;為深度學習框架提供高效卷積、池化等操作的優化實現&#xff0c;提升模型訓練…

高密度任務下的挑戰與破局:數字樣機助力火箭發射提效提質

2025年4月1日12時&#xff0c;在酒泉衛星發射中心&#xff0c;長征二號丁運載火箭順利升空&#xff0c;成功將一顆衛星互聯網技術試驗衛星送入預定軌道&#xff0c;發射任務圓滿完成。這是長征二號丁火箭的第97次發射&#xff0c;也是長征系列火箭的第567次發射。 執行本次任務…

關于SQL子查詢的使用策略

在 SQL 優化中&#xff0c;一般遵循**“非必要不使用子查詢”**的原則&#xff0c;因為子查詢可能會帶來額外的計算開銷&#xff0c;影響查詢效率。但是&#xff0c;并不是所有子查詢都需要避免&#xff0c;有時子查詢是最優解&#xff0c;具體要根據實際場景選擇合適的優化方式…

JavaEE初階復習(JVM篇)

JVM Java虛擬機 jdk java開發工具包 jre java運行時環境 jvm java虛擬機(解釋執行 java 字節碼) java作為一個半解釋,半編譯的語言,可以做到跨平臺. java 通過javac把.java文件>.class文件(字節碼文件) 字節碼文件, 包含的就是java字節碼, jvm把字節碼進行翻譯轉化為…

2.pycharm保姆級安裝教程

一、pycharm安裝 1.官網上下載好好軟&#xff0c;雙擊打開 2.下一步 3.修改路徑地址 (默認也可以) 4.打勾 5.安裝 不用重啟電腦 二、添加解釋器 1.雙擊軟件&#xff0c;打開 2.projects – new project 3.指定項目名字&#xff0c;項目保存地址&#xff0c;解釋器 4.右擊 – …

zk基礎—4.zk實現分布式功能二

大綱 1.zk實現數據發布訂閱 2.zk實現負載均衡 3.zk實現分布式命名服務 4.zk實現分布式協調(Master-Worker協同) 5.zk實現分布式通信 6.zk實現Master選舉 7.zk實現分布式鎖 8.zk實現分布式隊列和分布式屏障 4.zk實現分布式協調(Master-Worker協同) (1)Master-Worker架構…

Java 實現 字母異位詞分組

在這篇博客中&#xff0c;我們將詳細解析如何使用 Java 代碼來解決 字母異位詞分組這個經典的算法問題。我們會逐步分析代碼邏輯&#xff0c;并探討其時間復雜度及優化思路。 題目描述 給定一個字符串數組 strs&#xff0c;請將字母異位詞組合在一起。字母異位詞是指由相同字…

【Ragflow】10. 助理配置參數詳細解析/模型響應加速方法

概述 Ragflow的助理配置中&#xff0c;有很多參數&#xff0c;盡管官方文檔給出了一定程度的解釋&#xff0c;但不夠詳細。 本文將對各項參數進行更詳細的解釋說明&#xff0c;并進一步挖掘某些參數中隱含的潛在陷阱。 助理設置 空回復 含義&#xff1a;輸入的問題若未能在…

Mac Apple silicon如何指定運行amd64架構的ubuntu Docker?

如何指定運行amd64架構的ubuntu Docker 下面這個docker命令如何指定運行amd64架構的ubuntu Docker&#xff1f; docker run -it -v $(pwd):/workspace ubuntu:20.04 bash這個命令已經非常接近正確運行一個基于 amd64 架構的 Ubuntu 容器了&#xff0c;但如果你想明確指定運行…

ColPali:基于視覺語言模型的高效文檔檢索

摘要 文檔是視覺豐富的結構&#xff0c;不僅通過文本傳遞信息&#xff0c;還包括圖表、頁面布局、表格&#xff0c;甚至字體。然而&#xff0c;由于現代檢索系統主要依賴從文檔頁面中提取的文本信息來索引文檔&#xff08;通常是冗長且脆弱的流程&#xff09;&#xff0c;它們…

使用C++實現HTTP服務

天天開心&#xff01;&#xff01;&#xff01; 閱讀本篇文章之前&#xff0c;請先閱讀HTTP基礎知識 傳送門----> HTTP基礎知識 文章目錄 一、CWeb服務器&#xff08;核心代碼WebServer.cpp&#xff09;二、靜態文件結構三、編譯和運行四、訪問測試 一、CWeb服務器&#xff…

Reactive編程入門:Project Reactor 深度指南

文章目錄 4.2.1 創建 Flux 和 MonoFlux 基礎創建方式高級創建模式Mono 創建方式 4.2.2 訂閱與數據處理基礎訂閱模式數據處理操作符 4.2.3 核心操作符深度解析flatMap 操作符zip 操作符buffer 操作符 高級組合模式復雜流處理示例背壓處理策略 測試響應式流性能優化技巧 React 編…

【萬字總結】前端全方位性能優化指南(完結篇)——自適應優化系統、遺傳算法調參、Service Worker智能降級方案

前言 自適應進化宣言 當監控網絡精準定位病灶&#xff0c;真正的挑戰浮出水面&#xff1a;系統能否像生物般自主進化&#xff1f; 五維感知——通過設備傳感器實時捕獲環境指紋&#xff08;如地鐵隧道弱光環境自動切換省電渲染&#xff09; 基因調參——150個性能參數在遺傳算…

PQ以及有關索引的筆記Faiss: The Missing Manual

參考Faiss 索引結構總結&#xff1a; 為了加深記憶&#xff0c;介紹一下Inverted File Index&#xff08;IVF&#xff09;的名字由來&#xff1a; IVF索引的名字源自“倒排文件”&#xff08;Inverted File&#xff09;的概念。在傳統的信息檢索中&#xff0c;倒排文件是一種索…

win10徹底讓圖標不顯示在工具欄

關閉需要不顯示的軟件 打開 例此時我關閉了IDEA的顯示 如果說只是隱藏&#xff0c;鼠標拖動一個道理 例QQ 如果說全部顯示不隱藏