简介:本文以分层视角系统讲清大模型应用中的五个高频概念——Prompt、Function Call、Agent、Agent Skill与MCP,分别说明它们是什么、处于哪一技术层级、解决什么问题、如何协同工作,并辅以示意代码与对比表格,帮助开发者与技术选型人员快速建立清晰的概念框架,避免混淆与误用。
很多初次接触大模型应用开发的人,会被Prompt、Function Call、Agent、Agent Skill、MCP这几个词绕晕,甚至误以为它们是互相竞争的技术方案。其实它们根本不在同一个层面上,而是从“如何说话”到“如何动手”再到“如何连接世界”的一套递进体系。先给出各自的定位:
一句话概括它们的关系:你用Prompt向Agent表达目标,Agent加载Skill获得专业流程,通过MCP接入的外部工具(经由Function Call机制)执行动作,循环往复直到任务完成。下面逐层拆解。
Prompt是开发者或用户输入给大模型的自然语言或结构化文本,用于设定模型的角色、约束、任务与输出格式。它是所有人机交互的起点。可以类比为去餐厅点菜时你说的那句“来一份宫保鸡丁,微辣,不要花生”——模型就是听懂需求并上菜的服务员。
大模型本质上是基于上下文逐词预测的概率系统,它不会“读心”。你提供的上下文质量,直接决定输出质量。同一个模型,配上不同Prompt,效果可能天差地别。因此Prompt是投入产出比最高的优化环节。
实践中一条完整的Prompt一般由四部分组成:
示意代码(通用伪代码,展示提示词的组织方式):
// 伪代码:组织一次带角色设定的对话请求List<Message> messages = List.of(new SystemMessage("你是一位资深Java架构师,擅长用通俗语言解释技术概念"),new UserMessage("请解释什么是线程安全,并给出一个错误示例"));String answer = chatModel.generate(messages);
进阶做法是提示词工程(Prompt Engineering):通过模板变量、少样本示例、思维链引导等技巧,把模糊需求转化为可稳定复现的指令模板。例如:
// 伪代码:带变量与质量约束的提示词模板String template = """你是一名资深Java工程师。请依据以下需求生成代码。要求:包含必要注释、考虑异常处理、遵循单一职责原则。需求:%s""";String prompt = template.formatted(requirement);
Prompt只能改变模型“怎么说”,既不能让模型掌握训练数据之外的实时事实,也不能让模型真正执行动作。突破这两条边界,就需要下面两层能力。
Function Call是让大模型以结构化JSON形式表达“我想调用某个函数、传入什么参数”的机制。需要特别注意:模型本身并不执行函数,它只输出调用意图,真正的执行发生在你的应用代码里,执行结果再回传给模型用于生成最终回答。
{"name":"getWeather","arguments":{"city":"北京"}}的结构化意图;示意代码:
// 伪代码:声明一个可被模型调用的工具public class WeatherTool {@Tool(description = "查询指定城市的实时天气")public String getWeather(String city) {return weatherService.query(city); // 真正的执行发生在应用侧}}// 伪代码:处理模型返回的调用意图if (response.isToolCall()) {ToolCall call = response.getToolCall();Object result = toolExecutor.invoke(call); // 本地执行String finalAnswer = chatModel.generate(messages, result); // 结果回传}
函数的名称与描述本质上也是“喂给模型的文本”,模型靠理解这些描述来做调用决策。因此可以把函数描述看作一种特殊的功能性Prompt:它描述的不是任务,而是“你有哪些可用的动作”。
Agent是以大模型为“大脑”,具备目标理解、任务拆解、工具选择、结果反思与循环执行能力的自主系统。如果说Prompt问答是“一问一答”,Agent的工作模式则是“给目标、要结果”。
一个典型的Agent执行循环如下:感知输入 → 理解目标 → 拆解步骤 → 选择工具 → 执行 → 观察结果 → 未完成则调整计划继续,直到目标达成或触发终止条件。
// 伪代码:一个极简的Agent循环while (!task.isDone() && steps < MAX_STEPS) {Plan plan = llm.plan(task, memory); // 规划:下一步做什么Result result = executor.run(plan.next()); // 执行:调用工具或生成内容memory.add(plan, result); // 记忆:沉淀过程与结果if (llm.shouldStop(task, memory)) break; // 反思:判断是否完成}
Function Call是Agent的“手脚”,Agent是把这些手脚串成行为闭环的“指挥系统”。没有Function Call,Agent无法与外部世界交互;没有Agent的规划循环,Function Call只是单轮的一次性调用,无法完成多步骤任务。
Agent Skill是把完成某一类任务所需的流程说明、领域知识、可执行脚本与参考资源,按约定结构封装起来的可插拔能力单元。Agent接到相关任务时才加载对应Skill,即刻获得“专业水准”的做法。
通用大模型什么都知道一点,但面对专业任务(如生成规范的财务报表、执行特定的数据处理流程)往往不够精细。如果把所有专业知识都常驻在系统提示词里,会造成上下文膨胀、推理成本上升、注意力被稀释。Skill的思路是按需加载:平时不占用上下文,用到时才注入该技能的说明与模板。
一个技能包一般包含四类内容:
Skill本质上是模板化、工程化、可复用的Prompt资产,是提示词工程从“个人手艺”走向“团队资产管理”的产物;同时,Skill内部通常会指挥Agent调用若干工具并规定调用顺序与校验方式——Function Call解决“怎么调”,Skill解决“怎么调得专业”。
MCP(Model Context Protocol,模型上下文协议)是一类把“大模型应用”与“外部工具、数据源”的连接方式标准化的开放协议,采用客户端—服务端架构:宿主应用(如智能体开发框架)内置客户端,外部能力以服务端形式提供,双方按统一规范通信。
在统一协议出现之前,每个AI应用接入一个新工具都要写一套私有集成代码:M个应用 × N个工具,意味着M×N次重复开发。标准化之后变成M+N——工具方实现一次服务端,所有兼容应用都能使用;应用方实现一次客户端,就能接入所有服务端。这正是USB接口统一各种外设的思路。
Function Call是模型侧的调用机制,MCP是能力接入侧的描述与传输标准。MCP暴露的工具最终仍通过Function Call机制被模型使用;MCP不替代Function Call,而是让函数调用的“工具清单”可以被任何兼容应用直接复用。
| 概念 | 所在层级 | 解决的核心问题 | 类比 |
|---|---|---|---|
| Prompt | 指令/输入层 | 如何准确表达意图 | 你对服务员说的话 |
| Function Call | 调用机制层 | 如何触发外部动作 | 服务员把订单传给后厨 |
| Agent | 自主决策层 | 如何自主完成多步任务 | 会自己安排工作的经理 |
| Agent Skill | 能力封装层 | 如何沉淀专业与复用 | 职业技能证书与操作手册 |
| MCP | 连接协议层 | 如何标准化接入外部系统 | 统一的USB接口标准 |
回到定义本身:Prompt是表达,Function Call是机制,Agent是自主性,Skill是专业性,MCP是连接标准。它们分别位于指令层、调用层、决策层、封装层与协议层,彼此不是替代关系,而是共同构成大模型应用从“能对话”走向“能干活”的完整技术栈。理解这条分层主线后,无论是做架构设计还是技术选型,都能准确判断每个环节该用什么、不该用什么。