SLMFL:基于小语言模型的结构与语义融合故障定位方法

基本信息

Information and Software Technology 2026

博客贡献人

谷雨

作者

Fan, Xin and Hu, Junsong and Zheng, Wei and Liu, Yunlong and Gao, Shuaiyin

标签
Fault localization;Small Language Models;Abstract Syntax Tree
软件故障定位;小语言模型;抽象语法树

摘要

研究背景

        软件故障定位(SFL)是软件调试的核心技术,对提升软件开发与维护效率至关重要。大语言模型(LLMs)开创了无需测试用例的软件故障定位新范式,但这类模型因计算成本极高、依赖外部 API 处理代码引发隐私安全问题,严重限制了实际应用。这些不足表明,亟需一种轻量化、隐私保护、易部署的替代方案,取代基于大语言模型的软件故障定位方法。

研究目标

        本文针对上述挑战,提出SLMFL—— 一种基于小语言模型(SLMs)的轻量化故障定位框架。为弥补小语言模型语义理解能力有限的问题,SLMFL 通过多任务学习适配器融合代码的结构与语义知识。该适配器引入行级抽象语法树(AST)节点类型预测作为辅助任务,将结构信息与语义特征结合,显著提升模型的结构感知能力。此外,本文设计混合损失函数,协同优化分类与排序目标。

研究方法

        在 Defects4J 基准数据集上开展10 折交叉验证实验,保障结果稳健性。采用 Top-N、平均首次排名(MFR)、平均排名均值(MAR)等指标,将 SLMFL 与当前最优基线方法、传统基于频谱(SBFL)/ 基于变异(MBFL)的故障定位方法对比,评估其有效性。

研究结果

        SLMFL 在 Top-1 等指标上优于所有基线方法。其中,SLMFL-3B在 Top-1 指标上成功定位 105 个故障,相比 LLMAO-16B 性能提升 19.3%,参数量仅为后者的 20% 以下;同时推理时间减少 91.6%,峰值显存占用降至 8.5GB。此外,该模型在未见过的 Defects4J 2.0.0 数据集上展现出强大的跨版本泛化能力

研究结论

        SLMFL 为软件故障定位提供了轻量化、高效的解决方案。实验证明,通过细粒度的抽象语法树结构监督增强小语言模型,可使其在软件故障定位任务中性能超越规模大得多的大语言模型

1 引言

        软件调试是软件开发生命周期中关键且耗时的阶段。研究显示,开发者会花费 20% 至 40% 的时间用于调试。调试工作的核心环节是软件故障定位(SFL),即定位源代码中的错误位置,这也是调试中最具挑战性的步骤。随着软件系统规模与复杂度不断提升,人工故障定位已愈发不切实际。因此,业界亟需高效的自动化故障定位技术。

        现有的自动化故障定位技术通常依赖静态程序分析测试用例的动态执行信息。例如,基于频谱的故障定位(SBFL)根据通过 / 失败测试用例的覆盖轨迹,计算程序元素(语句、分支等)的可疑度并排序。多种方法提出了不同的通用计算公式,但这些公式在测试覆盖不足时,易生成相同分数,导致排序模糊。基于变异的故障定位(MBFL)通过注入变异体、对比原程序与变异体的测试执行差异,识别可疑语句,但该方法计算开销极大,还会产生大量等价变异体(测试中行为与原程序完全一致)。

        现有的基于机器学习的故障定位(MLFL)方法(如 DeepFL)融合代码复杂度、文本相似度等多种特征,但仍依赖测试生成的输入。传统方法与多数机器学习方法根本上依赖完备、高覆盖的测试集,而实际场景中这类测试集往往缺失。这种依赖严重限制了方法的适用性,在覆盖不足时易导致定位结果不可靠。

        近年来,大语言模型(LLMs)在代码生成任务取得突破性进展,为故障定位开辟了全新研究范式。与传统方法不同,基于大语言模型的方法直接利用对源代码的深度语义理解定位错误。例如,LLMAO 采用轻量化双向适配器微调模型,实现故障定位,开创了无需测试用例的行级故障定位范式;SoapFL 模拟开发者调试流程,将项目级故障定位拆解为故障理解、代码库导航、故障确认三个标准化步骤,实现全软件项目的有效故障定位。

        但基于大语言模型的故障定位仍是新兴领域,探索有限,现有方法面临两大核心挑战:

  1. 依赖超大模型(如 LLMAO 使用 160 亿参数的 CodeGen)或昂贵的商业 API(如 SoapFL 使用 ChatGPT),部署成本极高,严重阻碍实际应用;
  2. 上下文长度限制模型有效性,LLMAO 仅支持 128 行输入窗口,既限制模型全局理解能力,也脱离真实场景(实际源码文件常含数百至数千行代码)。

        因此,亟需一种能处理完整源码文件、计算高效的故障定位方法。

        为解决上述问题,本文提出SLMFL—— 基于小语言模型(SLMs)的轻量化故障定位方法。首先,选用通义千问 2.5-Coder(Qwen2.5-Coder)的 0.5B、1.5B、3B 版本作为骨干模型,该小语言模型支持32k 令牌上下文窗口,可无截断处理完整故障源码文件,更贴合实际故障定位场景。其次,为弥补小语言模型语义理解的固有缺陷,引入行级抽象语法树(AST)节点类型预测辅助训练任务,通过该任务训练,模型获得更强的结构感知能力,学会识别代码元素、理解元素间的预期关系与模式。

        该结构感知能力对故障定位价值显著。图 1 以 Apache Commons Lang 的真实漏洞为例,条件分支后缺失参数校验,结构感知能力让模型识别到 “无 else 分支且缺失校验逻辑” 是潜在故障。通过在抽象语法树层面理解预期代码结构,模型能检测到纯语义驱动模型遗漏的错误。重要的是,该辅助任务仅在训练阶段使用,推理阶段无额外开销,保障模型计算效率。

