Skip to main content

GitHub Copilot 的提示设计

按照以下策略改进 Copilot 结果。

提示是向 GitHub Copilot 发出的请求。 例如向 Copilot Chat 提出的问题或者要求 Copilot 完成的代码片段。 除了提示以外,Copilot 还使用其他上下文(例如当前文件和历史聊天记录中的代码)来生成回复。

按照本文中的提示编写提示,以便从 Copilot 生成更好的回复。

首先一般化,然后具体化

当为 Copilot 编写提示时,请首先为 Copilot 提供目标或应用场景的宽泛说明。 然后列出任何具体要求。

例如:

编写一个函数,以指示某个数字是否是质数

此函数会要求提供一个整数,如果此整数是质数,将返回 true

如果输入的数字不是正整数,此函数将会出错

提供示例

利用示例帮助 Copilot 了解你要执行的操作。 可以提供示例输入数据、示例输出和示例实现。

例如:

编写一个函数,以查找一个字符串中的所有日期,并在数组中返回这些日期。 日期的格式可以如下所示:

  • 05/02/24
  • 05/02/2024
  • 5/2/24
  • 5/2/2024
  • 05-02-24
  • 05-02-2024
  • 5-2-24
  • 5-2-2024

示例:

findDates("我要在 11/14/2023 去看牙医,并在 12-1-23 参加书友会")

返回:["11/14/2023", "12-1-23"]

单元测试也可以用作示例。 在编写函数之前,可以使用 Copilot 为此函数编写单元测试。 随后,可以要求 Copilot 编写这些单元测试所描述的函数。

将复杂任务分解成更简单的任务

如果希望 Copilot 完成复杂或大型的任务,请将此任务分解成多个简单的小型任务。

例如,不要要求 Copilot 生成单词搜索迷宫,而是将此过程分解成更小的任务,并要求 Copilot 逐个完成这些任务:

  • 编写一个函数,以生成一个 10 x 10 的字母网格。
  • 编写一个函数,以便在给定一组有效单词的情况下查找字母网格中的所有单词。
  • 编写一个函数,该函数使用之前的函数生成一个包含至少 10 个单词的 10x10 字母网格。
  • 更新上一个函数,以打印字母网格和网格中的 10 个随机单词。

避免多义性

避免含糊不清的用词。 例如,如果“这个”可能是当前文件、上一个 Copilot 回复或者特定的代码块,请不要问“这个有什么用”。 相反,应当具体化:

  • createUser 函数的作用是什么?
  • 上一个回复中的代码的作用是什么?

多义性也适用于库:

  • 如果正在使用不常见的库,请描述库的作用。
  • 如果希望使用特定的库,请在文件的顶部设置导入语句,或者指定要使用的库。

指示相关代码

如果正在 IDE 中使用 Copilot,以便在编码时获取建议,请打开任何相关文件并关闭不相关的文件。 Copilot 将使用打开的文件了解你的请求。

如果正在 IDE 中使用 Copilot Chat,请打开此文件,或者突出显示你希望 Copilot 引用的代码。 还可以指定 Copilot Chat 应当引用的文件。 例如,在 VS Code 中,使用 #file 变量或 @workspace 参与者。 有关如何在 IDE 中引用文件的说明,请参阅“在 IDE 中向 GitHub Copilot 提问”。

试验和迭代

如果未获得所需的结果,请反复修改提示并重试。

如果正在使用 Copilot 以便在编码时获取建议,可以彻底删除建议,然后重新开始。 也可以保留建议并请求修改。

如果正在使用 Copilot Chat,可以在下一个请求中引用上一个回复。 也可以删除上一个回复并重新开始。

保持与历史记录相关

Copilot Chat 利用历史聊天记录获取有关请求的上下文。 要只向 Copilot 提供相关历史记录:

  • 利用线程为新任务启动一个新对话
  • 删除不再相关或未提供所需结果的请求

遵循良好的编码实践

如果在要求 Copilot 提供代码库中的建议或解释时没有获得所需的回复,请确保现有的代码遵循最佳实践且易于阅读。 例如:

  • 使用一致的代码样式和模式
  • 对变量和函数使用描述性名称
  • 注释代码
  • 将代码构建成具有作用域的模块化组件
  • 包括单位测试

Tip

使用 Copilot 帮助代码遵循最佳实践。 例如,要求 Copilot 添加注释,或者将大型函数分解成更小的函数。

延伸阅读