Spring AI Java程序员的AI之Spring AI(一)

SpringAI 基础使用

  • 前言
  • Spring AI
    • ChatClient
    • ImageClient
    • OpenAiAudioTranscriptionClient
    • EmbeddingClient
  • 总结

前言

Spring AI,听着名字就感觉很好使用,快速上手,虽然功能没有太完善,但是社区活跃度很高,可以看看源码,让我们一起成为贡献者吧。

Spring AI

新建SpringBoot工程,然后添加以下依赖:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>3.2.1</version>
</parent>

<groupId>com.qjc</groupId>
<artifactId>spring-ai-demo</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
  <maven.compiler.source>17</maven.compiler.source>
  <maven.compiler.target>17</maven.compiler.target>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.ai</groupId>
      <artifactId>spring-ai-bom</artifactId>
      <version>0.8.1-SNAPSHOT</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
  </dependency>
</dependencies>


<repositories>
  <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>

需要注意的是:由于版本的不同,可能会引起很多的问题,因为底层的版本使用的webflux,需要对应,这是我碰到的问题。

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
 </dependency>

然后定义一个ChatController:

package com.qjc.demo.controller;

import org.springframework.ai.chat.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


/***
 * @projectName spring-ai-demo
 * @packageName com.qjc.demo.controller
 * @author qjc
 * @description TODO
 * @Email qjc1024@aliyun.com
 * @date 2024-10-16 09:05
 **/
@RestController
public class ChatController {

    @Autowired
    private ChatClient chatClient;

    @GetMapping("/chat")
    public String generate(@RequestParam String message) {
        return chatClient.call(message);
    }

}

由于依赖了:

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

该starter中间接依赖了:

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-spring-boot-autoconfigure</artifactId>
  <version>0.8.1-SNAPSHOT</version>
  <scope>compile</scope>
</dependency>

而该依赖中针对各个大模型提供了一个对应的自动配置类,比如OpenAiAutoConfiguration,而在该自动配置类中定义了以下几个Bean:

  1. OpenAiChatClient:文字聊天客户端
  2. OpenAiEmbeddingClient:文本向量化客户端
  3. OpenAiImageClient:文生图客户端
  4. OpenAiAudioTranscriptionClient:语音转文字客户端

这些Bean在创建时就会构造底层连接OpenAi的客户端OpenAiApi对象,其中会用到以下几种配置:

  1. OpenAiConnectionProperties:连接配置
  2. OpenAiChatProperties:聊天配置
  3. OpenAiEmbeddingProperties:向量化配置
  4. OpenAiImageProperties:文生图配置
  5. OpenAiAudioTranscriptionProperties:语音转文字配置

连接OpenAi的地址就apiKey就在OpenAiConnectionProperties中,比如application.properties的配置为:

spring.ai.openai.base-url=http://localhost:3000
spring.ai.openai.api-key=sk-xxxxx

ChatClient

所以,当我们需要基于OpenAI来提问时,直接注入ChatClient或OpenAiChatClient就可以了:

@Autowired
private ChatClient chatClient;

然后就可以使用call()方法来进行提问了:

@GetMapping("/chat")
public String chat(@RequestParam String message) {
    return chatClient.call(message);
}

在这里插入图片描述

ImageClient

使用下文生图的API:

@Autowired
private ImageClient imageClient;

@GetMapping("/image")
public String image(@RequestParam String message) {
    ImagePrompt imagePrompt = new ImagePrompt(message);
    ImageResponse imageResponse = imageClient.call(imagePrompt);
    return imageResponse.getResult().getOutput().getUrl();
}

在这里插入图片描述
访问该URL即可拿到对应图片。

OpenAiAudioTranscriptionClient

也可以使用语音转文字的API:

@Value("classpath:/abc.flac")
private Resource audioFile;

@Autowired
private OpenAiAudioTranscriptionClient audioTranscriptionClient;