图 1:Apache Commons Lang 中一个结构缺失的示例。

主要贡献

  1. 提出基于小语言模型的 SLMFL 方法,以低部署成本实现完整源码文件的故障定位;
  2. 引入行级抽象语法树节点类型预测辅助任务,增强模型结构感知能力,直接提升故障定位精度;
  3. 设计混合损失函数,协同优化分类与排序目标,有效解决类别不平衡问题,优化排序精度;
  4. 通过与当前最优模型的全面对比,验证 SLMFL 的有效性与优越性。

        本文结构如下:第 2 节回顾软件故障定位与语言模型的背景知识;第 3 节详细阐述所提模型及组件;第 4 节介绍实验设置、结果与分析;第 5 节梳理软件故障定位的相关工作;第 6 节分析研究的有效性威胁;第 7 节总结全文并展望未来研究方向。


2 背景知识

        本节介绍软件故障定位方法(2.1 节),回顾语言模型的基础概念(2.2 节)。

2.1 软件故障定位

        软件故障定位是软件调试的核心难题。理论上,该任务需从有限观测中推断并排序程序元素,找出最可能出错的部分。形式化定义:设程序 P 包含一组元素

\mathbf{P} = \{p_1, p_2, \cdots, p_n\} \quad (1) 

        本文假设已通过粗粒度检索步骤定位到故障文件,聚焦单文件内的故障精确定位

        软件故障定位的目标是构建可疑度函数

s: P \to \mathbb{R} \quad (2)

对所有p_{i} \in P_{i},输出s(p_{i})反映元素与故障的关联强度。对s(p_{i})排序后,开发者可优先检查高可疑度候选,降低调试成本。

软件故障定位历经多种理论范式:

  • 基于频谱的故障定位(SBFL):将执行轨迹转化为覆盖矩阵,用统计指标关联元素与测试失败;
  • 基于变异的故障定位(MBFL):通过测量代码变异对程序正确性的影响,实现因果推断;
  • 近年基于学习的方法:将任务形式化为监督学习或排序学习,学习输入空间 X 到输出空间 Y 的映射 f: X \to Y

        输入通常结合覆盖、语法、语义特征,计算程序元素的可疑度分数。近期大语言模型实现语义驱动范式,依托深度语义理解定位故障,降低对测试覆盖的依赖。

        这一演进表明,软件故障定位已超越调试工具范畴,成为融合统计推断、因果分析、表示学习的跨学科研究领域,始终在精度、效率、泛化性之间寻求平衡。

2.2 语言模型

        语言模型(LMs)的兴起彻底变革了代码智能研究。语言模型最初为自然语言处理研发,在代码理解与生成任务中同样表现优异,这源于代码的结构化特性 —— 与自然语言类似,代码遵循词法、语法、语义规则。通过学习长距离依赖与结构模式,语言模型可辅助开发者理解与分析复杂软件系统。

2.2.1 Transformer 架构

        现代语言模型核心依赖 Transformer 架构与自注意力机制。自注意力通过计算序列内所有令牌对的交互,捕获全局依赖关系,这一能力至关重要,因为相关代码元素(如函数定义与调用)往往距离较远。传统循环神经网络(RNNs)难以处理这类长距离依赖,而自注意力可直接建立全局连接。此外,Transformer 的并行性支持大规模高效训练,不仅在自然语言处理中表现卓越,也为代码语言模型奠定了坚实技术基础。

2.2.2 大语言模型

        基于 Transformer 的大语言模型在代码相关任务取得突破性进展。典型案例包括:OpenAI 的 GPT-5,在复杂前端工程、跨规模代码库辅助任务中表现优异;谷歌的 Gemini 2.5 Pro,在 LiveCodeBench 等基准测试中达到顶尖性能;开源模型如 DeepSeek-Coder,性能可与闭源模型媲美;通义千问代码模型(Qwen-Coder)展现出强大的多语言代码生成能力。这类模型参数量通常达数十亿至数千亿级,在海量代码与自然语言语料上预训练,具备强大的代码生成与理解能力。

        但大语言模型实际部署面临多重关键挑战

  1. 规模庞大,需大量计算与存储资源,多数机构难以本地部署;
  2. 依赖外部 API,无法满足企业严格的安全要求,限制广泛应用;
  3. 推理延迟高,阻碍快速迭代与实时调试。

        因此,尽管大语言模型性能优异,但高成本与部署壁垒使其难以在实际工程中大规模落地。

