尝试以扩展 VS Code 中的代理模式!

Copilot Chat 的提示工程

本文介绍了一些编写提示的技巧,以便从 Visual Studio Code 中的 Copilot Chat 获得更好、更相关的响应。提示工程(Prompt engineering)或提示制作(prompt crafting)是你在讨论人工智能时会经常听到的常用短语,指的是如何打包和发送什么信息到 AI API 端点。

如果你是 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 状态菜单下拉列表。

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 交互时,有几件事情可以优化你的体验。

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

聊天参与者旨在收集关于代码库或特定领域或技术的额外上下文。通过使用适当的参与者,AI 可以找到并提供更好的信息发送给 LLM。例如,如果你想询问有关你打开的项目的问题,可以使用 @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,可以提供特定领域上下文的聊天变量。你可以通过使用 # 符号在聊天提示中引用聊天变量。通过使用聊天变量,你可以更具体地指定聊天提示中包含的上下文。

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

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

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

了解更多关于在 Copilot Chat 中使用上下文变量的信息。

具体且保持简洁

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

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

迭代你的解决方案

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

这是一个使用内联聊天(Inline Chat)创建计算斐波那契数列函数示例

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 的更多信息,可以查看以下视频和博客文章