这个理念实际上很早就出现了,只不过早期的模型推理理解能力比较差,用户理解深度预测不够,现在每天的迭代有了改进,逐步引入到我们本身的业务系统,让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 工具回调提供
*/
@Bean
public ToolCallbackProvider bookToolCallbackProvider(McpService mcpService) {
return MethodToolCallbackProvider.builder()
.toolObjects(mcpService)
.build();
}
}
配置 Chat 客户端
在ChatClientConfig
配置类中,发送包含 prompt 和 functions 的请求给服务,并预定义角色,帮助模型更好地理解用户需求:
@Configuration
public class ChatClientConfig {
@Autowired
private ToolCallbackProvider toolCallbackProvider;
/**
* 发送包含prompt和functions的请求给服务
*/
@Bean
public 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 {
@Resource
private ChatClient chatClient;
@GetMapping
public 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协议
的概念……