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中文文档等,等你加入~

相关推荐
阿正的梦工坊9 小时前
【Rust】02-变量、不可变性与基础类型
开发语言·后端·rust
我叫黑大帅10 小时前
通过php 中的Route:: 的写法了解什么是静态类调用
后端·面试·php
JS菌11 小时前
AI Agent 沙箱双层防护体系:从权限过滤到内核隔离的完整实现
前端·人工智能·后端
IT空门:门主11 小时前
Spring 注入三剑客:@Resource、@Autowired、@RequiredArgsConstructor 到底该用哪个?
java·后端·spring
ServBay12 小时前
云端 AI 蜜月期宣告结束,为什么 2026 年开发者转向本地优先架构
后端·ai编程
IT_陈寒12 小时前
Vite这个坑我帮你踩了,动态导入居然这样才生效
前端·人工智能·后端
Sam_Deep_Thinking12 小时前
Spring Boot 的启动原理是什么?
java·spring boot·后端
南部余额12 小时前
Spring WebClient 从入门到精通
java·后端·spring
摇滚侠12 小时前
Spring 零基础入门到进阶 基于注解管理 Bean 38-43
xml·java·后端·spring·intellij-idea
SamDeepThinking12 小时前
我们当年是如何真实落地BFF的?
java·后端·架构