Github Copilot 是 OpenAI 作为“你的 AI 配对程序员”创建的新产品。它是您在 VSCode 中安装的插件,使用和安装都很简单。过去一周我已经对其进行了测试,并想测试它以了解它的强大功能,因此我在网上完成了 3 个编码问题,这些问题是一组准备好的面试编码问题,以了解它的表现。 GitHub Copilot 如何工作? Copilot 由名为 Codex 的深度神经网络语言模型提供支持。 Codex 是在 Github 代码之上训练的微调 GPT 模型。 Github Copilot 在一个名为 HumanEval 的评估集上进行了评估,该评估集由 OpenAI 创建,专门用于测量从文档字符串合成程序的功能正确性。该模型在测试时解决了 28.8% 的问题。 Copilot 在各种许可证下接受了公开可用代码的培训,这一事实引发了对其法律影响的许多讨论。我们将仅通过代码库的技术视图对其进行分析。要了解机器学习算法的工作原理、它们是如何产生的以及它们将走向何方,我建议:我已经寻找了像 Facebook 这样的科技巨头会询问新候选人的问题以及他们将如何解决这些问题。从 40 个 Facebook 编码面试问题中抽取 3 个问题,候选人可能会用这些问题来训练 Facebook 面试,看看 Github Copilot 有多么强大。给定一个整数数组,将所有为 0 的元素向左移动,同时保持数组中其他元素的顺序。必须就地修改数组。在查看解决方案和解释之前自己尝试一下。
首先,我开始添加注释来描述我正在编写的代码想要做什么。 Copilot 接听并提供了一些很好的自动完成建议。但是正如您所看到的,例如,它建议作为示例,即使其建议与我想要的非常接近,但所描述的问题的输出却是错误的。有趣的是,示例输出与我们想要的不同,但仍然非常接近。 Copilot 似乎不“理解”所问的内容,这是有道理的。关于需要就地的代码的注释也很棒。正是这个问题会问什么。我想知道这是否是我从互联网上选择的问题的结果,以及算法是否通过它学习并且只是记住了它。接下来,我将测试的函数定义和定义作为骨架编写,以查看 Copilot 生成的内容。 Copilot 给出的解决方案似乎与我们想要的很接近,但并不完全是解决方案。修改数组的函数将 0 向右移动而不是向左移动,但通过一些小的更改,它可以使函数向左移动 0 而不是向右移动。我们只需要将起点更改为数组的末尾,而不是开头,并减少指针而不是增加它们。下面的代码就足够了: 似乎 Copilot 给出的解决方案接近我们想要的,但不完全是解决方案 逻辑非常接近我们想要的,似乎我们只需要稍微修改一下函数即可得到问题的要求。现在关于测试,它似乎检查返回的数组是否与我们想要的相同,但是否足够接近我们想要的。同样,如果我们修改测试函数的一行,它可以给我们一个足够好的解决方案
我不确定 Copilot 解决方案在面试中的得分是多少,但如果编码人员使用它,它肯定可以帮助找到正确的问题解决方案。有趣的是,Copilot 允许选择查看自动完成代码的不同建议。它们都非常相似,仍然需要编码器来确定是否有正确的解决方案。现在让我们转到下一个问题,我们要弄清楚合并重叠的间隔。问题描述如下: 给定一个区间对数组(列表)作为输入,其中每个区间都有一个开始和结束时间戳。输入数组按起始时间戳排序。您需要合并重叠的区间并返回一个新的输出数组 再次,我们开始编写写出我们想要的函数所需的注释,Copilot 展示了其令人印象深刻的预测算法,它非常接近地预测了我们想要的东西。现在在第二个程序中,我们想看看当我们尝试编写正确的逻辑并且 Copilot 被用作加速编写代码的工具时它的执行情况。正如您所看到的,Copilot 确实帮助了很多人写出函数和一路上的每一行。我们不得不在这里和那里纠正一些错误,但似乎 Copilot 编写解决方案的速度比我在没有工具帮助的情况下要快得多。对于第三个问题,我们用一个更复杂的问题测试了 GitHub Copilot。我们想颠倒单词的顺序并颠倒每个单词本身。例如,对于输入“Hello World”,我们想要返回“dlroW olleH”。对于这个例子,GitHub Copilot 首先很难为给定的输入提供我们想要的输出,而对于解决方案,它没有推荐正确的解决方案。
在编写测试时,它首先推荐了错误的测试套件,仅更改单词的顺序,但不颠倒单词本身,这是对输出的第一个建议。 Github Copilot 的表现似乎不是那么好,因为这个问题有 2 个步骤。正确的解决方案有两个步骤,根据 OpenAI 在 Codex 上的论文:我们发现随着 docstring 中链式构建块数量的增加,模型性能呈指数下降。这种行为不是人类程序员的特征,如果他们可以为长度为 2 的链执行此操作,那么他们应该能够正确地为任意长度的链实现程序。这意味着 Copilot 在处理具有构建块链的程序时表现不佳。在第三个问题中,有两个构建块链是正确的。程序需要还原句子中的每个单词和句子中的单词。这可能就是它不能表现得很好的原因。下图说明了其通过率的下降,即它的性能与链接组件的数量之间的关系。在这第三个问题中,链式组件的数量是 2,使它更难表现良好。在此图中,我们看到通过率约为 7%。 Github Copilot 最令人印象深刻的是它在我使用它时从未挂过 UI,而当我在同一空间使用其他工具时,它们要么占用内存要么占用 CPU,我没有遇到任何 CPU 使用率飙升或内存使用。我也没有注意到活动监视器中的网络使用量激增。总体而言,这是一次超级流畅的体验,而其他代码助手则不然。从我对这些问题的经验和一个多星期的 Github Copilot 试用来看,该工具似乎绝对无法通过科技巨头的编码面试。但它肯定已经足够接近我们尝试过的挑战了。尽管我们已经尝试过网络上的挑战,因此很难判断当遇到不一定在网络上的新挑战时会是什么样子。但是 Copilot 似乎是一个超级强大的工具,可以提高开发人员的生产力,并在 VSCode 上使用它帮助提高开发速度。我想随着 OpenAI 和 Github 获得用户反馈并改进模型,它会随着时间的推移变得更好。随着语言模型变得更加强大,并且如果 Github Copilot 被软件社区采用,它肯定会变得更好。
想想 Github Copilot 什么时候会破解 Facebook 编码面试是一件很有趣的事情。如果过去模型在其他领域的性能改进是 Github Copilot 改进的任何迹象,那么它不会太久。