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

news2024/11/27 14:46:11

目录

​编辑

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

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

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

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

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

1. 环境准备

2. 获取API Key

3. 配置API Key

4. 添加仓库与依赖

5. 创建实体类

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2232569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac

寻找模拟器 背景&#xff1a; 运行的是h5&#xff0c;模拟器是网易MuMu。 首先检查一下是否配置dab环境&#xff0c;adb version 配置一下hbuilderX的adb&#xff1a; 将命令输出的路径配置到hbuilderx里面去&#xff0c;然后重启下HbuilderX。 开始安装基座…一直安装不…

使用Docker Compose构建多容器应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Docker Compose构建多容器应用 引言 Docker Compose 简介 安装 Docker Compose 创建基本配置 运行多容器应用 查看服务状态 …

react-router与react-router-dom的区别

写法上的区别&#xff1a; 写法1: import {Swtich, Route, Router, HashHistory, Link} from react-router-dom;写法2: import {Switch, Route, Router} from react-router; import {HashHistory, Link} from react-router-dom;react-router实现了路由的核心功能 react-router-…

Python 字符串类型中 ``split(“\n“)`` 与 ``splitlines()`` 方法的一些区别

最近在以 self.__print("#" * 20 "\n") 调用自己写的 __print 接口时发现打印的时候 "\n" 没有打出来&#xff0c;进而发现了 split("\n") 与 splitlines() 方法的一些区别。 一个是参数上&#xff0c;split 需要传递一个字符串作为…

Java Iterator 实现杨辉三角

一、问题描述 杨辉三角定义如下&#xff1a; 1/ \1 1/ \ / \1 2 1/ \ / \ / \1 3 3 1/ \ / \ / \ / \1 4 6 4 1/ \ / \ / \ / \ / \ 1 5 10 10 5 1 把每一行看做一个list&#xff0c;试写一个 Iterator&#xff0c;不断输出下一行的 list&#xf…

Spark 的介绍与搭建:从理论到实践

目录 一、分布式的思想 &#xff08;一&#xff09;存储 &#xff08;二&#xff09;计算 二、Spark 简介 &#xff08;一&#xff09;发展历程 &#xff08;二&#xff09;Spark 能做什么&#xff1f; &#xff08;三&#xff09;spark 的组成部分 &#xff08;四&…

Linux操作系统 ------(3.文本编译器Vim)

目录 1.前言 2.本章学习目标 3.vim的三种工作模式 3.1一般模式‌ 3.2编辑模式‌ 3.3命令行模式‌ 4.运行vim 5.vim 不同工作模式下的常见命令 6.一般模式下的功能键 6.1移动光标类 6.2删除、复制和粘贴类 6.3查找替换类 7.从一般模式进入编辑模式 8.命令行模式下的…

RocketMQ的消息类型

RocketMQ的消息类型 文章目录 RocketMQ的消息类型一、顺序消息二、广播消息应用场景&#xff1a;示例代码&#xff1a;实现思路&#xff1a;注意点&#xff1a; 三、延时消息应用场景&#xff1a;核心方法&#xff1a; 四、批量消息应用场景&#xff1a;示例代码&#xff1a;注…

Selective Generation for Language Models 语言模型的选择性生成

生成式语言模型&#xff08;Generative Language Models, GLMs&#xff09;在文本生成任务中取得了显著进展。然而&#xff0c;生成内容的“幻觉”现象&#xff0c;即生成内容与事实或真实语义不符的问题&#xff0c;仍是GLMs在实际应用中的一个重大挑战。为了解决这一问题&…

git clone,用https还是ssh

前言 在使用Git去克隆项目时&#xff0c;会遇到https和ssh等形式&#xff0c;这两种又有何种区别呢&#xff0c;本文将重点讨论在具体使用中的问题。 注:第一次使用Git 时&#xff0c;需要先设置全局用户名和邮箱&#xff0c;否则后续使用命令时会报错&#xff0c;也是提醒先添…

最新整理:Selenium自动化测试面试题