2.2.3 小语言模型

        与之相对,小语言模型(SLMs)参数量通常为数百万至数十亿级,体积小巧、计算需求低,愈发受到研究者与从业者关注。研究表明,小语言模型更适配高度专业化的任务。

        小语言模型具备两大核心优势:

  1. 部署成本低,可在本地服务器或个人电脑上推理,代码隐私保护效果显著;
  2. 推理效率高,为软件开发提供更快反馈。

        有研究指出,相比大语言模型,小语言模型的延迟、能耗、计算开销至少降低一个数量级。但在需要深度语义理解或复杂推理的任务中,小语言模型性能通常弱于当前最优的大语言模型。因此,研究者正积极探索如何发挥小语言模型的效率优势,同时弥补其专业任务的性能短板

图 2:SLMFL 的总体框架。

3 方法

        为解决小语言模型语义理解有限的问题,本文提出SLMFL 框架,联合建模代码结构与语义,实现更深度的代码理解与更精准的故障定位。如图 2 所示,SLMFL 通过两条并行流处理输入程序:

  • 结构流:将代码解析为抽象语法树,提取行级节点类型;
  • 语义流:预训练小语言模型将每行代码编码为特征向量。

两种表示经融合后,输入轻量化 Transformer 适配器处理。

SLMFL 采用多任务学习策略训练适配器:

  • 主任务:故障定位,采用融合二元交叉熵、成对排序、Top-k 聚焦损失的混合损失函数,优化分类能力;
  • 辅助任务:行级抽象语法树节点类型预测,强制模型学习代码结构。

        联合优化策略最终让模型输出每行代码的可疑度分数,实现精准故障定位,推理阶段无额外开销

3.1 小语言模型提取行级特征

        小语言模型作为大语言模型的轻量化替代方案,专为低部署成本需求设计。小语言模型主要通过两种路径生成:

  1. 在小规模语料上从头训练小模型,构建基础语义理解能力;
  2. 压缩现有大语言模型,采用知识蒸馏、权重剪枝等技术,大幅缩减模型体积与计算成本,同时保留核心性能。

        小语言模型专为效率优化,即便在资源有限的环境中,也能完成稳健的代码语义分析。模型生成的内部表示包含丰富的上下文信息,通过微调可高效适配软件故障定位任务。小语言模型兼具强大的表示能力与高运行效率(推理更快、能耗更低),是开发实际故障定位工具的理想基础。

图 3:利用SLMs从源代码中提取行级语义特征的流程。

        如图 3 所示,输入代码先经通义千问 2 分词器(Qwen2 Tokenizer)分词,转化为令牌序列;每个令牌对应唯一索引,通过嵌入矩阵映射为向量表示:

e_{i}=W_{emb}[id_{i}], i=1,2, ..., n \quad(4)

        其中id为令牌在词汇表中的索引,e_{i} \in \mathbb{R}^{d}为令牌的向量表示。

        小语言模型以嵌入向量序列E={e_{1}, e_{2}, ..., e_{n}}为输入,经多层 Transformer 解码器处理,输出上下文感知的隐藏状态序列:

H=\{ h_{1}, h_{2}, ..., h_{n}\} , h_{i}\in \mathbb {R}^{d} \quad(5)

        其中H为模型最后一层的隐藏状态序列,每个元素h_{i}为第i个令牌的d维语义向量表示。

        SLMFL 选取每行最后一个令牌的隐藏状态作为该行的语义表示。该选择基于自回归模型的原理:最后一个令牌的表示天然聚合了前文所有上下文信息。行级特征的形式化定义为:

z_{j}=h_{\left(t_{end }^{(j)}\right)}, j=1,2, ..., m \quad(6)

        其中m为代码总行数,z_{j}为第j行的行级特征向量,t_{end }^{(j)}为第j行最后一个令牌。最终行级特征Z={z_{1}, z_{2}, ..., z_{m}}输入多任务学习适配器。

3.2 抽象语法树提取行级节点类型

        为给多任务学习提供结构化监督,SLMFL 通过自动化流程从抽象语法树中为每行代码提取唯一语法标签。该流程分为两步:先为每行选取代表性节点,再泛化该节点的类型。

        核心难题是为单行代码匹配单一代表性节点—— 单行代码常对应抽象语法树中的多个候选节点(如 for 循环语句包含循环结构与内部变量初始化)。为解决该问题,本文通过启发式规则,选取结构最关键的节点代表该行。

