Copilot从诞生到现在过去了挺长时间了,大家对Copilot的评价算是褒贬不一吧。有些人觉得Copilot高效且神奇,可以对自己的工作大大提效;有些觉得也就那样,为什么要花那么多钱做这个事情,钱它不香吗?
从最开始未收费的时候,我就有使用Copilot,当我开始使用Copilot时,我有些失望和不屑,因为我没有收到预期的结果。就像任何新兴技术一样,总有一条学习曲线。因此,当copilot不能生成我们想要的输出时,我们肯定会产生不信任的感觉。举个例子,我让Copilot来帮我解决leetcode的问题(因为Copilot的训练机制,很多leetcode的题目,已经被它训练到了,例如:两数之和、二叉树翻转等等,这些题目不好作为参考),它总是不能给我一个答案,而且可能会差很多。
来到算法题吧
前提:不能使用已有旧题目,因为可能该题目在copilot的训练集中。我使用的测试题目是leetcode的周赛题目,直接使用此题目做实验。从讨论和题解可以看出,这个题目很新,对于copilot来说是未知的一个题目。
测试1:直将题目给Copilot来做,生成的代码是不对的,是不符合要求的。
测试2:我通过demo的方式给出输入和输出结果,它会增加处理,但是最终的结果还是不对的。
测试3:我将如何处理的思路给出,可以得到通过的结果。
通过以上的例子,我想说明的是,合理的Prompt会拿到想要结果的前提,所以有些时候我们对结果的不满意,可能是使用上有些不合理,合理的Prompt才是得到结果的关键。
Copilot是什么?
Copilot的核心是一个基于GPT-3的大规模预训练模型,它可以通过大量的代码片段进行训练,从而学习到代码的语法、语义、结构等信息,然后在编写代码时,根据上下文,生成代码片段,从而提供代码建议。
建议阅读: https://arxiv.org/pdf/2107.03374.pdf.
以vscode为例,Copilot编辑器扩展将评论和代码发送到Copilot服务,然后该服务使用OpenAI Codex来合成和建议代码。使用Copilot,我们所要做的就是编写一个函数名,然后查看生产的结果,中间需要我们对结果进行判断和调试。
合理的Prompt engineering
其实Prompt engineering对于Copilot、ChatGPT等人工智能同样都是很关键的,下面介绍一下如何合理的prompt来让Copilot更符合我们的需求:
使用高级任务描述来描述
使用文字描述清楚,你需要做什么事情。常见于比如文件的开头,或者方法的开头,描述这个文件主要在做什么事情。例如:
用示例来引导
使用demo的示例,来引导copilot来完成你想做的事情,可以参考leetcode提供的示例,如果可以的话,可以提供尽可能多的示例,示例越多,拿到的结果越好。
如果是使用的第三方库,可以将如何使用的例子贴出来,copilot可以帮你完成相应的工作。从例子中学习不仅对人类有用,对人工智能配对程序员也有用。
用上下文信息指导
copilot会阅读你上下文的信息,例如你在该方法中,都是处理sql或者日期的方法,copilot会推测你需要的相关方法和代码。
分步处理,prompt简单而具体
如果你想将一个主要目标传递给Copilot,那就要阐明实现该目标所需要的逻辑和步骤。就比如菜谱,如果你的目标是做一道西红柿炒蛋。你就要分步骤去执行:
-
将西红柿洗净后切成块,鸡蛋打入碗中搅拌均匀。
-
在锅中加油,油热后将打好的鸡蛋倒入锅中翻炒,待其凝固并呈金黄色时即可捞出备用。
-
锅中再加一些油,放入切好的西红柿块进行翻炒,然后加盖憩一会儿。
-
待西红柿变软之后可以按自己口味添加一些盐、料酒和糖来调味。
-
最后将之前准备好的炒过的蛋倒回锅中与西红柿混合均匀,并撒上少许葱花就可以出锅了。
使用Copilot同样如此,Copilot在分解事物时能更好地理解你的目标。让GitHub Copilot在每一步之后生成代码,而不是要求它一次生成一堆代码。
例如在刚刚leetcode题目中给出的解题步骤。
保熟黑科技
多次实验Prompt的技巧
说话是一门艺术,同样Prompt也是一门艺术,是需要练习和实践的。因此,如果你第一次尝试时没有收到你想要的东西,请按照上面的最佳实践重新开始提示。
例如,你写个注释:
// 随便写一点代码吧
copilot指定懵逼,它根本不知道你要做什么。这时候需要更换个思路,给它一个明确的提示
// 随便写一点代码吧,关于二叉树的前序遍历
编辑器打开几个相关的Tabs
Copilot使用了一种称为相邻选项卡的技术,允许AI对程序员通过处理IDE中打开的所有文件而不仅仅是你正在处理的单个文件来将你的代码上下文化。但是不能保证Copilot会将所有打开的文件视为你代码的必要上下文。
备注:真的很好用,talk is cheap, show me the code。
还是第一个leetcode的例子,在我没有打开test.js的文件时,Copilot给出的是第一个方案,在我打开test.js这个文件后,Copilot会读取相邻文件的上下文来做提示,真的很好使。
良好的编程习惯
-
保持自己良好的编程习惯,Copilot会根据你的代码风格生产相关代码。如果你一直使用驼峰式命名变量,Copilot 将建议驼峰式命名变量。
-
运行单元测试、集成测试和任何其他形式的测试代码
-
保持良好的codereview习惯
Copilot Chat
Copilot Chat 是一个基于 OpenAI GPT 模型的聊天机器人,它可以与用户进行自然语言交互,并根据用户的输入提供相应的回复。Copilot Chat 可以用于各种场景,可以帮助用户解决各种问题,提高工作效率。
主要功能有:
-
/explain 解释代码
-
/ext 询问VS代码扩展开发
-
/fix 为所选代码中的问题提出修复方案。
-
/help GitHub Copilot 帮助
-
/simplify 简化选中的代码
-
/tests 为选中的代码生成单元测试
-
/vscode 询问关于 VS Code 的问题
-
/clear 清空当前对话
主要介绍我经常使用的功能:
解释代码
接别人的代码永远是不可避免的,阅读代码又是一个比较耗时的过程,通过Copilot chat帮你阅读很高效。选中文件中的代码,直接在对话框询问即可,方便高效:
询问问题
copilot chat可以理解为帮我们prompt好的一个专门用于编程的助手,在ChatGTP关于编程方便的内容,可以直接询问Copilot,这样减少了跳入跳出,同时可以高效的解决问题。
优化代码
这个是我很喜欢的一个功能,可以结合代码检测工具,很好的用来优化代码,此处内容可以参考之前的文章: