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

相关推荐
Jul1en_17 分钟前
Claude 迁移 Codex 工作流迁移与更新
java·服务器·前端·后端·ai编程
神奇小汤圆17 分钟前
京东二面:假如SQL中join了10张表,如何优化性能?
后端
神奇小汤圆32 分钟前
Spring AOP底层黑科技:巧妙破解微服务异步线程池导致事务与链路上下文丢失难题
后端
用户9138381707991 小时前
从乐观锁到悲观锁:一次库存并发问题的排查与重构
后端
程序员包打听1 小时前
MoonBit 是什么?给第一次听说这门语言的你
前端·后端
RuoyiOffice1 小时前
2026 年开源 BPM/工作流引擎大盘点:Flowable vs Camunda vs Activiti vs Turbo——谁才是企业级首选?
java·spring boot·后端·开源·流程图·ruoyi·anti-design-vue
SamDeepThinking1 小时前
别把业务逻辑塞进存储过程,适当用表驱动法
java·后端·架构
只做人间不老仙1 小时前
C++ grpc 截止时间示例学习
后端·grpc
Rust研习社2 小时前
Weak 弱引用:如何用 Weak 打破 Rc 与 Arc 的循环引用
开发语言·后端·rust