分享自:

大型语言模型时代的程序切片:一项实证研究

期刊:2025 IEEE 49th Annual Computers, Software, and Applications Conference (COMPSAC)DOI:10.1109/COMPSAC65507.2025.00155

关于大型语言模型在程序切片领域应用的实证研究报告

一、 研究团队与发表信息

本研究的主要作者为来自加拿大约克大学拉斯德工程学院的 Kimya Khakzad Shahandashti, Mohammad Mahdi Mohajer, Alvine Boaye Belle, Song Wang 和 Hadi Hemmati。该研究以题为 “Program Slicing in the Era of Large Language Models” 的论文形式,发表于 2025年IEEE第49届计算机、软件与应用年度会议(COMPSAC)。论文的预印本已于会议召开前发布,其数字对象标识符(DOI)为 10.1109/compsac65507.2025.00155。

二、 研究背景与目标

本研究属于软件工程与人工智能交叉领域,具体聚焦于程序分析(Program Analysis)中的一个核心子任务——程序切片(Program Slicing)。程序切片是一种通过提取与特定“切片准则”(如某个变量或代码行)相关的代码片段,来辅助程序员进行代码理解、调试、测试和维护的关键技术。传统上,程序切片依赖于专门设计的静态或动态分析工具,这些工具虽然成熟可靠,但其开发和维护成本较高,且通常针对特定语言或场景。

近年来,大型语言模型(Large Language Models, LLMs)在自然语言处理和代码生成任务上展现出强大能力,促使研究者探索其在软件工程任务中的应用潜力。然而,在程序切片这一需要精确理解程序依赖关系的复杂任务上,LLMs的表现尚未得到系统性的评估。因此,本研究旨在填补这一空白,首次对最先进的LLMs在静态和动态程序切片任务上的性能进行全面实证评估。其核心目标是:1) 评估LLMs执行程序切片的有效性;2) 深入分析LLMs在切片任务中失败的原因和模式;3) 探索基于失败分析的提示工程策略能否提升LLMs的切片性能。

三、 详细研究流程与方法

本研究设计严谨,包含多个相互关联的步骤,其整体流程可概括为:数据准备与基准建立 → LLM切片生成与性能评估 → 失败案例分析(构建分类学) → 基于分类学的性能提升策略验证。

1. 数据集构建与基准切片生成: * 研究对象与样本量: 研究选取了来自LeetCode平台的Java编程问题解决方案作为代码库。从中随机抽取了100个Java程序作为实验样本。这些程序复杂度适中(代码行数大于10行),涵盖了算法和数据结构等常见编程场景,确保了数据集的多样性和代表性。 * 预处理: 为使代码兼容传统切片工具,研究进行了预处理。对于静态切片,调整了库引用和函数名;对于动态切片,则手动为每个程序插入了main函数以便执行。 * “黄金标准”切片生成: 为评估LLMs的输出,需要建立准确的基准(Ground Truth)。研究采用了两款成熟的传统切片工具:Javaslicer(用于静态切片)和Slicer4j(用于动态切片)。首先使用这些工具为每个程序和指定的切片准则自动生成候选切片。随后,由两名拥有超过5年软件开发经验的研究者手动验证并修正这些自动生成的切片,确保其逻辑正确性,最终形成用于评估的“黄金标准”切片集。这一步骤至关重要,保证了评估基准的可靠性。

2. LLM模型选择与实验设计: * 实验模型: 研究评估了四款主流的LLMs:GPT-4o、GPT-3.5 Turbo、Llama-2-7b-chatGemma-7b。这些模型在参数规模、发布时间和上下文窗口上各有不同,提供了广泛的比较基础。 * 提示工程策略: 研究采用了三种渐进的提示策略来引导LLMs生成切片: * 零样本提示(Zero-shot): 仅提供任务指令和代码,不给予示例。 * 单样本提示(One-shot): 在指令中提供一个完整的输入-输出示例。 * 单样本结合思维链提示(One-shot with Chain-of-Thought, CoT): 在单样本的基础上,在示例中加入模型进行逐步推理的“思考过程”。 * 切片任务与模板: 研究分别设计了针对静态向后切片动态向后切片的专用提示模板。模板明确要求LLM识别所有影响切片准则的代码行,并以指定的JSON格式输出行号数组。动态切片的准则固定为main函数中的return语句行号。 * 实验执行: 对于每个模型和每种提示策略的组合,研究都进行了三次独立实验以平均随机性,并计算平均性能。

