深入淺出RAG詳解:語言模型的“開卷考試”——讓模型答案錨定現實的外部“記憶” 精華
引言
大型語言模型(LLMs)徹底革新了自然語言處理領域,但其對靜態內部知識的依賴,在事實準確性和時效性方面暴露出根本性局限。檢索增強生成(RAG)作為一種強大的范式應運而生,它構建了一種混合架構,將模型輸出動態錨定于外部可驗證信息。本文將深入探討RAG框架的核心機制——從檢索器與生成器組件到參數化記憶與非參數化記憶的關鍵區別,揭示其在知識密集型應用中實現前沿性能的奧秘。
一、深入解析檢索增強生成(RAG)
RAG范式:參數化記憶與非參數化記憶的融合
大型語言模型(LLMs)在自然語言理解與生成領域實現了重大突破,但其單純依賴內部知識的模式存在根本缺陷,尤其在對事實準確性和時效性要求極高的任務中更為明顯。檢索增強生成(RAG)范式通過創建一種融合內部與外部知識源的混合架構,直擊這些痛點。
標準語言模型的局限性
標準LLMs將其世界知識完全封裝在網絡參數中,這種知識存儲形式被稱為參數化記憶,形成于預訓練階段。可以將其視為模型訓練數據的高度壓縮隱式摘要。盡管強大,這種模式存在固有缺陷:
- 知識靜態化:模型知識在訓練結束時便已固化,無法獲取訓練后新增的信息或事件,導致回答過時。例如,向2022年訓練的模型詢問2024年超級碗冠軍,只能得到猜測或無法回答。
- 更新成本高:修改或更新模型的事實性知識堪稱艱巨任務,需要對新的綜合數據集進行成本高昂、資源密集的重新訓練或微調。對單一事實進行小范圍定向更新幾乎不可能,且會影響模型的整體知識基礎。
- 事實性偏差(幻覺):由于參數化記憶是訓練數據的有損壓縮,模型無法實現完美記憶。當面對缺乏精確信息的查詢時,LLM可能生成聽起來合理但事實錯誤的陳述,這種現象被稱為“幻覺”,嚴重影響模型在法律研究、醫療總結等知識密集型場景中的可靠性。
核心思路:通過外部知識增強生成能力
檢索增強生成(RAG)引入了一種更動態、更可靠的方法。RAG系統不再單純依賴內部的參數化記憶,而是在生成回答前,先從外部知識源檢索相關信息。這一核心思路徹底改變了生成過程。通過將輸出建立在及時、真實的文檔基礎上,RAG模型能夠產出更具體、準確且可驗證的回答。這種增強使系統能夠有效訪問和利用訓練參數之外的知識,緩解了傳統LLMs的靜態性缺陷。
對比示例:
- 查詢:“Django Web框架最新版本引入了哪些關鍵安全特性?”
標準LLM回答:可能列出通用的網絡安全特性(如CSRF保護、XSS預防),因其知識具有通用性,可能未包含最新發布說明。
RAG系統回答:
- 檢索:掃描Django官方文檔和近期發布博客的語料庫。
- 生成:將檢索到的信息綜合成精準回答,例如:“最新Django版本在密碼哈希器中加強了對潛在時序攻擊的防護,并增加了對……的支持。”該回答直接基于源文檔。
參數化記憶 vs. 非參數化記憶的定義
理解RAG需要區分其采用的兩種記憶類型,這一區別是其強大靈活性的核心。
- 參數化記憶:這是編碼在神經網絡權重(參數)中的隱式知識,通過預訓練從海量文本數據中學習而來。這種記憶為模型提供核心能力:通用語言理解、語法規則、推理技巧以及廣泛但靜態的世界知識基礎,是模型流暢性和智能的源泉。
- 非參數化記憶:這是一種顯式的外部知識源,如文檔集合、數據庫或知識圖譜。這種記憶不存儲在模型權重中,可輕松即時更新,其主要優勢包括:
時效性:無需重新訓練LLM,即可通過實時信息保持更新。
可驗證性:系統可引用來源,使用戶能夠驗證信息并建立信任。
可控性:開發人員可直接控制模型允許訪問的信息,降低使用不良或無關數據的風險。
RAG系統巧妙地將參數化記憶的生成流暢性與非參數化記憶的事實準確性和時效性結合在一起。
實用類比:開卷考試
理解RAG的一個有效方式是將其類比為開卷考試:
- 標準LLM類似參加閉卷考試的優秀學生,只能依賴已記憶的知識(參數化記憶),雖可能對學科有深刻理解,但可能遺忘細節或不知新發現。
- RAG系統則如同同一學生參加開卷考試,既利用自身智力與理解(參數化記憶)構建答案,又可查閱指定教材或筆記(非參數化記憶)獲取具體事實、數據和引語,最終產出更準確、詳細且可信的回答。
二、高層架構:檢索器與生成器的雙重奏
RAG架構從根本上由兩個核心組件按順序協同工作構成:檢索器(Retriever)和生成器(Generator)。
1. 檢索器:信息搜索引擎
給定輸入提示,檢索器的任務是搜索外部知識語料庫并獲取最相關的信息。這一過程并非簡單的關鍵詞搜索,而是旨在理解查詢背后語義的語義搜索。
工作原理:
- 索引構建:外部知識語料庫(如PDF、文本文件、數據庫記錄)經過預處理,被分割為可管理的塊,每個塊通過專門的嵌入模型轉換為數值向量(“嵌入”)。這些向量存儲在高效的可搜索索引中,即向量數據庫(如Pinecone、Chroma、FAISS)。
- 檢索過程:用戶提交查詢時,使用同一嵌入模型將其轉換為向量。檢索器通過相似度搜索(如余弦相似度)查找索引中與查詢向量最接近的文檔向量。
- 輸出傳遞:檢索器將原始提示和匹配度最高的文檔塊文本傳遞給生成器。
檢索器的質量至關重要:若獲取的文檔無關,生成器將產出低質量、不相關的回答。
2. 生成器:綜合語言大師
生成器是預訓練的LLM(如GPT-4、Llama 3或T5),擅長理解上下文并生成類人文本。它接收原始輸入提示和檢索器獲取的豐富事實性上下文。
工作原理:
檢索到的上下文經過格式化后,被添加到原始查詢之前,形成增強提示。
# 生成提示的概念結構
retrieved_context = """Document 1: RAG檢索器通過將文檔和查詢轉換為嵌入向量工作...
Document 2: 像Pinecone這樣的向量數據庫使用近似最近鄰算法..."""
user_query = "RAG系統中的檢索器如何工作?"
final_prompt = f"""使用以下上下文回答問題。若答案不在上下文中,請說明未知。
上下文: {retrieved_context}
問題: {user_query}"""
生成器利用此增強提示,綜合出最終連貫且基于知識的回答。其輸出不僅以用戶查詢為條件,還以檢索器提供的事實信息為基礎,顯著降低幻覺風險,確保回答基于可靠來源。
本部分核心要點
- LLM局限性:標準LLMs因依賴固定的內部參數化記憶,存在知識靜態化、更新困難和易產生幻覺等問題。
- RAG目標:通過在生成回答前為LLM提供外部最新知識源(非參數化記憶),解決上述局限性。
- 參數化與非參數化對比:參數化記憶是模型權重中的隱式知識,提供通用智能;非參數化記憶是顯式、外部且易更新的數據源,提供事實依據。
- 核心組件:RAG系統由檢索器(通過向量數據庫中的語義搜索查找相關信息)和生成器(基于原始查詢和檢索上下文綜合回答的LLM)組成。
三、底層技術:RAG模型架構與訓練
RAG的高層架構融合了檢索器和生成器,但構建穩健的系統需關注這些組件的具體模型及其訓練方法。RAG框架采用復雜方法確保組件協同優化,將標準語言模型轉化為動態知識注入系統。
檢索器:密集段落檢索(DPR)與FAISS快速搜索
檢索器的目標是從海量知識語料庫中篩選出最可能包含查詢答案的文檔。RAG通過高效的雙編碼器架構——密集段落檢索(DPR)實現這一目標。
雙編碼器架構
DPR使用兩個獨立的基于Transformer的編碼器(通常源自BERT),為文本創建有意義的向量表示:
- 查詢編碼器(Query Encoder):為輸入查詢?
?x?
?計算單個密集向量嵌入。“密集”指其為連續多維向量,每個維度代表文本的學習特征。 - 段落編碼器(Passage Encoder):為知識語料庫中的每個文檔?
?d?
?執行相同操作。關鍵在于,這些文檔嵌入預先計算并存儲在索引中,使推理時的檢索過程極快。
使用FAISS實現高效搜索
面對數百萬文檔向量,暴力搜索最高點積相似度在計算上不可行。RAG集成向量搜索庫(如FAISS,Facebook AI相似性搜索)解決此問題。FAISS根據預計算的文檔向量構建專用數據結構(索引),利用量化和分區等技術實現最大內積搜索(MIPS),其速度遠快于窮舉搜索,使即使用海量語料庫,檢索器也能在亞線性時間內找到前k個最相似文檔向量,實現實時檢索。
# 使用DPR和FAISS構建檢索器的核心邏輯示例
import torch
from transformers import DprContextEncoder, DprContextEncoderTokenizer
from transformers import DprQuestionEncoder, DprQuestionEncoderTokenizer
import faiss
# 1. 加載預訓練DPR模型和分詞器
ctx_tokenizer = DprContextEncoderTokenizer.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
ctx_encoder = DprContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
question_tokenizer = DprQuestionEncoderTokenizer.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
question_encoder = DprQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
# 2. 創建虛擬知識語料庫
knowledge_corpus = [
"埃菲爾鐵塔是巴黎戰神廣場上的鍛鐵格子塔。",
"中國長城是一系列由石頭、磚塊和其他材料建造的防御工事。",
"光合作用是植物用來將光能轉化為化學能的過程。"
]
# 3. 預計算文檔嵌入(實際應用中僅需計算一次并存儲)
with torch.no_grad():
ctx_inputs = ctx_tokenizer(knowledge_corpus, return_tensors="pt", padding=True, truncatinotallow=True)
passage_embeddings = ctx_encoder(**ctx_inputs).pooler_output
print(f"文檔嵌入形狀: {passage_embeddings.shape}") # (文檔數量, 嵌入維度)
# 4. 構建FAISS索引
embedding_dim = passage_embeddings.shape[1]
index = faiss.IndexFlatIP(embedding_dim) # 精確最大內積搜索索引
index.add(passage_embeddings.numpy()) # 向索引添加文檔向量
# 5. 執行搜索
query = "什么是埃菲爾鐵塔?"
with torch.no_grad():
question_inputs = question_tokenizer(query, return_tensors="pt")
question_embedding = question_encoder(**question_inputs).pooler_output
D, I = index.search(question_embedding.numpy(), k=2) # 搜索前2個最相似段落
print("檢索結果:")
for i in range(len(I[0])):
print(f"排名 {i+1}: 文檔 '{knowledge_corpus[I[0][i]]}',得分 {D[0][i]}")
生成器:使用BART綜合信息
檢索器獲取前k個相關文檔后,生成器的任務是將其綜合為單一連貫回答。RAG通常采用預訓練的序列到序列(seq2seq)模型,BART是常用且有效的選擇。BART的架構(雙向編碼器+自回歸解碼器)非常適合此任務,其在去噪任務上的預訓練使其擅長從復雜輸入(如查詢與多個檢索文檔的拼接)中重建信息。生成器的輸入通過將原始查詢??x?
?添加到每個檢索文檔的內容前構建,組合后的文本被饋入BART模型:
[CLS] 查詢 [SEP] 文檔1標題 [SEP] 文檔1文本 [SEP] 文檔2標題 [SEP] 文檔2文本 ...
BART解碼器逐 token 生成最終答案,每一步均關注完整輸入序列,使其既能從原始查詢中提取上下文,又能將回答錨定在檢索文檔的事實信息上。這種對外部知識的直接依賴,使RAG輸出比標準LLMs更具事實性,顯著降低幻覺率。
# 使用Hugging Face RAG分詞器準備生成器輸入的示例
from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration
tokenizer = RagTokenizer.from_pretrained("facebook/rag-sequence-nq")
query = "什么是埃菲爾鐵塔?"
retrieved_docs = [
{"title": "Eiffel Tower", "text": "The Eiffel Tower is a wrought-iron lattice tower on the Champ de Mars in Paris."},
{"title": "Champ de Mars", "text": "The Champ de Mars is a large public greenspace in Paris, France, located in the seventh arrondissement."}
]
retrieved_doc_texts = [doc['text'] for doc in retrieved_docs]
retrieved_doc_titles = [doc['title'] for doc in retrieved_docs]
# 分詞器處理查詢與文檔拼接
prepared_inputs = tokenizer.prepare_seq2seq_batch(
src_texts=[query] * len(retrieved_doc_texts), # 每個文檔均關聯同一查詢
doc_texts=retrieved_doc_texts,
return_tensors="pt"
)
# 查看解碼后的輸入格式
for i in range(len(retrieved_doc_texts)):
print(f"\n--- 生成器輸入(文檔 {i+1}) ---")
print(tokenizer.decode(prepared_inputs['input_ids'][i], skip_special_tokens=False))
模型變體:RAG-Sequence vs. RAG-Token
RAG框架有兩種主要變體,區別在于生成過程中利用檢索文檔的方式:
- RAG-Sequence:每個查詢僅檢索一次,獲取前k個文檔后,使用同一組文檔生成整個輸出序列,最終回答基于所有檢索段落的聯合上下文。
- 適用場景:問答等短格式生成,單一聚焦的證據集已足夠。
- 優勢:計算高效,實現簡單。
- RAG-Token:采用更動態的“逐token”檢索方式,生成每個token時均可重新檢索一組新的前k個文檔,使上下文隨答案構建而動態變化,適用于主題可能演變的長復雜回答生成。
- 適用場景:撰寫段落或總結等長格式生成,答案不同部分可能需要不同證據。
- 優勢:復雜任務中可能更準確、細致。
- 缺點:因重復檢索,計算成本顯著更高。
兩種變體的選擇是性能與計算資源間的典型權衡。
幕后揭秘:RAG模型架構與訓練
RAG的高層架構融合了檢索器和生成器,但要構建一個強大的系統,這些組件的具體模型及其訓練方法至關重要。RAG框架采用了一種復雜的方法,以確保這兩個組件經過優化后協同工作,將標準語言模型轉變為一個動態的、注入知識的系統。
檢索器:用于快速搜索的密集段落檢索(DPR)和FAISS
檢索器的目標是在龐大的知識語料庫中篩選,找出最有可能包含給定查詢答案的文檔。檢索增強生成(RAG)通過一種稱為密集段落檢索(DPR)的高效雙編碼器架構來實現這一目標。
雙編碼器架構
DPR使用兩個獨立的、基于Transformer的編碼器(通常源自BERT)來創建有意義的文本向量表示:
- 查詢編碼器(Query Encoder):為輸入查詢?
?x?
?計算一個單一的、稠密向量嵌入。“稠密”是指它是一個連續的多維向量,其中每個維度都代表文本的一個學習特征。 - 段落編碼器(Passage Encoder):對知識語料庫中的每個文檔?
?d?
?執行相同的操作。至關重要的是,這些文檔嵌入是預先計算并存儲在索引中的,這使得推理時的檢索過程極其快速。
其核心思想是訓練這些編碼器,將語義相關的查詢和文檔映射到共享向量空間中相近的點。訓練目標是最大化查詢嵌入與其相關段落嵌入之間的點積相似度,同時最小化其與所有其他不相關段落的相似度。這確保了查詢向量將與包含其答案的文檔向量“最接近”。
使用FAISS進行高效搜索
由于文檔向量可能多達數百萬個,通過暴力搜索來尋找點積相似度最高的向量在計算上是不可行的。檢索增強生成(RAG)集成了諸如FAISS(Facebook AI相似度搜索)之類的向量搜索庫來解決這個問題。FAISS會根據預先計算好的文檔向量構建一種專門的數據結構——索引。該索引采用量化和分區等技術,實現最大內積搜索(MIPS),其速度比窮舉搜索快得多。它使檢索器能夠在亞線性時間內找到前k個最相似的文檔向量,即便處理大規模語料庫,也能實現實時檢索。
# 此示例演示了使用FAISS設置基于DPR的檢索器的核心邏輯
# 注意:需要安裝`transformers`、`datasets`和`faiss-cpu`
import torch
from transformers import DprContextEncoder, DprContextEncoderTokenizer
from transformers import DprQuestionEncoder, DprQuestionEncoderTokenizer
import faiss
# 1. 加載預訓練DPR模型和分詞器
# 段落編碼器用于處理文檔/段落
ctx_tokenizer = DprContextEncoderTokenizer.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
ctx_encoder = DprContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
# 問題編碼器用于處理用戶查詢
question_tokenizer = DprQuestionEncoderTokenizer.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
question_encoder = DprQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
# 2. 創建虛擬知識語料庫
knowledge_corpus = [
"The Eiffel Tower is a wrought-iron lattice tower on the Champ de Mars in Paris.",
"The Great Wall of China is a series of fortifications made of stone, brick, and other materials.",
"Photosynthesis is a process used by plants to convert light energy into chemical energy."
]
# 3. 預計算文檔嵌入(實際應用中只需計算一次并存儲)
with torch.no_grad():
ctx_inputs = ctx_tokenizer(knowledge_corpus, return_tensors="pt", padding=True, truncatinotallow=True)
passage_embeddings = ctx_encoder(**ctx_inputs).pooler_output
print(f"文檔嵌入形狀: {passage_embeddings.shape}") # (文檔數量, 嵌入維度)
# 4. 構建FAISS索引(用于高效搜索)
embedding_dim = passage_embeddings.shape[1]
# 使用IndexFlatIP進行精確的最大內積搜索
index = faiss.IndexFlatIP(embedding_dim)
index.add(passage_embeddings.numpy()) # 向索引中添加文檔向量
# 5. 執行搜索
query = "What is the Eiffel Tower?"
with torch.no_grad():
question_inputs = question_tokenizer(query, return_tensors="pt")
question_embedding = question_encoder(**question_inputs).pooler_output
# 搜索FAISS索引,獲取前k個最相似的段落(此處k=2)
D, I = index.search(question_embedding.numpy(), k=2) # D: 距離(點積值), I: 索引
print("檢索結果:")
for i in range(len(I[0])):
print(f"排名 {i+1}: 文檔 '{knowledge_corpus[I[0][i]]}',得分 {D[0][i]}")
生成器:使用BART合成信息
一旦檢索器獲取到前k個相關文檔,生成器的任務就是將它們整合為一個連貫的答案。檢索增強生成(RAG)為此采用了預訓練的序列到序列(seq2seq)模型,BART是一種常用且有效的選擇。BART的架構具有雙向編碼器和自回歸解碼器,非常適合這項任務。它在去噪任務上的預訓練使其在從損壞或復雜的輸入(如與多個檢索到的文檔連接的查詢)中重建信息方面表現出色。
生成器的輸入是通過將原始查詢??x?
??前置到每個檢索到的文檔??d_i?
?的內容中創建的。然后,將這個組合文本輸入到BART模型中:
[CLS] 查詢 [SEP] 文檔1標題 [SEP] 文檔1文本 [SEP] 文檔2標題 [SEP] 文檔2文本 ...
BART解碼器逐個生成最終答案的標記。在每一步中,它會關注完整的輸入序列,使其能夠從原始查詢中獲取上下文,同時將其回答基于檢索到的文檔所提供的事實信息。這種對外部知識的直接依賴,使得RAG的輸出更具事實性,與標準大語言模型相比,顯著降低了幻覺率。
# 此示例展示了如何使用Hugging Face RAG分詞器準備生成器的輸入
from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration
# 實際應用中,需初始化包含所有組件的完整RAG模型
# 此處僅使用分詞器演示輸入準備步驟
tokenizer = RagTokenizer.from_pretrained("facebook/rag-sequence-nq")
query = "What is the Eiffel Tower?"
# 假設這些是從之前步驟的FAISS索引中檢索到的文檔
retrieved_docs = [
{"title": "Eiffel Tower", "text": "The Eiffel Tower is a wrought-iron lattice tower on the Champ de Mars in Paris."},
{"title": "Champ de Mars", "text": "The Champ de Mars is a large public greenspace in Paris, France, located in the seventh arrondissement."}
]
retrieved_doc_texts = [doc['text'] for doc in retrieved_docs]
retrieved_doc_titles = [doc['title'] for doc in retrieved_docs]
# RagTokenizer處理查詢+文檔的復雜格式,為每個檢索到的文檔準備一個輸入序列
prepared_inputs = tokenizer.prepare_seq2seq_batch(
src_texts=[query] * len(retrieved_doc_texts), # 每個文檔均關聯同一查詢
doc_texts=retrieved_doc_texts,
return_tensors="pt"
)
# 查看解碼后的輸入格式(模型將處理這些輸入以生成答案)
for i in range(len(retrieved_doc_texts)):
print(f"\n--- 生成器輸入(文檔 {i+1}) ---")
print(tokenizer.decode(prepared_inputs['input_ids'][i], skip_special_tokens=False))
模型變體:RAG-Sequence vs. RAG-Token模型
RAG框架主要有兩種變體,它們的區別在于在生成過程中如何利用檢索到的文檔。
1. RAG-Sequence
- 機制:每次查詢執行一次檢索,獲取前k個文檔后,使用同一組文檔生成整個輸出序列,最終回答基于所有檢索段落的聯合上下文。
- 適用場景:問答等短文本生成任務,一組單一、有針對性的證據即可滿足需求。
- 優勢:計算效率高,實現簡單。
2. RAG-Token
- 機制:采用更動態的“逐token”檢索方式,生成每個token時均可重新檢索一組新的前k個文檔,使上下文隨答案構建而動態變化。
- 適用場景:撰寫段落或總結等長格式生成任務,答案不同部分可能需要不同證據。
- 優勢:復雜任務中可能更準確、細致。
- 缺點:因重復檢索,計算成本顯著更高。
兩種變體的選擇是性能與計算資源間的典型權衡。
端到端訓練:聯合優化檢索器和生成器
RAG最強大的功能之一是它能夠進行端到端的訓練。這意味著檢索器和生成器并非孤立訓練,而是在下游任務上一起進行微調。這是通過將檢索到的文檔??z?
?視為一個潛在變量來實現的。
由于檢索步驟(從索引中選擇最佳文檔)是離散且不可微的,我們無法將最終損失直接反向傳播到檢索器。RAG論文提出了一個巧妙的解決方案:模型不再選擇一個‘最佳’文檔,而是對前k個檢索到的文檔進行邊緣化處理。
公式拆解
反向傳播機制
通過優化此求和式,最終輸出的損失會通過以下兩個部分進行反向傳播:
- 生成器更新:梯度更新生成器參數,使其更擅長利用提供的上下文(( P(y|x, z) ))。
- 檢索器更新:梯度還更新查詢編碼器的參數(( E_Q )),訓練檢索器獲取生成器可用于產出更好答案的文檔,即學習檢索使( P(y|x, z) )最大化的段落?
?z?
?。
實際訓練注意事項
在典型的微調設置中,段落編碼器(( E_P ))和文檔索引保持凍結狀態。這是因為在每個訓練步驟中重新計算整個語料庫的嵌入向量并重建索引的成本過高。因此,訓練信號僅用于微調查詢編碼器和生成器,創建一個高度協同的系統——檢索器精準學習生成器所需的信息類型。
關鍵技術要點
- 檢索器:使用雙編碼器(DPR)將查詢和文檔高效映射到共享向量空間,由FAISS提供亞線性時間相似性搜索。
- 生成器:采用像BART這樣的序列到序列模型,以原始查詢和檢索到的文檔的連接輸入為條件,生成基于事實的答案。
- 模型變體:RAG-Sequence每次查詢檢索一次(速度快),而RAG-Token為每個生成的標記進行檢索(更具動態性,但成本高)。
- 端到端訓練:RAG的關鍵創新在于將檢索到的文檔視為潛在變量,通過對前k個檢索文檔的概率邊緣化實現聯合優化,使梯度能反向傳播到生成器和檢索器的查詢編碼器。
RAG實戰:性能與應用
在確立了檢索增強生成(RAG)的核心架構后,我們現在來探討它的實際性能和應用。一個模型只有在實際任務中能轉化為卓越的成果,其理論上的精妙之處才有價值。檢索增強生成(RAG)在多個知識密集型領域展示了其能力,凸顯出它的混合存儲系統如何帶來切實的、最先進的優勢。
知識密集型任務中的頂尖性能
RAG在多個開放域問答(ODQA)基準測試中取得了新的最先進成果,包括自然問題(Natural Questions)、網絡問題(WebQuestions)和瑣事問答(TriviaQA)。與必須從其固定參數記憶中回答問題的標準大語言模型不同,RAG系統可以在推理時查閱龐大的最新知識語料庫。這種將回答基于檢索到的、可驗證證據的能力是其成功的主要推動力。
在開放域問答(ODQA)中,目標是從大量文檔中找到問題的準確答案。RAG在這方面表現出色,因為其兩階段過程與該任務完美契合:
- 檢索器:密集段落檢索器(DPR)首先將搜索空間從數百萬個文檔縮小到少數幾個高度相關的段落。這一步對于效率和準確性至關重要。
- 生成器:基于BART的生成器隨后會仔細閱讀問題及提供的段落,以合成準確的自然語言答案。
這種方法始終優于僅依賴參數化記憶的模型,后者更容易出現事實性不準確問題,并且如果不進行完全重新訓練,就無法適應新信息。使用檢索增強生成(RAG),更新知識庫就像更新文檔索引一樣簡單,這是一個高效得多的過程。
減輕幻覺并增強事實一致性
標準大語言模型的一個關鍵故障模式是“幻覺”,即生成看似合理但事實上不正確的信息。檢索增強生成(RAG)通過使生成器基于外部可驗證的知識來直接緩解這一問題。這使其成為事實準確性至關重要的應用場景中的強大工具。
1. 事實核查(Fact Verification)
在這項任務中,模型必須根據證據來源判斷某一陳述的真實性。檢索增強生成(RAG)的架構天生適合此項任務,其過程如下:
- 將輸入的陳述作為查詢內容,檢索相關文檔。
- 生成器根據證據是否證實該陳述,合成一個判定結果(例如,“支持”或“反駁”)。在諸如FEVER(事實提取與核查)這樣的基準測試中,這種基于事實依據的機制顯著提高了可靠性。
2. 抽象生成與摘要(Abstractive Generation & Summarization)
對于諸如總結復雜文檔之類的長篇生成任務而言,保持事實一致性頗具挑戰。RAG-Token模型變體在這方面尤為有效。通過為其生成的每個標記重新檢索文檔,該模型能夠動態轉移其關注點。示例:設想創作一篇傳記:
- 在撰寫有關研究對象早年生活的內容時,RAG-Token會檢索有關其童年和教育的文檔。
- 當內容過渡到其職業生涯時,它會重新檢索,收集有關職業成就的文章。這使其能夠構建一個全面且基于事實的敘述,反映源材料的細微差別,而在這項任務上,標準的大語言模型可能會偏離主題或編造細節。
檢索器的關鍵作用:協同合作關系
檢索增強生成(RAG)系統的性能在很大程度上取決于其檢索器的質量。如果檢索器未能找到相關文檔,生成器就只能使用質量不佳或不相關的上下文,從而導致答案錯誤或籠統。整個系統的有效性取決于檢索器在正確的時間提供正確知識的能力。
- ( x ) 是輸入查詢,( y ) 是目標輸出(如正確答案),( z ) 是檢索到的文檔。
- ( P(z|x) ) 是檢索器為查詢 ( x ) 選擇文檔 ( z ) 的概率,( P(y|x, z) ) 是生成器在給定查詢 ( x ) 和文檔 ( z ) 時生成正確輸出 ( y ) 的概率。
該公式允許梯度不僅流向生成器,還流向檢索器的查詢編碼器。實際效果是強大的:查詢編碼器經過微調,生成能夠檢索幫助生成器產生正確最終答案概率最高的文檔的嵌入。簡而言之,檢索器學會了預測生成器的需求,創建了一個高度協同的系統。
實現權衡:速度、準確性和解碼
實現RAG需要進行實際的權衡,主要是在速度和準確性之間。這些選擇體現在模型架構和解碼策略中。
1. 架構變體
功能 | RAG-Sequence | RAG-Token |
檢索節奏 | 每個生成序列檢索一次 | 每個生成的標記檢索一次 |
上下文 | 靜態;整個答案使用同一組文檔 | 動態;上下文可隨答案構建而變化 |
最適合場景 | 短格式生成(如問答、事實查詢) | 長格式生成(如摘要、傳記) |
速度 | 高;計算效率高 | 低;由于重復檢索,計算成本高 |
準確性 | 對于聚焦查詢準確性高 | 對于復雜、多方面的答案可能更高 |
2. 解碼策略
生成最終文本序列的方法也對性能有重大影響:
- 貪心解碼(快速):在每一步,模型選擇單個最可能的標記。這是最快的方法,但可能導致次優或重復的輸出,因為它不考慮整體序列質量。
- 波束搜索(全面):波束搜索不只是選擇一個標記,而是維護一組 ( k )(“波束寬度”)個最可能的部分序列。它探索更廣泛的搜索空間,通常會產生更連貫和高質量的輸出。然而,其計算成本隨著波束寬度的增加而增加。
- RAG特定解碼:在RAG中,生成概率以檢索到的文檔 ( z ) 為條件。一些高級實現使用“全面”解碼方法,其中使用不同的檢索文檔生成不同的波束假設,最終輸出是整體得分最高的那個。這在計算上很昂貴,但可以最大限度地利用檢索到的知識。
總結
- 性能優勢:RAG通過將生成器基于外部檢索證據,在自然問題等知識密集型基準測試中取得了最先進的結果,使其知識庫可更新,答案可驗證。
- 應用多樣:其架構對開放域問答、事實核查(通過根據證據檢查陳述)和復雜摘要非常有效,其中RAG-Token變體可防止事實偏差。
- 檢索器的重要性:檢索器的性能至關重要。RAG的端到端訓練將文檔視為潛在變量,創造了一種獨特的協同作用,使檢索器學會查找對生成器任務最有用的文檔。
- 實際權衡:實現需要平衡速度和質量。關鍵決策包括在快速的RAG-Sequence和全面的RAG-Token變體之間進行選擇,以及選擇解碼策略,如快速貪心搜索或更健壯但較慢的波束搜索。
結論
總之,檢索增強生成(RAG)代表了從單一、靜態的語言模型向動態、知識基礎系統的關鍵轉變。通過將參數化記憶的生成流暢性與外部非參數化知識源的事實可靠性相結合,RAG直接解決了大語言模型的關鍵局限性,如信息過時和幻覺。其優雅的檢索器-生成器架構不僅提供了最先進的性能,還為構建更可信、準確和可驗證的AI應用提供了實用框架。隨著數字信息格局的不斷擴展,RAG范式將成為有效和負責任地利用知識的不可或缺的工具。
本文轉載自???柏企閱文???,作者:tailet
