在 VS Code 中试试

Copilot Chat 的 Prompt Engineering

本文介绍了如何在 Visual Studio Code 中编写 Prompt 以从 Copilot Chat 获取更好、更相关的响应。Prompt engineeringprompt crafting 是在讨论 AI 时会经常听到的常见短语,它指的是将哪些信息以及如何打包并发送到 AI API 端点。

如果您是 VS Code 或 GitHub Copilot 的新用户,建议您先阅读 GitHub Copilot 概述文章,或者直接阅读入门教程。

有多种选项可以优化您的 Copilot 内联建议和聊天体验

最大限度地利用 Copilot 内联建议

GitHub Copilot 扩展会自动提供建议,帮助您更高效地编写代码。您可以通过一些方法(即“Prompt”)来帮助 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 Chat

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

当您使用聊天与 GitHub Copilot 交互时,可以采取多种措施来优化您的体验。

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

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

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

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

Inline Chat slash command list

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

在 Copilot Chat 中详细了解聊天参与者斜杠命令

使用聊天变量提供上下文

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

例如,使用 #<文件名>#<文件夹名>,您可以在聊天 Prompt 中引用工作区中的特定文件或文件夹。通过提供有关您正在处理的文件的上下文,这有助于使 Copilot Chat 的回答与您的代码更相关。您可以提出诸如“您能建议对 #package.json 进行改进吗?”或“如何在 #devcontainer.json 中添加扩展?”之类的问题。

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

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 或框架。您的 Prompt 越具体,结果就越好。例如,不要说“从数据库读取产品数据”,而要说“按类别读取所有产品,以 JSON 格式返回数据,并使用 Mongoose 库”。

迭代优化您的解决方案

向 Copilot Chat 寻求帮助时,您无需接受第一个回复。您可以迭代并 Prompt 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 Prompting 的更多资源

如果您想了解如何更高效地使用 GitHub Copilot,可以参考以下视频和博客文章