3. 性能评估与对比基线: * 评估指标: 采用了两项从相关研究借鉴的指标: * 精确匹配准确率(Accuracy-EM): 衡量LLM生成的切片与“黄金标准”切片完全一致的次数比例。这是一个非常严格的指标。 * 依赖准确率(Accuracy-D): 衡量LLM正确预测代码语句间依赖关系的比例。这是一个更细粒度的指标,即使切片不完全一致,也能部分反映模型对依赖关系的理解程度。 * 对比基线: 为了将LLM方法与现有技术对比,研究引入了 NS-Slicer 作为静态切片的基线。NS-Slicer是一个基于预训练模型(CodeBERT和GraphCodeBERT)的静态程序切片学习模型。研究在相同数据集上运行NS-Slicer,并将其结果与LLMs的结果进行比较。

4. 失败案例分析与分类学构建: * 分析对象: 针对静态切片任务,研究聚焦于性能最佳的GPT-4o模型在单样本结合CoT策略下的输出。筛选出所有依赖准确率(Accuracy-D)未达到100% 的案例(共92个)进行深入手动分析。 * 分析方法: 由两名专家独立分析每个失败案例,识别导致切片错误的根本原因(Root Cause)和错误在代码中出现的位置(Failure Location)。通过讨论达成共识,并逐步归纳、提炼,最终构建了一个双层分类学。 * 分类学内容: * 失败根本原因: 分为三大类:逻辑理解缺失(包括条件语句、循环、方法调用)、代码复杂性(包括复杂控制流、代码歧义)以及模型特定限制(如上下文窗口、文本/代码混合、JSON解析错误)。 * 失败位置: 分为六类:条件语句、循环结构、方法调用与返回、变量声明与赋值、类声明、导入语句。

5. 基于分类学的性能提升策略验证: * 策略设计: 根据分类学揭示的最常见失败模式(根本原因为“复杂控制流”,失败位置为“变量声明与赋值”),研究设计了一种增强的提示构建(Enhanced Prompt Crafting) 策略。 * 实施方法: 在原有的单样本结合CoT提示(称为“原始”策略)基础上,增加一个专门针对上述常见失败模式的示例(即变为双样本结合CoT)。该示例包含复杂的控制流和变量操作,并详细展示了正确的推理步骤和输出。 * 验证实验: 使用增强后的提示重新对四个LLM进行静态切片测试,比较其与“原始”策略下性能指标的变化。

四、 主要研究结果

1. LLMs在静态与动态程序切片中的性能表现: * 静态切片(RQ1): GPT-4o在所有模型中表现最佳,在单样本结合CoT提示策略下,取得了60.84%的依赖准确率(Accuracy-D) 和7.33%的精确匹配准确率(Accuracy-EM)。其他模型性能依次递减:GPT-3.5 Turbo(46.43%)、Gemma-7b(43.43%)、Llama-2(17.57%)。与基线NS-Slicer相比,GPT-4o在依赖准确率上略优于基于CodeBERT的NS-Slicer(60.52%),并显著优于基于GraphCodeBERT的NS-Slicer(55.33%)。值得注意的是,所有模型和NS-Slicer的精确匹配准确率都非常低(最高仅7.33%),表明生成完全准确的切片极具挑战性。 * 动态切片(RQ2): GPT-4o同样表现最好,但在零样本提示策略下取得了最高依赖准确率(59.69%)。一个有趣的发现是,为动态切片提供更多示例或推理链(单样本、单样本结合CoT)并未带来性能提升,有时甚至导致性能下降。研究推测这可能是因为动态切片高度依赖具体的运行时上下文,而额外的提示信息可能引入了混淆。所有模型在动态切片上的精确匹配准确率均为0%。 * 静/动态切片对比: 通过曼-惠特尼U检验(Mann-Whitney U test)分析,静态切片与动态切片在依赖准确率上没有统计学上的显著差异(p值=0.62 > 0.05)。这表明LLMs在处理这两种不同类型的切片任务时,面临的挑战难度相当。

