APIGen

APIGen:生成式API方法推荐

阅读模板:背景,分析:逻辑、数据集、效果、例子,FAQ,参考。可做参考以形成自己的阅读模板

阅读理由:在学习中遇到与APIGen类似的任务,期望了解其他人是如何思考、解决这个任务的

  • 摘要

    • 自动推荐API现今有两类方法:基于检索和基于学习的方法,基于检索的方法依赖文本嵌入能力,基于学习的方法依赖标注数据。

    • APIGen通过增强上下文学习(ICL)给出推荐

      • 为了克服标准 ICL 在捕获特定任务知识方面的局限性,APIGen 涉及两个主要组成部分

      • (1)多样化示例选择。 APIGen 从词法、句法和语义角度搜索与编程查询类似的帖子,为 ICL 提供更多信息示例。

      • (2) 引导式API推荐。APIGen 使大型语言模型 (LLM) 能够在生成 API 建议之前执行推理,其中推理涉及查询背后的任务意图与 API 知识之间的细粒度匹配

    • 实验结果:在2个公开benchmark上与4个方法比较均最优

      • SuccessRate@1 ,APIGen 在方法级 API 推荐方面优于最佳基线 CLEAR 105.8%,在类级 API 推荐方面优于最佳基线 CLEAR 54.3%

      • 与流行的LLM(例如GPT-4)的零样本性能相比,APIGen在关于SuccessRate@3指标的方法级API推荐方面平均提高了49.87%

介绍&背景

  • API能使开发人员访问、使用外部资源,提高开发效率,现今API库高速发展,为特定的编程需求推荐API是当前开发人员面临的巨大挑战

    • 基于检索的方法受限于嵌入模型的表示能力

    • 基于学习的方法受限于任务领域训练数据不足

  • APIGen两个组成部分:多样化的示例选择和引导式 API 推荐。

    • 三个主要阶段:示例检索、提示构建和 API 推荐。

      • 示例检索阶段,APIGen 使用给定的查询从 API 相关帖子语料库中搜索相关帖子。相关帖子将作为下面阶段的演示示例,每个帖子都包含一个编程问题及其相应的 API 答案。

      • 提示构建阶段,APIGen首先通过分析选区树和语法元素提取问题背后的任务意图,然后基于构建的官方描述词典检测API的事实知识。接下来,APIGen 对任务意图和事实知识进行细粒度匹配,生成推理提示。推理提示为法学硕士提供如何有效分析查询和推荐适当的 API 的指导。

      • API 推荐阶段,APIGen 结合问题、推理提示和 API 答案来创建演示。使用演示和给定的查询作为输入提示,APIGen 利用 LLM 生成 API 方法及其相应的原因

    • APIGen 在方法级 API 推荐方面 CLEAR ,在 SuccessRate@3、MAP@3、MRR和NDCG@3 分别实现了 61.29%、82.61%、72% 和 28.26% 的改进;对SuccessRate@1 指标而言,添加检索示例使 APIGen 提高了 42.2%,引入推理提示进一步将 APIGen 提高了 79.7%。

  • 贡献

    • 第一个提出基于增强型上下文学习的生成式 API 推荐方法

    • 将查询的任务意图和 API 知识之间的细粒度匹配合并到大型语言模型中,使它们更好地理解查询并生成更合适的 API 推荐

    • APIGen 在方法级和类级 API 推荐方面都提高了性能

  • 背景

    • 大语言模型已经在各领域应用并取得巨大成功,现今人们通过提示技术来提高LLM在特定任务上的表现

    • LLM规模不断增加,使其根据特定任务进行调整变得昂贵,上下文学习可以利用提示中的演示帮助模型学习特定任务的输入输出之间的映射,而且无需更改参数就能达到一定效果

方法

  • 框架总共分三步:示例检索,提示构建,API推荐

  • 示例检索:语义相似检索API相关帖子,设计相似度评估器过滤出相似帖子

    • 相似度评估器: 选用模型BM-25 、SBERT 和 CodeT5

    • BM-25 测量两个句子之间的词汇相似性,并在单词选择级别对其进行评估

    • SBERT 捕获整个句子的整体语义

    • CodeT5是针对编程任务的预训练模型,可以理解编码任务的自然语言描述

  • 提示构建:创建推理提示,解释为什么选择某API 作为答案,为LLM生成合适的 API 提供指导

    • 1)使用意图探索器分析问题背后的任务意图

    • 2)通过知识检测器获取答案的事实知识

    • 3)通过推理在获得的任务意图和事实知识之间进行细粒度匹配

      • 意图探索器: 获取给定问题的意图,分为以下三步

        • 问题细化:完善不完全问题并提取核心内容(通过提示实现的一种问题重述)

        • 问题分类:使用AllenNLP识别语法元素进行句法分类,分成三种结构形式:VB+NP+(PP/S)、VB+NP+PP+(PP/S) 和 VB+S

          • 动词(VB)、句子(S)、名词短语(NP)、动词短语(VP)和介词短语(PP)

        • 问题解构:为了从重新表述的问题中获取意图。通过将问题分解为四个部分,更好地理解和提取其细节,确保 API 推荐更加准确

          • 操作:需要执行什么功能,问题的核心操作,例如获取、转换或创建

          • 对象:所操作的对象,问题的主要实体,例如数据类型、库或框架。

          • 目标:想要达到的目标,提问的结果

          • 条件:与问题相关的任何规则或限制,例如特定编程语言(Java)或数据格式(CSV 格式输入数据)

      • 知识检测器

        • 建立一个包含 30,287 个方法描述对的 Java API 字典;通过解析 JDK 1.8 API 参考文档并从每个类的 HTML 文件中提取所有 API 方法来构建

        • 使用微调 BERT 模型来注释描述,并将它们的功能类别附加到 API 字典中。通过字典,知识检测器可以检索API答案的功能描述和功能类别

      • 原因生成器

        • 在问题的任务意图和答案知识之间进行细粒度匹配,用来生成推理提示

  • API推荐

    • 结合所有问题、推理提示和 API 答案来创建演示

    • 通过从输入提示中的演示中学习,LLM 生成 API 推荐和相应的推理过程

