分类
技术

从 Chat 到 Agent:现代编程智能体

过去我们使用 AI 编程工具时,最常见的交互方式是“问一个问题,得到一段答案”。

例如:

  • 解释一段代码;
  • 生成一个函数;
  • 分析一个报错;
  • 提供重构建议。

如今,AI 编程工具开始从“回答问题”转向“直接完成任务”。

你可以对它说:

给这个项目添加用户登录功能,包括接口、权限校验、测试和文档。

它不仅会生成代码,还可能主动阅读项目、修改多个文件、运行测试、检查错误,并根据运行结果继续修复。

这种能够围绕目标连续执行任务的系统,通常被称为 Agent,也就是智能体

可以把“编程 Agent”理解成:

一个能观察项目、制定步骤、调用工具、执行操作、检查结果并继续修正的 AI 程序员。

GPT-5.5

普通大模型主要是“输入文字,输出文字”;编程 Agent 则在大模型外面加上了项目上下文、工具、权限、循环执行机制以及各种定制规则。


一、agent整体架构

一个典型编程 Agent 大致由这些部分组成:

你的任务
   ↓
Agent / 智能体
   ├── 大语言模型:理解、推理、规划
   ├── 上下文:代码、对话、错误、文档
   ├── 指令:项目规则和行为约束
   ├── 技能:可复用的专业工作流程
   ├── 工具:读文件、改文件、终端、搜索
   ├── MCP 服务器:连接外部系统和数据
   ├── 挂钩 Hooks:在固定节点强制执行脚本
   └── 权限和沙箱:控制它能做什么
          ↓
读取代码 → 修改代码 → 运行测试 → 查看错误 → 再修改

VS Code 官方把这个过程称为 Agent loop,智能体循环:模型选择工具,工具返回结果,结果进入下一轮上下文,模型再决定下一步,直到任务完成或需要人工介入。

二、什么是智能体 Agent

1. 大模型和 Agent 的区别

大模型本质上是一个推理和文本生成引擎。

你输入:

请帮我给这个 Express 项目添加登录功能

仅有大模型时,它可能输出一段示例代码。

Agent 则能进一步:

  1. 查看项目目录;
  2. 读取 package.json
  3. 找到路由、数据库和用户模型;
  4. 判断项目使用 JavaScript 还是 TypeScript;
  5. 修改多个文件;
  6. 安装依赖;
  7. 执行测试或启动项目;
  8. 阅读报错;
  9. 根据报错继续修改。

因此可以粗略写成:

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

技能规定:

  1. 先查询支付状态;
  2. 验证可退款金额;
  3. 使用幂等键;
  4. 调用支付网关;
  5. 记录退款流水;
  6. 发送领域事件;
  7. 补充失败场景测试。
第四步:调用 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 提供确定性控制,权限和沙箱负责真正的安全边界。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在此处输入验证码 : *

Reload Image