Prompt、Agent、Function Call、Skill、MCP,傻傻分不清楚?

Prompt、Agent、Function Call、Skill、MCP,傻傻分不清楚?

前言

最近AI越来越火了。

我发现里面有很多概念有些小伙伴有点分不清楚,比如:Prompt、Agent、Function Call、Skill、MCP等。

今天这篇文章专门跟大家一起聊聊这个话题,希望对你会有所帮助。

更多项目实战在项目实战网:Java突击队

核心概念关系图

先上干货,这张图让你从整体上理解这五个概念是如何分层递进的:

一句话概括

  • Prompt 是你跟AI说的“人话”
  • Function Call 让AI能“动手干活”
  • Agent 让AI会“思考规划”
  • Skill 是AI的“职业技能证书”
  • MCP 是AI世界的“USB接口”

下面我们一层一层拆开揉碎了讲,每层都有Java代码示例。

第一层:Prompt——和AI对话的“普通话”

1.1 什么是Prompt?

Prompt(提示词) 就是你输入给AI的文本指令。

它就像你去餐厅点菜时说的“来一份宫保鸡丁”,AI就是那个服务员,听懂你的话然后给你上菜。

在Java里,调用AI模型的第一步就是构造Prompt。

我用最简单的Spring AI示例来演示:

