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

情境为王:自定义指令助你获得更佳AI结果

2025年3月26日 作者:Rob Conery, @robconery.com, Burke Holland, @burkeholland

本月初,我们宣布了Visual Studio Code 中自定义指令的正式发布。自定义指令是您向 Copilot 提供关于团队工作流程、您的特定风格偏好、模型可能不了解的库等特定上下文的方式。

在这篇文章中,我们将深入探讨什么是自定义指令,您如何立即使用它们来显著改善您的 GitHub Copilot 结果,甚至还有一个全新的预览功能——“提示文件”,您今天就可以尝试。

更小的提示,更好的结果:一个简单的Markdown文件就能搞定

使用 GitHub Copilot 可以极大地提升您的开发流程,但在有效提示方面存在一个学习曲线。可能需要多次尝试才能获得您想要的正确答案,这通常意味着需要重新措辞您的问题或提示。即便如此,Copilot 仍能加速您的工作流程!

但您是否知道可以“调整”GitHub Copilot 以更好地满足您的需求?通过使用一个简单的 Markdown 文件,您可以向 Copilot 提供特定指令,帮助它更好地理解您的项目。在这篇文章中,我们将引导您完成创建和使用 VS Code 中新发布的功能——自定义指令的过程。

尝试一下:在您的项目中创建一个名为 .github/copilot-instructions.md 的文件。此文件将包含帮助 Copilot 更好地理解您的项目的指令。它会被 Copilot 自动识别,因此您无需进行任何特殊操作即可使其工作。

Screenshot showing the Explorer view in VS Code, highlighting the  file. The file is still empty.

将这些指令添加到文件中

# Copilot Instructions

This project is a web application that allows users to create and manage tasks. The application is built using React and Node.js, and it uses MongoDB as the database.

## Coding Standards

- Use camelCase for variable and function names.
- Use PascalCase for component names.
- Use single quotes for strings.
- Use 2 spaces for indentation.
- Use arrow functions for callbacks.
- Use async/await for asynchronous code.
- Use const for constants and let for variables that will be reassigned.
- Use destructuring for objects and arrays.
- Use template literals for strings that contain variables.
- Use the latest JavaScript features (ES6+) where possible.

标题并非严格必要,但有助于阐明文件的目的。其余内容是一组指令,帮助 Copilot 更好地理解您的项目。您可以根据项目的需求自定义这些指令。

现在,打开聊天视图并使用一个极其简洁的命令来提示它,例如 tail recursion。您无需询问“如何在 JavaScript 中实现尾递归”或类似问题。只需键入 tail recursion 并按 Enter 键。请注意,Copilot 理解您的项目的上下文并为您提供了相关的答案。

Screenshot that shows the Copilot response for "tail recursion" in the Chat view.

请注意,Copilot 给出了更详细的答案,并以您期望的格式(2 个空格、驼峰命名法等),即使您使用了小得多的提示

这就是使用自定义指令的力量!但您能做的远不止这些……

自定义所有一切!

GitHub Copilot 为 VS Code 添加了许多出色的功能,包括生成提交消息、审查选中代码以及生成测试!

这些功能都很有用,但您很可能有自己的实现方式。好消息是,您可以通过覆盖工作区中的一些设置来个性化它们。

