Copilot Chat 的 Prompt 工程
本文介绍了编写 Prompt 的技巧,以便从 Visual Studio Code 中的 Copilot Chat 获取更好、更相关的响应。 Prompt 工程 或 Prompt 编写 是在讨论 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
另一方面,当你添加对 Log4js
的引用时,Copilot 建议使用该框架来记录输出
有意义的函数名称
正如名为 fetchData()
的方法对同事(或几个月后的你)来说意义不大一样,fetchData()
也不会对 Copilot 有帮助。 使用有意义的函数名称有助于 Copilot 提供符合你期望的功能体。
具体且范围明确的函数注释
函数名称的描述性只能在不过于冗长的情况下达到一定程度。 函数注释可以帮助补充 Copilot 可能需要知道的详细信息。
使用示例代码引导 Copilot
让 Copilot 进入正确状态的一个技巧是将与你正在寻找的代码接近的示例代码复制并粘贴到你的打开的编辑器中。 提供一个小例子可以帮助 Copilot 生成与你想要实现的语言和任务相匹配的建议。 一旦 Copilot 开始为你提供你想要并实际使用的代码,你可以从文件中删除示例代码。 当 Copilot 默认提供旧代码建议时,这对于快速启动 Copilot 以使用较新版本的库尤其有用。
保持一致性并保持高质量标准
Copilot 将会抓住你的代码,以生成遵循现有模式的建议,因此“垃圾进,垃圾出”的格言适用。
始终保持高质量标准可能需要自律。 特别是当你在快速而随意地编写代码以使某些东西工作时,你可能希望在“hacking”模式下禁用 Copilot 补全。 你可以从 Copilot 状态菜单中临时禁用补全。 通过选择 Copilot 状态栏项,调出 Copilot 状态菜单下拉列表。
从下拉列表中,你可以完全禁用补全,或者仅针对活动文件类型禁用补全,例如 Markdown 文件。
充分利用 Copilot Chat
你还可以通过安装 GitHub Copilot Chat 扩展,通过 聊天界面 从 Copilot 获得帮助。
当你使用聊天与 GitHub Copilot 交互时,你可以做几件事来优化你的体验。
使用聊天参与者和斜杠命令
聊天参与者旨在收集有关代码库或特定领域或技术的额外上下文。 通过使用适当的参与者,Copilot Chat 可以找到并提供更好的信息发送到 Copilot 后端。 例如,如果你想询问有关你的打开项目的问题,请使用 @workspace
,或者使用 @vscode
了解有关 VS Code 功能和 API 的更多信息。
斜杠命令帮助 Copilot Chat 理解你在提问时的意图。 你是在学习代码库 (/explain
) 吗? 你是否需要帮助修复问题 (/fix
)? 还是在创建测试用例 (/tests
)? 通过让 Copilot Chat 知道你想要做什么,它可以根据你的任务调整其回复,并提供有用的命令、设置和代码片段。
你可以使用自然语言查询写出你的项目范围或当前任务,但使用聊天参与者和斜杠命令更简洁明了。
了解有关 Copilot Chat 中的 聊天参与者 和 斜杠命令 的更多信息。
使用聊天变量获取上下文
聊天参与者(例如 @workspace
或 @vscode
)可以贡献提供特定于领域的上下文的聊天变量。 你可以使用 #
符号在聊天 Prompt 中引用聊天变量。 通过使用聊天变量,你可以更具体地说明你在聊天 Prompt 中包含的上下文。
例如,#file
变量允许你在聊天 Prompt 中引用工作区中的特定文件。 这通过提供有关你正在处理的文件的上下文,帮助使 Copilot Chat 的答案与你的代码更相关。 你可以提出诸如“你能建议改进 #file:package.json 吗?”或“如何在 #file:devcontainer.json 中添加扩展?”之类的问题。 通过使用 #file
变量,你可以从 Copilot 获得更有针对性和更准确的响应。
你还可以通过使用“聊天”视图中的“附加上下文”按钮,将上下文添加到你的聊天消息中。 然后,你可以从“快速选择”中选择特定类型的上下文,例如当前选择、工作区中的一个或多个文件,或者源代码中的一个或多个符号。
了解有关 将上下文变量与 Copilot Chat 结合使用 的更多信息。
具体且保持简单
当你要求 Copilot 做某事时,请具体说明你的要求,并将大型任务分解为单独的、较小的任务。 例如,不要要求 Copilot 创建一个 Express 应用程序,该应用程序使用 TypeScript 和 Pug,并且有一个从 MongoDB 数据库检索数据的产品页面。 而是首先要求 Copilot 使用 TypeScript 和 Pug 创建 Express 应用程序。 接下来,要求添加一个产品页面,最后要求从数据库检索客户数据。
当你要求 Copilot 执行特定任务时,请具体说明你要使用的输入、输出、API 或框架。 你的 Prompt 越具体,结果就越好。 例如,不要使用“从数据库读取产品数据”,而应使用“按类别读取所有产品,以 JSON 格式返回数据,并使用 Mongoose 库”。
迭代你的解决方案
当向 Copilot Chat 寻求帮助时,你不会被第一个响应所困扰。 你可以迭代并 Prompt Copilot 来改进解决方案。 Copilot 既具有生成的代码的上下文,也具有你当前的对话上下文。
这是一个使用行内聊天创建计算斐波那契数列的函数的示例
也许你更喜欢不使用递归的解决方案
你甚至可以要求 Copilot 遵循编码约定或改进变量名称
即使你已经接受了结果,你也可以随时要求 Copilot 稍后迭代代码。
关于 Copilot Prompt 的更多资源
如果你想了解更多关于高效使用 GitHub Copilot 的信息,你可以关注这些视频和博客文章