简介:本文从演进历史、核心概念和工程落地三个维度,系统讲解Agent Skill、MCP与Prompt的区别与联系。读者将理解三者在智能体架构中的分工边界、调用链路与适用场景,并掌握在自建智能体或云上开发环境中合理组合使用它们的方法。
在智能体开发中,Prompt、MCP、Agent Skill 是三个频繁出现但容易混淆的概念。它们不是同一层面的替代关系,而是分别解决“怎么让模型理解意图”“怎么让模型调用外部能力”“怎么让模型稳定执行复杂流程”的不同问题。
本教程旨在帮助读者完成以下任务:
适合读者包括:智能体应用开发者、后端工程师、技术负责人,以及对大模型应用工程化感兴趣的企业用户。阅读本文不需要绑定任何特定云平台或开发框架,但建议具备大模型调用、JSON Schema、REST API 等基础概念。
概念繁多时,直接对比定义容易陷入术语循环。更有效的方法是从技术演进史中观察每个概念的诞生背景和它要解决的工程问题。
早期语言模型主要擅长生成文本,但当面对“查询实时数据”“执行计算”“操作外部系统”等任务时,单纯生成答案并不可靠。行业随后提出将推理与行动结合的研究范式,使模型在推理过程中可以暂停、调用外部反馈、再继续推理。这一阶段确立了“思考—行动—观察—再思考”的循环骨架,也为后续所有工具调用机制提供了逻辑基础。
当大规模语言模型具备更强的指令理解和逻辑推理能力后,开发者不再需要依赖完全人工编写的规则流程。模型可以在自然语言指令下,识别任务目标、拆分步骤并尝试使用外部工具。这一阶段的关键进展是:模型本身成为可以承载工具调用决策的载体,而不是仅靠外围代码驱动。
随着开发者需要在生产环境中调用数据库、搜索引擎、计算服务等外部能力,模型输出“自然语言操作意图”已不够稳定。于是行业引入结构化函数调用能力:开发者预先定义函数名称、参数、描述和 JSON Schema,模型在需要时生成符合规范的调用请求。工程价值在于:下游系统可以可靠解析模型输出,不再依赖脆弱的文本匹配。
这一能力后来在应用层被扩展为 Tool Calling,即由智能体运行时负责真正发起调用、接收结果并回传给模型。Function Calling 偏模型原生输出能力,Tool Calling 则强调“调用—执行—反馈”的完整执行链路。二者的连接是工程化落地的第一步标准化。
随着工具数量和类型激增,不同智能体框架各自定义工具描述、认证方式、调用协议,导致一个工具写一遍只能在一个平台使用。于是行业提出模型上下文协议(Model Context Protocol,MCP),尝试统一工具和数据的发现方式、描述格式与调用行为。
MCP 的核心意义在于解耦:将“工具如何被描述、被调用”从特定开发框架中剥离出来。服务提供方只需实现一次 MCP 适配,之后可被不同智能体客户端复用。MCP 不替代函数调用,而是建立在函数调用之上的更高层抽象与传输协议。
工具统一后,新的问题出现:即使模型能调用很多工具,面对多步骤、有分支、依赖顺序、需要遵循标准作业程序的复杂任务时,仍然容易出现遗漏步骤、上下文膨胀、执行不稳定等情况。Agent Skill 的出现,是把某类重复性任务的“流程知识”显式化、模板化,让智能体不是每次从零推理,而是按预先定义的技能包执行。
综上,演进主线可以概括为:
Prompt 是用户或系统向模型提交的自然语言指令、上下文和示例集合。它是所有交互的起点,也是调优成本最低、迭代最快的部分。
在智能体场景中,Prompt 通常分为系统提示和用户提示。系统提示用于约束角色、边界、输出格式,用户提示用于描述当前任务。Prompt 的局限在于:只有语言层面的引导,没有外部状态的闭环验证。一旦任务依赖实时数据或确定性计算,仅靠 Prompt 无法保证正确性。
Function Calling 是模型根据预定义 JSON Schema 生成工具调用请求的能力。它的核心是模型原生支持结构化输出,让函数调用不再是“文本里写出一个想调用什么”的不可靠行为,而是可被程序解析的标准数据结构。
一次典型 Function Calling 包含:
工程上,开发者需要完成工具 Schema 设计、描述编写、错误重试和结果回填。
Tool Calling 可视为 Function Calling 的运行时执行链路。它包含三阶段:
Tool Calling 的核心在“闭环”:如果没有把结果回传给模型,模型就无法根据反馈修正下一步动作。很多智能体不稳定,不是模型不会调用,而是执行反馈没有被正确组织或上下文管理不合理。
MCP 是一套面向工具与数据交互的标准协议。它的目标不是替代函数调用,而是统一工具发现、描述、权限和传输方式。理想情况下,一个支持 MCP 的服务可以被任意遵循该协议的客户端使用。
MCP 将一个工具拆为描述层与传输层:描述层用于声明工具的参数、描述、返回结构;传输层负责启动连接、鉴权、请求与返回。开发者可以使用通用客户端接入不同服务,减少重复适配成本。
MCP 解决的工程问题包括:
Agent Skill 是面向任务的流程能力包。它不是单个工具,也不是单一 Prompt,而是将“领域知识、执行步骤、可用工具、决策规则、输出格式”打包为一个可复用的技能。
Agent Skill 通常在以下情况下引入:
一个完整的 Skill 可以包含触发条件、输入约束、步骤说明、工具调用策略、异常处理、输出校验等。智能体在需要时加载对应技能,而不是把全部知识都塞进系统提示中。
从关系上看,三者不是并列且对等,而是分别处在不同层级:
| 层级 | 概念 | 解决什么问题 | 典型存在形式 |
|---|---|---|---|
| 交互层 | Prompt | 让模型理解用户意图、约束和输出要求 | 自然语言模板、系统指令 |
| 能力层 | Function Calling / Tool Calling | 让模型可靠请求外部工具并接收结果 | 工具 Schema、调用协议、运行时闭包 |
| 协同层 | MCP | 让工具与数据可跨框架、跨服务复用 | 服务端工具描述、传输协议、客户端适配 |
| 流程层 | Agent Skill | 让复杂任务按标准流程稳定执行 | 技能包、流程模板、领域规则 |
在实际工程中,可使用以下判断顺序:
下面给出一个通用落地流程。示例不依赖任何具体品牌工具,面对某云厂商或自建环境均可套用。
以一个“订单履约查询”任务为例。初始 Prompt 可设计为:
你是一个订单运营助手。收到用户请求后,先判断请求中的订单号。若订单号缺失,请引导用户提供。若订单号完整,请调用订单查询能力获取状态,再用简洁语言解释当前状态。不要猜测数据。
这一步的目标是让模型理解任务边界、触发条件与回答约束。缺点是模型无法真正获取订单数据,需要进入下一阶段。
定义一个通用函数描述:
{"name": "lookup_order_status","description": "查询订单的履约状态","parameters": {"type": "object","properties": {"order_id": {"type": "string", "description": "用户提供的订单号"}},"required": ["order_id"]}}
运行时调用链路为:
lookup_order_status(order_id=A123) 调用请求;{"status": "已发货", "carrier": "某物流商", "updated": "当日"};这一步实现了外部数据闭环,但当前仅适用于“单次查询”,一旦涉及“异常订单需要触发工单”“不同类型订单处理规则不同”等复杂流程,仅靠一个函数调用就不够了。
假设后续需要接入“库存工具”“退款工具”“工单工具”,每个工具若单独定义发现方式和调用参数,不仅重复劳动多,而且不同应用难以复用。此时可抽象一层统一协议。
约定一个通用描述结构:
{"protocol_version": "1.0","tool_name": "lookup_order_status","description": "查询订单履约状态","input_schema": { "type": "object", "properties": {} },"output_schema": { "type": "object", "properties": {} },"auth": { "type": "service_token" }}
所有智能体客户端通过该描述结构发现工具、校验参数并调用。应用层无需感知底层具体接口变化。工具提供方只需要完成一次说明和适配,就能被多个客户端加载。这一思路在工程上比直接对接每家工具原始接口更可维护。
当“订单异常处理”演变为一个标准作业流程时,可以把流程知识和工具组合打包为 Skill。结构可简化为:
skill_name: order_exception_handlingtrigger: "订单查询结果包含异常状态"input:- order_idsteps:- step: 1action: lookup_order_statuson: order_id- step: 2condition: status in ["取消", "拒收", "待处理"]decision: 根据异常类型分支- step: 3action: create_work_orderparams_from: order_id, status- step: 4reply_template: "已为您创建工单,预计处理时效为……"fallback: "转交人工客服"
此时智能体执行该任务时,不再依赖临时推理。Skill 的作用相当于“代理执行手册”,让模型知道每一步做什么、根据什么条件走哪条分支、出错时如何处理。相比把所有流程写进系统 Prompt,Skill 可以按需加载,既降低上下文冗余,也让流程可版本化、可审计。
完成上述落地后,建议从以下四个层面验证设计是否合理:
检查模型生成的函数或工具调用请求是否符合 JSON Schema,参数是否完整,是否出现未定义字段。可以用一批测试输入批量验证,并记录失败样本。
检查每次工具调用后,结果是否被正确回传给模型。若结果未回传,模型后续回答容易出现“凭猜生成”的情况。可在日志中搜索工具返回与下一次模型输入的关联记录,确认二者连续且一致。
对需要 3 个以上步骤的任务,连续执行多次,观察模型是否严格遵循 Skill 步骤。常见问题是模型跳过某一步或自行合并两个动作。可以在 Skill 中增加明确的前置条件说明,并进行回归测试。
对于简单任务,如果一次性加载大量工具说明,可能造成上下文膨胀,影响响应速度与正确率。可通过“只加载必要 Skill”的方式降低无关注入。一般原则是:工具描述按任务分层加载,技能包按领域拆分,避免全局注入。
可能原因:工具描述不清晰、参数含义不明确、缺少调用示例。解决思路:在工具描述中补充典型请求示例,明确每个参数的取值范围;检查 Schema 中是否存在嵌套过深、可选参数过多、名称容易混淆等问题。
通常是因为工具执行结果没有被正确回传,或回传格式没有明确标识。解决思路:将工具返回包装为可识别的工具消息,并附带 tool_call_id 之类标识,确保模型知道哪段文本属于哪个调用结果。同时避免将工具返回内容与用户消息混在一起。
可能原因:步骤条件表达不清,或者模型在上下文过长时忽略了中间规则。解决思路:将复杂 Skill 拆分为多个子技能;每个技能只处理一条主线;在关键步骤处增加“必须完成上一条件判断才能进入下一步”的显式表述。条件建议用参数值判断,不要用易歧义的自然语言。
可对工具描述做分层:先只加载工具摘要,待模型确认需要哪个工具时再加载对应详细参数,而不是把全部 Schema 同时塞入上下文。这种“按需加载”的方式可降低延迟和误调用概率。
将 Prompt、基础工具、扩展工具、高级技能分层管理。基础 Prompt 始终保留,通用工具常驻,领域工具按任务动态加载,复杂技能按需触发。这样既保留灵活性,也控制上下文成本。
对工具描述、MCP 适配层、Skill 流程包分别做版本管理。每次改动记录变更点,避免在多个智能体中同步出现不可预期的行为变化。统一注册中心可使用内部服务目录或元数据存储,不依赖特定厂商平台。
一个合格的 Skill 应该能通过“可重复执行”验证:相同输入下,在允许的合理变化范围内,最终动作一致。若多次执行产生明显分叉,说明流程描述还不够严格,需要补充条件或约束。
在工具调用层与 MCP 层都要做权限校验。工具应声明所访问资源和所需权限,Skill 应为每个步骤标注最小权限范围。生产环境中避免直接使用全局管理员凭证,工具调用记录应保留审计日志。
Prompt、MCP、Agent Skill 三者并非同层替代品。Prompt 负责让模型理解任务;Function Calling 与 Tool Calling 打通外部能力闭环;MCP 让工具发现和调用走向标准化;Agent Skill 则把复杂任务流程沉淀为可复用、可审计、可执行的技能包。
对于开发者而言,落地顺序应当是:先写好 Prompt,再根据真实需求接入函数调用;当工具数量变多时,考虑引入统一协议以降低维护成本;当某些任务开始频繁出现、流程固定但步骤较多时,再将其抽象为 Agent Skill。该路径符合从简单到复杂、从临时拼接到长期治理的工程演进规律,也能在云上开发环境或私有化部署中平滑推进。