为组织定制编码伴侣 | 亚马逊网络服务

为组织定制编码伴侣 | 亚马逊网络服务

源节点: 2375915

用于编码伴侣的生成式人工智能模型主要是在公开源代码和自然语言文本上进行训练的。 虽然训练语料库的规模较大,使模型能够生成常用功能的代码,但这些模型不知道私有存储库中的代码以及使用它们进行开发时强制执行的相关编码样式。 因此,生成的建议可能需要重写才能适合并入内部存储库。

我们可以通过将私人存储库中的代码知识嵌入在公共代码上训练的语言模型之上来解决这一差距并最大限度地减少额外的手动编辑。 这就是为什么我们开发了定制功能 亚马逊 CodeWhisperer。 在这篇文章中,我们向您展示了两种使用检索增强生成和微调来自定义编码伴侣的可能方法。

我们使用 CodeWhisperer 定制功能的目标是使组织能够使用其私有存储库和库来定制 CodeWhisperer 模型,以生成特定于组织的代码建议,从而节省时间、遵循组织风格和约定并避免错误或安全漏洞。 这有利于企业软件开发并有助于克服以下挑战:

  1. 内部库和 API 的文档或信息稀疏,迫使开发人员花时间检查以前编写的代码以复制用法。
  2. 在实施企业特定的编码实践、风格和模式时缺乏意识和一致性。
  3. 开发人员无意中使用了已弃用的代码和 API。

通过使用已经经过代码审查的内部代码存储库进行额外训练,语言模型可以使用内部 API 和代码块来克服前面列出的问题。 由于参考代码已经过审查并满足客户的高标准,因此引入错误或安全漏洞的可能性也被最小化。 而且,通过仔细选择用于定制的源文件,组织可以减少已弃用代码的使用。

设计挑战

基于组织的私有存储库定制代码建议存在许多有趣的设计挑战。 部署大型语言模型 (LLM) 来显示代码建议具有固定的可用性成本和由于基于生成的令牌数量进行推理而产生的可变成本。 因此,为每个客户进行单独的定制并单独托管它们,从而产生额外的固定成本,可能会非常昂贵。 另一方面,在同一系统上同时进行多个定制需要多租户基础设施来隔离每个客户的专有代码。 此外,定制功能应该显示旋钮,以便能够使用不同的指标(例如,具有较少错误历史的文件或最近提交到存储库中的代码)从内部存储库中选择适当的训练子集。 通过根据这些指标选择代码,可以使用更高质量的代码来训练定制,从而提高代码建议的质量。 最后,即使代码存储库不断发展,与定制相关的成本也应该最小化,以帮助企业通过提高开发人员生产力来实现成本节约。

构建定制的基线方法可能是在由现有(公共)预训练数据集和(私有)企业代码组成的单个训练语料库上对模型进行预训练。 虽然这种方法在实践中有效,但它需要使用每个企业的公共数据集进行(冗余)单独的预训练。 它还需要与为每个客户托管仅服务于来自该客户的客户端请求的定制模型相关的冗余部署成本。 通过将公共和私有代码的训练解耦并在多租户系统上部署定制,可以避免这些冗余成本。

如何定制

在较高层面上,有两种可能的定制技术:检索增强生成(RAG)和微调(FT)。

  • 检索增强生成: RAG 在存储库中查找与给定代码片段相似的匹配代码片段(例如,IDE 中紧邻光标之前的代码),并使用这些匹配的代码片段增强用于查询 LLM 的提示。 这丰富了提示,有助于推动模型生成更相关的代码。 文献中沿着这些思路探索了一些技术。 看 知识密集型NLP任务的检索增强生成, 领域, kNN-LM复古.

  • 微调: FT 采用预先训练的 LLM 并在特定的较小代码库(与预训练数据集相比)上对其进行进一步训练,以使其适应适当的存储库。 微调根据本次培训调整LLM的权重,使其更适合组织的独特需求。

RAG 和微调都是增强基于 LLM 的定制性能的强大工具。 RAG可以快速适应私有库或API,并且训练复杂度和成本较低。 但是,搜索检索到的代码片段并将其扩充到提示会增加运行时的延迟。 相反,微调不需要任何上下文增强,因为模型已经在私有库和 API 上进行了训练。 然而,当必须跨多个企业客户支持多个自定义模型时,它会导致更高的培训成本和模型服务的复杂性。 正如我们稍后讨论的,这些问题可以通过进一步优化该方法来解决。

检索增强生成

RAG涉及几个步骤:

索引

