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并将响应数据转化为我们所需要的格式。

相关推荐
zhangjr057524 分钟前
【HarmonyOS Next】鸿蒙实用装饰器一览(一)
前端·harmonyos·arkts
不爱学习的YY酱36 分钟前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
zongzi_49441 分钟前
二次封装的天气时间日历选择组件
开发语言·javascript·ecmascript
木子七1 小时前
vue2-vuex
前端·vue
麻辣_水煮鱼1 小时前
vue数据变化但页面不变
前端·javascript·vue.js
BY—-组态1 小时前
web组态软件
前端·物联网·工业互联网·web组态·组态
一条晒干的咸魚1 小时前
【Web前端】实现基于 Promise 的 API:alarm API
开发语言·前端·javascript·api·promise
WilliamLuo2 小时前
MP4结构初识-第一篇
前端·javascript·音视频开发
Beekeeper&&P...2 小时前
web钩子什么意思
前端·网络
过期的H2O22 小时前
【H2O2|全栈】JS进阶知识(七)ES6(3)
开发语言·javascript·es6