importorg.springframework.ai.chat.ChatClient;importorg.springframework.ai.chat.prompt.Prompt;importorg.springframework.ai.chat.prompt.SystemPrompt;importorg.springframework.ai.chat.prompt.UserPrompt;@ServicepublicclassAIService{privatefinalChatClient chatClient;publicAIService(ChatClient chatClient){this.chatClient = chatClient;}publicStringaskAI(String question){// 构造Prompt:可以包含系统消息和用户消息Prompt prompt =newPrompt(newSystemPrompt("你是一个Java架构师,擅长用通俗的语言解释技术概念。"),newUserPrompt(question));// 调用AI并返回结果return chatClient.call(prompt).getResult().getOutput().getContent();}}

这里的SystemPromptUserPrompt就是最基础的Prompt形式。

它们决定了AI的身份和你要问的问题。

1.2 Prompt的高级玩法

光有基础Prompt还不够,在实际应用中我们经常需要提示词工程来引导AI做出更好的回答。比如:

publicStringgenerateJavaCode(String requirement){String promptTemplate =""" 你是一个资深的Java开发工程师。 请根据以下需求生成Java代码,代码要包含必要的注释,并考虑异常处理: 需求:%s 请输出完整的Java类代码。 """;String prompt =String.format(promptTemplate, requirement);return chatClient.call(newPrompt(prompt)).getResult().getOutput().getContent();}

Prompt的本质:它是人类意图与AI能力之间的“翻译官”。

Prompt写得好,AI才能干得好。

第二层:Function Calling——让AI从“说话”到“动手”

Prompt只能让AI“说话”,但AI想干点实事(比如查数据库、发邮件、调用第三方API)时,就无能为力了。

Function Calling(函数调用) 就是来解决这个问题的。

2.1 什么是Function Calling?

Function Calling允许开发者在调用大模型时,注册一系列函数(工具),模型在生成回复时如果判断需要调用外部工具,就会返回一个结构化的请求,由开发者执行真实的函数,再把结果返回给模型生成最终答案。

原理图如下:

2.2 Java实现Function Calling

我用LangChain4j来演示,因为它对Java开发者很友好。首先定义工具函数:

importdev.langchain4j.agent.tool.Tool;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassWeatherTool{@Tool("获取指定城市的实时天气")publicStringgetWeather(String city){// 这里应该是真实的API调用,为了演示我们模拟数据if("北京".equals(city)){return"北京当前天气:晴,温度25℃,湿度40%";}elseif("上海".equals(city)){return"上海当前天气:小雨,温度22℃,湿度80%";}else{return"抱歉,暂不支持该城市天气查询";}}@Tool("获取当前时间")publicStringgetCurrentTime(){returnLocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}}

然后创建AI服务并绑定工具:

importdev.langchain4j.model.chat.ChatLanguageModel;importdev.langchain4j.model.openai.OpenAiChatModel;importdev.langchain4j.service.AiServices;publicclassWeatherAssistant{interfaceAssistant{Stringchat(String userMessage);}publicstaticvoidmain(String[] args){ChatLanguageModel model =OpenAiChatModel.builder().apiKey(System.getenv("OPENAI_API_KEY")).modelName("gpt-4").build();Assistant assistant =AiServices.builder(Assistant.class).chatLanguageModel(model).tools(newWeatherTool())// 注册工具.build();// 用户提问String response = assistant.chat("北京现在天气怎么样?");System.out.println(response); response = assistant.chat("现在几点了?");System.out.println(response);}}

当用户问天气时,模型会判断需要调用getWeather函数,LangChain4j自动处理了函数调用的整个流程,最后把结果整合成自然语言返回。

2.3 Function Calling的核心价值

让AI从“静态知识”变成“动态能力”

没有Function Calling,AI只能回答训练数据里的内容;有了它,AI可以实时获取最新信息,甚至可以操作你的系统。

第三层:Agent——会思考、会规划的“智能体”

Function Calling让AI能调用工具,但它还是被动的一问一答。

如果遇到复杂任务,比如“帮我规划一次杭州三日游”,需要查天气、查景点、查酒店、算预算……这时候就需要Agent(智能体) 出场了。

3.1 什么是Agent?

Agent是一个能够感知环境、做出决策并执行动作的自主系统

它不像Function Calling那样只是“单次工具调用”,而是具备完整的“思考-行动-观察”闭环能力。

通俗说,Function Calling是“会用手”,Agent是“有大脑”

3.2 ReAct:Agent的核心决策模式

目前主流Agent都采用ReAct(Reasoning + Acting)框架

它的工作流程是:

  1. 思考(Thought):分析当前状态,决定下一步要做什么
  2. 行动(Action):调用某个工具
  3. 观察(Observation):获取工具返回的结果
  4. 循环:直到任务完成

3.3 Java实现一个简单的ReAct Agent

我们用LangChain4j的AiServices结合工具来实现Agent。

首先定义多个工具:

importdev.langchain4j.agent.tool.Tool;publicclassTravelTools{@Tool("查询某城市未来一周的天气")publicStringqueryWeather(String city){// 模拟天气查询return city +"未来一周天气:前三天晴,后四天多云,气温20-28℃";}@Tool("查询某城市的知名景点")publicStringqueryAttractions(String city){// 模拟景点查询if("杭州".equals(city)){return"杭州知名景点:西湖、灵隐寺、西溪湿地、宋城";}elseif("上海".equals(city)){return"上海知名景点:外滩、东方明珠、迪士尼乐园";}return"暂无该城市景点信息";}@Tool("计算预算")publicStringcalculateBudget(String city,int days){// 模拟预算计算int base =500;int total = base * days;return city + days +"天游预算约为:"+ total +"元(不含大交通)";}}

然后创建Agent:

importdev.langchain4j.model.chat.ChatLanguageModel;importdev.langchain4j.model.openai.OpenAiChatModel;importdev.langchain4j.service.AiServices;importdev.langchain4j.memory.chat.MessageWindowChatMemory;publicclassTravelAgent{interfaceTravelPlanner{StringplanTrip(String request);}publicstaticvoidmain(String[] args){ChatLanguageModel model =OpenAiChatModel.builder().apiKey(System.getenv("OPENAI_API_KEY")).modelName("gpt-4").build();TravelPlanner agent =AiServices.builder(TravelPlanner.class).chatLanguageModel(model).tools(newTravelTools()).chatMemory(MessageWindowChatMemory.withMaxMessages(20))// 记忆,让Agent能记住上下文.build();String result = agent.planTrip("帮我规划一个3天的杭州游,包括天气、景点和预算");System.out.println(result);}}

这个Agent会自己决定先查天气、再查景点、再算预算,然后把所有信息整合成一份完整的旅行计划。整个过程是自主的,不需要我们写死流程。

3.4 Agent与Function Calling的关系

Function Calling是Agent的“手”,Agent是拥有“大脑”的完整系统

Agent通过Function Calling调用工具,但Agent多了“规划”和“记忆”能力,能处理更复杂的任务。

更多项目实战在项目实战网:Java突击队

第四层:Skill——封装专业知识的“技能包”

当Agent需要处理不同领域的任务时,如果让一个Agent掌握所有知识和工具,会变得臃肿且容易出错。

这时候就需要Skill(技能) 的概念。

4.1 什么是Skill?

Skill是一套封装了特定领域知识、最佳实践和工具组合的“技能包”

它就像我们人类的职业资格证书——一个医生有“看病技能”,一个程序员有“写代码技能”。

Anthropic最早提出Skill概念,一个Skill通常包含:

  • 领域专用的提示词模板
  • 一组相关的工具函数
  • 特定的工作流逻辑

4.2 Java中如何组织Skill?

我们可以把Skill定义为一个独立的模块,包含自己的工具类和提示模板。

例如,一个“前端开发Skill”:

// 前端技能专属工具publicclassFrontendTools{@Tool("生成React组件代码")publicStringgenerateReactComponent(String componentName,String props){return""" import React from 'react'; const %s = (%s) => { return <div>Hello, {props.name}</div>; }; export default %s; """.formatted(componentName, props, componentName);}@Tool("检查CSS命名规范")publicStringcheckCssNaming(String cssCode){// 模拟CSS检查逻辑return"CSS规范检查通过";}}// 前端技能的提示词模板publicclassFrontendPrompts{publicstaticfinalStringSYSTEM_PROMPT=""" 你是一个资深前端开发工程师,精通React、Vue、CSS等前端技术。 请严格按照前端最佳实践生成代码,确保代码可维护。 """;}// 创建前端专家AgentpublicclassFrontendAgent{publicstaticvoidmain(String[] args){ChatLanguageModel model =OpenAiChatModel.builder().apiKey(System.getenv("OPENAI_API_KEY")).modelName("gpt-4").build();Developer assistant =AiServices.builder(Developer.class).chatLanguageModel(model).tools(newFrontendTools()).systemMessageProvider(ignored ->FrontendPrompts.SYSTEM_PROMPT).build();String code = assistant.generateCode("创建一个计数器组件,有加一减一按钮");System.out.println(code);}}

4.3 Skill与Agent的关系

在大型系统中,我们通常会有多个Agent,每个Agent加载不同的Skill:

  • 前端Agent:加载ReactSkill、CSSSkill
  • 后端Agent:加载SpringSkill、DatabaseSkill
  • 运维Agent:加载K8sSkill、MonitoringSkill

每个Agent只拥有完成自己领域任务所需的最小知识集,既提高了精准度,又保障了安全。

4.4 Function Call和Skill有什么区别?

一句话说清本质:

  • Function Call 是一种能力:让AI能够调用外部函数(工具)
  • Skill 是一个模块:封装了特定领域的知识、最佳实践和一组相关的Function Call

用个比喻:

  • Function Call 像锤子、螺丝刀、扳手这些具体工具
  • Skill 像木工工具箱:里面有锤子、锯子、尺子,还附带一本《木工操作手册》

下面从代码看看它们的区别。

Function Call:单个工具
publicclassWeatherTool{@Tool("获取天气")publicStringgetWeather(String city){// 调用天气APIreturncallWeatherAPI(city);}}

这个工具只能干一件事:查天气。

Skill:完整的专业能力包
// 前端开发Skill - 包含多个工具 + 专业知识publicclassFrontendSkill{// 工具1:生成React组件@Tool("生成React组件")publicStringgenerateComponent(String name){return"React组件代码...";}// 工具2:检查CSS规范@Tool("检查CSS规范")publicStringcheckCss(String css){return"检查结果...";}// 工具3:优化性能建议@Tool("提供前端性能优化建议")publicStringperformanceAdvice(String code){return"优化建议...";}// 还有领域知识(不是工具,而是提示词模板)publicstaticfinalStringSYSTEM_PROMPT="你是一个资深前端专家,精通React、Vue、CSS优化...";}

这个Skill包含了多个工具,还带有领域知识。

核心区别对比表:

维度Function CallSkill
本质单一能力能力集合 + 知识
粒度原子操作业务模块
是否包含工具本身就是工具包含多个工具
是否包含知识不包含包含领域知识和最佳实践
类比单个螺丝刀电工工具箱 + 电工手册
应用场景查天气、发邮件等单次操作前端开发、运维管理、财务分析等专业领域
代码形式单个@Tool方法多个@Tool方法 + 系统提示词

为什么需要区分这两个概念?

  1. 设计层面的解耦:Function Call是底层能力,Skill是业务封装。底层能力稳定,上层业务可以灵活组合。
  2. 复用性:好的Skill可以跨项目复用,就像代码库里的工具包。
  3. 安全性:可以给不同的Agent分配不同的Skill,实现权限隔离(前端Agent不能调用后端数据库)。

总结:

  • Function Call:AI的“手”,能干活
  • Skill:AI的“职业培训证书”,让AI知道怎么干好某个领域的事

Function Call + 领域知识 + 最佳实践 = Skill

下次再有人问这个问题,你可以直接甩给他这张表,然后说:“锤子是Function Call,工具箱是Skill,懂了吗?”

更多项目实战在项目实战网:Java突击队

第五层:MCP——统一工具调用的“世界语”

随着Agent越来越多,每个Agent都要接入不同的工具,每个AI模型(OpenAI、Claude、文心一言)的Function Calling格式还不一样。

这就导致开发者要针对每个模型写一套工具适配代码,非常痛苦。

MCP(Model Context Protocol,模型上下文协议) 就是来解决这个问题的。

5.1 什么是MCP?

MCP是Anthropic提出的一个标准化协议,它定义了一套统一的接口,让AI模型可以像USB设备一样动态发现和调用工具。

核心思想

  • 工具以Server的形式暴露(MCP Server)
  • AI应用作为Client(MCP Client)连接Server
  • Server提供工具清单和调用接口
  • Client统一格式调用,无需关心底层工具具体实现

5.2 MCP的工作流程

更多项目实战在项目实战网:Java突击队

5.3 Java中使用MCP

Spring AI 2.0已经原生支持MCP,可以非常方便地构建MCP客户端和服务器。

定义MCP Server(工具提供方)

importorg.springframework.ai.mcp.server.McpServer;importorg.springframework.ai.mcp.server.McpServerFeatures;importorg.springframework.ai.mcp.server.McpServerRegistrar;importorg.springframework.ai.mcp.spec.McpSchema;@ComponentpublicclassWeatherMcpServer{@BeanpublicMcpServerRegistrarweatherServer(){// 定义工具McpSchema.Tool weatherTool =newMcpSchema.Tool("getWeather","获取城市天气",newMcpSchema.JsonSchema(Map.of("type","object","properties",Map.of("city",Map.of("type","string","description","城市名称")),"required",List.of("city"))));// 创建ServerMcpServerFeatures.AsyncServerSpec serverSpec =McpServerFeatures.async().tool(weatherTool,(request)->{String city = request.arguments().get("city").asText();// 执行真实逻辑String weather ="北京当前天气:晴,25℃";returnCompletableFuture.completedFuture(newMcpSchema.CallToolResult(List.of(newMcpSchema.TextContent(weather)),false));});returnMcpServerRegistrar.builder().name("weather-server").server(serverSpec).build();}}

MCP Client调用

importorg.springframework.ai.mcp.client.McpClient;importorg.springframework.ai.mcp.client.McpClientFeatures;@ServicepublicclassAIServiceWithMCP{privatefinalChatClient chatClient;privatefinalMcpClient mcpClient;publicAIServiceWithMCP(ChatClient chatClient){this.chatClient = chatClient;// 连接到MCP Serverthis.mcpClient =McpClientFeatures.async().connect("weather-server","http://localhost:8080/mcp");}publicStringaskWeather(String city){// 通过MCP调用工具McpSchema.CallToolResult result = mcpClient.callTool("getWeather",Map.of("city", city)).join();String weather = result.content().get(0).text();// 也可以让AI自动决定是否调用工具Prompt prompt =newPrompt("查询"+ city +"天气");return chatClient.call(prompt).getResult().getOutput().getContent();}}

5.4 MCP与Skill的关系

MCP和Skill是互补的:

  • MCP 解决“怎么连”的问题——标准化工具调用协议
  • Skill 解决“连什么”的问题——封装专业知识和工具集合

一个典型的架构是:Agent通过MCP调用各种Skill暴露的工具

这样,无论底层工具如何变化,Agent都不需要修改代码,只需要通过MCP动态发现即可。

一张表彻底分清五个概念

概念一句话定义核心作用Java生态代表
Prompt给AI的指令告诉AI要做什么Spring AI的Prompt
Function Call让AI能调用外部工具赋予AI行动能力LangChain4j的@Tool注解
Agent能自主决策的智能系统完成复杂任务的闭环LangChain4j的AiServices + 记忆
Skill封装专业知识的技能包固化领域知识和最佳实践模块化的工具集合+提示模板
MCP统一工具调用的标准协议让所有AI用同一套接口Spring AI的MCP支持

这五个概念构成了AI应用开发的完整分层:

  • Prompt是地基,没有它AI听不懂人话
  • Function Call是第一层楼,让AI能动手
  • Agent是第二层,让AI会思考
  • Skill是装修,让AI更专业
  • MCP是连接各层的管道,让整个系统灵活可扩展

总结

有些小伙伴可能会问:“我现在应该先学哪个?”

我的建议是:从Prompt开始,这是所有AI应用的基础

理解了Prompt,再逐步接触Function Call,然后尝试搭建简单的Agent。

至于Skill和MCP,可以先了解概念,等你的应用复杂到需要多个Agent协作时,再深入学习也不迟。

Prompt、Function Call、Agent、Skill、MCP,正是AI应用开发的“五层楼”,每一层都让我们离业务更近,离底层细节更远。

开源地址

更多项目实战在项目实战网:Java突击队

Read more

用 C# 扩展 Dynamics 365 Copilot:自定义插件与场景

Dynamics 365 Copilot 作为基于 AI 的智能助手,为企业用户提供了自动化流程、智能分析和自然语言交互的能力,但通用功能往往无法满足特定行业或企业的定制化需求。本文将详细介绍如何通过 C# 编写自定义插件,扩展 Dynamics 365 Copilot 的能力,并结合实际业务场景实现定制化 AI 交互。 一、核心基础:Dynamics 365 Copilot 扩展架构 Dynamics 365 Copilot 的扩展主要依赖于 Power Platform 插件框架 和 Copilot Studio 的自定义连接器,核心技术栈包括: * C# (.NET Framework 4.8 或 .NET 6+):编写业务逻辑插件 * Dynamics 365 SDK:

By Ne0inhk

Lostlife2.0角色对话系统升级:基于LLama-Factory微调剧情模型

Lostlife2.0角色对话系统升级:基于LLama-Factory微调剧情模型 在如今的互动叙事游戏中,玩家早已不再满足于“点击选项、观看动画”的被动体验。他们渴望与NPC进行真正意义上的对话——那些回应不只是预设脚本的回声,而是带着性格、记忆和情绪的真实反应。然而,要让一个虚拟角色“活”起来,远非堆砌几句台词那么简单。 传统基于规则或模板的对话系统,在面对开放性提问时往往暴露其机械本质:“你今天怎么样?”可能得到千篇一律的回答,无论这个角色刚经历了生死逃亡还是平静度日。这种断裂感严重削弱了沉浸体验。而通用大语言模型虽然能生成流畅文本,却容易脱离角色设定,说出不符合世界观甚至“OOC”(Out of Character)的内容。 正是在这种背景下,“Lostlife2.0”项目决定彻底重构其角色对话引擎:不再依赖硬编码逻辑,而是通过对大模型进行精细化微调,打造一套真正属于游戏世界的“人格化AI”。我们选择的技术路径,是开源社区中日益成熟的 LLama-Factory 框架。 为什么是 LLama-Factory? 市面上并不缺少大模型训练工具,Hugging Face 的

By Ne0inhk

SGLang+Stable Diffusion联动教程:2小时省千元显卡钱

SGLang+Stable Diffusion联动教程:2小时省千元显卡钱 你是不是也遇到过这种情况?作为一名内容创作者,想用AI生成点创意图、做个短视频脚本,结果刚打开Stable Diffusion,再启动一个大语言模型写文案,电脑就直接卡死。显存爆了、程序崩溃、风扇狂转……最后只能无奈放弃,或者咬牙花几千块升级显卡。 别急,今天我要分享一个“神操作”——用SGLang和Stable Diffusion联动,让你在家用低配显卡上也能流畅跑两个AI模型,而且整个过程2小时内就能搞定,省下至少上千元的硬件升级费。 这个方法的核心思路是:把“思考”和“画画”这两个任务分开,让它们在不同的计算资源上运行。就像你不需要自己动手做饭也能吃到美食一样,AI模型也不一定要全部塞进你的显卡里。通过ZEEKLOG星图镜像广场提供的预置镜像,我们可以一键部署SGLang作为“大脑”,负责理解需求、生成提示词;再用另一个镜像运行Stable Diffusion作为“画手”,专注出图。两者通过API无缝对接,既不占用你本地显存,又能高效协作。 这篇文章就是为像你我这样的普通用户写的。我会从零开始,手

By Ne0inhk
win10升级后总会弹出365 Copilot窗口如何禁用和关闭

win10升级后总会弹出365 Copilot窗口如何禁用和关闭

win10升级后总会弹出365 Copilot窗口如何禁用和关闭 在Windows 10中,可以通过以下几种方法禁用或关闭Microsoft 365 Copilot: 方法一:任务栏上直接禁用 1. 右键点击任务栏。 2. 在弹出的菜单中,找到并取消勾选“显示 Copilot(预览版)按钮”选项。 这种方法只是让Copilot不再显示在任务栏上,但并未彻底禁用该功能。用户仍然可以通过“Windows 键 + C”键盘快捷键来打开和关闭Copilot界面。 方法二:利用组策略彻底禁用 1. 打开开始菜单,搜索“组策略”并打开组策略编辑器。 2. 按照“用户配置 > 管理模板 > Windows 组件 > Windows Copilot”的路径依次展开。 3. 双击“关闭 Windows Copilot”

By Ne0inhk