图 4:将AST节点映射到广义的行级节点类型。

        提取工作首先解决 “代码行与单一语法角色关联” 的模糊性。如图 4 所示,以节点深度为指导,选取覆盖该行、语法操作最具代表性的最深层节点(如 if 语句、return 语句),确保每行代码的标签反映其最具体、最基础的操作。

        提取的第二步是泛化抽象语法树的节点类型:将语法节点映射为更抽象的类别,生成简化的代码语义表示。例如,if 语句、for 语句、while 语句等具体控制流结构,统一归为控制(CONTROL)大类。

        本文采用Tree-Sitter 解析库完成类型提取,依托其高效性与鲁棒性实现精准分析。

3.3 多任务学习适配器

        小语言模型虽能有效捕获代码语义,但在理解复杂逻辑关系、语法结构方面弱于大模型。软件故障定位任务常依赖语法模式(如循环边界、条件语句、变量声明),这类结构比注释、导入语句更易出错。仅依赖语义表示,模型无法利用这些语法模式,导致定位精度下降。为此,本文在多任务学习适配器中引入行级抽象语法树节点类型预测辅助任务。

        该适配器要求模型为每行同时预测两个目标:抽象语法树节点类别(如声明、控制、表达式)与二元标签。辅助任务强制模型学习不同代码行的独特功能角色:无该监督时,行表示在空间中趋于同质化,模糊逻辑差异;有该监督时,模型能更好捕获行间关系,更易检测逻辑异常。

        SLMFL 架构核心为共享的语义 - 结构编码器+两个任务专属头。多任务学习适配器是搭载旋转位置编码(RoPE)、前馈层、层归一化的 Transformer 模块,处理输入语义向量,生成捕获长距离依赖的深度上下文感知表示;这些表示分别输入节点类型分类头与故障定位头。整个模型端到端训练,联合优化目标为:

\mathcal{L}=\mathcal{L}_{main}+\lambda \mathcal{L}_{aux } \quad(7)

        其中\mathcal{L}_{main}为故障定位主任务损失,\mathcal{L}_{aux}为行级抽象语法树节点类型预测辅助任务损失,\lambda为平衡两项任务贡献的权重系数。

多任务设计的核心动机有两点:

  1. 仅依赖主任务易生成纠缠的表示,模糊语法差异,难以检测特定代码结构关联的语义异常。引入行级抽象语法树节点类型预测辅助任务,促使共享隐空间更明确地编码语法角色,帮助主任务更好识别基于结构的异常(如条件分支内缺失校验);
  2. 主任务面临稀疏、高度不平衡的监督(故障行极少),辅助任务为每行提供密集、确定的训练信号,正则化模型训练,降低过拟合稀缺故障标签的风险。

        另一动机是效率:将结构信息作为显式输入特征加入主任务,会增加输入维度、提升推理成本;而辅助任务让模型在训练阶段直接将结构规律融入适配器参数,仅训练阶段使用,推理阶段无额外开销,却能提升结构感知能力。

3.4 混合损失函数

        模型采用多任务训练,但故障定位是核心目标。为此,本文设计混合损失函数,融合三类互补损失:二元交叉熵(BCE)、成对排序损失、Top-k 聚焦损失。其中,二元交叉熵损失处理任务的逐点分类问题,排序损失与聚焦损失则显式优化高可疑度行的排序。

二元交叉熵(BCE)损失

        用于行级故障分类,模型需输出每行包含故障的可疑度概率,公式为:

\mathcal{L}_{\text{BCE}} = -\frac{1}{N}\sum_{i=1}^{N}\left[y_i \log(\hat{y}_i) + (1-y_i)\log(1-\hat{y}_i)\right] \quad(8)

        其中N为代码总行数,y_{i} \in{0,1}为真实标签(1 代表故障行,0 代表正常行),y_{i}为模型预测的第i行可疑度概率。二元交叉熵损失直接衡量预测与真实标签的差异,赋予模型基础分类能力。

成对排序损失

        故障定位中,可疑行的相对排序比绝对分类更关键。为此引入成对排序损失,显式优化模型将故障行排序在正常行之前的能力,形式化定义为:

\mathcal{L}_{\text{rank}} = \frac{1}{|P|}\sum_{(i,j)\in P}\log\left(1 + \exp\left(-(\hat{y}_i - \hat{y}_j)\right)\right) \quad(9)

        其中P为所有正负样本对集合,|P|为样本对总数,\hat{y}_{i}为模型预测的故障行i可疑度值,\hat{y}_{j}为模型预测的正常行j可疑度值。排序损失通过构建正负样本对、最小化分数间隔,促使模型将故障行排在正常行之前。该方法相比逐点二元交叉熵,在故障稀疏场景下优势显著,可避免模型退化为 “全部分类为正常行” 的 trivial 解,确保稀有故障获得高排名。

Top-k 聚焦损失

        成对排序虽能建立相对顺序,但大量正常行仍会主导优化过程,导致模型难以优先关注稀有故障。为进一步优化排序、贴合 “开发者仅检查前 k 行” 的实际场景,本文提出Top-k 聚焦损失,公式为:

L_{t o p k}=-\frac{1}{k} \sum_{i \in T_{k}}\left(y_{i} log \hat{y}_{i}+\left(1-y_{i}\right) log \left(1-\hat{y}_{i}\right)\right)\quad(10)

        其中T_k​为按可疑度排序的前 k 行集合。与标准二元交叉熵平等对待所有样本不同,Top-k 聚焦损失显式赋予高可疑度候选更高权重,强制模型聚焦这一小部分高概率集合,放大关键行的学习信号,确保前 k 候选的优化精度更高。

        混合损失函数分层融合三类互补原则,形成协同优化目标:二元交叉熵损失提供故障判别基础;成对排序损失强化可疑行的相对排序;Top-k 聚焦损失聚焦关键候选,优化排序结果,与实际调试目标对齐。主任务总损失为:

L_{main }=L_{BCE}+\alpha L_{rank}+\beta L_{topk } \quad(11)

        其中α、β为平衡不同优化目标的权重因子。

        行级抽象语法树节点类型预测任务采用多分类交叉熵(CE)损失,目标是准确预测每行的抽象语法树节点类型:

L_{aux }=-\sum_{i=1}^{N} \sum_{c=1}^{C} y_{i, c} log \hat{y}_{i, c} \quad(12)

        其中N为代码行数,C为节点类型类别数,y_{i,c}​为第i行在类别c下的真实标签,\hat{y}_{i, c}为模型预测的第i行属于类别c的概率。

        该混合损失函数融合语义与结构理解,主任务驱动故障语义学习,辅助任务强化结构感知。双重监督策略提升模型泛化能力,实现更稳健的故障定位,且推理阶段无任何额外开销

4 实验

4.1 研究问题

        RQ1:SLMFL 与当前最优方法相比,性能表现如何?RQ2:行级抽象语法树节点类型预测辅助任务如何提升故障定位性能?该辅助任务的性能增益在不同规模小语言模型中如何变化?RQ3:混合损失函数相比二元交叉熵损失的优势是什么?其各组件对性能提升的贡献如何?RQ4:SLMFL 在未见过的项目中泛化性能如何?RQ5:在计算效率与开销方面,SLMFL 与基于大语言模型的基线相比表现如何?

        RQ1 评估 SLMFL 与当前最优、传统方法的整体性能;RQ2 探究结构感知如何弥补不同规模小语言模型的语义缺陷;RQ3 验证混合损失对单一损失的超越性,量化各组件贡献;RQ4 评估 SLMFL 在未见过的真实项目中的泛化能力;RQ5 量化计算开销(预处理、训练、推理时间 + 显存占用),验证 SLMFL 的轻量化特性。

4.2 数据集

为验证方法有效性,选用Defects4J 数据集,该数据集包含多个 Java 项目的真实故障。

  • Defects4J 1.2.0:包含 6 个 Java 项目的 395 个真实故障,覆盖多种常见故障类型(见表 1);
  • Defects4J 2.0.0:数据集升级版,包含 17 个项目的 835 个真实故障。为保障数据有效性,选取与 1.2.0 版本完全不同的 11 个项目(见表 2)。

4.3 实验设置

        在 Defects4J 1.2.0 上采用10 折交叉验证,每轮 1 折验证、9 折训练,最大化数据利用率、降低单划分偏差,保障结果稳健性;同时通过全子集性能评估,降低分区过拟合风险,提升泛化能力。

        为与 LLMAO 等基线公平对比,遵循细粒度软件故障定位的标准流程,假设已知故障文件。推理阶段,SLMFL 以故障源码文件为输入,对所有行打分、排序,实现故障定位。

        参照现有评估方法,开展跨版本泛化测试:模型仅在 Defects4J 1.2.0 上训练,在完全未见过的 Defects4J 2.0.0 基准上测试,验证在未知数据上的有效性。

        表 3 为超参数设置:遵循大语言模型训练惯例,更大规模预训练小语言模型使用更小学习率;权重参数\lambda\alpha\beta通过验证集网格搜索调优;采用 AdamW 优化器训练。所有实验在搭载 NVIDIA A6000 显卡、AMD EPYC 7763 CPU、64GB 内存的服务器上完成。

4.4 评估指标

采用软件故障定位的标准指标评估模型:

  1. Top-N:可疑度列表中,真实故障行排在前 N 位的故障总数,数值越高性能越好;报告 Top-1、Top-3、Top-5 作为核心指标;
  2. 平均首次排名(MFR):所有故障中,首个真实故障语句在排序列表中的平均排名,数值越低性能越好;
  3. 平均排名均值(MAR):所有故障中,全部真实故障语句的平均排名,数值越低定位精度越高。该指标评估模型将所有故障行排前的能力,是候选行数量大时的全局性能关键指标。

4.5 结果分析