实验

  • 研究的问题

       • RQ1:与最先进的 API 推荐方法相比,APIGen 的有效性如何?

      • RQ2:APIGen 中的两个主要模块(即示例检索和提示构建)有何影响?

       • RQ3:在APIGen 中使用不同示例有何效果?

       • RQ4:APIGen 在不同的大型语言模型上表现如何?

  • Baseline

    • RACK通过从Stack Overflow搜索相关API来推荐API

    • DeepAPI 将 API 推荐任务建模为机器翻译问题:使用循环神经网络 (RNN) 编码器-解码器模型将给定查询编码为固定长度的上下文向量,并基于该向量生成 API 序列

    • BIKER训练词嵌入模型来计算给定查询和 Stack Overflow 帖子之间的相似度。然后,从这些帖子中选择前 N 个 API 答案作为候选答案

    • CLEAR基于 BERT 句子嵌入和对比学习:给定一个查询,CLEAR 首先根据 BERT 句子嵌入相似性选择一组候选 Stack Overflow 帖子,并使用基于 BERT 的分类模型对它们重新排序,以推荐前 n 个帖子

  • Dataset

    • APIBENCH-Q 包含 6,563 个 Java 问题,、问题来自 Stack Overflow 和教程网站

    • BIKER-Dataset 包含从 Stack Overflow 官方数据转储中提取的 33,000 个 Java 相关问题,该数据由 BIKER 提供并用作训练集

  • 指标

    • 成功率、平均倒数排名(MRR)、平均精度(MAP)和归一化累积增益(NDCG)

    • 成功率:评估模型根据 top-k 返回结果推荐正确 API 的能力

    • MAP: 衡量在推荐列表中找到第一个正确答案所需努力

    • MRR考虑所有正确答案的排名

    • NDCG通过考虑列表中每个位置的相关性分数来衡量推荐列表的质量

  • 实现细节

    • baseline直接调库,RQ1-3用GPT3.5,RQ4对比3.5和4

    • temperatu=0.15

    • Max token=512

    • sample=5

    • 采样方法:核采样

    • top-p=0.95

    • 检索示例数默认为3

    • 示例方法默认用Sbert

    • 4*V100

  • 实验结果

    • RQ1:与最先进的方法比较,APIGen有效,具体可看下表各项数值

      • APIGen 在两个数据集上均优于最佳基线 CLEAR,特别是在 SuccessRate@1 方面,方法级和类级推荐分别提高了 105.88% 和 54.29%

    • RQ2:APIGen 中不同模块的影响

      • 两种变体做消融实验

        • 变体1:排除任何检索到的帖子,仅依赖给定的查询作为输入提示

        • 变体2:提供检索到的帖子,但排除推理提示作为输入提示

        • 下表为两种变体的实验结果

        • 两个模块对于 APIGen 的性能都是必不可少的。从 SuccessRate@1 指标来看,添加示例检索将 APIGen 提高了 42.2%,引入推理提示将 APIGen 提高了 79.7%

    • RQ3:不同示例的影响

      • 示例数量从 1 变为 9,并比较第 III-B 节中提出的三种示例选择方法:BM-25 、SBERT 和 CodeT5

      • 选用 SuccessRate@3 和 MAP@3作为评估指标,下表分别为方法级和类级的不同数量示例的效果图

      • Sbert是最有效的

      • 示例的数量对 API 推荐有一定的影响

      • 选择适当数量的示例,并采用有效的示例选择,对于 API 推荐的性能至关重要

    • RQ4:不同大型语言模型上的性能

      • APIGen 可以增强各种 LLM 的性能,其在不同模型中具有通用性
  • 一个case

  • 示例的影响

    • 看图7,LLM从示例中学习如何理解查询,从而变得更加关注查询中的“class”关键字,由1-》2,变得更接近答案

  • 推理提示的影响

    • 推理提示帮助APIGen匹配查询意图和API知识,从而提供准确的API推荐。

  • 有效性

    • 分析得出本文工作数据泄露风险小的结论

    • 该工作具有普遍性,不止适用于java

    • 说明本文提示设计是有效的

结论

  • 通过提示设计,将 查询任务意图与API内容 细粒度匹配,合并至大语言模型,使大语言模型能更好地理解API并给出推荐

  • 阅读论文不足之处:阅读他人笔记,对比总结自己阅读存在的一些不足之处

    • 论文阅读深度仍有不足

      1. 应该在阅读论文后结合代码深入阅读,但是现在阅读代码仍旧效率不高,需要多多练习

      2. 阅读应该有自己的问题,而不是仅仅机械的输入,这方面仍旧单薄,每次的思考不深

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值