Java中使用Function Call實現AI大模型與業務系統的集成?

這個理念實際上很早就出現了,只不過早期的模型推理理解能力比較差,用戶理解深度預測不夠,現在每天的迭代有了改進,逐步引入到我們本身的業務系統,讓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協議的概念……

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75949.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

id 屬性自動創建 js 全局變量

給一個元素設置 id 屬性&#xff0c;它會在 js 中創建全局變量&#xff0c;如 <div class"test" click"test" id"idTest">test</div>test() {console.log(idTest:, window.idTest) }.test {height: 50px;width: 200px;background-c…

Android SELinux權限使用

Android SELinux權限使用 一、SELinux開關 adb在線修改seLinux(也可以改配置文件徹底關閉) $ getenforce; //獲取當前seLinux狀態,Enforcing(表示已打開),Permissive(表示已關閉) $ setenforce 1; //打開seLinux $ setenforce 0; //關閉seLinux二、命令查看sel…

【R語言繪圖】圈圖繪制代碼

繪制代碼 rm(list ls())# 加載必要包 library(data.table) library(circlize) library(ComplexHeatmap) library(rtracklayer) library(GenomicRanges) library(BSgenome) library(GenomicFeatures) library(dplyr)### 數據準備階段 ### # 1. 讀取染色體長度信息 df <- re…

vim 編輯器 使用教程

Vim是一款強大的文本&#xff08;代碼&#xff09;編輯器&#xff0c;它是由Bram Moolenaar于1991年開發完成。它的前身是Bill Joy開發的vi。名字的意義是Vi IMproved。 打開vim&#xff0c;直接在命令行輸入vim即可&#xff0c;或者vim <filename>. Vim分為四種模式&a…

C++20新增內容

C20 是 C 語言的一次重大更新&#xff0c;它引入了許多新特性&#xff0c;使代碼更現代化、簡潔且高效。以下是 C20 的主要新增內容&#xff1a; 1. 概念&#xff08;Concepts&#xff09; 概念用于約束模板參數&#xff0c;使模板編程更加直觀和安全。 #include <concept…

C++中常用的十大排序方法之4——希爾排序

成長路上不孤單&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///計算機愛好者&#x1f60a;///持續分享所學&#x1f60a;///如有需要歡迎收藏轉發///&#x1f60a;】 今日分享關于C中常用的排序方法之4——希爾排序的相…

詳細描述以太坊的gas、gaslimit、gasPrice

目錄 一、Gas 是什么? ? 簡要定義: ?? 舉例理解: 二、Gas Limit 是什么? ? 簡要定義: 分兩種: 舉例說明: 三、Gas Price 是什么? ? 簡要定義: 為什么它重要? 示例: 四、 EIP-1559 后的新機制(倫敦升級) 三個要素: 五、額外技巧(開發實用) 本文…

全國大學生數學建模競賽賽題深度分析報告(2010-2024)

全國大學生數學建模競賽賽題深度分析報告&#xff08;2010-2024&#xff09; 全國大學生數學建模競賽(CUMCM)是中國最具影響力的大學生科技競賽之一&#xff0c;本報告將對2010-2024年間的賽題進行全面統計分析&#xff0c;包括題目類型、領域分布、模型方法等多個維度&#x…

從獎勵到最優決策:動作價值函數與價值學習

從獎勵到最優決策&#xff1a;動作價值函數與價值學習 價值學習一、動作價值函數對 U t U_t Ut?求期望得到動作價值函數動作價值函數的意義最優動作價值函數(Optimal Action-Value Function)如何理解 Q ? Q^* Q?函數 二、價值學習的基本思想Deep Q-Network(DQN)DQN玩游戲的具…

智能手表該存什么音頻和文本?場景化存儲指南

文章目錄 為什么需要“場景化存儲”&#xff1f;智能手表的定位手機替代不了的場景碎片化的場景存儲 音頻篇&#xff1a;智能手表該存什么音樂和音頻&#xff1f;運動場景通勤場景健康場景 文本篇&#xff1a;哪些文字信息值得放進手表&#xff1f;&#xff08;部分情況可使用圖…

液態神經網絡技術指南

