问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

重磅突破:首个自适应LLM的智能提示优化系统MAPS,让用例生成效率提升超30%

创作时间:
作者:
@小白创作中心

重磅突破:首个自适应LLM的智能提示优化系统MAPS,让用例生成效率提升超30%

引用
1
来源
1.
https://m.aitntnews.com/newDetail.html?newId=10551

在软件开发过程中,测试用例的生成一直是一个既重要又耗时的环节。近年来,大型语言模型(LLM)在这一领域展现出了巨大的潜力。然而,实践表明,即使是同一个提示词(Prompt),在不同的LLM上也会产生截然不同的效果。

来自香港中文大学、哈尔滨工业大学(深圳)等机构的研究团队提出了一个突破性的解决方案——MAPS(LLM-tailored Prompt generation method for test case generation)。这是首个能够自动为不同LLM优化测试用例生成提示词的系统。MAPS通过三个创新模块解决了现有方法的核心痛点:提示词多样性不足、缺乏错误指导以及领域知识缺失。

MAPS系统工作流程概览。 该图展示了MAPS自适应提示优化系统的完整工作流程,采用模块化设计,包含以下核心组件:

  1. 领域上下文知识提取(左侧蓝框)
  • 融合目标方法、局部上下文和全局上下文信息
  • 通过知识增强机制扩充领域理解
  • 为提示生成提供专业知识基础
  1. 多样性引导的提示生成(右上红框)
  • 基于覆盖率评估现有提示词效果
  • 应用多样化修改方法优化提示
  • 在搜索空间中探索新的提示变体
  1. 失败驱动的规则归纳(右下橙框)
  • 通过加权采样选择失败信息
  • 基于错误反思生成优化规则
  • 验证规则的有效性和适用性
  1. 迭代优化机制(中心环路)
  • 从种子提示开始持续优化
  • 通过生成和反馈进行多轮迭代
  • 动态更新当前提示库

系统通过这三个模块的协同工作,实现了提示词的自动优化过程。初始提示词(Seed Prompts)经过不断迭代优化,最终产生高质量的测试用例。整个过程是自适应的,可以根据不同LLM的特点动态调整优化策略。

多样性引导的提示生成模块

这个模块解决了现有方法中提示词变化不足的问题。传统方法往往产生高度相似的提示词,如"Create unit tests to verify..."、"Create unit tests to validate..."等,这严重限制了优化空间。MAPS采用了创新的多样性度量方法,通过计算提示词之间的语义差异,确保每次生成的候选提示词都能探索不同的表达方式。研究者设计了一个基于编辑距离和语义相似度的混合评分机制,当新生成的提示词与现有提示词过于相似时,系统会自动调整生成策略,确保探索更广阔的可能性。

MAPS系统的提示词模板。 该图展示了MAPS系统中使用的三种核心提示词模板,每个模板都针对特定的优化任务,包含以下组成部分:

  1. 修改提示模板(左图)
  • 系统提示:将LLM定位为辅导者角色
  • 用户提示:要求提供N种不同的修改建议
  • 目标:确保生成的测试用例具有高覆盖率
  • 特点:强调提示词修改的多样性和有效性
  1. 反思提示模板(中图)
  • 系统提示:将LLM定位为软件工程师角色
  • 用户提示:分析错误样例并提供改进策略
  • 目标:从失败案例中总结经验教训
  • 特点:注重错误分析和解决方案提出
  1. 转换提示模板(右图)
  • 系统提示:将LLM定位为规则制定者角色
  • 用户提示:基于常见错误提炼优化规则
  • 目标:将经验转化为可复用的规则
  • 特点:强调规则的精确性和通用性

这三个模板共同构成了MAPS系统的提示词优化框架,通过角色定位、任务描述和目标设定的精心设计,确保了系统能够生成高质量、多样化的测试用例。

失败驱动的规则归纳模块

