目录用 Copilot 学 Agent —— AI 编程的新范式深入认识 Agent —— 实现你自己的 Agent深入认识 Agent —— 智能体开发框架深入认识 Agent —— 构建简单的 Agent 框架概述自从 ChatGPT 问世以来AI 大模型领域的发展日新月异各种概念、专业术语层出不穷如 Vibe Coding、Agent、MCP、Skills 等等。本文将结合 Copilot介绍相关概念的含义和具体的使用方式。Vibe CodingVibe Coding氛围编程 是2025年初由 AI 大牛 Andrej Karpathy 提出的一个概念它形象地描述了当下一种极致的 AI 辅助编程模式开发者不再逐行编写代码而是通过自然语言向AI描述想法和需求由 AI 完成几乎所有的编码工作。Vibe Coding自诞生起就伴随着巨大的争议。它如同一枚硬币拥有正反两面✅优势与机遇创造力的民主化闪电般的原型开发它能将原本数周的原型验证缩短到几天甚至几个小时。极低的入门门槛它让非技术人员能够将创意变成现实、推动了“人人都是开发者”的浪潮。解放创造力开发者可以从语法细节中抽身将精力更多地集中在“做什么”的问题定义和创意构思上。❌风险与挑战脆弱的“屎山代码”AI 生成的代码往往缺乏清晰的架构像意大利面条一样混乱极难维护和扩展。巨大的安全隐患研究表明AI 生成的代码中近一半包含漏洞。安全研究公司 Escape 对 5600 多个 Vibe Coding 应用进行大范围的扫描结果发现超过 2000 个安全漏洞、400 多个暴露的密钥。不可持续的长期成本初期的“高效率”过后后期在修复 Bug、重构代码和理解混乱逻辑上需要投入指数级增长的人力成本。开发者的知识断层长期以来 Vibe Coding 的开发者可能绕过编程基本功的学习沦为只会提需求的“中间商”。AI 编程Vibe Coding ≠ AI编程Vibe Coding 不等于 AI 编程它只是 AI 编程中的一种风格。人们常说的 AI 编程是一个更广泛的概念事实上用 “AI 辅助编程” 这个概念来描述可能更为准确开发者主导架构视 AI 为效率工具用于生成代码片段、编写单元测试用例或重构代码最终由人严格审查和整合。从随性的 Vibe 到理性的 Agentic Engineering面对 Vibe Coding 的混乱一种更严谨、更系统化的模式正在兴起即Agentic Engineering智能体工程。比较来说Vibe Coding 是随心所欲的感性创作而 Agentic Engineering 更像是一个严谨的工程化系统。建立 Agentic Engineering关键在于引入标准化的流程和质量控制系统从提示词到规格说明Spec-Driven不依赖模糊的自然语言而是使用结构化的规格说明Specifications来驱动 AI。开发团队先定义好清晰的需求、约束和验收标准这些规范成为 Agent 协作的依据确保产出和预期高度一致。从单元测试到多维评估Evaluation-Driven传统针对确定性代码的单元测试不再适用于测试 AI 生成的、充满可能性的结果。因此需要建立新的评估体系对智能体产出代码质量进行多维度、自动化的衡量和优化。从单兵作战到多智能体协作Multi-Agent Orchestration让单一 AI 包揽所有任务容易导致代码质量失控。智能体工程强调分工与制衡由不同的 AI Agent 各司其职。比如一个负责编码一个负责代码审查和安全检查还有一个负责测试它们协同工作形成一个半自主的、具备自我修正能力的系统。从代码审计到流程审计Audit Trails软件工程的标志之一就是可预测性和可审计性。智能体工程在流程中内建了质量关卡和审计轨迹。这意味着 AI 产生的每一行代码、所做的每一个决策都会被记录和追溯方便问题定位和责任归属。AI 编程工具推荐AI 辅助编程需要借助强大的 AI 编程工具。目前市场上主流的工具包括Cursor、Github Copilot、Claude Code、Replit Ghostwriter、Lovable、Windsurf。AgentAgent 是一个以大语言模型为核心控制器能够自主理解目标、规划步骤、调用外部工具、并根据环境反馈循环执行直至完成任务的智能程序。一个完整的 Agent 通常包含四个关键部分大语言模型LLMLLM 作为大脑负责理解意图、推理决策、生成计划。规划模块Planning将负责目标拆解成可执行的步骤并能根据结果动态调整。记忆模块Memory短期记忆当前对话上下文 长期记忆向量数据库存储历史经验。工具使用Tool Use调用外部 API、搜索引擎、代码解释器、数据库等获取信息或执行动作。Agent 不是一次性回答而是遵循“思考-行动-观察”的循环直到任务完成。Agent 与普通 AI 应用如聊天机器人的区别特性普通 AI 应用Agent交互模式单轮问答被动响应多轮自主执行主动完成任务能力边界只能输出文本可调用外部工具、改变外部状态任务复杂度简单信息查询或生成需要多步推理、拆解、纠错的复杂目标自主性完全由用户引导能在目标框架内自主决策下一步Copilot 中的 AgentCopilot 内置了 Agent 能力而且不止一种形态。在 IDE 如 Visual Studio 中可以直接在 Copilot Chat 里切换模式Ask/Plan/Agent。而在 Github 的 Copilot 页面也可以切换 Ask/Agent模式。如果要创建自定义的 Agents需要通过配置文件*.agent.md来定义其内容包含所专注解决的任务可以调用的工具或者 MCP 服务器可选的指令用于指导对话风格每个 Agent 都是一个配置文件放在agents/目录下其中声明了它所依赖的工具。下面是一个通过 VS Code 的 Copilot Agent 来创建自定义的 Agent 的示例其整个创建过程如下[我:] 帮我创建一个最小可用的 Agent主要用于对 API 层接口进行优化。 [Copilot:] 我会先按规范读取 agent-customization 的技能说明和 agent 文件格式再在仓库里直接创建一套最小可用的配置。 Read skill agent-customization 为了保证文件格式正确我会再读取官方 agent 模板说明然后一次性创建最小配置文件。 我会按“最小可用”方案创建两类文件一个项目级全局说明 一个可在 Agent 列表里使用的专用 Java API agent。 配置文件已创建我再做一次快速校验确认文件路径和 Git 状态都正确。 已帮你初始化一套最小可用的 Agent 配置放在项目级可随仓库共享 全局项目指令 copilot-instructions.md 自定义 Agent java-api-optimizer.agent.md 这套配置的作用 copilot-instructions.md定义项目级默认行为Java 多模块、最小改动、API 兼容优先等。 java-api-optimizer.agent.md提供一个可直接选用的“Java API 优化”专用 Agent工具最小化为 read/search/edit适合 API 层接口优化场景。 当前状态 文件已创建成功。 语法检查无错误。 Git 状态显示为未跟踪新增文件正常待你决定是否提交。 如果你要我可以下一步继续 再加一个“只读审查 Agent”仅 read/search不允许改代码。 按你团队习惯把这个 Agent 改成中文输出模板。生成过程中使用的 skill 点击会链接到插件自带的技能SKILL.md位于 VS Code 的插件目录。最终会在当前项目录的.github文件夹下创建 agents└── .github ├── copilot-instructions.md └── agents └── java-api-optimizer.agent.md什么时候应该使用 Copilot Agent 模式对于以下场景建议使用 Copilot Agent 模式而不是普通对话模式重复性的开发流程而且这些流程需要频繁调用工具(git/shell/API/DB)。希望 Copilot 不只是回答问题而是主动去做事情比如自动执行 shell 命令自动调用 API 等。需要一个稳定的角色约束而不是每次 prompt 都需要重新定义。相比于普通模式Agent 在整个 session 期间都保持一致行为。拆分任务并分派给多个子 Agent。SkillSkill 是可复用的能力模块capability modules本质上是给 Agent 提供 “结构化能力 上下文 执行方式” 的封装单元。Skill 的作用是将人类的操作手册翻译成 Agent 能够理解和执行的指令从而将通用模型变成领域专家。如果说 Agent 是执行者负责理解目标、规划、决策和调用工具那么 Skill 则是能力单元它告诉 Agent 当需要完成某个任务时请按照步骤 1-2-3 来执行。Agent 与 Skill 交互示意图如下在不同的 AI 框架中 Skill 的实现形式略有不同但核心思想是一致的框架/系统Skill 的体现LangChainTool或ChainAutoGPT通过ai_settings.yaml定义的命令Semantic KernelPlugins一组 Skill 的集合Copilot一套 Markdown 指令 可选脚本 的文件夹Copilot SkillCopilot 中 Skill 是一个特定的文件夹其核心结构如下your-skill-folder/ # 技能根目录 ├── SKILL.md # 核心文件包含元数据和操作指令 ├── scripts/ # (可选) 存放辅助脚本如Python/Shell文件 └── templates/ # (可选) 存放模板文件如代码或配置模板其中SKILL.md是技能的关键其内容由两部分构成元数据位于文件顶部包含name和descriptionCopilot 根据它来识别何时调用此技能。操作指令详细的步骤说明指导 Agent 如何一步步完成任务可以引用scripts/或/templates中的文件。Copilot Skills 可以存放在两个位置以适应不同的场景项目级 Skills放在.github/skills目录下可以随项目一起进行版本控制。个人级 Skills放在.copilot/skills目录下适合于个人使用的通用技能。接下来让 Copilot Agent 来创建一个用于 “Java 代码规范检查” 的 Skill过程如下看一下生成的文件.github/skills/java-code-style-check/SKILL.md--- name: java-code-style-check description: Use when reviewing Java code style, naming, logging, exception handling, and API-layer coding conventions in this repository. Keywords: java style check, code规范检查, clean code review, naming consistency. argument-hint: Provide target path(s) and strictness: quick | standard | strict. user-invocable: true --- # Java Code Style Check ## Purpose Run a repeatable Java code规范检查 workflow for this repository without requiring extra linters. ## When To Use - User asks for Java code style review or code规范检查 - Before commit to catch readability and maintainability issues - During API refactor to keep naming and exception handling consistent ## Inputs - Target file(s) or module path - Strictness level: - quick: high-impact issues only - standard: full checklist - strict: full checklist stronger consistency requirements ## Procedure 1. Gather context. - Read target Java files and nearby DTO/service classes if needed. - Check project conventions from .github/copilot-instructions.md. 2. Run lightweight validation commands when possible. - mvn -q -pl war -DskipTests compile - If checking whole repo: mvn -q -DskipTests compile 3. Review with the checklist below. 4. Report findings ordered by severity and include exact fileline references. 5. If requested, apply minimal fixes and re-check compile/errors. ## Java Checklist - Naming: - Class and method names are clear and intention-revealing. - Constants use UPPER_SNAKE_CASE; variables use lowerCamelCase. - API boundary: - Inputs use validation annotations where appropriate (NotNull, NotBlank, Valid). - Error responses are predictable and avoid leaking internal details. - Null and empty handling: - Avoid NPE-prone patterns; guard nullable values explicitly. - Treat blank strings intentionally (trim/validate where required). - Logging: - Log messages are actionable and include key identifiers. - Avoid noisy logs and avoid logging sensitive payloads. - Exceptions: - Catch only meaningful exception types. - Preserve original exception context in logs or rethrows. - Readability: - Minimize duplicate logic and magic strings. - Keep methods focused; extract helpers for repeated blocks. ## Output Format - Scope checked - Findings (Critical, Major, Minor) - Suggested fixes - Validation run results ## Notes - This skill is repository-friendly and does not assume Checkstyle/Spotless exists. - If formal linters are added later, prefer them first and keep this checklist as fallback.看起来有点像 Prompt实际上也是工程化后的 Prompt。相比于 PromptSkill 的复用性更高、结构化更强、并且是可执行的带工具还有持久的上下文。MCP在 AI Agent 的语境下MCPModel Context Protocol模型上下文协议是一个标准化协议它的核心角色是为 AI Agent 提供“如何连接并使用外部工具”的标准化接口。如果说 Agent 是执行者负责理解目标、规划、决策和调用工具Skill 是能力单元负责告诉 Agent 完成某个任务需要执行的操作那么 MCP 则是标准化的工具调用协议负责将 Skill 中描述的操作转化为 Agent 能够实际执行的、与外部系统交互的原子动作。简单点说Skill 定义做什么MCP 定义怎么做。假设现在有一个场景需要让 Agent 给所有的系统会员发送邮件。在 MCP 中需要暴露两个工具1️⃣ 数据库工具数据库工具本质上是一个 DB 查询 API{ name: query_users, description: Query membership users, params: { membership: boolean } }2️⃣ 邮件发送工具同样是一个邮件发送 API{ name: send_email, description: Send email to recipients, params: { to: liststring, subject: string, body: string } }虽然 MCP 定义好了怎么调用数据库怎么发邮件 把数据库/邮件系统变成了 Agent 可调用的工具但是并没有告诉 Agent 什么时候调用。于是 Agent 才需要查询 Skill:# Skill: Send Membership Email ## When to use - 用户想批量发邮件 - 涉及会员用户查询 ## Steps 1. 调用 query_users 获取会员用户 2. 提取 email 字段 3. 使用模板生成邮件内容 4. 调用 send_email 发送 ## Notes - 如果用户没提供内容用默认模板Agent 通过 Skill 知道了操作步骤然后再根据 MCP 的接口规范调用外部工具最终完成用户指定的任务。MCP 与 SkillMCP 和 Skill 是协同工作的。如果没有 MCPAgent 即使有 Skill 手册也无法真正去执行——因为每个外部工具都有自己的 API 格式、认证方式和参数规则。如果没有 SkillAgent 虽然有可能自己推理出要做什么然后用 MCP 来实现目的但是这个过程是不稳定、不可控的。Agent 每次推理结果可能不一样步骤增多/减少都是有可能的。Skill 可以把经验流程固化避免 Agent 每次临时发挥。Copilot MCPMCP 是 Agent 连接外部系统的“机机”接口定义了外部系统工具的使用规范。而 MCP server 是一个暴露这些工具的轻量级进程本质上就是 Tool Provider。在 VSCode Copilot 中MCP servers 的配置可能存在于不同目录文件作用范围说明.mcp.json项目根目录项目级别生效可以提交到 git.vscode/mcp.jsonVS code workspace与 VS Code 的配置文件格式兼容适合个人或编辑器相关的配置devcontainer.json开发容器内以容器运行时可以通过 devcontainer 定义 MCP 服务器配置优先级从低到高后加载的配置会合并和覆盖前面的配置。如果想配置全局生效而不仅仅是特定项目可以在用户级别来设置~/.config/Code/User/mcp.json或~/Library/Application Support/Code/User/mcp.jsonMac OS。如果使用的是 copilot-cli则 mcp 需要配置为: ~/.copilot/mcp-config.json而如果使用的是 IntelliJ IDEA则 mcp 需要配置在: ~/.config/github-copilot/intellij/mcp.json。而且不同的客户端使用的 mcp 配置格式都略有不同。下面是一个 MCP server 的配置文件示例.vscode/mcp.json{ servers: { postgres: { command: npx, args: [-y, modelcontextprotocol/server-postgres], env: { DATABASE_URL: postgresql://user:passlocalhost:5432/mydb } }, filesystem: { command: npx, args: [-y, modelcontextprotocol/server-filesystem, ./docs] } } }这个文件配置了两个 MCP server每个服务器是一个通过 npx 启动的进程按照 MCP 协议对外提供一组标准化的工具。MCP server 提供的工具在配置文件中是看不到的需要通过动态发现来获取主要有几种方式查阅官方文档。比如上面filesystem这个 server 启动的是一个 npm 包。因此可以查询官方文档modelcontextprotocol/server-filesystem。使用 MCP Inspector 工具。Anthropic 官方提供了一个图形化调试工具 MCP Inspector在终端中运行npx modelcontextprotocol/inspector npx -y modelcontextprotocol/server-filesystem ~通过 MCP 协议动态发现。MCP 有标准机制客户端会发送 tools/list 请求MCP 服务器会响应一个 JSON 列表其中包含所有可用工具的详细信息如名称、描述、参数模式。需要注意的是MCP 本身是没有官方中心仓库的完全是一个开放的生态。但有一个 MCP Registry集中存储 MCP Server 的元数据。相当于一个只存描述不存具体应用的 App Store。MCP server 启动和认证MCP server 配置后可以设置为自动启动也可以手动启动。直接在mcp.json配置文件中可以点击按钮▶️Start | More...如果是在用户级别配置的 mcp servers可以在 VSCode 的命令栏列出 mcp server 并运行MCP: List Servers有些 MCP servers 需要认证才能连接上。Copilot 提供多种认证方式OAuth标准网页授权自动弹出浏览器完成登录授权。设备码流程RFC 8628对于无图形服务器CICD 流水线等CLI 会自动切换成设备码模式。用户在另一台有浏览器的设备上访问并输入设备码完成登录。/mcp auth命令等 token 过期或切换账号时重新打开 OAuth 认证界面完成登录无需重启会话。Microsoft Entra ID (Azure AD)首次登录通过 Entra IDAzure AD进行登录认证后续自动重连。环境变量传递密钥, 假如 MCP server 需要 API Key将其设置在环境变量中通过API_KEY: {env: MY_API_KEY}传递。VS Code 运行时交互在mcp.json中以变量的方式写入${input: myToken}在 MCP server 启动时 VS Code 有弹出输入框让用户输入变量值。Copilot 内置工具和 MCPVS Code Copilot 内置了很多工具所以即使没有配置任何 MCP server也可以完成很多任务内置工具作用codebase在项目中搜索和分析代码terminal在集成的终端中运行 shell 命令edit在工作空间中创建和更新文件fetch通过 HTTP 请求访问 URLsearch在工作空间中搜索文件github与 Github API 进行交互VS Code Copilot Agent 能完成很多代码相关的工作正是靠这些内置工具实现的。点击对话框的按钮就能看到内置的诸多工具这里的 browser 截图工具可以直接让 Agent 截图判断页面状态。假设某 mcp server 需要登录认证你可以在 Skill 中让 Copilot 通过截图判断是否已经登录After the page loads, use screenshot_page to see the current state. Tell the user: The login page is open, please log in with your credentials. Let me know when you are done. Do not attempt to type credentials or click buttons automatically, the user must log in interactively.如果使用的是 Copilot Cli可以直接在 cli 中查看是否有内置的 MCP server/mcp showInstructionsCopilot 中还有一个术语叫 Instructions本质上它是系统级别的 Promopt用来长期约束 AI Agent 的行为。在其他 AI Agent 中也有类似的概念比如 Cursor 的 Rules.cursorrulesClaude Code 的 InstructionsCLAUDE.md等。与 Skills 区别经过上文介绍可知Skills 是 Agent 完成某个目标的操作手册赋予 AI 执行特定任务的能力是按需激活的而 Instructions 是始终生效的比较如下特性InstructionsSkills核心理念设定 AI 的行为准则和角色赋予 AI 执行特定任务的能力关注焦点设定身份、语气、边界限制描述能做什么定义一套标准化的工作流程内容结构通常是一个 md 文件通常是一个文件夹可附带脚本.py,.sh、模板.json.txt等如果说 Skills 是 AI Agent 的方法论是按需加载的专用能力包则 Instructions 是 AI Agent 的价值观是持久化的通用约束。Copilot InstructionsCopilot 的 Instructions 是一个文件夹instructions/ # 指令根目录 ├── xx.instructions.md同样地instructions 既可以放在用户目录~/.copilot/instructions也可以放在项目目录~/.github/instructions。当 Copilot 工作时它会加载所有的指令而如果不同指令有冲突优先级最高的是用户级指令。最好的方式是让不同层级的指令互为补充例如在用户指令中定义通用代码风格在项目指令中指定特定的技术栈。下面让 Copilot Agent 自动将 Andrej Karpathy 提出的 AI Coding 行为规范作为 instuctions 加入到全局配置中。下达指令后Copilot 会自动联网搜索分析 github 仓库中的CLAUDE.md文件将其内容提取出来生成全局的 instructionsvim ~/.copilot/instructions/karpathy-global.instructions.md --- description: Global coding guardrails derived from andrej-karpathy-skills. Use for coding, debugging, refactoring, and code review across any workspace. applyTo: ** --- # Karpathy Global Instructions These instructions bias toward caution over speed. For trivial tasks, use judgment. ## Think Before Coding - State assumptions explicitly before implementing when they affect behavior. - If multiple interpretations are plausible, surface them instead of picking one silently. - If something is unclear, name the uncertainty and ask or perform the smallest check that can resolve it. - Push back when a simpler approach solves the request better. ## Simplicity First - Implement the minimum code needed to satisfy the request. - Do not add speculative abstractions, flexibility, configuration, or features that were not requested. - Prefer existing patterns over introducing new layers. - If the solution feels overbuilt, simplify it. ...