1.selenium中如何判断元素是否存在? find_elements查找到的元素个数为0&#xff0c;find_element报错意味着元素不存在 2.如何判断元素是否出现? 判断元素是否出现&#xff0c;存在两种情况&#xff0c;一种是该元素压根就没有&#xff0c;自然不会出现;另外一种是有这样的…

业绩代码查询实战——php

一、一级代码显示职员 foreach($data_职员信息 as $key > $value){//$where_查询分类$where_查询通用;//$dat分类one $业绩提成->where($where_查询分类)->order("CreateDate desc")->select();if($value[haschildname]0 && $value[key] !"…

如何彻底删除gitbash中所有的命令记录、以及彻底删除Windows powerShell或者cmd中的所有命令记录

文章目录 1. 文章引言2. 彻底删除gitbash中所有的命令记录3. 彻底删除Windows powerShell或者cmd中的所有命令记录1. 文章引言 有时,我们使用外部电脑从gitbash中下载代码,假设使用history -c命令: 可以清除当前弹框的历史记录,但也无法彻底删除命令记录。打开gitbash后,通…

工作管理实战指南:利用Jira、Confluence等Atlassian工具打破信息孤岛,增强团队协作【含免费指南】

如果工作场所存在超级反派&#xff0c;其中之一可能会被命名为“信息孤岛”&#xff0c;因为它们能够对公司的生产力和协作造成严重破坏。当公司决定使用太多互不关联的工具来完成工作时&#xff0c;“信息孤岛”就会出现&#xff0c;导致团队需要耗费大量时间才能就某件事情达…

OceanBase V4.3.3,首个面向实时分析场景的GA版本发布

在10月23日举办的 OceanBase年度发布会 上&#xff0c;我们怀着激动之情&#xff0c;正式向大家宣布了 OceanBase 4.3.3 GA 版的正式发布&#xff0c;这也是OceanBase 为实时分析&#xff08;AP&#xff09;场景打造的首个GA版本。 2024 年初&#xff0c;我们推出了 4.3.0 版本…

最新最全面的JAVA面试题免费下载

面对求职市场的激烈竞争&#xff0c;掌握全面且深入的Java知识已成为每一位Java开发者必不可少的技能。《2023最新版Java面试八股文》是一份精心整理的面试准备资料&#xff0c;旨在帮助广大开发者系统复习&#xff0c;从容应对Java及相关技术栈的面试挑战。这份文档不仅汇聚了…

Spring Security 框架篇-深入了解 Spring Security 的授权核心功能(RBAC 权限模型、自定义异常处理器、校验权限方法)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 权限系统 1.1 引入 1.2 RBAC 权限模型 1.3 数据库设计 2.0 Spring Security 核心功能-授权 2.1 思路分析 2.2 编写 SQL 语句 2.3 将用户权限进行封装 2.4 获取用户…

博捷芯MIP专机:精密划片技术的革新者

BJX8160 精密划片机作为MINI行业的专用机&#xff0c;凭借其全自动上下料、高精度高速度um级无膜切割以及兼容多种上下料方式等特点&#xff0c;成为了工厂无人值守自动化的理想选择。同时&#xff0c;MIP专机作为博捷芯的独创产品&#xff0c;展现了博捷芯在精密划片机领域的领…

【嵌入式】STM32中的SPI通信

SPI是由摩托罗拉公司开发的一种通用数据总线&#xff0c;其中由四根通信线&#xff0c;支持总线挂载多设备&#xff08;一主多从&#xff09;&#xff0c;是一种同步全双工的协议。主要是实现主控芯片和外挂芯片之间的交流。这样可以使得STM32可以访问并控制各种外部芯片。本文…

Android 虚拟化框架(AVF)指南

Android 虚拟化框架&#xff08;AVF&#xff09;指南 一、项目介绍二、项目特色三、如何使用AVF四、总结 随着移动设备的普及和应用场景的多样化&#xff0c;安全性和隐私保护成为了移动操作系统的重要课题。Android作为全球最广泛使用的移动操作系统之一&#xff0c;一直在不断…