这个模块着眼于解决一个普遍存在但常被忽视的问题:如何从失败的测试用例中学习。研究者发现,即使是优化后的提示词生成的测试用例,往往会重复出现相同类型的错误。MAPS创新性地引入了失败模式分析机制,通过归纳常见错误类型(如抽象类实例化、参数类型不匹配等),自动生成相应的规避策略,并将这些策略融入到提示词优化过程中。这种方法不仅提高了测试用例的质量,还大大加快了优化收敛速度。

领域上下文知识提取模块

这是MAPS最具特色的创新点之一。传统方法往往只关注目标方法本身,而忽略了更广泛的上下文信息。MAPS系统会自动分析目标类的继承关系、成员方法签名以及跨文件的调用关系,构建完整的知识图谱。这些信息被巧妙地整合到提示词中,使LLM能够生成更符合实际场景的测试用例。例如,对于抽象类的测试,系统会自动提供可用的具体实现类信息,有效避免了实例化错误。

最终提示词格式与上下文信息提取示例。该图以一个Java类的测试用例生成为例,展示了MAPS系统如何提取和组织代码上下文信息,以及最终优化后的提示词格式。图中以Axis类(实现了Cloneable和Serializable接口)为例,详细展示了以下核心要素:

  1. 提示词设计(顶部红黄色部分)
  • 优化后的指令部分明确要求"编写多样化的单元测试,覆盖正常场景、边缘场景、失败场景和边界场景"
  • 归纳的具体规则包括"确保所有必要的类在测试文件开始时被导入"和"确保所有类都有匹配所需参数类型的构造函数"
  • 采用结构化的格式确保提示的完整性和可执行性
  1. 领域知识提取(中部蓝色部分)
  • 提取目标类的完整签名信息:
    public abstract class Axis implements Cloneable, Serializable
    
  • 识别关键方法如
    setTickLabelInsets
    
    及其参数类型
    RectangleInsets
    
  • 捕获成员方法之间的调用关系,包括
    setTickLabelInsets
    
    getTickLabelInsets
    
    的实现细节
  1. 上下文信息整合(底部绿色部分)
  • 识别并提取继承关系信息,如Axis类实现的接口
  • 分析跨文件的方法调用,包括
    RectangleInsets
    
    类的定义和使用
  • 收集相关类的构造函数信息,特别是
    RectangleInsets
    
    类的多个构造函数重载
  1. 知识组织方式(右侧标注)
  • 清晰标识局部上下文(In-file Context)和全局上下文(Cross-file Context)
  • 突出显示焦点方法(Focal Method)及其相关代码元素
  • 建立方法调用、继承关系等代码元素之间的关联关系,如
    CategoryAxis
    
    类的继承信息

MAPS系统中提示词优化的核心算法

MAPS提示词优化算法。 该算法展示了MAPS系统如何通过迭代优化来生成高质量的提示词。算法接收现有提示词集合(P)、已有规则(ER)、处理过的失败案例(H)等作为输入,通过以下步骤进行优化:

  1. 多样性引导的提示生成(第2-7行)
  • 从现有提示词中选择表现最好的K个
  • 使用不同的修改方法生成新的提示词变体
  • 将新生成的提示词加入优化集合
  1. 失败驱动的规则归纳(第8-11行)
  • 使用DBSCAN算法对失败信息进行聚类
  • 采样具有代表性的失败案例
  • 通过LLM反思失败原因并总结规则
  1. 规则验证与选择(第12-15行)
  • 评估新生成规则的有效性
  • 选择最佳规则加入规则集
  • 更新已处理的失败案例集合

这个算法展示了MAPS如何将多样性探索和失败经验学习相结合,实现提示词的持续优化。通过这种方式,系统能够不断提升测试用例的生成质量。

实验结果:显著优于现有方法

