Spring AI实现结构化输出

介绍:让AI大模型输出指定格式数据,便于操作数据并与前端交互

makefile 复制代码
jdk版本:17  
spring-ai-alibaba版本:1.0.0.2  
spring-boot版本:3.4.4

步骤一:引入依赖

依赖管理

xml 复制代码
<properties>
  <java.version>17</java.version>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <spring-boot.version>3.4.4</spring-boot.version>
  <spring-ai-alibaba.version>1.0.0.2</spring-ai-alibaba.version>
</properties>
xml 复制代码
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
           
            <dependency>
                <groupId>com.alibaba.cloud.ai</groupId>
                <artifactId>spring-ai-alibaba-bom</artifactId>
                <version>${spring-ai-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
	</dependencies>
</dependencyManagement>	

具体依赖-模块所在位置pom.xml

xml 复制代码
<dependency>
  <groupId>com.alibaba.cloud.ai</groupId>
  <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>

步骤二:配置信息

application.yml

yaml 复制代码
server:
  port: 8098

spring:
  application:
    name: RuoYi-Vue-Plus
  ai:
    dashscope:
      api-key: ${AI_DASHSCOPE_API_KEY}
      chat:
        response-format: json

步骤三:测试类

TestController

less 复制代码
@RestController
@RequestMapping("/structure")
@Slf4j
public class TestController {
    private final ChatClient chatClient;

    private final ChatModel chatModel;

    private final BeanOutputConverter<PersonalInfo> beanOutputConverter;

    private final String format;


    public TestController(ChatClient.Builder builder, ChatModel chatModel) {
        this.chatModel = chatModel;

        this.beanOutputConverter = new BeanOutputConverter<>(
                new ParameterizedTypeReference<PersonalInfo>() {
            }
        );

        this.format = beanOutputConverter.getFormat();
        log.info("format: {}", format);
        this.chatClient = builder.build();
    }

    @GetMapping(value = "/simple-chat-format")
    public PersonalInfo simpleChatFormat(@RequestParam(value = "query", defaultValue = "以小研说技术为作者,写一篇50字左右的人物介绍") String query) {
        return chatClient.prompt(query)
            .call().entity(PersonalInfo.class);
    }

    @GetMapping(value = "/simple-chat")
    public PersonalInfo simpleChat(HttpServletResponse response) {
        Flux<String> flux = this.chatClient.prompt()
            .user(u -> u.text("""
						requirement: 请用大概 100 字, 作者为 小研 , 为AI的发展史写一首诗;
						format: 以纯文本输出 json, 请不要包含任何多余的文字------包括 markdown 格式;
						outputExample: {
							 "title": {title},
							 "author": {author},
							 "date": {date},
							 "content": {content}
						};
						"""))
            .stream()
            .content();

        String result = String.join("\n", Objects.requireNonNull(flux.collectList().block()))
            .replaceAll("\\n", "")
            .replaceAll("\\s+", " ")
            .replaceAll("\"\\s*:", "\":")
            .replaceAll(":\\s*\"", ":\"");

        return beanOutputConverter.convert(result);
    }
}

PersonalInfo

typescript 复制代码
@Data
public class PersonalInfo {
    private String title;

    private String author;

    private String date;

    private String content;

}

步骤四:启动

步骤五:测试

至此,Spring AI实现结构化输出Demo版结束啦!

本人正在打造技术交流群,欢迎志同道合的朋友一起探讨,一起努力,通过自己的努力,在技术岗位这条道路上走得更远。QQ群号:952912771 备注:技术交流 即可通过!

加入技术群可以获取资料,含AI资料、Spring AI中文文档等,等你加入~

相关推荐
大哥43092 分钟前
模型名停用与分层降级:一次 LLM 链路的失败面设计
后端
橙子家20 分钟前
对象状态与操作合法性异常【C# Exception 详解系列(二)】
后端
架构技术专栏1 小时前
为什么 AI 公司都想做Personal Agent ?
后端
用户761016088471 小时前
黑马RabbitMQ 从入门到可靠性:收发、持久化、死信延迟一篇打通
后端
Bazingga1 小时前
Transformer与自注意力机制:一台"全员检索"机器的说明书
人工智能·后端
星辰云-1 小时前
# 基于Spring Boot的德州特产扒鸡商城系统(毕设|源码|论文|演示视频)
spring boot·后端·课程设计
武子康2 小时前
同为7/8,错误样本却不同:Agent Grader 分歧复算
人工智能·后端·agent
茉莉玫瑰花茶2 小时前
GO [ 内存与变量逃逸分析 ]
开发语言·后端·golang
星辰云-2 小时前
基于Spring Boot的旅游景点票务系统的设计与实现(毕设项目,附完整源码)
spring boot·后端·课程设计
Rain的Java大神之路2 小时前
百万并发直播弹幕系统设计全解:看懂了扇出,你就看懂了高并发的八成
java·后端·面试