解密prompt系列39. RAG之藉助LLM最佳化精排環節

风雨中的小七發表於2024-09-30

RAG的部分我們之前討論過資訊召回的多樣性,資訊密度和質量,主要集中在召回,融合,粗排的部分。這一章我們集中看下精排的部分。粗排和精排的主要差異其實在於效率和效果的balance。粗排模型複雜度更低,需要承上啟下,用較低複雜度的模型,在大幅度縮小召回候選量級的基礎上,和精排的排序一致性做盡可能的對齊,保證精排高質量內容不被過濾。而精排模型複雜度更高,可以使用更復雜的模型來儘可能地擬合最終的目標排序。在RAG任務中,最終目標就是候選內容可以回答問題,客觀評估就是推理引用率。

精排模型的訓練目標常用的有幾種,有全域性最佳化的ListWise,有每個item獨立擬合ctr等直接目標的pointwise,還有對比最佳化的pairwise。在RAG的排序模組,也有多篇論文針對排序目標和樣本的標註方式使用以上的不同方案進行了嘗試,以下方案均可以直接使用大模型做精排,也可以使用大模型來構建微調樣本訓練小模型~

PointWise

  • HELM:Holistic Evaluation of Language Models
  • UPR:Improving Passage Retrieval with Zero-Shot Question Generation

先說pointwise也就是每條召回內容,都獨立判斷該內容能多大程度上回答query的問題,既query和content的相關性。

那最直觀的方案就是把query和content一起輸入大模型讓模型判斷是否相關,也就是HELM中使用的few-shot指令判別方案。使用以下指令大模型推理的YES,NO的token機率來對內容進行排序。

Given a passage and a query, predict whether the passage includes an answer to the query by producing either ‘Yes‘ or ‘No‘.

{{few_shot}}

Passage: {{passage}}
Query: {{query}}
Does the passage answer the query?
Answer:

如果說上面的方案是針對每條內容候選計算P(query,content)的聯合機率,那考慮query對於所有content是固定的,那我們也可以選擇計算P(content|query)的條件機率。

但考慮內容中的噪聲會比較大,既有相關也有無關資訊,所以我們放鬆bayesian的假設,透過計算P(query|content)來近似P(content|query),也就是用給定content下query的機率來衡量query和content的相似度。

UPR論文直接使用大模型,基於以下的prompt模版,計算query每個字的解碼機率取平均作為P(query|content)的近似,因為可以並行解碼,所以這個方案雖然用大模型但是也不算慢。

Passage: {{passage}}. Please write a question based on this passage.

以及是不是看著很眼熟,和之前在LLM Agent之再談RAG的召回資訊密度和質量中提到的長文字壓縮方案的LongLLMLingua是一個思路。只不過LongLLMLingua使用的指令是"we can get the answer to this question in the given documents"

Listwise

  • RankVicuna: Zero-Shot Listwise Document Reranking with Open-Source Large Language Models
  • RankGPT:Is ChatGPT good at search? Investigating large language models as re-ranking agent
  • https://github.com/sunnweiwei/RankGPT

RankGPT提出了基於permutation的大模型排序方案,模型會輸入多個content上文,並使用指令要求LLM根據內容的關聯性按順序輸出內容序號, prompt模版如下

This is RankGPT, an intelligent assistant that can rank passages based on their relevancy to the
query.
The following are {{num}} passages, each indicated by number identifier []. I can rank them based
on their relevance to query: {{query}}
[1] {{passage_1}}
[2] {{passage_2}}
(more passages) ...
The search query is: {{query}}
I will rank the {{num}} passages above based on their relevance to the search query. The passages
will be listed in descending order using identifiers, and the most relevant passages should be listed
first, and the output format should be [] > [] > etc, e.g., [1] > [2] > etc.
The ranking results of the {{num}} passages (only identifiers) is:

而所謂Permutation是考慮到LLM的上文長度有限,因此對N條上文內容進行了分組,組和組之間是有重疊的劃分,每次只讓模型對一組資料進行排序。listwise效果雖好,但是也有不少缺點

  • 推理上文長度的限制
  • 輸入內容順序會影響推理結果
  • 輸出推理耗時較高
  • 多次預測的穩健性不高會出現排序衝突
  • 對模型能力的要求較高

