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 task
        json 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 response
        json 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

相关推荐
gergul1 小时前
在llama-cpp-python中使用自己编译的llama.cpp,解决pip install llama-cpp-python报错
python·llama·llama.cpp·llamacpppython
黑牛儿2 小时前
零成本!Ollama本地部署国产大模型全指南(支持Kimi-K2.5/GLM-5/Qwen,新手秒上手)
ai·llama
奇思智算21 小时前
LLaMA/Bert/扩散模型微调GPU选型及租用指南
人工智能·bert·llama
xingyuzhisuan21 小时前
LoRA微调实战:8卡4090服务器如何高效微调LLaMA?
运维·服务器·llama·gpu算力
yumgpkpm2 天前
华为昇腾910B上用Kubernetes(K8s)部署LLM和用Docker部署LLM的区别
docker·chatgpt·容器·stable diffusion·kubernetes·llama·gpu算力
yumgpkpm2 天前
华为昇腾910B上用Kubernetes(K8s)部署LLM(Qwen3-32B)的详细步骤,保姆级命令及方法、下载链接等
运维·服务器·华为·stable diffusion·aigc·copilot·llama
YanDDDeat2 天前
【大模型微调】基于 Llama3-8B 的 LoRA 微调专有领域QA 问答对生成模型
python·语言模型·llama
tinygone3 天前
OpenClaw之Memory配置成本地模式,Ubuntu+CUDA+cuDNN+llama.cpp
人工智能·ubuntu·llama
建行一世3 天前
【Windows笔记本大模型“傻瓜式”教程】使用LLaMA-Factory工具来完成对Windows笔记本大模型Qwen2.5-3B-Instruct微调
windows·ai·语言模型·llama
Thomas.Sir4 天前
第二章:LlamaIndex 的基本概念
人工智能·python·ai·llama·llamaindex