当前位置: 首页 > article >正文

Spring AI的函数调用(Function Calling),具体怎么实现?


Spring AI 的 函数调用(Function Calling) 功能允许大语言模型(LLM)在生成回答时触发预定义的外部函数,从而实现动态数据获取或业务逻辑操作(如查询数据库、调用 API 等)。以下是其核心机制和实现方式:


在这里插入图片描述

1. 函数调用的核心流程

  1. 定义函数:声明可供模型调用的函数(名称、描述、参数结构)。
  2. 模型交互:将函数信息与用户输入一起发送给模型,模型决定是否需要调用函数。
  3. 执行函数:解析模型的函数调用请求,执行对应的业务逻辑。
  4. 返回结果:将函数执行结果返回给模型,生成最终回答。

2. Spring AI 中的实现步骤

2.1 定义函数接口

使用 @Function 注解标记方法,描述函数的作用和参数:

public class WeatherService {
    
    @Function(
        name = "getCurrentWeather", 
        description = "获取指定城市的当前天气",
        inputType = @Function.Parameter(
            type = "object",
            properties = {
                @Function.ParameterProperty(name = "location", type = "string", description = "城市名称")
            }
        )
    )
    public String getWeather(@RequestParam String location) {
        // 调用真实天气 API(示例)
        return "{\"location\": \"" + location + "\", \"temperature\": 25, \"condition\": \"晴\"}";
    }
}

2.2 注册函数到模型

在 Spring 配置中将函数注册到 ChatClient

@Configuration
public class FunctionConfig {
    
    @Bean
    public FunctionCallback weatherFunctionCallback(WeatherService weatherService) {
        return new FunctionCallbackWrapper<>(
            "getCurrentWeather", 
            "获取天气信息", 
            weatherService::getWeather, 
            new WeatherRequestConverter()  // 参数解析器(将模型请求转为Java对象)
        );
    }

    @Bean
    public ChatClient chatClient(OpenAiChatClient chatClient, List<FunctionCallback> functionCallbacks) {
        // 将函数回调注册到 ChatClient
        chatClient.setFunctionCallbacks(functionCallbacks);
        return chatClient;
    }
}

2.3 触发函数调用

在对话请求中启用函数调用:

@RestController
public class ChatController {
    
    @Autowired
    private ChatClient chatClient;

    @PostMapping("/chat")
    public String chat(@RequestBody String userMessage) {
        // 构造包含函数调用选项的请求
        ChatOptions options = OpenAiChatOptions.builder()
            .withFunctionCallbacks(List.of("getCurrentWeather")) // 允许调用的函数
            .build();

        // 发送请求
        ChatResponse response = chatClient.call(
            new UserMessage(userMessage, options)
        );

        return response.getResult().getOutput().getContent();
    }
}

3. 处理函数调用结果

模型可能返回两种结果:

  1. 直接回答:无需调用函数时,直接生成文本。
  2. 函数调用请求:模型返回函数名称和参数,需手动执行并回传结果。
手动处理函数调用的示例
ChatResponse response = chatClient.call(userMessage);

if (response.getMetadata().containsKey("function_call")) {
    // 解析函数调用请求
    FunctionCallRequest functionCall = parseFunctionCall(response.getMetadata());
    
    // 执行函数
    Object result = executeFunction(functionCall.getName(), functionCall.getArguments());
    
    // 将结果回传给模型生成最终回答
    ChatResponse finalResponse = chatClient.call(
        new UserMessage(
            "函数调用结果:" + result, 
            OpenAiChatOptions.builder().build()
        )
    );
    return finalResponse.getResult().getContent();
}

4. 核心优势

  • 动态数据整合:模型可实时获取外部数据(如天气、订单状态)。
  • 业务逻辑触发:通过自然语言触发后端操作(如发送邮件、更新数据库)。
  • 精准性提升:结合函数调用与 RAG,生成更准确、实时的回答。

5. 典型应用场景

  • 客服机器人:查询用户订单、物流信息。
  • 智能助手:控制智能家居设备(“打开客厅的灯”)。
  • 数据分析:根据用户问题动态生成图表(调用图表生成服务)。

6. 注意事项

  • 模型支持:确保使用的模型支持函数调用(如 GPT-3.5-turbo、GPT-4)。
  • 参数验证:严格校验模型传入的参数,避免注入攻击。
  • 权限控制:限制敏感函数的访问权限(如仅允许管理员触发删除操作)。

7. 完整示例:天气查询

用户输入"北京现在天气怎么样?"

流程分解

  1. 模型识别需要调用 getCurrentWeather,参数 location: 北京
  2. Spring AI 触发 WeatherService.getWeather("北京")
  3. 函数返回 JSON 数据:{"temperature": 25, "condition": "晴"}
  4. 模型将结果转换为自然语言:"北京当前天气晴朗,气温 25 摄氏度。"


http://www.kler.cn/a/519180.html

相关文章:

  • 【vue3组件】【大文件上传】【断点续传】支持文件分块上传,能够在上传过程中暂停、继续上传的组件
  • Linux--权限
  • 服务器中的流量主要是指什么?
  • 复位信号的同步与释放(同步复位、异步复位、异步复位同步释放)
  • Pyecharts之地图图表的强大功能
  • java读取设置pdf属性信息
  • 群晖docker获取私有化镜像http: server gave HTTP response to HTTPS client].
  • 开源大模型:从单一竞争迈向多元生态时代
  • layui Table单元格编辑支持Enter键换行,包括下拉框单元格
  • [Computer Vision]实验三:图像拼接
  • 我的创作纪念日——1/23
  • 深入理解SSH:安全远程登录与高级应用
  • LLM幻觉(Hallucination)缓解技术综述与展望
  • 基于聚类与相关性分析对马来西亚房价数据进行分析
  • AI学习指南Ollama篇-Ollama中的模型管理
  • go变量、打印、注释
  • 构建企业级React应用的进阶实践
  • 神经网络的通俗介绍
  • 什么是 IndexedDB?
  • 怎么调整香港服务器硬盘分区大小?
  • 【长期更新】RN+expo 错误解决方案
  • linux中如何后台运行一个命令并获取它的进程号
  • 工程车辆检测数据集VOC+YOLO格式1239张10类别
  • 一站式云原生支持,Alibaba Cloud Linux性能有多强?
  • Pyecharts之地图图表的强大功能
  • 深度学习|表示学习|卷积神经网络|Padding(填充)的用处是什么?|12