大模型时代,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…