在VS Code中使用GitHub Copilot的最佳实践

本文介绍了在Visual Studio Code中使用GitHub Copilot的最佳实践,包括通过提示工程和向GitHub Copilot提供正确的上下文。

Note

"提示工程"或"提示设计"是讨论AI时常见的术语,指的是如何以及将哪些信息打包并发送到AI API端点。Copilot扩展为您完成此过程,但您可以通过提供提示来指导扩展。

如果你是VS Code或GitHub Copilot的新手,你可能想先查看GitHub Copilot概述文章,或者直接进入入门教程。

有不同的选项可以优化您的Copilot体验,包括内联建议和聊天:

充分利用Copilot内联建议

GitHub Copilot 扩展会自动提供建议,以帮助您更高效地编写代码。您可以采取一些措施来帮助(“提示”)Copilot 为您提供最佳建议。好消息是,您可能已经在做这些事情了,因为它们有助于您和您的同事理解您的代码。

为Copilot提供上下文

Copilot 在有足够上下文了解你在做什么以及你需要什么帮助时效果最佳。就像你在向同事请求帮助完成特定的编程任务时提供上下文一样,你也可以对 Copilot 做同样的事情。

打开文件

对于代码补全,Copilot会查看您编辑器中的当前和打开的文件,以分析上下文并创建适当的建议。在使用Copilot时,在VS Code中打开相关文件有助于设置此上下文,并让Copilot看到您项目的更大图景。

顶级评论

就像你会给同事一个简短的高层次介绍一样,在你正在处理的文件中的顶级注释可以帮助Copilot理解你正在创建的各个部分的整体上下文。

适当的包含和引用

最好手动设置您工作中需要的包含或模块引用。Copilot 可以提供建议,但您可能最清楚需要包含哪些依赖项。这也可以帮助 Copilot 了解在提供建议时您希望它使用哪些框架、库及其版本。

在以下的TypeScript示例中,我们想要记录add方法的输出。当我们没有任何包含时,Copilot建议使用console.log

Copilot 内联建议在没有导入文件时提出 Console.log。

另一方面,当你添加对Log4js的引用时,Copilot 建议使用该框架来记录输出:

Copilot 内联建议使用导入的日志记录框架进行日志记录。

有意义的函数名称

正如一个名为fetchData()的方法对同事(或几个月后的你)来说意义不大一样,fetchData()对Copilot也没有帮助。使用有意义的函数名称有助于Copilot提供符合你需求的主体。

具体且范围明确的函数注释

函数名称只能在不显得过长的情况下尽可能描述清楚。函数注释可以帮助补充Copilot可能需要了解的细节。

使用示例代码启动Copilot

让Copilot走上正轨的一个技巧是,将接近你需求的示例代码复制并粘贴到你打开的编辑器中。提供一个小的示例可以帮助Copilot生成与你想要实现的语言和任务相匹配的建议。一旦Copilot开始提供你想要的并且实际会使用的代码,你就可以从文件中删除示例代码。这在Copilot默认提供旧代码建议时,特别有助于快速启动Copilot到较新的库版本。

保持一致并保持高质量标准

Copilot 将会根据你的代码生成遵循现有模式的建议,因此“垃圾进,垃圾出”这句谚语适用。

始终保持高质量标准需要纪律。特别是当你快速而松散地编码以使某些东西工作时,你可能希望在“黑客”模式下禁用Copilot的自动完成功能。你可以从Copilot状态菜单中暂时禁用自动完成功能。通过选择Copilot状态栏项来调出Copilot状态菜单下拉菜单。

将鼠标悬停在Copilot状态栏项目上会显示“显示Copilot状态菜单”

从下拉菜单中,您可以完全禁用自动补全,或者仅为当前文件类型(例如Markdown文件)禁用。

Copilot 状态菜单下拉选项,选择了禁用自动完成

充分利用Copilot Chat

你也可以通过安装GitHub Copilot Chat扩展,通过聊天界面从Copilot获取帮助。

当你使用聊天与GitHub Copilot互动时,有几件事可以做来优化你的体验。

使用聊天参与者和斜杠命令

聊天参与者旨在收集关于代码库或特定领域或技术的额外上下文。通过使用适当的参与者,Copilot Chat 可以找到并提供更好的信息发送到 Copilot 后端。例如,如果您想询问关于您打开的项目的问题,请使用 @workspace,或者使用 @vscode 以了解更多关于 VS Code 功能和 API 的信息。

询问@vscode参与者如何更改VS Code颜色

斜杠命令帮助Copilot Chat理解你提问时的意图。你是在学习代码库(/explain),还是想帮助修复问题(/fix),或者是在创建测试用例(/tests)?通过让Copilot Chat知道你想要做什么,它可以调整其回复以适应你的任务,并提供有用的命令、设置和代码片段。

内联聊天斜杠命令列表

你可以用自然语言查询来写出你的项目范围或当前任务,但使用聊天参与者和斜杠命令更简洁明了。

了解更多关于聊天参与者斜杠命令在Copilot Chat中的信息。

使用聊天变量作为上下文

聊天参与者,例如@workspace@vscode,可以提供特定领域的上下文聊天变量。您可以在聊天提示中使用#符号引用聊天变量。通过使用聊天变量,您可以更具体地指定聊天提示中包含的上下文。

例如,#file 变量允许你在聊天提示中引用工作区中的特定文件。这有助于通过提供你正在处理的文件的上下文,使 Copilot Chat 的答案更符合你的代码。你可以问类似“你能建议对 #file:package.json 的改进吗?”或“如何在 #file:devcontainer.json 中添加扩展?”的问题。通过使用 #file 变量,你可以从 Copilot 获得更有针对性和准确的回答。

您还可以通过使用聊天视图中的附加上下文按钮为您的聊天消息添加上下文。然后,您可以从快速选择中选择特定类型的上下文,例如当前选择、工作区中的一个或多个文件,或源代码中的一个或多个符号。

VS Code Copilot 聊天视图的截图,显示附加上下文按钮和上下文快速选择。

了解更多关于使用Copilot Chat的上下文变量

具体且保持简洁

当你要求Copilot做某事时,请具体说明你的要求,并将一个大任务分解为多个独立的小任务。例如,不要要求Copilot创建一个使用TypeScript和Pug的Express应用程序,并且有一个从MongoDB数据库检索数据的产品页面。相反,首先要求Copilot创建一个使用TypeScript和Pug的Express应用程序。接下来,要求添加一个产品页面,最后要求从数据库中检索客户数据。

当你要求Copilot执行特定任务时,请明确说明你希望使用的输入、输出、API或框架。你的提示越具体,结果就会越好。例如,不要使用“从数据库中读取产品数据”,而是使用“按类别读取所有产品,以JSON格式返回数据,并使用Mongoose库”。

迭代你的解决方案

当向Copilot Chat寻求帮助时,您不必局限于第一个响应。您可以迭代并提示Copilot改进解决方案。Copilot既了解生成的代码的上下文,也了解您当前的对话。

这是一个使用内联聊天创建计算斐波那契数列函数的示例:

Copilot首次响应计算斐波那契数列的函数

也许你更喜欢一个不使用递归的解决方案:

要求Copilot不要使用递归和新结果

你甚至可以要求Copilot遵循编码规范或改进变量名:

请Copilot使用更好的变量名和新结果

即使你已经接受了一个结果,你也可以随时要求Copilot稍后对代码进行迭代。

关于Copilot提示的更多资源

如果您想了解更多关于如何高效使用GitHub Copilot的信息,您可以观看这些视频和阅读这些博客文章: