这个理念实际上很早就出现了,只不过早期的模型推理理解能力比较差,用户理解深度预测不够,现在每天的迭代有了改进,逐步引入到我们本身的业务系统,让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协议
的概念……