前言
最近AI越來越火了。
我發(fā)現(xiàn)里面有很多概念有些小伙伴有點(diǎn)分不清楚,比如:Prompt、Agent、Function Call、Skill、MCP等。
今天這篇文章專門跟大家一起聊聊這個(gè)話題,希望對你會有所幫助。
核心概念關(guān)系圖
先上干貨,這張圖讓你從整體上理解這五個(gè)概念是如何分層遞進(jìn)的:

更多項(xiàng)目實(shí)戰(zhàn)在Java突擊隊(duì)網(wǎng):susan.net.cn
一句話概括:
- Prompt 是你跟AI說的“人話”
- Function Call 讓AI能“動手干活”
- Agent 讓AI會“思考規(guī)劃”
- Skill 是AI的“職業(yè)技能證書”
- MCP 是AI世界的“USB接口”
下面我們一層一層拆開揉碎了講,每層都有Java代碼示例。
第一層:Prompt——和AI對話的“普通話”
1.1 什么是Prompt?
Prompt(提示詞) 就是你輸入給AI的文本指令。
它就像你去餐廳點(diǎn)菜時(shí)說的“來一份宮保雞丁”,AI就是那個(gè)服務(wù)員,聽懂你的話然后給你上菜。
在Java里,調(diào)用AI模型的第一步就是構(gòu)造Prompt。
我用最簡單的Spring AI示例來演示:
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.SystemPrompt;
import org.springframework.ai.chat.prompt.UserPrompt;
@Service
public class AIService {
private final ChatClient chatClient;
public AIService(ChatClient chatClient) {
this.chatClient = chatClient;
}
public String askAI(String question) {
// 構(gòu)造Prompt:可以包含系統(tǒng)消息和用戶消息
Prompt prompt = new Prompt(
new SystemPrompt("你是一個(gè)Java架構(gòu)師,擅長用通俗的語言解釋技術(shù)概念。"),
new UserPrompt(question)
);
// 調(diào)用AI并返回結(jié)果
return chatClient.call(prompt).getResult().getOutput().getContent();
}
}
這里的SystemPrompt和UserPrompt就是最基礎(chǔ)的Prompt形式。
它們決定了AI的身份和你要問的問題。
1.2 Prompt的高級玩法
光有基礎(chǔ)Prompt還不夠,在實(shí)際應(yīng)用中我們經(jīng)常需要提示詞工程來引導(dǎo)AI做出更好的回答。比如:
public String generateJavaCode(String requirement) {
String promptTemplate = """
你是一個(gè)資深的Java開發(fā)工程師。
請根據(jù)以下需求生成Java代碼,代碼要包含必要的注釋,并考慮異常處理:
需求:%s
請輸出完整的Java類代碼。
""";
String prompt = String.format(promptTemplate, requirement);
return chatClient.call(new Prompt(prompt)).getResult().getOutput().getContent();
}
Prompt的本質(zhì):它是人類意圖與AI能力之間的“翻譯官”。
Prompt寫得好,AI才能干得好。
第二層:Function Calling——讓AI從“說話”到“動手”
Prompt只能讓AI“說話”,但AI想干點(diǎn)實(shí)事(比如查數(shù)據(jù)庫、發(fā)郵件、調(diào)用第三方API)時(shí),就無能為力了。
Function Calling(函數(shù)調(diào)用) 就是來解決這個(gè)問題的。
2.1 什么是Function Calling?
Function Calling允許開發(fā)者在調(diào)用大模型時(shí),注冊一系列函數(shù)(工具),模型在生成回復(fù)時(shí)如果判斷需要調(diào)用外部工具,就會返回一個(gè)結(jié)構(gòu)化的請求,由開發(fā)者執(zhí)行真實(shí)的函數(shù),再把結(jié)果返回給模型生成最終答案。
原理圖如下:

2.2 Java實(shí)現(xiàn)Function Calling
我用LangChain4j來演示,因?yàn)樗鼘ava開發(fā)者很友好。首先定義工具函數(shù):
import dev.langchain4j.agent.tool.Tool;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class WeatherTool {
@Tool("獲取指定城市的實(shí)時(shí)天氣")
public String getWeather(String city) {
// 這里應(yīng)該是真實(shí)的API調(diào)用,為了演示我們模擬數(shù)據(jù)
if ("北京".equals(city)) {
return "北京當(dāng)前天氣:晴,溫度25℃,濕度40%";
} else if ("上海".equals(city)) {
return "上海當(dāng)前天氣:小雨,溫度22℃,濕度80%";
} else {
return "抱歉,暫不支持該城市天氣查詢";
}
}
@Tool("獲取當(dāng)前時(shí)間")
public String getCurrentTime() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
然后創(chuàng)建AI服務(wù)并綁定工具:
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
public class WeatherAssistant {
interface Assistant {
String chat(String userMessage);
}
public static void main(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(new WeatherTool()) // 注冊工具
.build();
// 用戶提問
String response = assistant.chat("北京現(xiàn)在天氣怎么樣?");
System.out.println(response);
response = assistant.chat("現(xiàn)在幾點(diǎn)了?");
System.out.println(response);
}
}
當(dāng)用戶問天氣時(shí),模型會判斷需要調(diào)用getWeather函數(shù),LangChain4j自動處理了函數(shù)調(diào)用的整個(gè)流程,最后把結(jié)果整合成自然語言返回。
2.3 Function Calling的核心價(jià)值
讓AI從“靜態(tài)知識”變成“動態(tài)能力”。
沒有Function Calling,AI只能回答訓(xùn)練數(shù)據(jù)里的內(nèi)容;有了它,AI可以實(shí)時(shí)獲取最新信息,甚至可以操作你的系統(tǒng)。
第三層:Agent——會思考、會規(guī)劃的“智能體”
Function Calling讓AI能調(diào)用工具,但它還是被動的一問一答。
如果遇到復(fù)雜任務(wù),比如“幫我規(guī)劃一次杭州三日游”,需要查天氣、查景點(diǎn)、查酒店、算預(yù)算……這時(shí)候就需要Agent(智能體) 出場了。
3.1 什么是Agent?
Agent是一個(gè)能夠感知環(huán)境、做出決策并執(zhí)行動作的自主系統(tǒng)。
它不像Function Calling那樣只是“單次工具調(diào)用”,而是具備完整的“思考-行動-觀察”閉環(huán)能力。
通俗說,Function Calling是“會用手”,Agent是“有大腦”。
3.2 ReAct:Agent的核心決策模式
目前主流Agent都采用ReAct(Reasoning + Acting)框架。
它的工作流程是:
- 思考(Thought):分析當(dāng)前狀態(tài),決定下一步要做什么
- 行動(Action):調(diào)用某個(gè)工具
- 觀察(Observation):獲取工具返回的結(jié)果
- 循環(huán):直到任務(wù)完成
3.3 Java實(shí)現(xiàn)一個(gè)簡單的ReAct Agent
我們用LangChain4j的AiServices結(jié)合工具來實(shí)現(xiàn)Agent。
首先定義多個(gè)工具:
import dev.langchain4j.agent.tool.Tool;
public class TravelTools {
@Tool("查詢某城市未來一周的天氣")
public String queryWeather(String city) {
// 模擬天氣查詢
return city + "未來一周天氣:前三天晴,后四天多云,氣溫20-28℃";
}
@Tool("查詢某城市的知名景點(diǎn)")
public String queryAttractions(String city) {
// 模擬景點(diǎn)查詢
if ("杭州".equals(city)) {
return "杭州知名景點(diǎn):西湖、靈隱寺、西溪濕地、宋城";
} else if ("上海".equals(city)) {
return "上海知名景點(diǎn):外灘、東方明珠、迪士尼樂園";
}
return "暫無該城市景點(diǎn)信息";
}
@Tool("計(jì)算預(yù)算")
public String calculateBudget(String city, int days) {
// 模擬預(yù)算計(jì)算
int base = 500;
int total = base * days;
return city + days + "天游預(yù)算約為:" + total + "元(不含大交通)";
}
}
然后創(chuàng)建Agent:
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
public class TravelAgent {
interface TravelPlanner {
String planTrip(String request);
}
public static void main(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(new TravelTools())
.chatMemory(MessageWindowChatMemory.withMaxMessages(20)) // 記憶,讓Agent能記住上下文
.build();
String result = agent.planTrip("幫我規(guī)劃一個(gè)3天的杭州游,包括天氣、景點(diǎn)和預(yù)算");
System.out.println(result);
}
}
這個(gè)Agent會自己決定先查天氣、再查景點(diǎn)、再算預(yù)算,然后把所有信息整合成一份完整的旅行計(jì)劃。整個(gè)過程是自主的,不需要我們寫死流程。
3.4 Agent與Function Calling的關(guān)系
Function Calling是Agent的“手”,Agent是擁有“大腦”的完整系統(tǒng)。
Agent通過Function Calling調(diào)用工具,但Agent多了“規(guī)劃”和“記憶”能力,能處理更復(fù)雜的任務(wù)。
第四層:Skill——封裝專業(yè)知識的“技能包”
當(dāng)Agent需要處理不同領(lǐng)域的任務(wù)時(shí),如果讓一個(gè)Agent掌握所有知識和工具,會變得臃腫且容易出錯(cuò)。
這時(shí)候就需要Skill(技能) 的概念。
4.1 什么是Skill?
Skill是一套封裝了特定領(lǐng)域知識、最佳實(shí)踐和工具組合的“技能包”。
它就像我們?nèi)祟惖穆殬I(yè)資格證書——一個(gè)醫(yī)生有“看病技能”,一個(gè)程序員有“寫代碼技能”。
Anthropic最早提出Skill概念,一個(gè)Skill通常包含:
- 領(lǐng)域?qū)S玫奶崾驹~模板
- 一組相關(guān)的工具函數(shù)
- 特定的工作流邏輯
4.2 Java中如何組織Skill?
我們可以把Skill定義為一個(gè)獨(dú)立的模塊,包含自己的工具類和提示模板。
例如,一個(gè)“前端開發(fā)Skill”:
// 前端技能專屬工具
public class FrontendTools {
@Tool("生成React組件代碼")
public String generateReactComponent(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命名規(guī)范")
public String checkCssNaming(String cssCode) {
// 模擬CSS檢查邏輯
return "CSS規(guī)范檢查通過";
}
}
// 前端技能的提示詞模板
public class FrontendPrompts {
public static final String SYSTEM_PROMPT = """
你是一個(gè)資深前端開發(fā)工程師,精通React、Vue、CSS等前端技術(shù)。
請嚴(yán)格按照前端最佳實(shí)踐生成代碼,確保代碼可維護(hù)。
""";
}
// 創(chuàng)建前端專家Agent
public class FrontendAgent {
public static void main(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(new FrontendTools())
.systemMessageProvider(ignored -> FrontendPrompts.SYSTEM_PROMPT)
.build();
String code = assistant.generateCode("創(chuàng)建一個(gè)計(jì)數(shù)器組件,有加一減一按鈕");
System.out.println(code);
}
}
4.3 Skill與Agent的關(guān)系
在大型系統(tǒng)中,我們通常會有多個(gè)Agent,每個(gè)Agent加載不同的Skill:
- 前端Agent:加載ReactSkill、CSSSkill
- 后端Agent:加載SpringSkill、DatabaseSkill
- 運(yùn)維Agent:加載K8sSkill、MonitoringSkill
每個(gè)Agent只擁有完成自己領(lǐng)域任務(wù)所需的最小知識集,既提高了精準(zhǔn)度,又保障了安全。
更多項(xiàng)目實(shí)戰(zhàn)在Java突擊隊(duì)網(wǎng):susan.net.cn
4.4 Function Call和Skill有什么區(qū)別?
一句話說清本質(zhì):
- Function Call 是一種能力:讓AI能夠調(diào)用外部函數(shù)(工具)
- Skill 是一個(gè)模塊:封裝了特定領(lǐng)域的知識、最佳實(shí)踐和一組相關(guān)的Function Call
用個(gè)比喻:
- Function Call 像錘子、螺絲刀、扳手這些具體工具
- Skill 像木工工具箱:里面有錘子、鋸子、尺子,還附帶一本《木工操作手冊》
下面從代碼看看它們的區(qū)別。
Function Call:單個(gè)工具
public class WeatherTool {
@Tool("獲取天氣")
public String getWeather(String city) {
// 調(diào)用天氣API
return callWeatherAPI(city);
}
}
這個(gè)工具只能干一件事:查天氣。
Skill:完整的專業(yè)能力包
// 前端開發(fā)Skill - 包含多個(gè)工具 + 專業(yè)知識
public class FrontendSkill {
// 工具1:生成React組件
@Tool("生成React組件")
public String generateComponent(String name) {
return "React組件代碼...";
}
// 工具2:檢查CSS規(guī)范
@Tool("檢查CSS規(guī)范")
public String checkCss(String css) {
return "檢查結(jié)果...";
}
// 工具3:優(yōu)化性能建議
@Tool("提供前端性能優(yōu)化建議")
public String performanceAdvice(String code) {
return "優(yōu)化建議...";
}
// 還有領(lǐng)域知識(不是工具,而是提示詞模板)
public static final String SYSTEM_PROMPT =
"你是一個(gè)資深前端專家,精通React、Vue、CSS優(yōu)化...";
}
這個(gè)Skill包含了多個(gè)工具,還帶有領(lǐng)域知識。
核心區(qū)別對比表:
| 維度 | Function Call | Skill |
|---|---|---|
| 本質(zhì) | 單一能力 | 能力集合 + 知識 |
| 粒度 | 原子操作 | 業(yè)務(wù)模塊 |
| 是否包含工具 | 本身就是工具 | 包含多個(gè)工具 |
| 是否包含知識 | 不包含 | 包含領(lǐng)域知識和最佳實(shí)踐 |
| 類比 | 單個(gè)螺絲刀 | 電工工具箱 + 電工手冊 |
| 應(yīng)用場景 | 查天氣、發(fā)郵件等單次操作 | 前端開發(fā)、運(yùn)維管理、財(cái)務(wù)分析等專業(yè)領(lǐng)域 |
| 代碼形式 | 單個(gè)@Tool方法 |
多個(gè)@Tool方法 + 系統(tǒng)提示詞 |
為什么需要區(qū)分這兩個(gè)概念?
- 設(shè)計(jì)層面的解耦:Function Call是底層能力,Skill是業(yè)務(wù)封裝。底層能力穩(wěn)定,上層業(yè)務(wù)可以靈活組合。
- 復(fù)用性:好的Skill可以跨項(xiàng)目復(fù)用,就像代碼庫里的工具包。
- 安全性:可以給不同的Agent分配不同的Skill,實(shí)現(xiàn)權(quán)限隔離(前端Agent不能調(diào)用后端數(shù)據(jù)庫)。
總結(jié):
- Function Call:AI的“手”,能干活
- Skill:AI的“職業(yè)培訓(xùn)證書”,讓AI知道怎么干好某個(gè)領(lǐng)域的事
Function Call + 領(lǐng)域知識 + 最佳實(shí)踐 = Skill
下次再有人問這個(gè)問題,你可以直接甩給他這張表,然后說:“錘子是Function Call,工具箱是Skill,懂了嗎?”
第五層:MCP——統(tǒng)一工具調(diào)用的“世界語”
隨著Agent越來越多,每個(gè)Agent都要接入不同的工具,每個(gè)AI模型(OpenAI、Claude、文心一言)的Function Calling格式還不一樣。
這就導(dǎo)致開發(fā)者要針對每個(gè)模型寫一套工具適配代碼,非常痛苦。
MCP(Model Context Protocol,模型上下文協(xié)議) 就是來解決這個(gè)問題的。
5.1 什么是MCP?
MCP是Anthropic提出的一個(gè)標(biāo)準(zhǔn)化協(xié)議,它定義了一套統(tǒng)一的接口,讓AI模型可以像USB設(shè)備一樣動態(tài)發(fā)現(xiàn)和調(diào)用工具。
核心思想:
- 工具以Server的形式暴露(MCP Server)
- AI應(yīng)用作為Client(MCP Client)連接Server
- Server提供工具清單和調(diào)用接口
- Client統(tǒng)一格式調(diào)用,無需關(guān)心底層工具具體實(shí)現(xiàn)
5.2 MCP的工作流程

5.3 Java中使用MCP
Spring AI 2.0已經(jīng)原生支持MCP,可以非常方便地構(gòu)建MCP客戶端和服務(wù)器。
定義MCP Server(工具提供方):
import org.springframework.ai.mcp.server.McpServer;
import org.springframework.ai.mcp.server.McpServerFeatures;
import org.springframework.ai.mcp.server.McpServerRegistrar;
import org.springframework.ai.mcp.spec.McpSchema;
@Component
public class WeatherMcpServer {
@Bean
public McpServerRegistrar weatherServer() {
// 定義工具
McpSchema.Tool weatherTool = new McpSchema.Tool(
"getWeather",
"獲取城市天氣",
new McpSchema.JsonSchema(Map.of(
"type", "object",
"properties", Map.of(
"city", Map.of("type", "string", "description", "城市名稱")
),
"required", List.of("city")
))
);
// 創(chuàng)建Server
McpServerFeatures.AsyncServerSpec serverSpec = McpServerFeatures.async()
.tool(weatherTool, (request) -> {
String city = request.arguments().get("city").asText();
// 執(zhí)行真實(shí)邏輯
String weather = "北京當(dāng)前天氣:晴,25℃";
return CompletableFuture.completedFuture(
new McpSchema.CallToolResult(List.of(
new McpSchema.TextContent(weather)
), false)
);
});
return McpServerRegistrar.builder()
.name("weather-server")
.server(serverSpec)
.build();
}
}
MCP Client調(diào)用:
import org.springframework.ai.mcp.client.McpClient;
import org.springframework.ai.mcp.client.McpClientFeatures;
@Service
public class AIServiceWithMCP {
private final ChatClient chatClient;
private final McpClient mcpClient;
public AIServiceWithMCP(ChatClient chatClient) {
this.chatClient = chatClient;
// 連接到MCP Server
this.mcpClient = McpClientFeatures.async()
.connect("weather-server", "http://localhost:8080/mcp");
}
public String askWeather(String city) {
// 通過MCP調(diào)用工具
McpSchema.CallToolResult result = mcpClient.callTool("getWeather",
Map.of("city", city)).join();
String weather = result.content().get(0).text();
// 也可以讓AI自動決定是否調(diào)用工具
Prompt prompt = new Prompt("查詢" + city + "天氣");
return chatClient.call(prompt).getResult().getOutput().getContent();
}
}
5.4 MCP與Skill的關(guān)系
MCP和Skill是互補(bǔ)的:
- MCP 解決“怎么連”的問題——標(biāo)準(zhǔn)化工具調(diào)用協(xié)議
- Skill 解決“連什么”的問題——封裝專業(yè)知識和工具集合
一個(gè)典型的架構(gòu)是:Agent通過MCP調(diào)用各種Skill暴露的工具。
這樣,無論底層工具如何變化,Agent都不需要修改代碼,只需要通過MCP動態(tài)發(fā)現(xiàn)即可。
一張表徹底分清五個(gè)概念
| 概念 | 一句話定義 | 核心作用 | Java生態(tài)代表 |
|---|---|---|---|
| Prompt | 給AI的指令 | 告訴AI要做什么 | Spring AI的Prompt類 |
| Function Call | 讓AI能調(diào)用外部工具 | 賦予AI行動能力 | LangChain4j的@Tool注解 |
| Agent | 能自主決策的智能系統(tǒng) | 完成復(fù)雜任務(wù)的閉環(huán) | LangChain4j的AiServices + 記憶 |
| Skill | 封裝專業(yè)知識的技能包 | 固化領(lǐng)域知識和最佳實(shí)踐 | 模塊化的工具集合+提示模板 |
| MCP | 統(tǒng)一工具調(diào)用的標(biāo)準(zhǔn)協(xié)議 | 讓所有AI用同一套接口 | Spring AI的MCP支持 |
這五個(gè)概念構(gòu)成了AI應(yīng)用開發(fā)的完整分層:
- Prompt是地基,沒有它AI聽不懂人話
- Function Call是第一層樓,讓AI能動手
- Agent是第二層,讓AI會思考
- Skill是裝修,讓AI更專業(yè)
- MCP是連接各層的管道,讓整個(gè)系統(tǒng)靈活可擴(kuò)展
總結(jié)
有些小伙伴可能會問:“我現(xiàn)在應(yīng)該先學(xué)哪個(gè)?”
我的建議是:從Prompt開始,這是所有AI應(yīng)用的基礎(chǔ)。
理解了Prompt,再逐步接觸Function Call,然后嘗試搭建簡單的Agent。
至于Skill和MCP,可以先了解概念,等你的應(yīng)用復(fù)雜到需要多個(gè)Agent協(xié)作時(shí),再深入學(xué)習(xí)也不遲。
Prompt、Function Call、Agent、Skill、MCP,正是AI應(yīng)用開發(fā)的“五層樓”,每一層都讓我們離業(yè)務(wù)更近,離底層細(xì)節(jié)更遠(yuǎn)。
開源地址:
- Spring AI:https://github.com/spring-projects/spring-ai
- LangChain4j:https://github.com/langchain4j/langchain4j
- MCP規(guī)范:https://github.com/modelcontextprotocol
更多項(xiàng)目實(shí)戰(zhàn)在Java突擊隊(duì)網(wǎng):susan.net.cn