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

前言

最近AI越來越火了。

我發(fā)現(xiàn)里面有很多概念有些小伙伴有點(diǎn)分不清楚,比如:Prompt、Agent、Function Call、Skill、MCP等。

今天這篇文章專門跟大家一起聊聊這個(gè)話題,希望對你會有所幫助。

核心概念關(guān)系圖

先上干貨,這張圖讓你從整體上理解這五個(gè)概念是如何分層遞進(jìn)的:

image

更多項(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();
    }
}

這里的SystemPromptUserPrompt就是最基礎(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é)果返回給模型生成最終答案。

原理圖如下:

image

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)框架。

它的工作流程是:

  1. 思考(Thought):分析當(dāng)前狀態(tài),決定下一步要做什么
  2. 行動(Action):調(diào)用某個(gè)工具
  3. 觀察(Observation):獲取工具返回的結(jié)果
  4. 循環(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è)概念?

  1. 設(shè)計(jì)層面的解耦:Function Call是底層能力,Skill是業(yè)務(wù)封裝。底層能力穩(wěn)定,上層業(yè)務(wù)可以靈活組合。
  2. 復(fù)用性:好的Skill可以跨項(xiàng)目復(fù)用,就像代碼庫里的工具包。
  3. 安全性:可以給不同的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的工作流程

image

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)。

開源地址

更多項(xiàng)目實(shí)戰(zhàn)在Java突擊隊(duì)網(wǎng):susan.net.cn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容