过去我们使用 AI 编程工具时,最常见的交互方式是“问一个问题,得到一段答案”。
例如:
- 解释一段代码;
- 生成一个函数;
- 分析一个报错;
- 提供重构建议。
如今,AI 编程工具开始从“回答问题”转向“直接完成任务”。
你可以对它说:
给这个项目添加用户登录功能,包括接口、权限校验、测试和文档。
它不仅会生成代码,还可能主动阅读项目、修改多个文件、运行测试、检查错误,并根据运行结果继续修复。
这种能够围绕目标连续执行任务的系统,通常被称为 Agent,也就是智能体。
可以把“编程 Agent”理解成:
一个能观察项目、制定步骤、调用工具、执行操作、检查结果并继续修正的 AI 程序员。
GPT-5.5
普通大模型主要是“输入文字,输出文字”;编程 Agent 则在大模型外面加上了项目上下文、工具、权限、循环执行机制以及各种定制规则。
一、agent整体架构
一个典型编程 Agent 大致由这些部分组成:
你的任务
↓
Agent / 智能体
├── 大语言模型:理解、推理、规划
├── 上下文:代码、对话、错误、文档
├── 指令:项目规则和行为约束
├── 技能:可复用的专业工作流程
├── 工具:读文件、改文件、终端、搜索
├── MCP 服务器:连接外部系统和数据
├── 挂钩 Hooks:在固定节点强制执行脚本
└── 权限和沙箱:控制它能做什么
↓
读取代码 → 修改代码 → 运行测试 → 查看错误 → 再修改
VS Code 官方把这个过程称为 Agent loop,智能体循环:模型选择工具,工具返回结果,结果进入下一轮上下文,模型再决定下一步,直到任务完成或需要人工介入。
二、什么是智能体 Agent
1. 大模型和 Agent 的区别
大模型本质上是一个推理和文本生成引擎。
你输入:
请帮我给这个 Express 项目添加登录功能
仅有大模型时,它可能输出一段示例代码。
Agent 则能进一步:
- 查看项目目录;
- 读取
package.json; - 找到路由、数据库和用户模型;
- 判断项目使用 JavaScript 还是 TypeScript;
- 修改多个文件;
- 安装依赖;
- 执行测试或启动项目;
- 阅读报错;
- 根据报错继续修改。
因此可以粗略写成:
Agent = 大模型 + 上下文 + 工具 + 执行循环 + 权限控制
2. Agent loop 是怎样工作的
假设你说:
修复所有失败的单元测试。
Agent 内部可能经历如下循环:
第一轮:观察
Agent 调用终端工具:
npm test
得到:
UserService should reject duplicate email
Expected status 409, received 500
第二轮:分析
模型推断:
- 测试预期重复邮箱返回 409;
- 当前代码可能没有处理数据库唯一约束错误;
- 需要查看
UserService和异常处理中间件。
第三轮:使用工具
Agent 读取:
src/services/UserService.ts
src/middleware/errorHandler.ts
tests/UserService.test.ts
第四轮:修改
Agent增加重复邮箱错误映射。
第五轮:验证
再次运行:
npm test
如果还有失败,它继续循环。
这就是 Agent 与“一次性生成代码”的根本差异:它能够根据真实执行结果修正自己的方案。
三、Agent 的核心组成
1. 模型 Model
模型是 Agent 的“大脑”,负责:
- 理解你的目标;
- 阅读代码;
- 推断项目结构;
- 制定步骤;
- 选择工具;
- 分析工具结果;
- 决定是否继续。
但模型本身并不能直接操作电脑。没有工具时,它只能输出文字。
模型也不是传统意义上的确定性程序。相同任务可能产生不同计划,因此需要测试、权限和审查机制。
2. 上下文 Context
上下文是当前这次推理中,模型能够看到的信息,例如:
- 你的提示词;
- 之前的对话;
- 当前打开的文件;
- 选中的代码;
- 项目目录结构;
- 搜索结果;
- 编译错误;
- 测试输出;
- Git 差异;
- 项目指令;
- 技能内容;
- MCP 工具说明。
上下文不是无限的。给 Agent 太多无关内容,会导致:
- 成本增加;
- 响应变慢;
- 重要信息被淹没;
- 工具选择变差;
- 模型“忘记”早期细节。
VS Code 官方也建议限制可用工具,因为每个工具定义和每次工具调用都会占用上下文。
3. 工具 Tools
工具是 Agent 的“手和眼睛”。
没有工具,模型只能说:
你应该打开文件并修改这一行。
有工具,Agent 可以自己完成修改。
VS Code 将工具分为三类:
内置工具
由 VS Code 自带,例如:
- 读取文件;
- 编辑文件;
- 创建文件;
- 搜索工作区;
- 查看诊断错误;
- 运行终端命令;
- 查找符号;
- 获取 Git diff。
扩展工具
由 VS Code 扩展提供,例如:
- 数据库扩展暴露查询工具;
- 云平台扩展暴露部署工具;
- 自定义企业扩展暴露内部系统工具。
MCP 工具
由 MCP Server 提供,例如:
- 查询 GitHub issue;
- 读取 Jira 任务;
- 查询 PostgreSQL;
- 操作浏览器;
- 查询内部 API;
- 获取云平台资源;
- 读取设计系统。
你可以把工具理解成普通函数:
readFile(path)
writeFile(path, content)
runTerminal(command)
searchCode(query)
queryDatabase(sql)
createGitHubIssue(title, body)
模型不会直接执行操作,而是生成一个“工具调用请求”。Agent 运行工具,再把结果交回模型。
四、Instructions 指令
指令用于告诉 Agent:
在这个项目里,应当遵守哪些长期规则。
例如:
- 使用 TypeScript strict 模式。
- 不要使用 any。
- 日期处理统一使用 date-fns。
- API 错误必须转换为统一的 ApiError。
- 修改业务逻辑时必须补充测试。
- 不允许直接修改生成目录。
这些不是某一次任务,而是项目长期约定。
1. 指令和普通提示词的区别
普通提示词:
帮我实现用户注册接口。
项目指令:
所有接口使用 Zod 验证。
业务层不得直接依赖 Express。
测试使用 Vitest。
最终 Agent 得到的任务相当于:
实现用户注册接口,
并遵守 Zod、分层架构、Vitest 等项目规则。
2. VS Code 中常见的指令文件
VS Code 当前支持多种指令来源,包括:
.github/copilot-instructions.md
整个项目默认应用。
.github/
└── copilot-instructions.md
适合放:
- 技术栈;
- 架构规范;
- 命名规则;
- 安全规范;
- 测试约定;
- 禁止事项。
AGENTS.md
也是项目级 Agent 指令文件,并可在不同目录中定义更局部的规则。
例如:
AGENTS.md
frontend/AGENTS.md
backend/AGENTS.md
根目录规则作用于整个项目,而子目录规则可针对特定区域。
*.instructions.md
条件式指令,通常根据文件路径或文件类型应用。
例如:
.github/instructions/
├── react.instructions.md
├── backend.instructions.md
└── testing.instructions.md
React 指令可能只作用于:
---
applyTo: "src/frontend/**/*.{ts,tsx}"
---
这适合大型项目,因为前端、后端和测试代码可能遵循不同规范。
3. 好指令与坏指令
较差:
写出高质量代码。
使用最佳实践。
注意安全。
这些规则过于抽象。
较好:
- 所有外部输入必须先通过 Zod schema 验证。
- Controller 只负责 HTTP 映射,业务逻辑放在 service。
- 不得在日志中记录 access token、密码和完整身份证号码。
- 新增功能必须包含正常路径和失败路径测试。
好的指令应当:
- 具体;
- 可执行;
- 尽量避免歧义;
- 说明原因;
- 必要时给正反例;
- 只写项目特有、非显而易见的规则。
五、Prompt Files 提示文件
提示文件是一个可以重复调用的任务模板,也常被显示为斜杠命令。
例如:
.github/prompts/
├── create-api.prompt.md
├── fix-tests.prompt.md
└── review-pr.prompt.md
执行时可以输入:
/create-api customers
或者:
/review-pr
Prompt 文件适合把经常重复输入的一大段要求保存下来,例如:
---
description: 创建符合项目规范的 REST API
tools:
- codebase
- editFiles
- terminal
---
分析现有项目结构,为指定资源创建:
1. 路由
2. controller
3. service
4. schema
5. 单元测试
6. API 文档
先查找项目中的同类模块并保持一致。
Prompt 文件需要你主动调用;而项目指令通常会自动应用。VS Code 官方正是这样区分二者的。
六、Skills 技能
技能是比普通指令更完整的、可复用的专业能力包,把重复出现的经验、流程、规范和验证方式提前固化下来。
简单地说:
指令告诉 Agent 要遵守什么规则;技能教 Agent 如何完成某类任务。
技能通常是一个文件夹:
database-migration/
├── SKILL.md
├── scripts/
│ └── validate-migration.sh
├── references/
│ └── migration-rules.md
└── assets/
└── migration-template.sql
其中 SKILL.md 是入口文件,描述:
- 技能何时应该被使用;
- 输入是什么;
- 工作步骤是什么;
- 应调用哪些脚本;
- 应读取哪些参考资料;
- 输出如何检查。
技能还可以包含脚本、示例、模板和参考资料,并且只在任务相关时按需加载。VS Code 和 GitHub Copilot 将 Agent Skills 作为开放标准支持,可用于 VS Code、Copilot CLI 和 Copilot cloud agent。
1. 一个技能示例
假设团队经常做数据库迁移,可以创建:
---
name: safe-database-migration
description: 创建和检查 PostgreSQL 数据库迁移
---
# 工作流程
1. 阅读当前数据库 schema。
2. 检查是否需要无停机迁移。
3. 禁止直接对大表添加带默认值的非空字段。
4. 创建向前迁移和回滚迁移。
5. 运行 scripts/validate-migration.sh。
6. 输出风险说明和部署顺序。
以后你只需要说:
为 orders 表添加 delivery_status 字段。
Agent 识别到数据库迁移任务后,可以自动加载这个技能。
2. 技能和指令的区别
| 维度 | 指令 | 技能 |
|---|---|---|
| 主要作用 | 规定规则 | 教会工作流程 |
| 内容 | 主要是文字要求 | 指令、脚本、模板、参考资料 |
| 加载方式 | 经常自动或按文件匹配 | 通常按任务需要加载 |
| 典型范围 | 项目编码规范 | 测试、发布、迁移、安全扫描 |
| 可移植性 | 常与特定 IDE 或项目绑定 | 可以跨多个兼容 Agent |
| 复杂程度 | 较轻 | 可包含多步骤执行 |
可以类比为:
- 指令:员工手册;
- 技能:专项操作手册和工具箱。
在 ChatGPT 中,技能库可以从 /skills 查看;也可以直接在对话中要求创建,例如:
创建一个技能,把客户访谈记录整理成产品洞察。
在 VS Code 中,技能通常位于 .github/skills/、.agents/skills/、.claude/skills/ 或用户目录中,并包含 SKILL.md。
七、Custom Agents 自定义智能体
自定义 Agent 是一个专门化的“角色”。
例如:
- 后端开发 Agent;
- 安全审查 Agent;
- 测试 Agent;
- 文档 Agent;
- 架构评审 Agent;
- 数据库迁移 Agent。
一个自定义 Agent 可以规定:
- 它是谁;
- 它擅长什么;
- 它不应做什么;
- 它能使用哪些工具;
- 它使用哪些 MCP Server;
- 它应该遵循什么流程。
例如:
---
name: security-reviewer
description: 审查代码中的安全风险
tools:
- search
- readFile
- diagnostics
---
你是一名应用安全审查员。
重点检查:
- SQL 注入
- XSS
- SSRF
- 权限绕过
- 密钥泄露
- 不安全反序列化
默认只分析并提出建议,不直接修改业务代码。
每条问题必须包含位置、风险、攻击路径和修复建议。
GitHub 将自定义 Agent 描述为 Copilot 的专门化版本,其配置通常是带 YAML frontmatter 的 Markdown Agent profile,定义提示、工具和可选的 MCP Server。
自定义 Agent 和Skill的区别
这是最容易混淆的一组。
Agent 定义“谁来做”
例如:
安全审查员
数据库专家
测试工程师
技术文档工程师
Skill 定义“怎么做某件事”
例如:
如何执行威胁建模
如何完成数据库迁移
如何生成发布说明
如何诊断 CI 失败
一个 Agent 可以加载多个技能:
安全审查 Agent
├── OWASP 审查技能
├── 依赖漏洞检查技能
└── 密钥泄漏检测技能
同一个技能也可以被不同 Agent 使用。
八、MCP Server
MCP 全称是 Model Context Protocol。
它是一个开放协议,用来标准化 AI 应用与外部工具、数据源之间的连接方式。
可以把 MCP 类比为:
AI 工具生态中的通用接口。
以前,每个 AI 客户端都需要为 Jira、GitHub、数据库、浏览器分别编写私有集成。
有了 MCP:
VS Code Agent ──MCP── GitHub Server
├─MCP── Jira Server
├─MCP── PostgreSQL Server
├─MCP── Browser Server
└─MCP── 公司内部系统 Server
只要客户端和服务器都实现 MCP,就可以按统一方式连接。
1. MCP Server 提供什么
一个 MCP Server 可以暴露三类能力:
Tools
模型可调用的操作,例如:
list_issues()
create_issue()
query_database()
open_webpage()
deploy_service()
Resources
可以读取的资料,例如:
数据库 schema
内部文档
日志
项目配置
知识库
Prompts
服务端提供的可复用提示模板。
不过不同 Agent 产品对 MCP 能力的支持范围不同。例如 GitHub Copilot cloud agent 当前主要支持 MCP tools,并不一定支持 MCP Server 暴露的所有资源和提示能力。
2. 本地和远程 MCP Server
本地服务器
在你的机器上启动:
{
"servers": {
"postgres": {
"type": "stdio",
"command": "npx",
"args": ["some-postgres-mcp-server"]
}
}
}
特点:
- 可访问本机环境;
- 延迟较低;
- 适合本地数据库和开发工具;
- 需要注意本机权限。
远程服务器
通过 HTTP 连接:
{
"servers": {
"company-api": {
"type": "http",
"url": "https://mcp.example.com"
}
}
}
特点:
- 可集中部署和管理;
- 适合企业内部服务;
- 需要认证、网络和权限控制;
- 服务端可以统一更新。
具体配置格式会随客户端和版本不同而变化,不应盲目复制示例。
3. MCP 不等于 API
MCP Server 内部通常仍然会调用 API,但 MCP 在 API 之上增加了适合模型使用的描述层。
普通 API:
POST /v1/issues/search
模型未必知道:
- 什么时候调用;
- 参数是什么意思;
- 返回值如何解释;
- 是否有副作用。
MCP 工具会附带机器可读描述:
Tool: search_issues
Description:
Search GitHub issues in a repository.
Arguments:
- repository: string
- query: string
- state: open | closed
Read-only: true
Agent 可以根据这些说明自动判断是否调用。
4. MCP 的主要风险
MCP Server 可以让 Agent 接触真实系统,因此风险远高于普通聊天:
- 读取敏感数据;
- 修改数据库;
- 创建或删除云资源;
- 发送消息;
- 泄露令牌;
- 执行恶意命令;
- 被外部内容进行提示注入;
- 供应链风险。
安全实践包括:
- 默认只开放只读工具;
- 使用工具白名单;
- 不要使用
"*"无限制开放所有工具; - 按最小权限配置令牌;
- 区分开发和生产凭据;
- 对写操作进行人工确认;
- 检查第三方 MCP Server 源码和维护者;
- 不把密钥直接写入仓库;
- 对外部返回内容视为不可信输入。
GitHub 官方同样建议只启用必要工具,优先允许明确的只读工具,并认真审查第三方 MCP Server。
九、Hooks 挂钩
Hook 是在 Agent 生命周期的特定节点,强制执行的确定性程序。
这是它与指令最大的区别:
- 指令是“告诉模型应该怎么做”;
- Hook 是“无论模型怎么想,都执行这段程序”。
例如:
Agent 准备运行终端命令
↓
PreToolUse Hook
↓
检查命令是否危险
↓
允许或阻止
或者:
Agent 修改文件
↓
PostToolUse Hook
↓
自动运行 Prettier
↓
自动执行 ESLint
VS Code 的 Agent hooks 当前仍属于预览功能。官方列出的用途包括安全策略、自动格式化、测试、审计记录、上下文注入和审批控制。
1. Hook 的典型节点
不同产品命名会有差异,常见概念包括:
- Session start:会话开始;
- Before tool use:工具执行前;
- After tool use:工具执行后;
- Before command:终端命令执行前;
- After file edit:文件修改后;
- Stop:Agent 即将结束;
- Error:工具调用失败时。
2. Hook 示例
自动格式化:
{
"hooks": {
"PostToolUse": [
{
"type": "command",
"command": "npx prettier --write ."
}
]
}
}
阻止危险命令的伪代码:
command = hook_input["command"]
blocked = [
"rm -rf /",
"DROP DATABASE",
"terraform destroy"
]
if any(item in command for item in blocked):
deny("Dangerous command blocked")
3. Hook 和指令的区别
假设你写了一条指令:
不要运行 rm -rf。
模型通常会遵守,但不能提供绝对保证。
而执行前 Hook 可以直接检查命令并阻止:
rm -rf ...
因此:
| 需求 | 更适合 |
|---|---|
| 使用团队命名规范 | 指令 |
| 修改后尽量运行测试 | 指令或技能 |
| 修改后必须执行格式化 | Hook |
| 禁止执行某类命令 | Hook |
| 记录每次工具调用 | Hook |
| 指导 Agent 如何完成发布 | 技能 |
十、Plugins 插件
Agent 插件通常是一个更高层的分发包,可以把多个定制元素打包在一起:
Plugin
├── 自定义 Agents
├── Skills
├── Instructions
├── Hooks
├── MCP 集成
└── 其他资源
例如一个“团队后端开发插件”可能包含:
- Backend Agent;
- 数据库迁移 Skill;
- API Review Skill;
- 团队编码 Instructions;
- 修改后执行测试的 Hook;
- 连接 Jira 和内部文档的 MCP Server。
VS Code 官方将 Agent plugins 描述为上述多类定制能力的预打包组合,可通过市场分发。
十一、这些概念如何组合
可以用一个实际项目来说明。
你对 Agent 说:
实现订单退款功能,对应 Jira 的 PAY-417。
系统可能这样工作:
第一步:加载 Instructions
.github/copilot-instructions.md
Agent 得知:
- 后端使用 NestJS;
- 数据访问使用 Prisma;
- 金额使用整数分;
- Controller 不写业务逻辑;
- 所有写接口必须记录审计日志。
第二步:选择自定义 Agent
选择:
payment-backend.agent.md
这个 Agent 被限定为支付后端专家,并只能使用相关工具。
第三步:加载相关 Skill
根据任务自动加载:
refund-workflow/SKILL.md
技能规定:
- 先查询支付状态;
- 验证可退款金额;
- 使用幂等键;
- 调用支付网关;
- 记录退款流水;
- 发送领域事件;
- 补充失败场景测试。
第四步:调用 MCP
Agent 使用 Jira MCP:
get_issue("PAY-417")
获得验收标准。
使用内部文档 MCP:
search_docs("refund API")
获得支付网关文档。
第五步:调用内置工具
- 搜索现有支付代码;
- 阅读
PaymentService; - 编辑多个文件;
- 创建测试;
- 运行测试。
第六步:触发 Hooks
文件修改后:
Prettier → ESLint → unit tests
如果 Agent 尝试执行生产部署命令,Hook 将阻止。
第七步:人工审查
你检查:
- 修改的文件;
- 命令记录;
- 测试结果;
- Git diff;
- 是否满足业务要求。
Agent:负责整体执行。
模型:负责推理。
Instructions:提供项目规则。
Skill:提供专业流程。
Tools:操作项目。
MCP:连接外部系统。
Hooks:提供确定性控制。
权限:构成真正安全边界。
十二、几个概念的快速对照
| 概念 | 回答的问题 | 类比 |
|---|---|---|
| Model | 谁负责思考? | 大脑 |
| Agent | 谁负责完成任务? | 能工作的员工 |
| Context | 它当前知道什么? | 桌面上的材料 |
| Tool | 它能做什么操作? | 手和工具 |
| Instruction | 它必须遵守什么规则? | 员工守则 |
| Prompt file | 如何快速发起重复任务? | 标准任务单 |
| Skill | 如何专业地完成某类任务? | 操作手册和工具箱 |
| Custom Agent | 它以什么角色工作? | 专岗员工 |
| MCP Server | 它能连接哪些外部系统? | 标准化外接接口 |
| Hook | 哪些动作必须自动发生? | 门禁和流水线开关 |
| Plugin | 如何整体安装这些能力? | 扩展套装 |
| Sandbox | 它能在哪个范围活动? | 隔离工作区 |
| Approval | 哪些操作需要你同意? | 审批流程 |
VS Code 官方给出的组合逻辑也非常接近:指令塑造代码行为,Prompt 和技能封装重复任务,自定义 Agent 定义角色,MCP 扩展外部能力,Hooks 在生命周期节点提供确定性控制。
十三、有关Agent的一些经验
1. Agent 并不是真的“理解”整个项目
它只理解当前获得的上下文。
如果它没有读取某个关键文件,就可能做出错误判断。
因此高质量 Agent 会先:
- 查看目录;
- 搜索相似实现;
- 阅读配置;
- 阅读测试;
- 再修改代码。
2. Agent 的“计划”不代表一定正确
Agent 可能:
- 误判框架版本;
- 使用不存在的 API;
- 漏掉边界条件;
- 破坏兼容性;
- 写出能编译但业务错误的代码。
测试循环能减少错误,但不能消除错误。
3. MCP 越多不一定越好
连接几十个 MCP Server 后,Agent 面临大量工具:
应该用 search_issue?
还是 get_project?
还是 query_docs?
还是 semantic_search?
工具过多会:
- 占用上下文;
- 增加选择难度;
- 增加误调用概率;
- 扩大安全攻击面。
应当为不同 Agent 只开放必要工具。
4. 指令不是安全边界
“请不要删除生产数据库”只是一句话。
真正的安全边界应由这些措施提供:
- 权限;
- 沙箱;
- 只读凭据;
- 工具白名单;
- Hook;
- 网络限制;
- 人工审批。
十四、初学者建议的配置顺序
不建议一开始就同时搭建 Agent、Skills、Hooks 和多个 MCP Server。可以按下面顺序学习:
阶段一:使用普通 Agent
先熟悉:
- 让 Agent 阅读项目;
- 让它解释计划;
- 查看每次修改;
- 运行测试;
- 检查 Git diff;
- 控制终端审批。
阶段二:添加项目指令
创建:
.github/copilot-instructions.md
只写最重要的 5~15 条团队规范。
阶段三:创建 Prompt 文件
把频繁执行的任务做成:
/review-api
/fix-tests
/create-component
阶段四:创建 Skill
当一个任务具有稳定的多步骤流程时,再创建 Skill,例如:
- 数据库迁移;
- 发布检查;
- 安全审查;
- 创建新服务;
- CI 故障诊断。
阶段五:接入一个只读 MCP Server
优先选择:
- GitHub;
- Jira;
- 文档搜索;
- 只读数据库查询。
先不要开放删除、部署和生产写入权限。
阶段六:添加 Hooks
用 Hook 做确定性保障:
- 修改后格式化;
- 提交前测试;
- 阻止危险命令;
- 保存审计记录。
十五、Agent入门的最小配置
my-project/
├── .github/
│ ├── copilot-instructions.md
│ ├── prompts/
│ │ └── fix-tests.prompt.md
│ ├── skills/
│ │ └── test-debugging/
│ │ └── SKILL.md
│ └── hooks/
│ └── quality.json
├── src/
├── tests/
└── package.json
它的职责分别是:
copilot-instructions.md
→ 定义项目长期规则
fix-tests.prompt.md
→ 提供 /fix-tests 任务入口
test-debugging/SKILL.md
→ 教 Agent 如何系统排查测试失败
quality.json
→ 修改后强制运行格式化和检查
之后再按需要加入 MCP:
GitHub MCP
→ 查询 issue、PR 和代码评审信息
Jira MCP
→ 获取需求和验收标准
Database MCP
→ 查询 schema 和测试数据
总结:
Agent 是执行框架;模型负责思考,工具负责行动,指令约束行为,技能提供方法,MCP 扩展外部能力,Hooks 提供确定性控制,权限和沙箱负责真正的安全边界。