2. 失败案例分类学分析结果(RQ3): 对92个失败案例的手动分析产生了具有深刻见解的分类学。 * 根本原因分布: 复杂控制流(Complex Control Flow) 是最主要的失败根源,在39个案例中出现。这凸显了LLMs在处理嵌套循环、多重条件分支等复杂逻辑结构时的固有困难。 * 失败位置分布: 变量声明与赋值(Variable Declarations and Assignments) 是最常出错的代码位置,涉及78个案例。这表明LLMs在准确追踪变量状态变化和数据依赖传播路径上存在显著短板。 * 其他常见原因: 包括对条件语句分支的遗漏、对循环迭代和退出的错误理解、以及对方法调用(特别是涉及内置数据结构的方法)影响的误判。

3. 基于分类学的提示工程效果(RQ4): 应用针对常见失败模式设计的增强提示构建策略后,所有受测LLM的静态切片性能均得到提升: * GPT-4o的依赖准确率从60.84%提升至64.19%,绝对提升约4%。 * GPT-3.5 Turbo从46.43%提升至54.19%(提升约7.8%)。 * Gemma-7b从43.43%提升至46.04%。 * Llama-2从17.57%提升至20.61%。 这一结果证实,通过深入理解LLMs的失败模式并据此精心设计提示,可以有效引导模型避开常见陷阱,从而提升其在复杂程序分析任务上的表现。

五、 研究结论与价值

本研究的核心结论是:尽管以GPT-4o为代表的先进大型语言模型在程序切片任务上展现出了一定的潜力,甚至在某些指标上可与专门的学习模型(NS-Slicer)相媲美,但其整体性能仍远未达到可投入实际使用的“合理”水平,尤其是在要求完全正确的精确匹配场景下。LLMs在理解程序,特别是处理复杂控制流和精确追踪变量依赖关系方面,仍然存在根本性的挑战。

本研究的价值体现在多个层面: * 科学价值: 这是首项对LLMs在静态和动态程序切片任务上进行系统、全面评估的研究。它提供了宝贵的基准数据,量化了当前LLMs在此类精确代码分析任务上的能力边界。 * 方法论贡献: 研究提出的失败案例分类学是一个重要的贡献。它不仅仅是对错误现象的罗列,而是为理解和诊断LLMs在程序切片(可推广至其他程序分析任务)中失败的原因提供了一个结构化的分析框架。这为后续研究指明了改进方向。 * 实践启示: 研究证实了领域知识驱动的提示工程的有效性。通过分析模型弱点并针对性优化提示,可以获得显著的性能提升。这为软件工程研究人员和开发者利用LLMs辅助代码分析提供了切实可行的策略。 * 促进可复现性: 作者公开了实验数据集和源代码,有助于其他研究者验证结果、进行对比实验和推动该领域进一步发展。

六、 研究亮点

  1. 开创性评估: 首次对多种主流LLMs在静态和动态程序切片这一核心软件工程任务上进行了严谨的实证评估,设定了性能基准。
  2. 深度归因分析: 超越了简单的性能数字对比,通过手动分析大量失败案例,构建了一个系统性的、包含根本原因和错误位置的双层分类学,深刻揭示了LLMs在程序理解中的薄弱环节。
  3. 有效的改进路径: 不仅指出了问题,还验证了基于分类学知识的提示工程作为一种有效的性能提升手段,为后续研究提供了可借鉴的方法。
  4. 全面的实验设计: 涵盖了多种模型、多种提示策略、静/动态两种切片类型,并与传统工具及专门的学习模型进行对比,使得结论更加全面和可靠。

七、 其他有价值内容

研究在最后讨论了可能影响结论有效性的各种威胁,并提出了缓解措施,体现了研究的严谨性。例如: * 外部有效性威胁: 主要威胁是实验仅使用Java语言。研究者解释这是因为Java有成熟可用的传统切片工具作为基准。未来扩展到其他语言需要解决工具链问题。 * 内部有效性威胁: 通过预处理数据集以避免LLMs在训练中见过、以及对自动化脚本进行广泛测试和抽查来缓解。 * 建构有效性威胁: 通过双人独立标注并讨论解决手动分析的主观性;通过使用成熟的Javaslicer和Slicer4j工具并加以人工验证来保证基准切片的质量。

这项研究为“LLMs用于程序分析”这一新兴领域贡献了扎实的实证基础、深刻的分析见解和实用的改进方法,指出了当前的能力上限与未来的研究方向。

上述解读依据用户上传的学术文献,如有不准确或可能侵权之处请联系本站站长:admin@fmread.com