Pairwise

  • Large Language Models are Effective Text Rankers with Pairwise Ranking Prompting

相比前面的pointwise依賴模型輸出機率是well-calibrated,listwise依賴模型有較好的排序能力,pairwise對模型的要求會放鬆不少。

論文使用以下prompt讓模型對兩個內容進行對比,輸出A/B的結果,這裡論文也是使用了prob 機率,不過相對於pointwise使用所有內容的prob機率直接進行排序,pairwise會兩兩進行對比,同時每次都會swap內容的順序,得到AB,BA的兩次對比的token推理機率。

Given a query {query}, which of the following two passages is more relevant to the query?
Passage A: {document1}
Passage B: {document2}
Output Passage A or Passage B:

那如何使用以上兩兩對比的結果,論文給出了三種排序方案: all pairs,heap sort和bubble sort

All pairs使用內容間兩兩對比的結果對所有內容進行打分,兩兩對比時,如果(AB),(BA)模型均給出了A>B的一致判斷則A得一分,如果兩次結果矛盾則A,B各得0.5分。所以其實論文把prob機率打分進行了區域性的ranking處理,降低了因為模型預測機率不是well-calibrated帶來的結果偏差。當然All Pairs的缺點很明顯,做一次整體排序,是(N^2)的請求複雜度。

image

Heap sort就是使用排序演算法,把複雜度縮減到了O(NlogN),而bubble sort就是氣泡排序的實現邏輯,同時考慮到精排往往只保留Top-k排名最高的item即可,因此只需要兩兩對比交換順序K次,所以複雜度是O(NK)。

效果上論文和前面的point-wise的UPR,list-wise的RankGPT都做了對比,除了打不過gpt4吧,使用20B的FlAN-UL2基本能和gpt3.5效果差不多。並且對比listwise,pair-wise的對比方案,對輸入內容順序的敏感度很低,同時對模型能力的要求也比較低,小模型也能有和大模型相當的表現。

image

SetWise

  • A Setwise Approach for Effective and Highly Efficient Zero-shot Ranking with Large Language Models
  • https://github.com/ielab/llm-rankers

最後一篇介紹setwise,其實是上面listwise和pairwise的結合體,它使用了listwise的打分方式,也借鑑了pairwise使用heap sort和bubble sort篩選topK文件的思路,其實還用了pointwise使用大模型輸出機率分佈的思路。哈哈感覺其實算是個工程化實現的改進,簡單說一下

前面的listwise打分,需要大模型對所有內容進行一次性的排序,不僅有上文長度的限制,輸入內容順序對結果的影響,推理比較慢的問題,同時對模型來說本身難度也較高,會出現多次推理順序矛盾的情況。因此不妨把內容分成很多個小組,降低輸入長度,同時把輸出排序改為輸出小組內最相關的文件序號,這樣既降低推理延時,也同時可以使用輸出token的logits分佈來對組內的多個文件進行打分。

然後基於小組內的打分,同樣是使用bubble sort,對比pairwise的實現邏輯每次對比交換都需要計算大模型對比兩個文件的相關性,setwise可以一次對比組內的3-4篇文件,在效率上會有進一步提升,對比如下圖

image

效果上論文使用NDCG@10作為評估指標(上角標是setwise相對前面哪些方法有顯著的指標提升),下圖一是不同模型大小的Flan-t5使用不同排序方案的效果&效率對比,雖然pointwise的latency是最低的,但是效果也是最差的,而pairwise效果是最好的,但latency也是最高的。在兼顧排序效果和latency的方案中listwise-likelihood和setwise heapsort看起來是更合適的方案。

image

想看更全的大模型相關論文梳理·微調及預訓練資料和框架·AIGC應用,移步Github >> DecryPrompt

彩蛋

最近想做個自己的部落格網站,於是用傳說中一句話就能構建功能完備的web頁面的,網頁模擬生成器websim.ai試了下,下面是效果圖,感覺效果還不戳哦,大家覺得嘞~

image

相關文章