@GetMapping("/audio")
public String audio() {
    AudioTranscriptionPrompt transcriptionRequest = new AudioTranscriptionPrompt(audioFile);
    AudioTranscriptionResponse response = audioTranscriptionClient.call(transcriptionRequest);
    return response.getResult().getOutput();
}

EmbeddingClient

也可以用来对文本进行向量化:

@Autowired
private EmbeddingClient embeddingClient;

@GetMapping("/embedding")
public List<Double> embedding(@RequestParam String message) {
    return embeddingClient.embed(message);
}

在这里插入图片描述

总结

SpringBoot的自动配置,基于自动配置,我们只需要直接依赖注入对应的Client就可以使用了,还是那么的善解人意,LangChain4j虽好但不是我的最爱,我更加的偏向Spring AI,因为使用简单,扩展方便,拥有强大的自动配置等,更适用于SpringBoot 让开发更加简洁。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据治理:构建数据驱动的智能决策体系

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Edge论文的创新点

创新点及其来源 1. 从灰度边缘重建RGB图像的方法&#xff08;EdgRec&#xff09; 基于的方法&#xff1a;传统的重建方法&#xff0c;如使用自动编码器或生成模型来重建正常样本的图像&#xff0c;并通过对原始图像和重建图像的比较来检测异常。 重建过程&#xff1a; 训练阶…

Spring Boot: 构建高效中小型医院网站

1 绪论 1.1研究背景 随着计算机技术的成熟、普及&#xff0c;现代信息技术革命的迅猛发展,正冲击并进而改变着经济和社会结构。信息化的程度已经成为一个国家&#xff0c;一个企业&#xff0c;一个组织仍至一个人发展的基础和竞争成败的关键。 在实际的生活中&#xff0c;用户都…

Oracle Expdp按条件导出-指定表数据

1.场景描述 业务需求&#xff1a;导出A机构、2024的数据&#xff0c;以dmp格式&#xff0c;保留导出日志。首先&#xff0c;需要分析库中需要导出的表清单、表的机构字段约束、表的时间约束&#xff1b;然后再导出。 2.方案分析 本次采用Oracle的expdp数据泵方式导出&#xf…

集合框架12:Set集合概述、Set接口使用

视频链接&#xff1a;13.24 Set接口使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p24 1、Set集合概述 特点&#xff1a;无序、无下标&#xff0c;元素不可…

现今 CSS3 最强二维布局系统 Grid 网格布局

深入学习 CSS3 目前最强大的布局系统 Grid 网格布局 Grid 网格布局的基本认识 Grid 网格布局: Grid 布局是一个基于网格的二位布局系统&#xff0c;是目前 CSS 最强的布局系统&#xff0c;它可以同时对列和行进行处理&#xff08;它将网页划分成一个个网格&#xff0c;可以任…

限流是什么?如何限流?怎么限流?

概述 什么是限流 对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机 为什么要限流 因为互联网系统通常都要面对大并发大流量的请求,在突发情况下(最常见的场景就是秒杀、抢购),瞬时大流量会直接将系统打垮,无法…

DS堆的实际应用(10)

文章目录 前言一、堆排序建堆排序 二、TopK问题原理实战创建一个有一万个数的文件读取文件并将前k个数据创建小堆用剩余的N-K个元素依次与堆顶元素来比较将前k个数据打印出来并关闭文件 测试 三、堆的相关习题总结 前言 学完了堆这个数据结构的概念和特性后&#xff0c;我们来看…

DVWA | Files Upload(文件上传)通关笔记

概念 **文件上传漏洞**是网络安全中常见的漏洞之一&#xff0c;攻击者可以利用该漏洞上传恶意文件&#xff0c;进而在服务器上执行恶意代码、绕过权限验证或获取敏感数据。文件上传漏洞主要发生在允许用户上传文件的Web应用程序中&#xff0c;比如图像、文档上传功能等。 ###…

dayjs日期格式化,开发uniapp或unicloud前后端进行时间格式转换

