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.mzph.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, …