一、引言 1.從傳統神經網絡到液態神經網絡 神經網絡作為深度學習的核心工具&#xff0c;在圖像識別、自然語言處理、推薦系統等領域取得了巨大成功。尤其是卷積神經網絡&#xff08;CNN&#xff09;、循環神經網絡&#xff08;RNN&#xff09;、長短期記憶網絡&#xff08;LS…

hive通過元數據庫刪除分區操作步驟

刪除分區失敗&#xff1a; alter table proj_60_finance.dwd_fm_ma_kpi_di_mm drop partition(year2025,month0-3,typeADJ); 1、查詢分區的DB_ID、TBL_ID – 獲取數據庫ID-26110 SELECT DB_ID FROM DBS WHERE NAME ‘proj_60_finance’; – 獲取表ID-307194 SELECT TBL_ID FR…

1990-2019年各地級市GDP數據

1990-2019年各地級市GDP數據 1、時間&#xff1a;1990-2019年 2、來源&#xff1a;城市年鑒 3、指標&#xff1a;行政區劃代碼、年份、省份、城市、經度、緯度、地區生產總值(萬元) 4、范圍&#xff1a;250地級市 5、指標解釋&#xff1a;地區生產總值&#xff08;Gross R…

滄州鐵獅子

又名“鎮海吼”&#xff0c;是中國現存年代最久、形體最大的鑄鐵獅子&#xff0c;具有深厚的歷史文化底蘊和獨特的藝術價值。以下是關于滄州鐵獅子的詳細介紹&#xff1a; 歷史背景 ? 鑄造年代&#xff1a;滄州鐵獅子鑄造于后周廣順三年&#xff08;953年&#xff09;&#…

《Java八股文の文藝復興》第十一篇:量子永生架構——對象池的混沌邊緣(終極試煉·完全體)

Tags: - Java高并發 - 量子架構 - 混沌工程 - 賽博修真 - 三體防御 目錄&#xff1a; 卷首語&#xff1a;蝴蝶振翅引發的量子海嘯 第一章&#xff1a;混沌初開——對象池的量子涅槃&#xff08;深度擴展&#xff09; 第二章&#xff1a;混沌計算——對象復活的降維打擊&…

Java面試34-Kafka的零拷貝原理

在實際應用中&#xff0c;如果我們需要把磁盤中的某個文件內容發送到遠程服務器上&#xff0c;那么它必須要經過幾個拷貝的過程&#xff1a; 從磁盤中讀取目標文件內容拷貝到內核緩沖區CPU控制器再把內核緩沖區的數據復制到用戶空間的緩沖區在應用程序中&#xff0c;調用write…

TF-IDF忽略詞序問題思考

自從開始做自然語言處理的業務&#xff0c;TF-IDF就是使用很頻繁的文本特征技術&#xff0c;他的優點很多&#xff0c;比如&#xff1a;容易理解&#xff0c;不需要訓練&#xff0c;提取效果好&#xff0c;可以給予大規模數據使用&#xff0c;總之用的很順手&#xff0c;但是人…

SQL122 刪除索引

alter table examination_info drop index uniq_idx_exam_id; alter table examination_info drop index full_idx_tag; 描述 請刪除examination_info表上的唯一索引uniq_idx_exam_id和全文索引full_idx_tag。 后臺會通過 SHOW INDEX FROM examination_info 來對比輸出結果。…

Langchat平臺知識庫測試

平臺介紹&#xff1a; LangChat是Java生態下企業級AIGC項目解決方案&#xff0c;集成RBAC和AIGC大模型能力&#xff0c;幫助企業快速定制AI知識庫、企業AI機器人。 支持的AI大模型&#xff1a;Gitee AI / 阿里通義 / 百度千帆 / DeepSeek / 抖音豆包 / 智譜清言 / 零一萬物 /…

Vue3 Composition API 深度開發指南

Vue3 Composition API 深度開發指南 響應式系統核心解析 1.1 響應式原理解構 Vue3 基于 Proxy 實現響應式追蹤&#xff0c;其核心流程為&#xff1a; const reactiveHandler {get(target, key, receiver) {track(target, key) // 依賴收集return Reflect.get(target, key, …