召回前重排序:大规模代码到代码检索的深度学习模型基准测试

arXiv cs.CL 论文

摘要

本文对17种深度学习模型在大规模代码到代码检索的第一阶段召回中进行了基准测试,评估了它们在多种编程语言和数据集上的精确度、效率和可扩展性。文中介绍了基于LLM的代码标准化和查询重写方案,这些方案提高了性能较低模型的精确度。

arXiv:2606.27401v1 公告类型:cross 摘要:语义代码搜索和克隆检测对于软件开发、维护和重用至关重要。本文评估了当代深度学习模型在大规模代码到代码搜索引擎第一阶段召回中的有效性、效率和可扩展性。跨多种编程语言和数据集的基准测试揭示了这些模型在TB级源代码集合上精确度和可扩展性的关键限制。我们提出了基于LLM的代码标准化和查询重写方案,这些方案在性能较低的模型上取得了显著的精确度提升。我们的结果对资源受限部署的可持续性以及当前代码专用LLM跨数据集的假定鲁棒性提出了质疑。最后,我们得出了构建可扩展、高效代码检索系统的可行见解。
查看原文
查看缓存全文

缓存时间: 2026/06/29 05:26

# 召回先于重排序:面向大规模代码检索的深度学习模型基准测评
来源:https://arxiv.org/html/2606.27401
11圣安娜高等研究院,意大利比萨
11电子邮箱:\{Leonardo\.Venuta, Francesco\.Tosoni, Paolo\.Ferragina\}@santannapisa\.ithttps://www.santannapisa.it/###### 摘要

语义代码搜索和克隆检测对于软件开发、维护及复用至关重要。本文评估了当前深度学习模型在大型代码到代码搜索引擎第一阶段召回中的有效性、效率和可扩展性。跨多个编程语言和数据集的基准测试揭示了这些模型在TB级源代码库上精度与可扩展性的关键限制。我们提出了基于LLM的代码规范化与查询重写方案,显著提升了性能较弱模型的精度。研究结果对资源受限部署的可持续性以及当前代码专用LLM在跨数据集上假设的鲁棒性提出了质疑。最后,我们为构建可扩展、高效的代码检索系统总结了切实可行的见解。

## 1 引言