给定一个私有存储库作为管理员的输入,通过将源代码文件分割成块来创建索引。 简而言之,分块将代码片段转变为易于理解的片段,这些片段可能对模型来说信息量最大,并且在给定上下文的情况下很容易检索。 块的大小以及如何从文件中提取块是影响最终结果的设计选择。 例如,可以基于代码行或基于语法块等来分割块。

管理员工作流程


上下文搜索

根据光标上方的几行代码搜索一组已索引的代码片段,并检索相关的代码片段。 这种检索可以使用不同的算法进行。 这些选择可能包括:

  • 词袋(BM25) 词袋检索功能,根据查询术语频率和代码片段长度对一组代码片段进行排名。

基于BM25的检索

下图说明了BM25的工作原理。 为了使用BM25,首先要建立一个倒排索引。 这是一种数据结构,将不同的术语映射到这些术语所在的代码片段。在搜索时,我们根据查询中存在的术语查找代码片段,并根据频率对其进行评分。

语义检索

BM25 专注于词汇匹配。 因此,用“删除”替换“添加”可能不会改变基于查询中的术语的BM25分数,但检索到的功能可能与所需的相反。 相比之下,语义检索侧重于代码片段的功能,即使变量和 API 名称可能不同。 通常,BM25 和语义检索的组合可以很好地协同工作,以提供更好的结果。

增强推理

当开发人员编写代码时,他们现有的程序用于制定发送到检索索引的查询。 使用上述技术之一检索多个代码片段后,我们将它们添加到原始提示符之前。 这里有很多设计选择,包括要检索的片段数量、片段在提示中的相对位置以及片段的大小。 最终的设计选择主要由经验观察驱动,通过探索底层语言模型的各种方法,并在确定方法的准确性方面发挥关键作用。 返回的块的内容和原始代码被组合并发送到模型以获得定制的代码建议。

开发人员工作流程

微调:

微调 语言模型是为 转移学习 其中预训练模型的权重是根据新数据进行训练的。 目标是保留已经在大型语料库上训练的模型中的适当知识,并从新语料库(在我们的例子中是新的代码库)中细化、替换或添加新知识。 只需对新代码库进行训练即可 灾难性遗忘。 例如,语言模型可以 “忘记”其安全知识 或迄今为止在企业代码库中很少使用的 API。 有多种技术,例如 体验重播, 创业板PP-TF 来应对这一挑战。

微调

微调的方法有两种。 一种方法是使用附加数据而不增加微调模型的提示。 另一种方法是通过检索相关代码建议来增强微调期间的提示。 这有助于提高模型在存在检索到的代码片段的情况下提供更好建议的能力。 然后在训练后根据一组保留的示例对模型进行评估。 随后,部署定制模型并用于生成代码建议。

尽管使用专用法学硕士在私人存储库上生成代码具有优势,但对于中小型组织来说,成本可能过高。 这是因为专用计算资源是必要的,尽管考虑到团队规模,这些资源可能没有得到充分利用。 实现成本效率的一种方法是在同一计算上提供多个模型(例如, SageMaker 多租户)。 然而,语言模型需要跨多个区域的一个或多个专用 GPU 来处理延迟和吞吐量限制。 因此,在每个 GPU 上托管完整模型的多租户是不可行的。

我们可以通过使用小型计算机在同一计算上为多个客户提供服务来克服这个问题 适配器 到法学硕士。 参数高效微调 (PEFT) 技术,例如 及时调整, 前缀调整,和低阶适应(劳拉)用于降低培训成本而不损失任何准确性。 尤其是 LoRA,在实现与全模型微调相似(或更好)的精度方面取得了巨大成功。 基本思想是设计一个低秩矩阵,然后将其添加到具有模型目标层的原始矩阵权重的矩阵中。 通常,这些适配器随后会与原始模型权重合并以进行服务。 这导致与原始神经网络具有相同的大小和架构。 通过保持适配器分离,我们可以为同一个基本模型提供许多模型适配器。 这为我们的中小型客户带来了规模经济。

低阶适应(LoRA)

衡量定制的有效性

我们需要评估指标来评估定制解决方案的功效。 离线评估指标可作为防范交付低于默认模型的定制的护栏。 通过从所提供的存储库中保留的数据集构建数据集,可以将定制方法应用于该数据集以衡量有效性。 将现有源代码与定制代码建议进行比较可以量化定制的有用性。 用于此量化的常见度量包括诸如 编辑相似度,完全匹配,并且 代码BLEU.

