這個理念實際上很早就出現了,只不過早期的模型推理理解能力比較差,用戶理解深度預測不夠,現在每天的迭代有了改進,逐步引入到我們本身的業務系統,讓AI大模型集成進來管理自身業務功能。當然現在也不是一個什么難事了。
什么是 Function Call
Function Call,即函數調用,在 AI 大模型的應用場景中,它允許模型調用外部工具或函數,以此來執行特定任務。當模型接收到用戶的請求時,它能夠判斷是否需要調用外部工具,并生成相應的函數調用指令。這一機制極大地擴展了模型的能力邊界,使其能夠處理諸如查詢數據庫、調用 API 接口等復雜任務,而不僅僅局限于文本生成。舉例來說,當用戶詢問 “北京今天的天氣如何” 時,模型可以通過 Function Call 調用天氣 API,獲取并返回準確的天氣信息。
Function Call的工作原理
- 當有函數調用時,用戶發送包含prompt和functions的請求給服務(Chat Server)。
- GPT模型根據用戶的prompt和functions選擇合適的外部API,并調用該API獲取數據或執行特定任務。
- GPT模型根據API邏輯生成回復并返回給用戶
項目技術選型
-
RuoYI-Vue-springboot3框架v3.8.9
-
Springboot 3.3.5
-
Maven 3.8.4
-
Jdk 17
-
Ai模型:
Qwen/Qwen2.5-7B-Instruct
(支持能力🛠? 工具調用 Tool use / Function calling)這里在選用模型的時候需要注意能用提供工具調用的功能,現在大部分都支持,一個小扳手的標志。也可以在本地通過 Ollama 進行部署。
項目搭建與配置
添加依賴
在pom.xml
文件中,添加 OpenAI 核心依賴,支持 AI 大模型的使用:
<!-- AI大模型支持 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>
若依賴下載失敗,可以在pom.xml
中添加鏡像中心地址:
<repositories><repository><id>public</id><name>aliyun nexus</name><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases></repository><repository><name>Central Portal Snapshots</name><id>central-portal-snapshots</id><url>https://central.sonatype.com/repository/maven-snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository>
</repositories>
配置 AI 模型
在application.yml
文件中,配置 AI 模型的相關信息:
spring:ai:openai:base-url: https://ai.cn/api-key: \${ApiKey}chat:options:model: Qwen/Qwen2.5-7B-Instruct
注冊業務工具接口
定義接口類
創建一個自定義接口類McpService
,用于收集業務系統對外暴露的工具。該接口有多種注冊方式,后續可根據實際需求進行改造:
public interface McpService {}
創建配置類
通過創建配置類McpServerConfig
,將相關接口注冊為工具回調提供者:
@Configuration
public class McpServerConfig {/*** 注冊工具回調提供者,把實現類中的工具注冊進來** @param mcpService mcp服務類* @return 工具回調提供*/@Beanpublic ToolCallbackProvider bookToolCallbackProvider(McpService mcpService) {return MethodToolCallbackProvider.builder().toolObjects(mcpService).build();}}
配置 Chat 客戶端
在ChatClientConfig
配置類中,發送包含 prompt 和 functions 的請求給服務,并預定義角色,幫助模型更好地理解用戶需求:
@Configuration
public class ChatClientConfig {@Autowiredprivate ToolCallbackProvider toolCallbackProvider;/*** 發送包含prompt和functions的請求給服務*/@Beanpublic ChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem("你是一個OA業務系統管理,可以幫助用戶管理當前的數據系統。" +"你可以根據用戶的提示詞進行分析關鍵字了解用戶的需求操作。" +"回復時,請使用簡潔友好的語言,并將收到的數據整理為易讀的格式或者JSON結構格式轉化成中文語言。").defaultTools(toolCallbackProvider).build();}
}
開發業務接口并注冊工具
以ServerController
為例,實現McpService
接口,并使用@Tool
和@ToolParam
注解標記工具函數和參數。注解中的name
指定工具名稱,description
對工具或參數進行詳細描述,以便模型更好地理解和匹配:
@RestController@RequestMapping("/monitor/server")public class ServerController implements McpService {// @PreAuthorize("@ss.hasPermi('monitor:server:list')")@GetMapping()@Tool(name = "viewServerInformation", description = "查看服務器信息")public AjaxResult getInfo(@ToolParam(description="這里是服務的具體名稱參數可以針對到哪臺服務器") String serverName) throws Exception {Server server = new Server();server.copyTo(serverName);return AjaxResult.success(server);}
}
開發 Chat 對話功能
創建ChatController
控制器,實現系統內部的 Chat 對話功能,使模型能夠調用系統內的工具,實現高效智能管理:
@RestController
@RequestMapping("/api/chat")
public class ChatController {@Resourceprivate ChatClient chatClient;@GetMappingpublic ResponseEntity<ChatResponse> chat(@RequestParam String msg) {try {String content = chatClient.prompt().user(msg).call().content();return ResponseEntity.ok(new ChatResponse(content));} catch (Exception e) {e.printStackTrace();return ResponseEntity.ok(new ChatResponse("AI出問題啦 " + e.getMessage()));}}
}
通過以上步驟,我們成功地將 AI 大模型集成到了 Java 業務系統中,實現了 Function Call 功能,極大地提升了業務系統的智能化程度。
最終效果:
既然都看到這里了,你是不是有個大大的問號 ? ? 我開發的工具怎么給告訴別人?別人怎么用?如何用?
這時候你會發現原來還有一個Mcp協議
的概念……