RQ1:与基线方法对比

        选取 3 类传统基于频谱的故障定位方法、2 类传统基于变异的故障定位方法、5 类当前最优机器学习方法作为对比基线。其中 DeepFL 为方法级定位,其余基线均为语句级 / 行级技术。

        如表 4 所示,SLMFL 在Top-1 指标上超越所有当前最优方法,Top-3、Top-5 表现极具竞争力。具体而言,SLMFL 比最接近的竞争对手 CodeHealer 多定位 7 个 Top-1 故障,同时获得最优 MFR、MAR 分数,印证整体优越性。

        与 LLMAO 对比,SLMFL 优势尤为显著:即便在更具挑战的完整文件上下文场景、模型规模相当(0.5B vs 0.35B)的条件下,SLMFL 在 Top-1、Top-3、Top-5 分别多定位 15、16、22 个故障,性能提升 18.3%、15.1%、17.5%。该差距印证核心结论:LLMAO 仅依赖语义是关键缺陷,结构感知 + 语义理解是实现高精度故障定位的核心,可显著提升精度与鲁棒性。

图 5:MFR指标的SFL结果。

图 6:MAR指标的SFL结果。

        如图 5、图 6 所示,SLMFL-3B 获得所有模型中最低的 MFR、MAR 分数,故障定位排序精度最高,全面领先。

RQ1 结论:SLMFL 在 Top-1 指标上定位 105 个故障,超越当前最优方法;与同等规模、纯语义的 LLMAO 相比优势显著,印证结构感知与语义融合对高精度故障定位的必要性。

RQ2:行级抽象语法树节点类型预测任务的有效性

        针对 RQ2,在 0.5B、1.5B、3B 三种模型规模上消融辅助任务。为严格分离结构监督的贡献,对比采用标准二元交叉熵损失,排除混合损失组件干扰。表 5 证实:语义 + 抽象语法树组合在所有规模、所有指标上均优于纯语义方案。

表 5:不同训练方法及模型规模下SFL的有效性。

图 7:不同尺度下 LLMAO 与 SLMFL 变体的TOP-1对比图。

        如图 7 所示,该受控消融实验分离了 “结构 - 语义融合” 与通义千问模型基础能力的效果:仅用纯语义、通义千问 3B 骨干在完整文件定位任务中 Top-1 得分为 82,虽架构更先进,仍低于 LLMAO-16B 基线的 88 分,说明仅靠更强骨干无法实现 SLMFL-3B 对 LLMAO-16B 的超越。加入行级抽象语法树节点类型预测任务后,通义千问 3B 的 Top-1 得分升至 99(提升 20.7%);搭配完整混合损失函数后,得分达 105,超越 LLMAO-16B 19.3%。

        最小规模模型呈现相同规律:纯语义的通义千问 0.5B Top-1 得分为 75,低于受限 128 行搜索空间下 LLMAO-0.35B 的 82 分;加入结构信息后得分升至 93(提升 24%)。多规模结果证实:性能增益源于方法提供的结构信息,而非语言模型本身

        性能增益幅度随模型规模变化:Top-1 增益从 0.5B 的 24.0%、1.5B 的 22.2%,降至 3B 的 20.7%。该趋势表明:更小模型因内在结构知识匮乏,从显式抽象语法树指导中获益更多;更大模型通过预训练习得更多结构知识,外部结构信号的边际收益降低。但即便 SLMFL-3B 仍有超 20% 的提升,印证结构 - 语义融合在所有测试规模中均至关重要。

RQ2 结论:辅助任务在所有小语言模型规模上均持续提升定位性能,增益与模型规模负相关;显式结构指导对内在语义理解较弱的小模型最为关键。

RQ3:混合损失函数的效果

        为验证混合损失函数,开展消融实验,分离三类组件的贡献。为严格评估优化目标的影响,在无行级抽象语法树节点类型预测任务的条件下,测试 SLMFL-3B 的四种配置。

表 6:不同损失函数下SFL的有效性。

        如表 6 所示,二元交叉熵基线性能最差,证实纯二元分类不足以实现有效排序;加入成对损失或 Top-k 聚焦损失均带来显著增益,且两类损失各有优势:成对损失擅长提升整体排序质量(Top-3、Top-5),Top-k 聚焦损失更擅长定位最可能的单个故障(Top-1),贴合 “最小化开发者工作量” 的实际需求。

        混合损失函数在所有核心指标上均取得最优性能,超越所有单一 / 部分损失组合,印证三类目标的互补性。混合设计成功平衡 “全局高质量排序” 与 “优先高可疑行” 的需求,适配实际调试场景。

RQ3 结论:消融实验验证混合损失函数的优越性,其在核心指标上显著超越所有单一 / 部分损失配置;成功融合分类、排序、Top-k 聚焦目标,平衡全局排序质量与顶部候选精度,是实际应用的关键。

表 7:SFL在不同项目中的有效性。

RQ4:SLMFL 的泛化性能

        如表 7 所示,跨版本泛化测试在完全未见过的 Defects4J 2.0.0 数据集上评估 SLMFL-3B。模型仅在 Defects4J 1.2.0 上训练,在 Top-1、Top-3、Top-5 分别成功定位 72、112、148 个故障,Top-5 成功率达 36.9%。

        该零样本场景下的结果表明:SLMFL 学习的是可泛化的故障模式,而非记忆项目特征。模型能有效将知识迁移至新项目,展现强大的跨版本泛化能力,对实际部署至关重要。