一、 为什么要用日期格式化 因为在开发项目过程中&#xff0c;会遇到各种各样的日期格式&#xff0c;有的显示完整的年-月-日 时:分:秒&#xff0c;而有的场景就只显示月-日等格式&#xff0c;还有就是显示当前时间和注册时间的间隔时长等&#xff0c;场景非常多&#xff0c;如…

学习 Flutter 的最佳路线图

学习 Flutter 的最佳路线图 视频 https://youtu.be/IpKXVq9lP_4 https://www.bilibili.com/video/BV1J92uYDEit/ 前言 原文 Flutter 开发者必看&#xff1a;全面的学习路线图 本文借鉴了 roadmap 的思路&#xff0c;为大家介绍如何有效学习 Flutter。 该路线图提供了从零开…

MySQL-DQL练习题

文章目录 简介初始化表练习题 简介 本节简介: 主要是一些给出一些习题, 关于DQL查询相关的, DQL查询语句是最重要的SQL语句, 功能性最复杂, 功能也最强, 所以本节建议适合以及有了DQL查询基础的食用, 另外注意我们使用的是Navicat, SQL编辑的格式规范也是Navicat指定的默认格式…

uni-app uni.setTabBarBadge 不生效

‘text’属性&#xff0c;类型必须是字符串&#xff0c;而接口返回的是数值&#xff0c;没有注意到&#xff0c;所以怎么都不生效&#xff0c;也不会有报错&#xff01;

基于一个python库tencent的API接口开发有趣应用

这篇博客给大家介绍一个python库 tencent (https://pypi.org/project/tencent/) 以及对应三方API的开发流程&#xff0c;以公众号后台通过服务器接入自动系统回复为例。基于微信公众号后台开发自动回复&#xff0c;或者利用多模态信息回复用户输入&#xff0c;需要自己有独立服…

python爬虫实战案例——从移动端接口抓取微博评论,采用cookie登陆,数据存入excel表格,超详细(15)

文章目录 1、任务目标2、网页分析3、代码编写3.1 代码分析3.2 完整代码1、任务目标 1、目标网站:微博文章(https://m.weibo.cn/detail/4813628149072458),这是微博某一篇博文,用于本文测试 2、要求:爬取该博文下,所有一级评论和二级评论,以及每条评论的作者,最后保存至E…

【Kafka】Kafka源码解析之producer过程解读

从本篇开始 打算用三篇文章 分别介绍下Producer生产消费&#xff0c;Consumer消费消息 以及Spring是如何集成Kafka 三部分&#xff0c;致于对于Broker的源码解析&#xff0c;因为是scala语言写的&#xff0c;暂时不打算进行学习分享。 总体介绍 clients : 保存的是Kafka客户端…

Docker新手必看:快速安装和配置BookStack在线文档系统

文章目录 前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动BookStack容器4. 登录与简单使用5. 公网远程访问本地BookStack5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 前言 本文主要介绍如何在Linux系统使用Docker本地部署在线文档管理…

基于SSM医药垃圾分类管理系统【附源码】

基于SSM医药垃圾分类管理系统 效果如下&#xff1a; 系统登录界面 管理员主界面 公告信息管理界面 垃圾分类管理界面 医院垃圾信息管理界面 用户主界面 留言反馈管理界面 研究背景 随着科学技术发展&#xff0c;计算机已成为人们生活中必不可少的生活办公工具&#xff0c;在…

Java语言-抽象类

目录 1.抽象类概念 2.抽象类语法 3.抽象类特性 4.抽象类作用 1.抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c; 如果 一个类中没有包含足够的信息来描绘一个具体…

初阶数据结构【2】--顺序表(详细且通俗易懂,不看一下吗?)

本章概述 线性表顺序表顺序表问题与思考彩蛋时刻&#xff01;&#xff01;&#xff01; 线性表 概念&#xff1a;一些在逻辑上成线性关系的数据结构的集合。线性表在逻辑上一定成线性结构&#xff0c;在物理层面上不一定成线性结构。常见的线性表&#xff1a;顺序表&#xff0…