從碎片化到一體化:Rankify 如何重塑檢索、重排與生成的全流程 原創(chuàng)
“在某個地方,有某種令人難以置信的事物等待著被知曉?!薄枴に_根
在信息爆炸的時代,如何從海量數(shù)據(jù)中快速、精準(zhǔn)地獲取所需信息,是困擾眾多科研人員與行業(yè)從業(yè)者的難題。而今天,我們要介紹的 Rankify,正是這樣一款在學(xué)術(shù)界和工業(yè)界都備受矚目的 Python 工具包,它以全面、模塊化和用戶友好的方式,為檢索、重排以及檢索增強(qiáng)型生成(RAG)提供了一站式解決方案。
一、Rankify 的誕生背景
過去,檢索領(lǐng)域經(jīng)歷了從純基于詞匯的搜索策略到基于密集嵌入的方法的演變。同時,重排模型的興起幫助優(yōu)化了初始搜索結(jié)果,使其更具相關(guān)性。而檢索增強(qiáng)型生成則將這些技術(shù)與文本生成相結(jié)合,讓語言模型能夠通過即時查閱相關(guān)文檔,以更高的事實準(zhǔn)確性回答問題。
然而,在這些領(lǐng)域不斷發(fā)展的同時,從業(yè)者們卻常常需要拼湊多種工具,每種工具各司其職,處理特定的任務(wù)。Rankify 的出現(xiàn),正是為了解決這種碎片化問題,它將整個流程——從檢索初始結(jié)果、重排,到生成最終的、富有上下文信息的答案——整合在一起,提供了一個統(tǒng)一、模塊化且穩(wěn)健的解決方案。
二、深入理解 Rankify
(一)Rankify 的愿景
Rankify 的誕生源于將不同流程整合于一處的必要性。傳統(tǒng)的信息檢索(IR)工具包往往只專注于檢索或重排中的某一項。有些框架雖然處理檢索增強(qiáng)型生成,但在排名階段缺乏更細(xì)致的粒度。Rankify 橋接了這些空白:
- 檢索:它利用多種方法,從經(jīng)典的稀疏檢索(如 BM25)到先進(jìn)的密集模型(如 DPR、ANCE、BGE、Contriever 和 ColBERT)。
- 重排:引入了從 MonoBERT 到 RankT5 等眾多重排器,允許使用點式、成對或列表式算法進(jìn)行靈活的第二階段排名。
- RAG:促進(jìn)生成基于檢索文檔的答案,從而增強(qiáng)事實可靠性。
(二)相較于傳統(tǒng)方法的關(guān)鍵優(yōu)勢
- 模塊化:通過單一接口,用戶可以自由組合檢索方法、重排模型和 RAG 方法。
- 預(yù)檢索數(shù)據(jù):Rankify 提供了預(yù)檢索文檔和大型語料庫(如維基百科和 MS MARCO)的現(xiàn)成索引。
- 可擴(kuò)展性:基于 Python 和 PyTorch 構(gòu)建,Rankify 能夠高效地處理大型數(shù)據(jù)集。
- 比較實驗:由于整合了多樣化的方法,研究人員可以系統(tǒng)地比較不同檢索或重排策略的性能。
三、與“思維鏈”范式的差異
(一)什么是“思維鏈”
在大型語言模型研究中,“思維鏈”通常指一種推理框架,模型(或方法)在得出最終結(jié)論前公開地思考中間步驟。這種方法試圖模仿人類的推理序列,確保每一步都透明。
(二)Rankify 如何超越“思維鏈”方法
盡管“思維鏈”推理富有洞察力,但它主要關(guān)注模型內(nèi)部邏輯的展開,而不是確保外部相關(guān)上下文被正確檢索、加權(quán)和利用。而 Rankify 則:
- 聚焦上下文:不是依賴內(nèi)部“思維鏈”,Rankify 主動檢索相關(guān)文檔并系統(tǒng)地重排它們,確保語言模型的生成基于準(zhǔn)確的外部數(shù)據(jù)。
- 穩(wěn)健且模塊化:“思維鏈”因深度集成于模型的隱藏層而難以評估或擴(kuò)展。Rankify 使用成熟的外部檢索器和重排器,便于定制和擴(kuò)展。
- 更適合知識密集型任務(wù):當(dāng)事實正確性至關(guān)重要時,僅依賴模型內(nèi)部的“思維鏈”可能會產(chǎn)生幻覺。Rankify 的流程確保相關(guān)來源始終處于前沿。
“信息是 21 世紀(jì)的石油,而分析是內(nèi)燃機(jī)?!薄说谩に傻录拥?/p>
四、Rankify 的核心組件
(一)檢索
Rankify 支持稀疏(BM25)和密集(DPR、ANCE、BGE、Contriever、ColBERT)檢索器。
- 稀疏檢索(BM25):對于較短的查詢以及精確關(guān)鍵詞匹配足夠的情況,它非??煽俊?/li>
- 密集檢索(例如 DPR):利用神經(jīng)嵌入來捕捉語義相似性,在更微妙或模糊的查詢中,通常優(yōu)于稀疏方法。
(二)重排
在典型的 Rankify 工作流程中,第二階段是重排。一旦檢索到一組初始文檔,這些文檔將使用更復(fù)雜但更精確的模型重新排序:
- 點式(例如 MonoBERT、MonoT5)
- 成對式
- 列表式(例如 RankT5、RankGPT、LiT5)
當(dāng)需要從大量初始檢索文檔中提取高精度結(jié)果時,這一步尤為關(guān)鍵。
(三)檢索增強(qiáng)型生成(RAG)
Rankify 中的 RAG 將檢索和生成的優(yōu)勢相結(jié)合:
- 檢索器:檢索與用戶查詢最相關(guān)的頂級文檔。
- 生成器:然后將這些頂級文檔作為輸入,生成基于上下文的答案。
支持的方法包括零樣本生成、解碼器中的融合(FiD)方法、上下文學(xué)習(xí)(RALM)等。通過將語言模型錨定到真實的外部數(shù)據(jù),顯著降低了事實幻覺的風(fēng)險。
五、安裝與設(shè)置
(一)虛擬環(huán)境搭建
在安裝 Rankify 之前,最佳實踐是創(chuàng)建一個專用的 conda 環(huán)境,以避免依賴沖突:
conda create -n rankify pythnotallow=3.10
conda activate rankify
(二)PyTorch 安裝
Rankify 與 PyTorch 2.5.1 無縫協(xié)作:
pip install torch==2.5.1 torchvisinotallow==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu124
如果你有 GPU 并希望優(yōu)化訓(xùn)練/檢索性能,安裝適用于 PyTorch 的 CUDA 版本(12.4 或 12.6)。
(三)Rankify 安裝
- 基礎(chǔ)安裝:
pip install rankify
這為你提供了檢索、重排和檢索增強(qiáng)型生成的基礎(chǔ)功能。
- 推薦安裝:
pip install "rankify[all]"
此命令安裝了完整的套件,涵蓋高級檢索器、重排器和生成器模塊。
- 可選依賴項:如果你只想安裝特定組件:
pip install "rankify[retriever]"
pip install "rankify[reranking]"
- 僅重排器:
- 僅檢索器:
- 從 GitHub 安裝(獲取最新開發(fā)版本):
git clone https://github.com/DataScienceUIBK/rankify.git
cd rankify
pip install -e .
對于完整功能:
pip install -e ".[all]"
(四)使用 ColBERT 檢索器
如果你計劃在 Rankify 中使用 ColBERT,需要進(jìn)行額外設(shè)置:
- 安裝 GCC 和所需庫:
conda install -c conda-forge gcc=9.4.0 gxx=9.4.0
conda install -c conda-forge libstdcxx-ng
- 導(dǎo)出環(huán)境變量:
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
export CC=gcc
export CXX=g++
export PATH=$CONDA_PREFIX/bin:$PATH
六、預(yù)檢索數(shù)據(jù)集與操作
(一)預(yù)檢索數(shù)據(jù)集
Rankify 提供了每個數(shù)據(jù)集 1000 份預(yù)檢索文檔,這對于那些希望快速上手而無需構(gòu)建或維護(hù)索引的人來說是一個巨大的幫助。
(二)下載與處理 Rankify 中的數(shù)據(jù)集
用戶可以通過單一腳本下載流行問答數(shù)據(jù)集的預(yù)檢索文檔。例如,下載 BM25 檢索的自然問題數(shù)據(jù)集:
from rankify.dataset.dataset import Dataset
dataset = Dataset(retriever="bm25", dataset_name="nq-dev", n_docs=100)
documents = dataset.download(force_download=False)
你可以將 "bm25" 替換為 "dpr"、"ance"、"colbert"、"bge"、"contriever" 或 "mss",以探索不同檢索器對同一數(shù)據(jù)集的檢索效果。
(三)運(yùn)行檢索
Rankify 為廣泛的檢索方法提供了一個簡單統(tǒng)一的接口。以下是如何在維基百科上使用 BM25 檢索文檔的示例:
from rankify.dataset.dataset import Document, Question, Answer
from rankify.retrievers.retriever import Retriever
documents = [
Document(questinotallow=Question("Who wrote Hamlet?"),
answers=Answer(["Shakespeare"]), cnotallow=[])
]
bm25_retriever_wiki = Retriever(method="bm25", n_docs=5, index_type="wiki")
retrieved_docs = bm25_retriever_wiki.retrieve(documents)
for doc in retrieved_docs:
print(doc)
(四)運(yùn)行重排
一旦檢索到頂級文檔,將它們輸入到重排器中以優(yōu)化順序。Rankify 支持 20 多種重排模型:
from rankify.dataset.dataset import Document, Question, Answer, Context
from rankify.models.reranking import Reranking
question = Question("When did Thomas Edison invent the light bulb?")
answers = Answer(["1879"])
contexts = [
Context(text="Lightning strike at Seoul National University", id=1),
Context(text="Thomas Edison invented the light bulb in 1879", id=2),
]
doc = Document(questinotallow=question, answers=answers, cnotallow=contexts)
reranker = Reranking(method="monot5", model_name="monot5-base-msmarco")
reranker.rank([doc])
print(doc.reorder_contexts)
重排后,??doc.reorder_contexts?
? 將反映新的順序,突出與用戶查詢最匹配的段落。
(五)使用生成器模塊
Rankify 的生成器模塊將檢索增強(qiáng)型生成(RAG)整合到工作流程中。以下是一個檢索一些上下文并使用生成模型生成最終答案的示例:
from rankify.dataset.dataset import Document, Question, Answer, Context
from rankify.generator.generator import Generator
question = Question("What is the capital of France?")
answers = Answer(["Paris"])
contexts = [
Context(text="The capital of France is Paris.", id=1),
Context(text="Berlin is the capital of Germany.", id=2),
]
doc = Document(questinotallow=question, answers=answers, cnotallow=contexts)
generator = Generator(method="in-context-ralm", model_name='meta-llama/Llama-3.1-8B')
output = generator.generate([doc])
print(output)
當(dāng)希望語言模型不僅擁有問題本身,還能掌握相關(guān)上下文時,這種方法非常有價值。
七、評估指標(biāo)
(一)衡量檢索性能
Rankify 為檢索提供了 top-k 準(zhǔn)確度衡量指標(biāo):
from rankify.metrics.metrics import Metrics
m = Metrics(documents)
before_rank = m.calculate_retrieval_metrics(ks=[1,5,10,20,50,100], use_reordered=False)
print(before_rank)
對于每個 k(1、5、10、20、50、100),Rankify 檢查正確答案是否出現(xiàn)在檢索到的前 k 篇段落中。
(二)評估重排效果
在許多實驗中,你可能想知道重排模型是否真正改善了結(jié)果。只需將 ??use_reordered?
?? 設(shè)置為 ??True?
? 即可查看差異:
after_rank = m.calculate_retrieval_metrics(ks=[1,5,10,20,50,100], use_reordered=True)
print(after_rank)
(三)評估檢索增強(qiáng)型生成
Rankify 還計算最終生成答案的精確匹配(EM)、精確度、召回率和 F1 等指標(biāo)。這些指標(biāo)對于問答和基于知識的生成任務(wù)至關(guān)重要:
gen_metrics = m.calculate_generation_metrics(generated_answers)
print(gen_metrics)
八、用例與最佳實踐
(一)問答系統(tǒng)
如果你正在構(gòu)建 FAQ 或解答開放域問題(如醫(yī)學(xué)、科學(xué)或企業(yè)知識庫),Rankify 在提取正確文檔、高精度重排以及可選地生成簡潔準(zhǔn)確的響應(yīng)方面表現(xiàn)出色。
(二)基于知識的助手
許多聊天機(jī)器人失敗是因為它們完全依賴大型語言模型而沒有錨定參考。Rankify 通過將檢索和重排的外部參考與生成能力相結(jié)合,降低了“幻覺”的風(fēng)險。最終結(jié)果是一個更具基礎(chǔ)且可靠的助手。
(三)學(xué)術(shù)研究與基準(zhǔn)測試
研究人員可以利用 Rankify 的預(yù)檢索數(shù)據(jù)集快速進(jìn)行受控實驗。他們可以插入新的檢索或重排模型,并直接比較指標(biāo),無需每次都重新發(fā)明輪子。
“如果我們知道自己在做什么,那還叫研究嗎?”——阿爾伯特·愛因斯坦
Rankify 體現(xiàn)了這種哲學(xué):它使研究人員免于實施標(biāo)準(zhǔn)檢索管道的繁瑣任務(wù),讓他們專注于工作的創(chuàng)新性。
九、Rankify 為何脫穎而出
(一)統(tǒng)一框架
無需在六七種工具之間來回切換,你可以通過一個界面處理檢索、重排和 RAG。這種一致性減少了開發(fā)時間并減少了集成錯誤。
(二)適應(yīng)性與模塊化
Rankify 采用即插即用的設(shè)計。添加一個新的檢索器或重排器通常只需實現(xiàn)一個可以無縫插入現(xiàn)有管道的接口。這種模塊化促進(jìn)了創(chuàng)新,因為用戶可以快速嘗試新想法。
(三)社區(qū)與生態(tài)系統(tǒng)
作為一個開源項目,Rankify 從社區(qū)貢獻(xiàn)和積極維護(hù)中受益。憑借詳盡的文檔和不斷擴(kuò)大的用戶群體,它已準(zhǔn)備好與自然語言處理領(lǐng)域的最新進(jìn)展同步發(fā)展。
“聚集在一起是開始,保持在一起是進(jìn)步,一起工作才是成功?!薄嗬じL?/p>
秉承福特的這番話語,Rankify 正是在這種團(tuán)結(jié)協(xié)作的精神下蓬勃發(fā)展,它將信息檢索社區(qū)匯聚于一個靈活且強(qiáng)大的框架之下。
十、結(jié)語
Rankify 是一個代表下一代工具包的典范,它統(tǒng)一了檢索、重排和檢索增強(qiáng)型生成的整個流程。它通過提供一個連貫、模塊化的平臺,解決了現(xiàn)代信息檢索系統(tǒng)中的復(fù)雜性和碎片化問題。用戶可以輕松地嘗試從經(jīng)典的 BM25 到先進(jìn)的神經(jīng)方法(如 DPR 和 ColBERT)等一系列檢索器,進(jìn)一步利用復(fù)雜的重排器(MonoT5、RankT5、LiT5、RankGPT 等)優(yōu)化結(jié)果,并最終使用 RAG 生成與上下文相關(guān)答案。
與主要依賴內(nèi)部、不透明機(jī)制的“思維鏈”范式不同,Rankify 將其答案牢固地建立在明確的外部上下文中。這一區(qū)別對于需要可驗證準(zhǔn)確性、事實正確性和穩(wěn)健性能的任務(wù)至關(guān)重要。通過專注于相關(guān)數(shù)據(jù)的來源和組織方式,Rankify 避免了幻覺的陷阱,有效地彌合了理論人工智能能力和實際、現(xiàn)實可靠性之間的差距。
本文轉(zhuǎn)載自公眾號Halo咯咯 作者:基咯咯
原文鏈接:??https://mp.weixin.qq.com/s/YO4KEM1mVdrBa8NdKee8EQ??
