SpringAI-结构化输出API

1.简介

StructuredOutputConverter 接⼝允许获取结构化输出,例如将输出映射到 Java 类或从⽂本型 AI 模型输出中提取值数组。接⼝定义如下:

有一些大模型不能使用结构化输出,例如deepseek不可以(若不可以需要换一个大模型)

java 复制代码
public interface StructuredOutputConverter<T> extends Converter<String, T>, 
FormatProvider {
}

2.可用转换器

⽬前, SpringAI 提供了 AbstractConversionServiceOutputConverter 、 AbstractMessageOutputConverter 、 BeanOutputConverter 、 MapOutputConverter 和 ListOutputConverter 实现:

下来是具体相关转换器的使⽤。需要注意的是这⾥不能使用流模式 ,使**⽤同步文本模式**。

2.1Bean 输出转换器

以下示例显示了如何使⽤ BeanOutputConverter 为演员⽣成电影作品集。 代表演员电影作品的⽬标记录:

java 复制代码
record ActorsFilms(String actor, List<String> movies) {}

2.1.1介绍record

record是JDK17才出现的,Java 的 record 是一种简化的不可变数据载体,语法格式为 record 类名(属性列表) {}

例子:

Person类

java 复制代码
package com.jiazhong.mingxing.ai.siliconflow.glm.demo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person implements Serializable {

    private String id;
    private String name;
    private Character gender;
    public  void print(){
        System.out.println( name+"输出了内容");
    }
}
java 复制代码
record Preson1(String id,String name,Character gender){
        public void print(){
            System.out.println(name+"输出了内容");
        }
    }

这两段代码功能相同。

2.1.2案例

一个人

java 复制代码
 record ActorForm(String actor, List<String> movies){}
    @GetMapping(value = "/call1" ,produces = "application/json;charset=utf-8")
    public ActorForm call1(@RequestParam("question") String question){
        return openAiChatClient.prompt()
                .user(question)
                .call().entity(ActorForm.class);
    }

多个人

java 复制代码
@GetMapping(value = "/call2" ,produces = "application/json;charset=utf-8")
private List<ActorForm> call2(@RequestParam("question") String question){
    return openAiChatClient.prompt()
            .user(question)
            .call()
            .entity(new ParameterizedTypeReference<List<ActorForm>>() {
            });
}

2.2Map 输出转换器

案例

java 复制代码
 @GetMapping(value = "/call3" ,produces = "application/json;charset=utf-8")
    public Map<Object,Object> call3(@RequestParam("question") String question){
        return openAiChatClient.prompt()
                .user(question)
                .call().entity(new ParameterizedTypeReference<Map<Object, Object>>() {
                });
    }

2.3List 输出转换器

案例

java 复制代码
@GetMapping(value = "/call4" ,produces = "application/json;charset=utf-8")
    public List<String> call4(@RequestParam("question") String question){
        return openAiChatClient.prompt()
                .user(question)
                .call().entity(new ListOutputConverter());
    }
相关推荐
旖旎夜光几秒前
【AI入门】大模型介绍全解析:从模型、LLM 到提示词与嵌入
人工智能·笔记·python·学习·ai编程
牧羊人.3331 分钟前
计算机视觉基础 第13章 |背景建模与运动目标检测
图像处理·人工智能·目标检测·计算机视觉·目标跟踪
卷无止境1 分钟前
SIE:当一个推理引擎决定把100多个模型装进一个集群里
人工智能·python
阳明山水3 分钟前
概念漂移分类与自适应策略解析
人工智能·深度学习·算法·机器学习·架构
狂师5 分钟前
AI 测试提效 | 别搞万能 Skill,推荐5 个 Agent Skill 串起 UI 自动化执行到报告生成全流程
人工智能·agent·测试
动物园猫7 分钟前
超市空货架目标检测数据集:1,500张图像 | 目标检测
人工智能·目标检测·计算机视觉
卷无止境8 分钟前
Orca:当五个AI程序员同时给你打工
人工智能·python
晴天1612 分钟前
操作系统开发入门-Day34
人工智能
牧羊人.33316 分钟前
计算机视觉基础第15章|DNN实现图像风格迁移
图像处理·人工智能·深度学习·opencv·计算机视觉
Mickey Q17 分钟前
【深度学习】权重衰减与 Dropout
人工智能·深度学习