RQ4 结论:严格零样本条件下,SLMFL 在完全未见过的 Defects4J 2.0.0 数据集上 Top-5 定位 148 个故障,展现稳健的跨版本泛化性;证实模型学习可迁移的结构 - 语义模式,而非训练数据的记忆,是适配多样实际软件项目的可靠工具。

表 8:计算开销比较。

RQ5:效率与开销分析

        为评估 SLMFL 效率,对比 SLMFL-3B 与 LLMAO-16B 基线的计算开销。表 8 详细列出预处理时间、训练轮数、总训练时间、单轮训练时间、总推理时间、单文件平均推理延迟、峰值显存占用。

        尽管 SLMFL-3B 新增抽象语法树解析步骤,预处理仅需 79 秒,这得益于 Tree-Sitter(C 语言实现的静态分析工具)解析开销极低。与之相对,LLMAO-16B 预处理需 987 秒:为在完整文件场景下公平对比,需适配 LLMAO 处理完整文件,但底层 CodeGen 模型上下文窗口受限,仅支持最大 128 行输入,因此采用滑动窗口提取完整文件特征,引入大量冗余计算,大幅提升预处理开销。而 SLMFL-3B 依托 32k 令牌上下文窗口,单次直接处理完整文件

        训练阶段,尽管 SLMFL-3B 包含多任务学习适配器,单轮平均训练仅需 4.57 秒,LLMAO-16B 为 4.74 秒,单轮训练时间降低 3.6%。

        推理阶段省略行级抽象语法树节点类型预测任务,部署无额外开销。因此 SLMFL-3B 推理仅需 83 秒,相比 LLMAO-16B 的 991 秒,推理时间减少 91.6%;峰值显存占用 8.5GB,符合普通消费级显卡内存限制,而 LLMAO-16B 需 35GB。结果证实:SLMFL 在不损失定位精度的前提下,为软件故障定位提供高效解决方案

RQ5 结论:相比 LLMAO-16B,SLMFL-3B 推理延迟降低超 91.6%,峰值显存占用仅 8.5GB;多任务训练无推理开销,是大模型的轻量化替代方案。

5 相关工作

5.1 基于频谱的故障定位(SBFL)

        基于频谱的故障定位利用程序执行频谱识别潜在故障位置,频谱记录程序元素(语句、分支、方法)被通过 / 失败测试用例覆盖的情况。其核心假设:故障元素更常被失败测试执行。作为轻量化、自动化调试方法,SBFL 广泛部署于大规模系统,仅需收集执行轨迹,无需修改源代码。

        SBFL 根据测试执行收集的频谱数据,计算每个程序元素的可疑度分数。对于测试集 T 中的程序元素 e,频谱包含四个指标:e_{f}(被失败测试覆盖)、e_{p}(被通过测试覆盖)、n_{f}(未被失败测试覆盖)、n_{p}(未被通过测试覆盖)。研究者基于这些指标提出多种可疑度计算公式,对元素按故障概率排序。表 9 列出典型公式:Tarantula、Ochiai、DStar。

表 9:SBFL 和 MBFL 的典型公式。

5.2 基于变异的故障定位(MBFL)

        基于变异的故障定位利用变异测试,通过分析变异体在测试用例上的行为识别故障。其核心假设:故障代码附近的变异更易改变测试结果。通过生成变异体、对比原程序与变异体的执行结果,MBFL 计算反映代码语义变化的可疑度分数。相比 SBFL,MBFL 能捕获更深层的程序语义,但计算开销显著更高

MBFL 执行分为三步:

  1. 变异算子(如替换 a+b 为 a−b、取反条件)为每个程序元素生成变异体;
  2. 测试集在每个变异体上执行,判断测试是否 “杀死” 变异体(行为与原程序不同);
  3. 基于变异测试频谱计算可疑度分数。

        对于元素e_{1},其变异体包含四个指标:k_{f}(被失败测试杀死)、k_{p}(被通过测试杀死)、s_{f}(在失败测试中存活)、s_{p}(在通过测试中存活)。这些指标输入 Metallaxis、MUSE 等可疑度公式(见表 9)。

