现已推出!阅读 10 月份的新功能和修复。

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

本文介绍了在 Visual Studio Code 中使用 GitHub Copilot 的最佳实践,包括使用提示构建和为 GitHub Copilot 提供正确的上下文。

注意:“提示工程”或“提示构建”是您在讨论 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 inline suggestion proposes Console.log when no imports in the file.

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

Copilot inline suggestion proposes logging using the imported logging framework.

有意义的函数名称

就像名为 fetchData() 的方法对同事(或您几个月后)意义不大一样,fetchData() 对 Copilot 也无济于事。使用有意义的函数名称有助于 Copilot 提供符合您预期的函数体。

特定且范围明确的函数注释

函数名称只能描述到一定程度,而不会过长。函数注释可以帮助填补 Copilot 可能需要知道的详细信息。

用示例代码为 Copilot 做准备

让 Copilot 了解您要做什么的一个技巧是,将接近您要查找的示例代码复制粘贴到您打开的编辑器中。提供一个小型示例可以帮助 Copilot 生成符合您想要实现的语言和任务的建议。一旦 Copilot 开始为您提供您想要的并会实际使用的代码,您就可以从文件中删除示例代码。当 Copilot 默认提供较旧的代码建议时,这对于帮助 Copilot 尽快适应新的库版本特别有用。

保持一致并保持高标准

Copilot 将依赖于您的代码来生成遵循现有模式的建议,因此“垃圾进,垃圾出”的格言适用。

始终保持高标准需要自律。特别是在您快速松散地编码以使某些东西正常工作时,您可能希望在“黑客”模式下禁用 Copilot 补全。您可以从 Copilot 状态菜单中暂时禁用补全。通过选择 Copilot 状态栏项目,调出 Copilot 状态菜单下拉列表。

Hover over the Copilot Status bar item displays "Show Copilot status menu"

从下拉列表中,您可以完全禁用补全,或者仅针对活动文件类型(例如 Markdown 文件)禁用补全。

Copilot Status menu dropdown with Disable Completions selected

充分利用 Copilot 聊天

您还可以通过安装 GitHub Copilot 聊天 扩展,通过 聊天界面 获得 Copilot 的帮助。

当您使用聊天与 GitHub Copilot 交互时,您可以做一些事情来优化您的体验。

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

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

Asking the @vscode participant how to change the VS Code colors

斜杠命令可以帮助 Copilot 聊天了解您在提出问题时的意图。您是在了解代码库(/explain),还是想修复问题(/fix),还是在创建测试用例(/tests)?通过让 Copilot 聊天了解您要做什么,它可以根据您的任务调整回复并提供有用的命令、设置和代码片段。

Inline chat slash command list

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

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

使用聊天变量来提供上下文

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

例如,#file 变量允许您在聊天提示中引用工作区中的特定文件。这有助于通过提供有关您正在使用的文件的信息来使 Copilot Chat 的答案更贴近您的代码。您可以提出诸如“您能建议如何改进 #file:package.json 吗?”或“如何在 #file:devcontainer.json 中添加扩展?”之类的提问。通过使用 #file 变量,您可以从 Copilot 获得更具针对性和准确性的响应。

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

Screenshot of VS Code Copilot Chat view, showing the Attach context button and context Quick Pick.

详细了解 如何将上下文变量与 Copilot Chat 一起使用

具体明确,保持简单

当您要求 Copilot 执行某项操作时,请在您的要求中明确具体,并将大型任务分解成独立的较小任务。例如,不要要求 Copilot 创建一个使用 TypeScript 和 Pug 的 Express 应用程序,该应用程序具有从 MongoDB 数据库检索数据的产品页面。相反,首先要求 Copilot 使用 TypeScript 和 Pug 创建 Express 应用程序。接下来,要求添加产品页面,最后要求从数据库检索客户数据。

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

反复迭代您的解决方案

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

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

First response from Copilot for a function to calculate Fibonacci numbers

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

Ask Copilot to not use recursion and new result

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

Ask Copilot to use better variable names and new result

即使您已经接受了结果,您也可以随时要求 Copilot 稍后迭代代码。

有关 Copilot 提示的更多资源

如果您想了解有关如何有效地使用 GitHub Copilot 的更多信息,可以关注这些视频和博客文章