尝试以扩展 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 目录中,它们只是名称格式为 *.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 是一个可定制的助手,当配置得当时,可以成为团队工作流程中不可或缺的一部分。有了自定义指令,控制权就掌握在开发者手中。

编码愉快!