5.3 基于机器学习的故障定位(MLFL)

        近年来,基于机器学习的故障定位方法快速发展,下文梳理从特征驱动语义驱动范式演进的代表性工作。

  • DeepFL:开创性融合多维特征(频谱、变异、代码指标等)的方法级定位工作,其异构特征融合的思路为后续学习类方法奠定基础,但局限于粗粒度的方法级定位,仍依赖完备测试集;
  • DeepRL4FL:推进至语句级定位,核心创新是摒弃人工特征工程,用卷积神经网络(CNNs)自动学习代码动态 / 静态表示,但仍依赖完备测试集,且依赖建模导致计算开销高;
  • TRANSFER-FL:结合迁移学习与语义建模的语句级定位方法,先在大规模缺陷数据上训练多分类双向长短期记忆网络(BiLSTM),提取语句级语义特征,再通过多层感知机(MLP)融合 SBFL、MBFL 特征计算可疑度分数,验证了迁移语义的价值,但仍需测试执行与变异分析,计算开销大;
  • LLMAO:范式革新,提出无需测试用例的故障定位,核心贡献是摒弃测试覆盖依赖,仅依靠预训练大语言模型的语义理解,开辟语义驱动的全新方向;
  • CodeHealer:当前最优方法,提出上下文驱动框架,通过排序学习协同建模语义、频谱、变异特征。

6 有效性威胁

6.1 内部有效性威胁

        本文承认数据集真实标签标注存在潜在内部威胁:从漏洞修复补丁中识别诱导故障的代码行,过程具有主观性,可能导致标注者间的差异。为保障结果可复现性与可比性,本研究采用 Defects4J 作者建立的标准真实标签,与领域内基准评估保持一致。

        为支持复现、降低实现偏差,所有代码、数据集、执行脚本均公开于https://github.com/TidySongS/SLMFL

6.2 外部有效性威胁

  1. 数据集依赖:SLMFL 仅在 Defects4J 1.2.0 基准上验证,可能无法完全覆盖真实故障的多样性。为解决该问题,开展跨版本评估:在 Defects4J 1.2.0 上训练,在完全未见过的 Defects4J 2.0.0 上测试;
  2. 语言局限:SLMFL 仅在 Java 项目上验证,其他语言的有效性未探索。但本文采用 Tree-Sitter 解析抽象语法树,工具天然支持多语言,可直接扩展至 Python、C++ 等语言。未来将开展多语言验证,拓宽 SLMFL 的适用范围;
  3. 数据泄露:骨干模型(通义千问 2.5-Coder)在 GitHub 等大规模开源语料上预训练,语料大概率包含 Defects4J 项目。但如相关研究所述,这些语料为原始源码,无显式故障标签,模型预训练阶段未接触 “代码 - 故障位置” 的映射关系。

6.3 结构有效性威胁

        本文通过严格的评估协议保障结构有效性:核心担忧是单一性能指标引发偏差,为此评估不依赖单一指标,采用 Top-N、MFR、MAR 三类标准故障定位指标,全面衡量性能;同时采用 10 折交叉验证,确保结果稳定,不依赖特定数据划分,降低单一训练 - 测试划分的偏差风险,提升结果泛化性。

7 结论

        基于大语言模型的故障定位虽效果优异,但面临部署成本极高、隐私风险、上下文不足等问题。为解决这些局限,本文提出 SLMFL—— 基于小语言模型的轻量化故障定位方法。SLMFL 通过融入代码结构知识增强语义理解,依托搭载行级抽象语法树节点类型预测辅助任务的多任务学习适配器实现,且推理阶段无额外开销

        在 Defects4J 基准上,SLMFL-3B 实现故障定位性能的显著提升:Top-1 指标检测 105 个故障,超越当前最优方法 7.1%(7 个故障)。最突出的是,SLMFL-3B 参数量仅为 LLMAO-16B 的 1/5,Top-1 性能却超越后者 19.3%(17 个故障),同时推理时间减少 91.6%,显存仅需 8.5GB。

未来研究将聚焦三个方向:

  1. 融合运行时轨迹、开发者注释等更多代码模态,进一步提升精度;
  2. 将 SLMFL 扩展至 Python、C++ 等编程语言,验证跨语言泛化性
  3. 将方法封装为可本地部署的工具套件,便于实际使用。

数据可用性

数据公开于:https://github.com/TidySongS/SLMFL

启发

        用多任务 + 混合损失解决小模型的天生缺陷,可以给模型加AST / 控制流 / 数据流辅助任务,训练时注入结构知识,而且不增加推理时的开销

        使用分类损失(判对错)+ 排序损失(排可疑度)+ Top-k 聚焦损失(优先定位前几行)的混合损失,完全贴合开发者 “只看前几行代码” 的实际需求。

        小模型既然可以又快又好用,就不用一味地追求更大、更新的模型,也不用花钱买token了。

BibTex

@article{ WOS:001744330900001,
Author = {Fan, Xin and Hu, Junsong and Zheng, Wei and Liu, Yunlong and Gao,
   Shuaiyin},
Title = {SLMFL: Structural and semantic fusion for fault localization based on
   Small Language Models},
Journal = {INFORMATION AND SOFTWARE TECHNOLOGY},
Year = {2026},
Volume = {196},
Month = {AUG},
DOI = {10.1016/j.infsof.2026.108143},
Article-Number = {108143},
ISSN = {0950-5849},
EISSN = {1873-6025},
ResearcherID-Numbers = {Liu, Yunlong/OOK-5905-2025},
Unique-ID = {WOS:001744330900001},
}

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