在 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 个空格、camelCase 等)给出了更详细的答案。

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

自定义所有内容!

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 目录中,并且是名为 *.prompt.md 格式的 Markdown 文件。

您可能有一个 .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 是一个可定制的助手,经过适当配置后,它可以成为团队工作流程中不可或缺的一部分。通过自定义指令,控制权掌握在开发人员手中。

编程愉快!