尝试一下:打开命令面板(⇧⌘P(Windows、Linux Ctrl+Shift+P),然后输入“workspace settings”。您应该会看到一个菜单选项,显示为首选项:打开工作区设置 (JSON)。选择该选项并将以下设置添加到您的工作区

{
  "github.copilot.chat.commitMessageGeneration.instructions": [
    {
      "text": "Be extremely detailed with the file changes and the reason for the change. Use lots of emojis."
    }
  ]
}

保存 settings.json 文件并关闭它。活动栏中的源代码管理图标现在应该表示您有已更改的文件。如果您在没有 Git 仓库的测试目录中工作,可以直接通过源代码管理视图创建一个。只需选择初始化仓库按钮并按照说明操作即可。

好玩的地方来了:打开源代码管理视图,然后选择提交消息输入字段中的闪烁图标。这将指示 Copilot 为您生成一条提交消息。请注意,它生成了一条极其详细并使用了大量表情符号的提交消息!

Screenshot that shows the Source Control view, showing a colorful commit message for the latest commit.

注释掉 settings.json 文件中的指令,然后再次生成提交消息。您应该会看到一条远不如之前详细且未使用任何表情符号的提交消息。

编写优秀、详细的提交消息是一项需要时间学习的技能。但有了 Copilot,您可以节省大量时间并获得更好的消息。

全面采用自定义指令

您可能将编码标准存储在单独的文件中,这些文件的格式可能不是 Markdown。也许您有一个用于 JavaScript,一个用于 Python,一个用于 Go。您可能还有关于如何使用数据库的标准——您使用的数据类型、命名约定、连接字符串处理等等。

您不必将所有这些都合并到一个文件中。您可以将它们分开,并仍然使用 Copilot 来帮助您处理所有这些问题!

我们来试试吧!打开您的 .vscode/settings.json 文件(工作区设置)并添加以下设置

{
  "github.copilot.chat.codeGeneration.instructions": [
    {
      "file": "./docs/javascript-styles.md"
    },
    {
      "file": "./docs/database-styles.md"
    }
  ]
}

这指示 Copilot 在 docs 目录中查找两个文件:javascript-styles.mddatabase-styles.md。您可以添加任意数量的文件,Copilot 将按照您指定的顺序查找它们。

Screenshot that shows the Explorer view, highlighting the two files in the  folder and showing the custom instructions in the  file that reference these docs files.

您可以在此处添加任何您喜欢的文件,包括当前冲刺的规范。我们甚至见过有人将 Gherkin 规范作为自定义指令添加!

试一试!

改变模型语气

模型往往过于客气。它们会频繁道歉,如果您指出它们的错误,它们几乎从不为自己做出的决定辩护。当您想要完成工作时,这可能会很烦人。您可以通过一些指令来覆盖模型过于乐于助人的语气,以指定您希望它如何回应。

- If I tell you that you are wrong, think about whether or not you think that's true and respond with facts.
- Avoid apologizing or making conciliatory statements.
- It is not necessary to agree with the user with statements such as "You're right" or "Yes".
- Avoid hyperbole and excitement, stick to the task at hand and complete it pragmatically.

重要的是,始终要以肯定而非否定的方式向模型提供指令,因为它们需要知道该做什么,而不是不该做什么。与其说“不要做”,不如说“避免”。

实验并享受乐趣!一位程序员报告说,他们喜欢通过生成俳句形式的测试来活跃他们的测试套件。这看起来有点极端,但如果你正在做一个业余项目,为什么不呢?你可以添加这样的指令:

- Generate tests in haiku format.
- Use 5-7-5 syllable structure.
- Use nature themes and imagery.

还有一件事...

GitHub Copilot 也能将代码文件理解为自定义指令!例如,如果您有一个 SQL 文件,您可以将其添加到您的设置中,Copilot 将使用它来帮助生成您的数据访问代码。

如果您有自己喜欢的数据访问工具,可以在项目中添加一个示例,Copilot 在生成数据访问代码时将使用该示例。

试试看!这是一个我们团队成员用来为 PostgreSQL 数据库生成 Sequelize 模型 (Node.js ORM) 的例子:

//Template for a Sequelize model
const { DataTypes, Model } = require('sequelize');
class User extends Model {
  //static or factory methods
  //instance methods
}
const init = function(sequelize){
  User.init({
    //schema goes here
  }, {
    hooks: {},
    tableName: "users"
    underscored: true,
    sequelize
  })
}

exports.createUser = function(sequelize){
  init(sequelize);
  return User;
}

在您的设置中引用此文件,GitHub Copilot 将使用此模板以及您的 SQL 文件为您生成项目中的模型。您可以在编辑模式或询问模式下完成此操作。只需使用提示 generate the data access for the project,然后砰!奇迹发生了!

隆重推出提示文件

提示文件允许您为自己和团队编写可重用的提示。这有助于强制保持一致性,同时减少可能变得繁琐的提示操作。

例如,假设您想创建一个可重用的提示,根据数据库模式创建接口。您可以创建一个包含数据库模式的提示文件。Copilot 非常乐意为您生成一个 SQL 脚本来完成此操作。

提示文件放在 .github/prompts 目录下,它们只是 Markdown 文件,名称格式为 *.prompt.md

您可能有一个 .github/prompts/database_users.prompt.md 文件,其中包含您的数据库描述。例如

# User Authentication

Our application will have `users` with the following information:

- The standard user information, including: `name`, `email` (unique).
- A link for a "magic" login, which will be a `GUID` as well as the expiration date for the link.
- Social login account IDs for Microsoft, GitHub, and Google.
- The timestamp of the last login.
- The timestamp for when the user was created.

然后您可以创建另一个名为 generate-interface.prompt.md 的提示文件,其中包含生成接口的指令。提示文件可以相互引用,因此您可以将数据库架构作为一个简单的 Markdown 链接传递到此提示文件中。

Generate a TypeScript interface for the table specified by the user. Refer to the [user schema](database_users.prompt.md).

要在聊天中使用这些提示文件,请使用附件按钮(回形针)或使用 。从菜单中选择提示,然后选择您想要使用的提示文件。请注意,当我使用 generate-interface.prompt.md 文件时,它会自动引入 database_users.prompt.md 文件。

Animated gif showing how to use prompt files in chat.

结论

VS Code 是一个可自定义的助手,如果配置得当,它可以成为团队工作流程不可或缺的一部分。通过自定义指令,控制权掌握在开发人员手中。

编码愉快!