研究团队在Defects4J基准数据集上进行了全面的实验评估,结果令人振奋:

  1. 相比现有最先进的提示词优化方法,MAPS在代码行覆盖率上平均提升了6.19%,分支覆盖率提升了5.03%。
  2. 在不同LLM上的表现都实现了显著提升:
  • ChatGPT:行覆盖率从24.46%提升到29.87%
  • Llama-3.1:行覆盖率从21.92%提升到27.56%
  • Qwen2:行覆盖率从23.15%提升到28.94%

为了深入理解MAPS系统各个组件的贡献,研究团队进行了详细的消融实验:

MAPS系统的消融实验结果。 通过移除不同的关键组件,分析它们对系统性能的影响:

  1. 完整MAPS系统
  • 在所有模型上都达到了最佳性能
  • ChatGPT上实现了53.80%的行覆盖率和41.84%的分支覆盖率
  • Llama-3.1和Qwen2也显示了类似的优势
  1. 组件重要性分析
  • 领域上下文知识提取的移除导致性能显著下降
  • 多样性引导的提示词生成对提升覆盖率起到重要作用
  • 失败驱动的规则归纳也证明了其必要性
  1. 跨模型表现
  • 各个组件在不同模型上都显示出一致的重要性
  • 完整系统相比单一组件始终表现更好
  • 证实了MAPS系统设计的合理性

这些实验结果不仅验证了MAPS系统的整体效果,也证明了每个组件对于提升测试用例生成质量的重要性。

MAPS系统参数分析与迭代效果实验。 这组图展示了MAPS系统在不同参数设置和模型上的性能表现,通过代码行覆盖率(Line Coverage)指标进行评估:

  1. 种子提示词数量影响(图4a)
  • 横轴显示种子提示词数量(3-6个)
  • MAPS方法(方块标记)始终优于基准方法
  • 当种子提示词数量为5时达到最佳效果
  • 覆盖率提升约10个百分点
  1. 生成提示词数量影响(图4b)
  • 横轴表示每次生成的提示词数量(1-3个)
  • MAPS方法表现稳定且优异
  • 生成2-3个提示词时效果最好
  • 与基准方法的差距明显
  1. 迭代优化效果(图5)
  • ChatGPT(图5a)
  • Llama 3.1(图5b)
  • Qwen2(图5c)
  • 在三个不同模型上进行测试:
  • MAPS方法(蓝线)在所有模型上都显示出显著的优势
  • 迭代2-3次后性能趋于稳定
  • 相比其他方法(EVOPROMPT等)提升明显

这些实验结果表明,MAPS系统不仅在参数设置上具有良好的稳定性,而且在不同大语言模型上都能实现显著的性能提升。特别是通过迭代优化,系统能够持续改进测试用例的覆盖率,最终达到稳定的高性能水平。

对Prompt工程实践的重要启示

MAPS的成功为Prompt工程领域带来了几个重要启示:

  1. 提示词优化需要多维度考量
  • 仅仅关注提示词的语义表达是不够的,还需要考虑:
  • 提示词的多样性:确保充分探索可能的表达方式
  • 错误反馈:将失败经验转化为优化方向
  • 领域知识:整合更广泛的上下文信息
  1. 自动化优化是必然趋势
  • 随着LLM种类的增多,手动设计和优化提示词的方法将变得越来越不可持续。MAPS展示了自动化优化的可行性和优势,这个方向值得更多关注和投入。
  1. 领域特定知识的重要性
  • MAPS的成功很大程度上得益于其对领域知识的充分利用。这提醒我们,在设计提示词时,除了通用的工程原则,还要特别注意领域特定的知识和约束。

MAPS系统的出现标志着Prompt工程进入了一个新阶段。它不仅解决了测试用例生成中的具体问题,更重要的是提供了一个可推广的框架,展示了如何将提示词优化从手工艺术转变为系统工程。对于正在开发AI产品的工程师来说,MAPS提供的方法和思路值得深入学习和借鉴。它提醒我们,优秀的Prompt不是靠直觉和运气,而是可以通过系统化的方法来设计和优化的。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号