随着软件仓库规模达到前所未有的高度(截至2026年1月,Software Heritage(SWH)存档[1 (https://arxiv.org/html/2606.27401#bib.bib8)]持有超过2PB数据,涵盖4.21亿个项目[29 (https://arxiv.org/html/2606.27401#bib.bib60)]),开发者编写的大部分代码要么已存在于其他地方,要么在语义上存在冗余。代码搜索——从自然语言或代码查询中检索相关代码片段——因此成为软件开发与维护不可或缺的工具,支撑着代码补全、代码合成、可追溯性和漏洞检测。一个根本性矛盾始终存在:语义深度学习(DL)模型精度虽高,但推理成本高昂[11 (https://arxiv.org/html/2606.27401#bib.bib55)];而传统IR指标(BM25[18 (https://arxiv.org/html/2606.27401#bib.bib117), §11.4.3][7 (https://arxiv.org/html/2606.27401#bib.bib24), §3.2.1]、TF-IDF[18 (https://arxiv.org/html/2606.27401#bib.bib117), §6.2.2][7 (https://arxiv.org/html/2606.27401#bib.bib24), §3.1.6]和Jaccard[18 (https://arxiv.org/html/2606.27401#bib.bib117), §19.6])推理速度可达毫秒级,但仅依赖表面关键词匹配。大规模端到端检索系统通常通过**召回-重排序**两阶段范式来解决这一权衡:首先由轻量级嵌入模型将语料库\(\mathcal{C}\)缩小到一个小型候选集,然后由高精度交叉编码器对每个\(\langle q, c_i \rangle\)对进行重排序,最终输出与\(q\)最相似的代码片段。TOSS[11 (https://arxiv.org/html/2606.27401#bib.bib55)]将该架构形式化为代码到代码搜索的基线。整个流水线的关键在于第一阶段召回——这是主要瓶颈:任何在此阶段遗漏的相关片段,即使是最高级的索引或重排序器也无法找回。

### 我们的贡献。

尽管召回阶段如此核心,但其最新技术缺乏系统性分析。我们通过首次大规模实证研究来填补这一空白,系统评估了用于代码到代码搜索的DL模型选择:涵盖4个数据集、5种编程语言、17个不同的Transformer模型。该研究贡献如下:

1. 1. 基于先前工作[11 (https://arxiv.org/html/2606.27401#bib.bib55),22 (https://arxiv.org/html/2606.27401#bib.bib67)]及向前滚雪球方法,我们构建了包含17个编码器和解码器模型的大规模基准,覆盖不同架构、参数量和训练范式。我们在4个数据集、5种语言、30万+代码片段上测量了有效性(Precision@\(k\)[18 (https://arxiv.org/html/2606.27401#bib.bib117), §8.3]、NDCG[18 (https://arxiv.org/html/2606.27401#bib.bib117), §8.4])和效率(KB/秒吞吐量)。该基准共进行了920次实验(644次检索实验:23个模型 × 14个数据集 × 2个距离度量;外加276次重写实验:23个模型 × 3个数据集 × 4个变体),消耗约403 GPU小时,充分体现了评估的规模。毫无疑问,这是首次在该规模上进行的研究,也是首次将MultiPL-E数据集[4 (https://arxiv.org/html/2606.27401#bib.bib53)]应用于代码到代码检索。
2. 2. 跨5种语言(Python、Java、JavaScript、C++和C#)和4个不同数据集的经验发现揭示了质量与可扩展性之间的悖论。仅从检索质量来看,Qwen3 Embedding和CodeXEmbed在各类语言和数据集中领先,专用嵌入器远超规模大得多的通用LLM;然而,这些性能提升在大规模部署时伴随着不可接受的计算成本。轻量级模型在吞吐量上可提升一个数量级,但精度损失严重(在xCodeEval上最高达80个点),这凸显了针对具体任务和资源进行模型选择的必要性。轻量级编码器(如StarEncoder)与大型语言模型之间的吞吐量差距阻碍了中小型企业(SME)和学术研究人员在中型数据集上采用LLM嵌入索引。
3. 3. 代码重写分析表明,基于LLM的风格规范化可将对风格敏感的较弱模型(如Code Llama)的召回率提升高达29%,而顶尖模型对风格、注释和标识符的变化保持鲁棒。

我们的结果证实,模型选择必须结合具体任务和上下文,在吞吐量、准确性和语言专业化之间仔细权衡。此外,它们也强化了如下结论:混合两阶段流水线——将快速紧凑的编码器用于候选检索,与强大的LLM用于重排序相结合——仍然是最有效的架构[11 (https://arxiv.org/html/2606.27401#bib.bib55)]。我们研究的另一个启示是,尽管文献中存在大量通用和代码专用嵌入模型,但即使在Python、Java、JavaScript、C++和C#等广泛使用的编程语言中,也仍未出现普遍最优的解决方案。特别是,当考虑实际可扩展性要求且GPU资源有限时(如大多数学术场景),追求更高吞吐量往往导致检索精度的显著损失,进而严重制约了有效代码检索系统的设计。这些发现(实现已发布于anonymous.4open.science/r/benchmark_private-7D0E (https://anonymous.4open.science/r/benchmark_private-7D0E))强调了在这些场景下,需要进一步研究和大规模实证验证,以更好地理解效率、准确性和特定语言性能之间的权衡关系。关于可行指导方针和未来研究方向的更全面讨论,请读者参见第̃8节 (https://arxiv.org/html/2606.27401#S8)。

参见图注图1:端到端top-\(k\)代码检索架构。离线阶段(1-4)构建基于DL的嵌入索引;在线阶段(1'-4')搜索该索引,以检索与查询\(q\)最相似的\(k\)个代码片段。为隔离模型性能与有损压缩效应,我们通过顺序扫描计算真实最近邻。

## 2 背景

深度学习显著推进了语义代码搜索在语言到代码和代码到代码检索两方面的发展。例如,生成增强检索(GAR)[15 (https://arxiv.org/html/2606.27401#bib.bib31)]在查询到达向量索引前对其进行重写。传统IR方法(BM25[18 (https://arxiv.org/html/2606.27401#bib.bib117), §11.4.3][7 (https://arxiv.org/html/2606.27401#bib.bib24), §3.2.1]、TF-IDF[18 (https://arxiv.org/html/2606.27401#bib.bib117), §6.2.2][7 (https://arxiv.org/html/2606.27401#bib.bib24), §3.1.6]、Jaccard[18 (https://arxiv.org/html/2606.27401#bib.bib117), §19.6])推理速度可达毫秒级,但仅进行表面匹配,精度受限。相反,神经双编码器将查询和代码片段独立映射到共享向量空间[11 (https://arxiv.org/html/2606.27401#bib.bib55)],支持预计算嵌入索引以实现高效ANN搜索1 (https://arxiv.org/html/2606.27401#S1.F1)。交叉编码器联合处理查询-候选对,以可扩展性换取更高精度。这种分割催生了召回-重排序两阶段范式(TOSS[11 (https://arxiv.org/html/2606.27401#bib.bib55)]):轻量级双编码器(可选配BM25增强)首先缩小候选池,然后交叉编码器对子集进行重排序以生成最终结果。召回阶段遗漏的任何代码片段无法在下游恢复。现有基准仅呈现了不完整的图景。TOSS[11 (https://arxiv.org/html/2606.27401#bib.bib55)]在Python CodeSearchNet[12 (https://arxiv.org/html/2606.27401#bib.bib43)]上评估了CodeBERT[6 (https://arxiv.org/html/2606.27401#bib.bib78)]和GraphCodeBERT[8 (https://arxiv.org/html/2606.27401#bib.bib79)];一项更广泛的研究[22 (https://arxiv.org/html/2606.27401#bib.bib67)]在13个任务上对19个模型进行了基准测试,发现UniXcoder[9 (https://arxiv.org/html/2606.27401#bib.bib82)]和GraphCodeBERT在仅含C语言的POJ-104数据集上表现最佳。这两项工作均遗漏了更新架构(CodeSage-V2[36 (https://arxiv.org/html/2606.27401#bib.bib94)]、CodeXEmbed[16 (https://arxiv.org/html/2606.27401#bib.bib93)]、Nomic Embed[23 (https://arxiv.org/html/2606.27401#bib.bib99)]、Code Llama[28 (https://arxiv.org/html/2606.27401#bib.bib91)]、Qwen[35 (https://arxiv.org/html/2606.27401#bib.bib95)]),每种语言最多覆盖两个数据集,且忽略了吞吐量。嵌入模型也对表面风格变化敏感[15 (https://arxiv.org/html/2606.27401#bib.bib31),10 (https://arxiv.org/html/2606.27401#bib.bib29)],这影响着抄袭检测和漏洞分析。

## 3 问题陈述与研究问题

给定代码库\(\mathcal{C}\)和查询片段\(q\),**代码搜索问题**是从\(\mathcal{C}\)中检索与\(q\)在语义上最相似的top-\(k\)个片段。遵循TOSS[11 (https://arxiv.org/html/2606.27401#bib.bib55)],我们关注第一阶段召回函数\(R(q, \mathcal{C})\),它必须有效(跨多样查询和语言的高召回率)且高效(可扩展到大规模代码存档)。我们的主要研究问题如下:

- RQ1:当前代码嵌入模型在第一阶段召回中的有效性如何?哪些架构因素(编码器类型、大小、预训练数据)对性能影响最大?
- RQ2:在非常大的代码片段集合上部署这些模型时,哪些吞吐量和基础设施瓶颈占据主导地位?
- RQ3:语义保持变换(变量重命名、注释插入与删除)在多大程度上影响检索效果?哪些重写策略最有前景?

我们在第̃4节 (https://arxiv.org/html/2606.27401#S4)、第̃5节 (https://arxiv.org/html/2606.27401#S5)和第̃6节 (https://arxiv.org/html/2606.27401#S6)中通过Precision@\(k\)[18 (https://arxiv.org/html/2606.27401#bib.bib117), §8.3]和NDCG[18 (https://arxiv.org/html/2606.27401#bib.bib117), §8.4]评估了17个模型在4个数据集、5种编程语言上的表现,以回答RQ1。针对RQ2,我们在第̃6节 (https://arxiv.org/html/2606.27401#S6)中表明嵌入速率是可扩展性的关键(例如,BigCloneBench的600万方法[31 (https://arxiv.org/html/2606.27401#bib.bib101)]),使得IR方法或有损嵌入压缩[19 (https://arxiv.org/html/2606.27401#bib.bib40),25 (https://arxiv.org/html/2606.27401#bib.bib39)][7 (https://arxiv.org/html/2606.27401#bib.bib24), §13.7]对于大型语料库更实用。针对RQ3,在第̃7节 (https://arxiv.org/html/2606.27401#S7)中,我们研究了应用于查询和/或代码库的基于LLM和基于规则的重写方法。

分组模型YTAPJ/SC#PDim.KB/s早期双模态编码器CodeBERT[6 (https://arxiv.org/html/2606.27401#bib.bib78)]'20GE∙\\bullet∙\\bullet∙\\bullet125M768105G-CodeBERT[8 (https://arxiv.org/html/2606.27401#bib.bib79)]'21GE∙\\bullet∙\\bullet∙\\bullet125M768125CoTexT[26 (https://arxiv.org/html/2606.27401#bib.bib77)]'21GE/D∙\\bullet∙\\bullet220M768116SPT-Code[21 (https://arxiv.org/html/2606.27401#bib.bib76)]'21GE∙\\bullet∙\\bullet262M768165统一编码器-解码器PLBART[2 (https://arxiv.org/html/2606.27401#bib.bib75)]'21GE/D∙\\bullet140M76898CodeT5[33 (https://arxiv.org/html/2606.27401#bib.bib80)]'21GE/D∙\\bullet∙\\bullet∙\\bullet220M76869770M21UniXcoder[9 (https://arxiv.org/html/2606.27401#bib.bib82)]'22GE/D∙\\bullet∙\\bullet∙\\bullet125M768107CodeT5+[34 (https://arxiv.org/html/2606.27401#bib.bib100)]'23GE/D∙\\bullet∙\\bullet∙\\bullet110M768128220M1024129代码嵌入器StarEncoder[17 (https://arxiv.org/html/2606.27401#bib.bib65)]'23EE∙\\bullet∙\\bullet∙\\bullet125M768140CodeXEmbed[16 (https://arxiv.org/html/2606.27401#bib.bib93)]'23EE∙\\bullet∙\\bullet∙\\bullet400M1024282B7CodeSage-V2[36 (https://arxiv.org/html/2606.27401#bib.bib94)]'23EE∙\\bullet∙\\bullet∙\\bullet356M2048451.3B15CR-Embed[30 (https://arxiv.org/html/2606.27401#bib.bib97)]'24EE∙\\bullet∙\\bullet137M76867Nomic E.C.[23 (https://arxiv.org/html/2606.27401#bib.bib99)]'25EE∙\\bullet∙\\bullet7B35842代码纯解码器LLMGranite Code[20 (https://arxiv.org/html/2606.27401#bib.bib83)]'24GD∙\\bullet∙\\bullet∙\\bullet3B256098B1Code Llama[28 (https://arxiv.org/html/2606.27401#bib.bib91)]'24GD∙\\bullet∙\\bullet∙\\bullet7B40962Qwen3 Coder[35 (https://arxiv.org/html/2606.27401#bib.bib95)]'25GD∙\\bullet∙\\bullet∙\\bullet30B20483Qwen3 Emb.[37 (https://arxiv.org/html/2606.27401#bib.bib96)]'25GD∙\\bullet∙\\bullet∙\\bullet600M1024748B40969表1:所选模型,按架构分组,组内按年份(Y)排序。
## 4 模型选择

我们从先前基准测试[11 (https://arxiv.org/html/2606.27401#bib.bib55),22 (https://arxiv.org/html/2606.27401#bib.bib67)]中收集模型,并在Google Scholar上通过向前滚雪球法(关键词:'code embedding'、'code retrieval'、'code search'、'bi-encoder')进行补充。最终选定17个模型(参数范围125M至30B),基于四个标准:(i) **架构范式**:双编码器(如CodeRankEmbed[30 (https://arxiv.org/html/2606.27401#bib.bib97)])、编码器-解码器(如CodeT5[33 (https://arxiv.org/html/2606.27401#bib.bib80)])以及以嵌入模式运行的纯解码器LLM(如Code Llama[28 (https://arxiv.org/html/2606.27401#bib.bib91)]、Qwen3[35 (https://arxiv.org/html/2606.27401#bib.bib95)]);(ii) **模型规模**:优先选择每个系列的基础变体;(iii) **来源**:开源权重、代码专用训练、多样化的组织来源;(iv) **先前性能**:根据[22 (https://arxiv.org/html/2606.27401#bib.bib67)],我们保留了精度超过85%的模型(PLBART、CoTexT、CodeT5、SPT-Code、UniXcoder、CodeBERT、GraphCodeBERT),剔除了权重不可用的DOBF、SynCoBERT和TreeBERT。我们排除了传统IR基线(BM25、TF-IDF、Jaccard)。正如[11 (https://arxiv.org/html/2606.27401#bib.bib55)]所确定的,在代码到代码检索中,深度学习始终优于基于规则的匹配,因为语义相似性需要比表面词汇重叠更深入的分析。选择最优IR指标来增强神经嵌入与第一阶段召回正交,属于后续重排序分析的范畴[11 (https://arxiv.org/html/2606.27401#bib.bib55)]。表̃1 (https://arxiv.org/html/2606.27401#S3.T1)报告了每个模型的发布年份;目标(T):嵌入/检索(E)或通用(G);架构(A):编码器(E)、纯解码器(D)或编码器-解码器(E/D);语言支持:Java和P

相似文章

超越检索:代码搜索的多任务基准与模型

Hugging Face Daily Papers

本文介绍了 CoREB,这是一个针对代码搜索的、受数据污染限制的多任务基准测试,具备微调重排序能力,可评估文本到代码、代码到文本以及代码到代码的检索效果。

SkillRet:面向 LLM 智能体技能检索的大规模基准

arXiv cs.AI

本文提出了 SkillRet,这是一个用于评估 LLM 智能体技能检索的大规模基准,旨在解决从大型技能库中选择相关技能的挑战。该基准提供了包含超过 17,000 项技能的 dataset,并证明针对特定任务的微调能显著提升检索性能。