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 工具回调提供
    */

   @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协议的概念……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值