还可以通过量化定制调用内部 API 的频率并将其与预先存在的源中的调用进行比较来衡量有用性。 当然,做好这两方面的工作对于成功完成非常重要。 对于我们的定制方法,我们设计了一个量身定制的指标,称为定制质量指数 (CQI),这是一个范围在 1 到 10 之间的用户友好的单一指标。CQI 指标显示了定制模型的建议与代码相比的有用性通用公共模型的建议。

总结

我们基于本博文中讨论的领先技术技术的组合构建了 Amazon CodeWhisperer 定制功能,并通过 Persisted Systems 进行的关于开发人员生产力的用户研究对其进行了评估。 在 AWS 委托的这两项研究中,开发人员被要求用 Java 创建一个需要使用其内部库的医疗软件应用程序。 在第一项研究中,无法访问 CodeWhisperer 的开发人员(平均)需要约 8.2 小时才能完成任务,而使用 CodeWhisperer(未定制)的开发人员在(平均)约 62 小时内完成任务的速度提高了 3.1%。

在针对不同开发人员群体的第二项研究中,使用使用其私有代码库定制的 CodeWhisperer 的开发人员平均在 2.5 小时内完成了任务,比使用未定制的 CodeWhisperer 的开发人员快了 28%,并在约 3.5 小时内完成了任务。平均小时数。 我们坚信,像 CodeWhisperer 这样针对您的代码库定制的工具在进一步提高开发人员的工作效率方面可以发挥关键作用,并建议您尝试一下。 如需了解更多信息并开始使用,请访问 亚马逊 CodeWhisperer 页面.


关于作者

孙庆 是 AWS AI 实验室的高级应用科学家,负责 AWS CodeWhisperer(一种由 AI 驱动的生成式编码助手)的工作。 她的研究兴趣包括自然语言处理、AI4Code 和生成式人工智能。 过去,她曾参与过多项基于 NLP 的服务,例如 Amazon Health AI 的医疗诊断系统 Comprehend Medical 和 Meta AI 的机器翻译系统。 她于 2017 年获得弗吉尼亚理工大学博士学位。

阿拉什·法拉哈尼 是 Amazon CodeWhisperer 的应用科学家。 他目前的兴趣是生成人工智能、搜索和个性化。 Arash 热衷于构建解决开发人员痛点的解决方案。 他致力于 CodeWhisperer 的多项功能开发,并将 NLP 解决方案引入到涉及所有 Amazon 开发人员的各种内部工作流中。 他于 2017 年在伊利诺伊大学厄巴纳-香槟分校获得博士学位。

马晓飞 是 AWS AI 实验室的应用科学经理。 他于 2016 年加入 Amazon,担任 SCOT 组织内的应用科学家,随后于 2018 年加入 AWS AI 实验室,从事 Amazon Kendra 工作。 小飞一直担任多项服务的科学经理,包括 Kendra、Contact Lens,以及最近的 CodeWhisperer 和 CodeGuru Security。 他的研究兴趣在于 AI4Code 和自然语言处理领域。 他于 2010 年在马里兰大学帕克分校获得博士学位。

穆拉里·克里希纳·拉马纳坦 是 AWS AI 实验室的首席应用科学家,也是 AWS CodeWhisperer 的联合领导者,AWS CodeWhisperer 是一种生成式 AI 驱动的编码伴侣。 他热衷于构建有助于提高开发人员生产力的软件工具和工作流程。 过去,他构建了 Piranha,这是一种自动重构工具,用于删除由于过时的功能标记而导致的代码,并在 Uber 工程部门领导了代码质量计划。 他是 Google 教师奖(2015 年)、ACM SIGSOFT 杰出论文奖(ISSTA 2016 年)和 Maurice Halstead 奖(普渡大学 2006 年)的获得者。 他于 2008 年获得普渡大学计算机科学博士学位。

拉梅什·纳拉帕蒂 是 AWS AI 实验室的高级首席应用科学家,也是 AWS 的 CodeWhisperer(一种生成式 AI 驱动的编码伴侣)和 Titan 大型语言模型的联合领导者。 他的兴趣主要集中在自然语言处理和生成人工智能领域。 过去,Ramesh 在交付许多基于 NLP 的 AWS 产品(例如 Kendra、Quicksight Q 和 Contact Lens)方面发挥了科学领导作用。 他曾在斯坦福大学、卡内基梅隆大学和 IBM 研究中心担任研究职务,并获得博士学位。 2006 年获得马萨诸塞大学阿默斯特分校计算机科学博士学位。

时间戳记:

更多来自 AWS机器学习