Copilot 聊天的提示工程
本文介绍了编写提示词的技巧,以便从 Visual Studio Code 中的 Copilot 聊天获得更好、更相关的响应。提示工程(Prompt engineering)或提示词制作(prompt crafting)是您在讨论人工智能时会听到的一个常用短语,指的是如何将信息打包并发送到人工智能 API 端点。
如果您是 VS Code 或 GitHub Copilot 的新手,您可能需要先阅读 GitHub Copilot 概述文章,或者直接进入入门教程。
有多种选项可以优化您在内联建议和聊天方面的 Copilot 体验
充分利用 Copilot 内联建议
GitHub Copilot 扩展程序会自动提供建议,以帮助您更高效地编写代码。您可以做一些事情来帮助(“提示”)Copilot 给出最佳建议。好消息是,您现在可能已经在做这些了,因为它们也能帮助您和您的同事理解您的代码。
向 Copilot 提供上下文
当 Copilot 拥有足够的上下文来了解您在做什么以及您需要什么帮助时,它的工作效果最好。就像在请求同事帮助完成特定编程任务时会提供上下文一样,您也可以对 Copilot 做同样的事情。
打开文件
对于代码补全,Copilot 会查看编辑器中当前和已打开的文件来分析上下文并创建适当的建议。在使用 Copilot 时,在 VS Code 中打开相关文件有助于设置此上下文,并让 Copilot 看到您项目的更大图景。
顶层注释
就像您会向同事简要、高层次地介绍情况一样,在您正在处理的文件中添加一个顶层注释可以帮助 Copilot 理解您正在创建的各个部分的整体上下文。
适当的包含和引用
最好手动设置工作所需的包含(includes)或模块引用。Copilot 可以提出建议,但您可能最清楚需要包含哪些依赖项。这也有助于让 Copilot 知道在制作建议时您希望它使用哪些框架、库及其版本。
在下面的 TypeScript 示例中,我们想要记录 add
方法的输出。当我们没有任何包含时,Copilot 建议使用 console.log
另一方面,当您添加对 Log4js
的引用时,Copilot 会建议使用该框架来记录输出
有意义的函数名
就像一个名为 fetchData()
的方法对同事(或几个月后的您自己)意义不大一样,fetchData()
也对 Copilot 没有多大帮助。使用有意义的函数名有助于 Copilot 提供一个能实现您想要的功能的函数体。
具体且范围明确的函数注释
函数名要想具有描述性,就不能太长。函数注释可以帮助补充 Copilot 可能需要知道的细节。
用示例代码引导 Copilot
让 Copilot 进入正确状态的一个技巧是,将与您所需内容相近的示例代码复制并粘贴到您打开的编辑器中。提供一个小例子可以帮助 Copilot 生成与您想要实现的语言和任务相匹配的建议。一旦 Copilot 开始为您提供您想要并且会实际使用的代码,您就可以从文件中删除示例代码。当它默认提供旧代码建议时,这对于引导 Copilot 使用较新的库版本尤其有帮助。
保持一致并维持高质量标准
Copilot 会根据您的代码来生成遵循现有模式的建议,所以“垃圾进,垃圾出”这句老话同样适用。
始终保持高品质标准需要自律。特别是在您为了让某些东西能运行而快速随意编码时,您可能希望在“试验”模式下禁用代码补全。要临时暂停代码补全,请在状态栏中选择 Copilot 菜单,然后选择暂停按钮,每次将暂停时间增加五分钟。要恢复代码补全,请在 Copilot 菜单中选择取消暂停按钮。
充分利用聊天功能
当您使用聊天时,有几件事可以做来优化您的体验。
使用聊天参与者和斜杠命令
聊天参与者旨在收集关于代码库或特定领域或技术的额外上下文。通过使用适当的参与者,人工智能可以找到并提供更好的信息发送给大语言模型(LLM)。例如,如果您想询问有关您打开的项目的问题,请使用 @workspace
;如果您想了解更多关于 VS Code 功能和 API 的信息,请使用 @vscode
。
斜杠命令可以帮助 Copilot 聊天理解您提问时的意图。您是在了解代码库(/explain
),需要帮助修复问题(/fix
),还是在创建测试用例(/tests
)?通过让 Copilot 聊天知道您想做什么,它可以根据您的任务调整回复,并提供有用的命令、设置和代码片段。
您可以用自然语言查询写出您的项目范围或当前任务,但使用聊天参与者和斜杠命令更简洁、更明确。
了解更多关于 Copilot 聊天中的聊天参与者和斜杠命令。
使用聊天变量提供上下文
聊天参与者,如 @workspace
或 @vscode
,可以提供特定领域上下文的聊天变量。您可以在聊天提示中使用 #
符号引用聊天变量。通过使用聊天变量,您可以更具体地说明您在聊天提示中包含的上下文。
例如,通过 #<文件名>
或 #<文件夹名>
,您可以在聊天提示中引用工作区中的特定文件或文件夹。这通过提供有关您正在处理的文件的上下文,有助于使 Copilot 聊天的回答与您的代码更相关。您可以问诸如“你能对 #package.json 提出改进建议吗?”或“我如何在 #devcontainer.json 中添加扩展?”之类的问题。
您还可以通过聊天视图中的附加上下文按钮为您的聊天消息添加上下文。然后,您可以从快速选择器中选择特定类型的上下文,例如当前选择、工作区中的一个或多个文件,或源代码中的一个或多个符号。
了解更多关于在 Copilot 聊天中使用上下文变量。
具体化并保持简单
当您要求 Copilot 做某事时,您的要求要具体,并将一个大任务分解成多个独立的小任务。例如,不要让 Copilot 创建一个使用 TypeScript 和 Pug 的 Express 应用,并且该应用有一个从 MongoDB 数据库检索数据的产品页面。相反,首先让 Copilot 创建使用 TypeScript 和 Pug 的 Express 应用。接下来,要求添加一个产品页面,最后要求从数据库中检索客户数据。
当您要求 Copilot 执行特定任务时,要具体说明您想使用的输入、输出、API 或框架。您的提示越具体,结果就越好。例如,不要说“从数据库读取产品数据”,而应该说“按类别读取所有产品,以 JSON 格式返回数据,并使用 Mongoose 库”。
迭代您的解决方案
在向 Copilot 聊天寻求帮助时,您不必满足于第一个响应。您可以迭代并提示 Copilot 改进解决方案。Copilot 既有生成代码的上下文,也有您当前对话的上下文。
这是一个使用内联聊天创建斐波那契数计算函数的例子
也许您更喜欢一个不使用递归的解决方案
您甚至可以要求 Copilot 遵循编码规范或改进变量名
即使您已经接受了一个结果,您也随时可以稍后要求 Copilot 对代码进行迭代。
更多关于 Copilot 提示的资源
如果您想了解更多关于高效使用 GitHub Copilot 的信息,可以关注这些视频和博客文章