llama.cpp reranking源碼分析

大模型時代,reranker一直是提高RAG有效性的重要工具。相對于初篩階段向量檢索,精排階段的reranker需要query和每個候選document做相關計算。初篩已經將候選documents限制在一個相對較小范圍,但依然要進行大量的相關性計算。

llama.cpp是廣泛使用的模型量化工具,支持16、8、4、2位模型量化,降低存儲占用,提高運行效率。而且llama.cpp的server模式,兼容openai格式的訪問接口。

這里通過閱讀llama.cpp reranking源碼,分析llama.cpp運行reranker方式,探索可能的優化點。

1?llama.cpp reranking

如下所示,目前(2025.8.26)llama.cpp依然采用較傳統的reranking計算方法。

llama.cpp收到query和documents后,先tokenize處理query,后處理documents。

然后,在循環體中,針對每個處理后的tokenized_docs[i],和query一起送入tasks隊列進行計算。

? ? ? ?# query tokenize處理

? ? ? ?llama_tokens tokenized_query = tokenize_input_prompts(ctx_server.vocab, query, /* add_special */ false, true)[0];
? ? ? ? {
? ? ? ? ? ? # documents tokenize處理
? ? ? ? ? ? auto tokenized_docs = tokenize_input_prompts(ctx_server.vocab, documents, /* add_special */ false, true);
? ? ? ? ? ? for (size_t i = 0; i < tokenized_docs.size(); i++) {

? ? ? ? ? ? ? ? # 針對每個 tokenized_docs[i]進行reranking計算
? ? ? ? ? ? ? ? auto tmp = format_rerank(ctx_server.vocab, tokenized_query, tokenized_docs[i]);
? ? ? ? ? ? ? ? ...
? ? ? ? ? ? }

可見,llama.cpp采用串行方式分別計算每個<query, document>對的相關性。

以下是llama.cpp處理reranking的完整代碼,來源如下

https://github.com/ggml-org/llama.cpp/blob/master/tools/server/server.cpp

        llama_tokens tokenized_query = tokenize_input_prompts(ctx_server.vocab, query, /* add_special */ false, true)[0];// create and queue the taskjson responses = json::array();bool error = false;std::unordered_set<int> task_ids;{std::vector<server_task> tasks;auto tokenized_docs = tokenize_input_prompts(ctx_server.vocab, documents, /* add_special */ false, true);tasks.reserve(tokenized_docs.size());for (size_t i = 0; i < tokenized_docs.size(); i++) {auto tmp = format_rerank(ctx_server.vocab, tokenized_query, tokenized_docs[i]);server_task task   = server_task(SERVER_TASK_TYPE_RERANK);task.id            = ctx_server.queue_tasks.get_new_id();task.index         = i;task.prompt_tokens = server_tokens(tmp, ctx_server.mctx != nullptr);tasks.push_back(std::move(task));}task_ids = server_task::get_list_id(tasks);ctx_server.queue_results.add_waiting_tasks(tasks);ctx_server.queue_tasks.post(std::move(tasks));}ctx_server.receive_multi_results(task_ids, [&](std::vector<server_task_result_ptr> & results) {for (auto & res : results) {GGML_ASSERT(dynamic_cast<server_task_result_rerank*>(res.get()) != nullptr);responses.push_back(res->to_json());}}, [&](const json & error_data) {res_error(res, error_data);error = true;}, req.is_connection_closed);if (error) {return;}// write JSON responsejson root = format_response_rerank(body,responses,is_tei_format,documents);res_ok(res, root);

2 reranking優化探索

如上所述,llama.cpp采用串行方式分別計算每個<query, document>對的相關性。

其實,目前已經有一些效率更高的reranker計算方式。

比如,采用batch,一次性并行計算多個<query, document>對。

另外,針對reranker計算中query和instruct重復計算問題,采用自定義注意力掩碼方式,在推理中共享query和instruct部分,僅計算documents部分。

實現可參考基于自定義注意力掩碼的reranker運行速度優化-CSDN博客。

reference

---

llama.cpp http server

https://github.com/ggml-org/llama.cpp/blob/master/tools/server/server.cpp

基于llama.cpp的量化版reranker模型調用示例

https://blog.csdn.net/liliang199/article/details/150619898

基于自定義注意力掩碼的reranker運行速度優化

https://blog.csdn.net/liliang199/article/details/150612837

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

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

相關文章

ruoyi-vue(十二)——定時任務,緩存監控,服務監控以及系統接口

一 定時任務 1、 定時任務使用 1.1 概述 在實際項目開發中Web應用有一類不可缺少的&#xff0c;那就是定時任務。 定時任務的場景可以說非常廣泛&#xff0c;比如某些視頻網站&#xff0c;購買會員后&#xff0c;每天會給會員送成長值&#xff0c;每月會給會員送一些電影券&…

spring如何通過實現BeanPostProcessor接口計算并打印每一個bean的加載耗時

文章目錄實現說明&#xff1a;注意事項&#xff1a;要在Spring中通過BeanPostProcessor接口計算并打印每個Bean的加載耗時&#xff0c;我們可以利用該接口的兩個回調方法記錄Bean初始化前后的時間戳&#xff0c;然后計算時間差。 以下是實現方案&#xff1a; 首先創建一個實現B…

“品種+創新銷售”,恩威醫藥半年度業績翻倍增長

8月25日晚&#xff0c;恩威醫藥發布2025年半年度報告&#xff0c;報告期內&#xff0c;公司實現營業收入4.49億元&#xff0c;同比增長15.73%&#xff0c;歸屬于上市公司股東凈利潤達3834.42萬元&#xff0c;同比增幅113.80%&#xff0c;扣除非經常性損益凈利潤為3527.57萬元&a…

【機器學習】機器學習算法

機器學習1、K-近鄰算法KNN1.1、舉例&#xff1a;電影類型分析1.2、KNN算法流程1.3、Scikit-learn工具1.4、K-近鄰算法API1.5、距離度量1.5.1、歐式距離Euclidean Distance&#x1f525;1.5.2、曼哈頓距離Manhattan Distance&#x1f525;1.5.3、切比雪夫距離Chebyshev Distance…

python-批量安裝庫

要將當前環境中已安裝的Python庫列表導出為一個可重用的格式&#xff08;通常為requirements.txt&#xff09;&#xff0c;以便在另一個環境中再現這些庫的安裝&#xff0c;可以使用pip工具提供的功能。以下是具體步驟&#xff1a;### 使用pip freeze1. **打開命令提示符或終端…

創龍3576ububuntu系統設置靜態IP方法

創龍3576ububuntu系統設置靜態IP方法&#xff0c;執行命令進入"/etc/systemd/network/"目錄&#xff0c;請根據實際網絡環境&#xff0c;下面演示修改 eth0.network 網口靜態ip為192.168.1337.200執行&#xff1a;vim /etc/systemd/network/eth0.network 增加一句&am…

MySQL - 視圖,事務和索引

目錄一、視圖1. 問題2. 視圖是什么3. 定義視圖4. 查看視圖5. 使用視圖6. 刪除視圖7. 視圖的作用二、事務1. 定義2. 事務命令1&#xff09;回滾2&#xff09;提交3&#xff09;臟寫、臟讀、不可重復讀和幻讀三、索引1. 定義2. 索引是什么3. 索引目的4. 索引原理5. 索引的使用6. …

車載鐵框矯平機:把“鈑金診所”開到工地上

——一次從原子層面開始的平整之旅一、先想一想&#xff1a;鐵框為什么“脾氣大” 鋼板在軋制、切割、焊接、吊裝、甚至太陽暴曬時&#xff0c;內部晶粒被拉得七扭八歪&#xff0c;像揉皺的紙。宏觀上&#xff0c;我們就看到“翹、拱、扭”。矯平&#xff0c;實質上是給金屬做一…

不安全的服務器,不支持 FTP over TLS

當服務器不支持 FTP over TLS&#xff08;也稱為 FTPS&#xff09;時&#xff0c;意味著它僅支持未加密的 FTP 連接。這種情況存在顯著的安全風險&#xff0c;因為&#xff1a;數據傳輸不加密&#xff1a;用戶名、密碼以及傳輸的文件內容都會以明文形式在網絡中傳輸&#xff0c…

本地緩存與 Redis 緩存的區別與實際應用

緩存是提升系統性能、降低數據庫壓力的重要手段。Java 開發中常用的緩存方案包括 ?本地緩存&#xff08;如 Caffeine、Guava Cache&#xff09;?? 和 ?分布式緩存&#xff08;如 Redis&#xff09;?。這兩者在設計目標、使用場景、性能特點等方面有顯著差異&#xff0c;合…

從“0”開始學JAVA——第十一節 I/O流

在Java編程中&#xff0c;文件操作和輸入輸出(IO)處理是必不可少的部分。本文將深入探討Java IO包中的文件流操作&#xff0c;包括基礎概念、分類、常用類以及實際應用場景。1. File類File類是Java IO操作的基礎&#xff0c;它實現了Serializable和Comparable<File>接口。…

【數據價值化】數據資產入表指南:核心準則與實操路徑

隨著數據要素市場的蓬勃發展&#xff0c;數據資產的商業價值愈發凸顯。然而&#xff0c;如何讓數據資產合規、合理地進入企業財務報表&#xff0c;成為眾多企業急需解決的難題。本文基于《企業會計準則》的相關規定&#xff0c;為您系統梳理數據資產入表的核心準則要點與實操路…

基于 MediaPipe + Three.js 的實時姿態可視化前端

這是一套前端實時姿態捕獲與 3D 可視化的 DEMO&#xff0c;特點是啟動快、UI 現代、渲染穩定&#xff0c;同時對設備性能與網絡情況做了多處優化。 預覽地址 技術棧與核心依賴 框架與工程&#xff1a;Vite React TypeScript實時姿態識別&#xff1a;MediaPipe Tasks Vision&…

【分布式技術】Kafka 數據積壓全面解析:原因、診斷與解決方案

Kafka 數據積壓全面解析&#xff1a;原因、診斷與解決方案Kafka 數據積壓深度解析與解決方案全景指南一、數據積壓核心原因矩陣二、生產者側問題深度解析1. 突發流量洪峰2. 大消息阻塞管道三、消費者側問題深度解析1. 消費能力不足2. 消費邏輯阻塞四、Broker集群問題深度解析1.…

企業云辦公安全指南:如何構建高效無憂的云辦公環境?

2025年&#xff0c;全球化協作與混合辦公已成為企業運營的常態。越來越多的企業將業務遷移至云端&#xff0c;云辦公在提升靈活性與效率的同時&#xff0c;也帶來了新的安全挑戰——數據泄露、內部威脅、網絡攻擊等風險無處不在&#xff0c;每一個環節都可能成為企業核心資產的…

Thingsboard 租戶管理員權限,增加租戶普通用戶權限

在 ThingsBoard CE&#xff08;社區版&#xff09;中&#xff0c;租戶管理員擁有對規則鏈、客戶、資產、設備、儀表板等資源的全面管理權限。如果你想為租戶創建一個普通用戶&#xff0c;并限制其不能操作規則鏈、高級功能、安全設置等&#xff0c;可以通過以下步驟實現&#x…

【筆記】大模型業務場景流程綜述

前言 大模型是指具有大規模參數和復雜計算結構的深度學習模型,這些模型通常由眾多神經網絡構建而成,擁有數十億甚至數千億個參數。本章將圍繞大模型概念及特點展開,介紹模型算法的分類、典型大模型及應用、大模型訓練流程和大模型業務流程。 目標 學完本課程后,您將能夠…

【兩數相互求余等于輸入兩數】2022-10-20

緣由關于#c#的問題&#xff1a;這個應該按照怎么個思路來寫&#xff1a;想老半天莫得思路想法-編程語言-CSDN問答 void 兩數相互求余等于輸入兩數() {//緣由https://ask.csdn.net/questions/7813625int a 0, b 0, x 0, y 0;cin >> a >> b;if (a > b)x a, y…

Linux系統調優

目錄 1.CPU 負載查看 1.1.使用 uptime 查看系統負載 1.2.使用 top 按 CPU 使用率排序 1.3.使用 ps 查看 CPU 使用最多的進程 1.4.使用 mpstat 查看 CPU 詳細狀態 1.5.查看 /proc/meminfo 獲取詳細內存信息 2查看內存運行狀態 2.1.使用 free 查看內存使用 1.CPU 負載查看…

AtCoder Beginner Contest 420

比賽鏈接如下&#xff1a; AtCoder Beginner Contest 420 - AtCoder A - What month is it? Problem Statement You are given integers X and Y between 1 and 12, inclusive. Find what month it will be Y months after month X (for example, month 1 is January). Cons…