简介:本文面向开发者与技术负责人,系统讲解Agent Skill、MCP与Prompt三类能力的定位差异、适用边界与协作方式,并给出可落地的选型判断流程、配置示例与排查优化建议,帮助读者在构建多代理系统时做出清晰、可维护的架构决策。
在构建基于大模型的代理(Agent)系统时,开发者经常会遇到一个绕不开的架构问题:同样是让代理具备某项能力,到底应该写进 Prompt、封装成 Skill,还是接入 MCP? 三者看起来都能”让代理做事”,但在可复用性、上下文开销、权限边界和维护成本上差异极大。选错了载体,短期能跑通,长期会演变成难以维护的”提示词泥潭”。
本教程的目标是帮助读者完成一件事:建立一套清晰的判断标准,能够在具体场景中决定某项能力应该放在 Prompt、Skill 还是 MCP 中实现。适合正在设计单代理或多代理系统的开发者、负责技术选型的架构师,以及需要评估代理平台落地路径的技术负责人阅读。
在讨论”怎么选”之前,必须先明确三者分别解决什么问题。
Prompt 是直接注入到模型上下文中的自然语言指令或示例。它的特点是:
Prompt 适合承载”这一次要怎么做”的信息,比如输出格式约束、角色设定、当前任务的临时规则。
Skill 的本质是把一类专业知识或标准作业流程封装成可被任意代理加载的能力单元。它通常包含:领域知识、执行步骤、判断规则、输出规范,必要时还会声明需要调用的工具。
关键特性:
MCP(Model Context Protocol,模型上下文协议)解决的是一类完全不同的问题:代理如何以统一的方式访问外部系统、数据源或工具。它定义的是”代理与外部资源之间的接口规范”,而不是”某类知识怎么做”。
关键特性:
用一句话概括三者关系:
Prompt 决定”这次怎么做”,Skill 决定”这类事该怎么做”,MCP 决定”能去哪里做”。
| 维度 | Prompt | Skill | MCP |
|---|---|---|---|
| 作用范围 | 单次对话/单代理 | 跨代理、跨会话 | 跨代理、跨会话 |
| 承载内容 | 指令、格式、临时规则 | 专业知识、流程、方法 | 外部工具、数据、系统接入 |
| 复用性 | 低 | 高 | 高 |
| 是否含权限 | 否 | 通常不含,仅声明依赖 | 是,含鉴权与访问边界 |
| 上下文开销 | 占用主上下文 | 按需加载 | 通过协议调用,不占主上下文 |
| 典型场景 | 角色设定、输出约束 | 安全审查、数据分析流程 | 查询数据库、调用业务接口 |
理解这张表的关键在于:三者的差异不在”能力大小”,而在”解决的是哪一层问题”。把它们混用,就会出现”把通用流程写死在某个代理的 Prompt 里”或”为了调一个接口就新建一个代理”这类反模式。
下面给出一套可操作的判断流程。面对一个新需求时,按顺序问自己四个问题:
如果某项任务需要:
那么它更适合用子代理承载,而不是把它塞进主代理的 Prompt 或 Skill 中。
如果访问外部资源需要独立的鉴权、审计或最小权限控制,MCP 是更合适的载体;而 Skill 通常只声明”需要哪类工具”,不负责实际授权。
经验法则:能复用的知识做成 Skill,能复用的接入做成 MCP,一次性的约束写进 Prompt,需要独立执行链路的用子代理。
这正是原始内容中最关键的观点,值得展开说明。
假设你的系统里有三个代理:一个负责代码审查,一个负责数据管道构建,一个负责运维变更评估。三者都需要执行”安全检查流程”——检查依赖风险、识别敏感数据暴露、核对权限最小化原则。
如果把这个流程写死在每个代理的 Prompt 里,会带来三个问题:
如果封装成 Skill,则:
这就是 Skill 的核心价值:把”任何代理都应该掌握的专业知识”从具体的代理实现中抽离出来。
Skill 和子代理不是竞争关系,而是互补关系。以下场景更适合子代理:
换句话说:Skill 教”怎么做”,子代理负责”独立去做”。一个子代理在执行过程中,完全可以加载多个 Skill 来指导自己的行为。
下面给出一个中立的、可落地的设计流程。
列出系统需要代理完成的所有任务,并标注每一项属于:
对知识/流程类需求,识别其中被多处引用的部分,封装为 Skill。一个 Skill 建议包含:
skill:name: security-reviewdescription: 标准安全检查流程inputs:- target: 待检查对象描述steps:- 识别依赖与外部输入- 检查敏感数据暴露面- 核对权限最小化原则- 输出风险清单与建议outputs:- risk_reportrequires_tools:- file_reader- dependency_scanner
注意:Skill 只声明需要哪类工具,不负责实际授权,授权由运行时环境或 MCP 层处理。
对每一项外部资源访问需求,定义标准的工具接口:
{"tool": "query_metrics","description": "按时间范围查询指标数据","input_schema": {"type": "object","properties": {"start": {"type": "string"},"end": {"type": "string"},"metric": {"type": "string"}},"required": ["start", "end", "metric"]}}
接口定义应保持与具体代理无关,任何有权限的代理都能调用。
对需要独立执行、独立权限、独立上下文的任务,创建子代理,并在其配置中声明:
主代理的 Prompt 中只保留:当前任务目标、输出格式、本次特殊约束。不要把可复用的知识写进 Prompt。
设计完成后,用以下方式验证分层是否合理:
问题 1:Skill 加载后行为不符合预期。
排查方向:Skill 的输入描述是否清晰?前置条件是否满足?依赖的工具是否已在运行时可用?建议先单独用最小样例验证 Skill,再接入代理。
问题 2:多个 Skill 之间规则冲突。
原因通常是职责边界不清。解决方式是为每个 Skill 明确”负责什么、不负责什么”,并在加载顺序上定义优先级。
问题 3:MCP 工具调用频繁失败。
排查鉴权配置、网络连通性、参数 schema 是否匹配。建议在协议层统一错误返回格式,便于代理做出重试或降级决策。
问题 4:子代理结果无法被主代理理解。
这通常是输出契约问题。应为主代理与子代理之间定义固定的返回结构,而不是自由文本。
问题 5:Prompt 越写越长,效果反而变差。
这是典型的”该抽 Skill 却写进 Prompt”的信号。把通用流程移出 Prompt,往往能同时提升稳定性和可维护性。
回到最初的问题:Agent Skill、MCP 与 Prompt 的区别是什么?
判断顺序可以简化为:先问是知识还是资源,再问是否复用,最后问是否需要独立执行与隔离。当你发现多个代理或多段对话都需要同一类专业能力时,应该创建 Skill,而不是把知识写死在某个子代理或 Prompt 里。这一条原则,是保持代理系统长期可维护的关键。