spring ai 入门 之 结构化输出 - 把大模型llm返回的内容转换成java bean

目录

​编辑

将AI非结构化文本转换为特定格式数据的应用场景说明

[Spring AI 介绍 :为Java开发者打造的AI应用开发框架](#Spring AI 介绍 :为Java开发者打造的AI应用开发框架)

[Qwen 介绍 : 一个国内领先的开源大模型](#Qwen 介绍 : 一个国内领先的开源大模型)

[Spring AI Alibaba框架介绍 : 一个国内最好的spring ai实现](#Spring AI Alibaba框架介绍 : 一个国内最好的spring ai实现)

[使用spring ai alibaba实现非结构化数据到Java Bean的转换](#使用spring ai alibaba实现非结构化数据到Java Bean的转换)

[1. 环境准备](#1. 环境准备)

[2. 获取API Key](#2. 获取API Key)

[3. 配置API Key](#3. 配置API Key)

[4. 添加仓库与依赖](#4. 添加仓库与依赖)

[5. 创建实体类](#5. 创建实体类)

[6. 控制器逻辑实现](#6. 控制器逻辑实现)


将AI非结构化文本转换为特定格式数据的应用场景说明

结构化输出主要应用于需要将AI生成的非结构化文本转换为特定格式数据的场景,比如将自然语言描述的信息转化为Java对象。这解决了从大模型获取信息后难以直接与现有系统或数据库对接的问题,通过预定义的数据结构(如Java Bean)来接收和处理AI输出的内容,极大简化了数据处理流程,提升了应用开发效率。

本文采用spring ai alibaba 调用通义qwen来实现。 qwen有100万免费Token额度,可以快速实现,同时,因为qwen 也是个开源的模型,我们可以自己搭建模型来实现免费使用

Spring AI 介绍 :为Java开发者打造的AI应用开发框架

在过去,Java 缺乏一个统一且高效的 AI 应用框架,这导致开发者在集成和使用各种 AI 组件时面临诸多挑战。为了解决这个问题,Spring 团队推出了 Spring AI,这是一个专为 Java 开发者设计的、用于构建 AI 应用程序的强大框架。Spring AI 的核心优势在于它提供了一套统一的接口来调用不同的 AI 服务(如车牌号识别等),极大地简化了开发流程。此外,Spring AI 与现有的 Spring 生态系统无缝兼容,并且完全支持 Java 的面向对象编程模式,使得开发者能够更加自然地将 AI 功能融入到他们的应用中。通过这些特点,Spring AI 不仅提升了开发效率,还确保了代码的可维护性和扩展性。

Qwen 介绍 : 一个国内领先的开源大模型

通义千问Qwen是阿里巴巴云推出的一种先进的语言模型,在多个权威基准测评中表现出色。它在MMLU、TheoremQA和GPQA等评测指标上超越了Llama 3 70B,并在Hugging Face的开源大模型排行榜Open LLM Leaderboard上位居第一,展示了其卓越的性能和广泛的应用潜力。这一成就不仅体现了阿里云在人工智能领域的深厚积累和技术实力,也标志着中国在AI技术研发方面达到了新的高度。Qwen能够支持多种自然语言处理任务,包括但不限于文本生成、问答系统、对话交互等,为用户提供高质量的服务体验。

大家也可以参与和支持这些竞技活动,亲自体验并投票支持你心目中的最佳模型。它在思南评测平台 CompassArena 上表现优异,仅次于国际知名的GPT和Claude模型;

同时,在国外大模型竞技场 https://huggingface.co/spaces/lmarena-ai/chatbot-arena-leaderboard 中在中文处理中属于第一梯队。

Spring AI Alibaba框架介绍 : 一个国内最好的spring ai实现

Spring AI Alibaba是一个专为Spring生态系统设计的AI应用框架,特别针对阿里云的通义大模型系列进行了优化。它支持多种生成式AI任务,包括对话、文生图、文生语音等。Spring AI Alibaba通过提供一套标准化API和实用工具(如Prompt Template、OutputParser),极大地简化了开发者集成国产大模型的过程。其核心优势在于能够无缝对接阿里云的各种AI服务,只需简单的配置更改即可切换不同的AI实现,同时保持代码的一致性和可维护性。这使得基于Spring Boot的应用可以快速获得强大的AI能力,而无需深入理解复杂的底层技术细节。

使用spring ai alibaba实现非结构化数据到Java Bean的转换

基于 spring ai alibaba 实现结构化输出为一个 Java Bean,主要是利用大模型的标准化能力来将非结构化的数据转换成结构化的格式,并进一步映射到Java对象上。这一过程有助于提高信息处理效率和准确性。下面是具体的操作步骤:

1. 环境准备

首先,确保你的开发环境满足以下要求:

  • JDK版本:至少为JDK 17。
  • Spring Boot版本:使用3.3.x系列中的最新稳定版或更高版本。

2. 获取API Key

访问阿里云百炼页面,登录您的阿里云账号并开通"百炼大模型推理"服务。按照指引完成服务开通后,进入个人中心创建一个新的API KEY,并妥善保存此密钥以供后续配置使用。

3. 配置API Key

在终端或命令行工具中设置环境变量,将您刚才记录下来的API Key值赋给AI_DASHSCOPE_API_KEY

export AI_DASHSCOPE_API_KEY=这里替换为您实际的API密钥

4. 添加仓库与依赖

为了支持最新的Spring AI Alibaba特性,在项目的pom.xml文件中添加必要的Maven仓库及依赖项:

<repositories>
    <repository>
        <id>sonatype-snapshots</id>

        <url>https://oss.sonatype.org/content/repositories/snapshots</url>

        <snapshots>
            <enabled>true</enabled>

        </snapshots>

    </repository>

    <repository>
        <id>spring-milestones</id>

        <name>Spring Milestones</name>

        <url>https://repo.spring.io/milestone</url>

        <snapshots>
            <enabled>false</enabled>

        </snapshots>

    </repository>

    <repository>
        <id>spring-snapshots</id>

        <name>Spring Snapshots</name>

        <url>https://repo.spring.io/snapshot</url>

        <releases>
            <enabled>false</enabled>

        </releases>

    </repository>

</repositories>

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>

        <artifactId>spring-ai-alibaba-starter</artifactId>

        <version>1.0.0-M3.1</version>

    </dependency>

    <!-- 其他依赖 -->
</dependencies>

同时,请确认项目已经指定了Spring Boot的父级POM:

<parent>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>3.3.4</version>

    <relativePath/> <!-- lookup parent from repository -->
</parent>

5. 创建实体类

定义一个简单的Java Bean用来存储解析后的数据。例如,用于表示演员及其出演电影列表的实体类如下所示:

package com.example.demo.entity;

import java.util.List;

public class ActorsFilms {
    private String actor;
    private List<String> movies;

    // Getters and Setters
}

6. 控制器逻辑实现

接下来,在控制器中注入ChatClient,并通过它向大模型发起请求。根据返回的数据流构建对应的ActorsFilms对象列表:

import com.example.demo.entity.ActorsFilms;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.converter.BeanOutputConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.Objects;

@RestController
@RequestMapping("/api")
public class OutputParserController {

    private final ChatClient chatClient;

    @Autowired
    public OutputParserController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping("/output")
    public List<ActorsFilms> generateStructuredOutput(@RequestParam(value = "actor", defaultValue = "Tom Hanks") String actor) {
        var converter = new BeanOutputConverter<>(new ParameterizedTypeReference<List<ActorsFilms>>() {});

        Flux<String> flux = chatClient.prompt()
                .user(u -> u.text("""
                                  Generate the filmography for a given actor.
                                  {format}
                                """)
                        .param("format", converter.getFormat()))
                .stream()
                .content();

        return converter.convert(String.join("", Objects.requireNonNull(flux.collectList().block())));
    }
}

通过上述步骤,我们完成了基于spring ai alibaba技术栈对指定演员的电影作品进行查询,并将其结果封装为一个ActorsFilms类型的Java Bean实例集合的过程。这里的关键在于正确地设置好所有必需的库依赖、环境变量以及合理地运用ChatClient提供的功能来调用外部API并将响应数据转化为我们所需要的格式。

相关推荐
Liquor14191 小时前
JavaScript知识点梳理及案例实践
开发语言·前端·javascript·python·css3·html5·js
空白诗3 小时前
HTML 基础概念:什么是 HTML ? HTML 的构成 与 HTML 基本文档结构
前端·html
hummhumm4 小时前
Oracle 第22章:数据仓库与OLAP
java·javascript·后端·python·sql·mysql·database
漫天转悠5 小时前
Uniapp在Vue环境中引入iconfont图标库(详细教程)
前端·vue.js·uniapp
二狗mao5 小时前
Uniapp的学习
前端·vue.js·uni-app
334554327 小时前
element表格双击修改时间
开发语言·前端·javascript
想退休的搬砖人7 小时前
axios请求中的data和params的区别
前端
前端李易安7 小时前
如何封装一个axios,封装axios有哪些好处
前端·vue.js·axios
sky.fly8 小时前
HTML5+css3(伪类,动态伪类,结构伪类,否定伪类,UI伪类,语言伪类,link,hover,active,visited,focus)
开发语言·前端·css3·html5