Springai入门

一、概述

1.1发展历史

1.2大模型

大模型,是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。其设计目的在于提高模型的表达能力和预测性能,以应对更加复杂的任务和数据;

大模型,简单来说,就是一个特别聪明、特别能干的“大脑”,这个“大脑”由很多个小小的“神经元”组成,每个“神经元”都能处理一部分信息,当这些“神经元”一起工作时,大模型就能理解并回答各种问题,或者完成各种复杂的任务。就像你有一个超级聪明的助手,它能帮你写邮件、写PPT、回答你的各种问题等等,它就像是一个上知天文,下知地理,无所不知的人;

1.3Spring AI

Spring AI提供的API支持跨人工智能提供商的 聊天,文本到图像,和嵌入模型等,同时支持同步和流API选项;

1、Chat Models 聊天模型:

2、Text-to-image Models 文本到图像模型:

  • OpenAI with DALL-E
  • StabilityAI

3、Transcription (audio to text) Models 转录(音频到文本)模型

  • OpenAI

4、Embedding Models 嵌入模型

5、Vector Store API提供了跨不同提供商的可移植性,其特点是提供了一种新颖的类似SQL的元数据过滤API,以保持可移植性;

6、用于AI模型和矢量存储的Spring Boot自动配置和启动器;(xxxx-spring-ai-starter)

7、函数调用

8、用于数据工程的ETL框架

9、广泛的参考文档、示例应用程序和研讨会/课程材料;

未来的版本将在此基础上提供对其他人工智能模型的访问,例如,谷歌刚刚发布的Gemini多模式模态,一个评估人工智能应用程序有效性的框架,更方便的API,以及帮助解决“查询/汇总我的文档”用例的功能。有关即将发布的版本的详细信息,请查看GitHub;

二、Spring AI聊天

2.1方式一String

1、建项目:创建一个Spring Boot项目;

2、加依赖:加入spring-ai-openai-spring-boot-starter依赖;

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

3、配文件

spring:
  ai:
    openai:
      api-key: sk-3sfER03LDLG3SDFsdlwe283JSdw023lkrmrHDND32fmREKFD (换成你的api-key)
      base-url: https://api.openai.com

4.编写代码

@RestController
public class ChatController {

    /**
     * spring-ai 自动装配的,可以直接注入使用
     */
    @Resource
    private OpenAiChatClient openAiChatClient;

    /**
     * 调用OpenAI的接口
     *
     * @param msg 我们提的问题
     * @return
     */
    @RequestMapping(value = "/ai/chat")
    public String chat(@RequestParam(value = "msg") String msg) {
        String called = openAiChatClient.call(msg);
        return called;
    }


}

2.2方式二 Prompt

概述

在JavaScript中,prompt()函数用于显示一个包含文本消息和一个输入框的对话框,并等待用户输入信息。该函数的语法如下:

prompt(message, defaultValue)
  • message:要显示给用户的消息文本,通常是一个提示用户输入信息的文本。
  • defaultValue:可选参数,表示输入框中的默认值。

用户可以在输入框中输入信息,然后点击确定按钮以提交信息。prompt()函数将返回用户输入的内容作为字符串。如果用户点击取消按钮,则返回null。通常,开发人员会将返回值存储在变量中,以便后续使用。

名词解释: 结构化的 Prompt 是一种高效和有组织的方式来指导和指示聊天机器人的回应和功能。这种方法类似于在面向对象编程(OOP)中的思维方式,其中强调了对象、类、继承、接口和多态性等概念。

 prompt顾名思义就是“提示”的意思,应该有人玩过你画我猜这个游戏吧,对方根据一个词语画一幅画,我们来猜他画的是什么,因为有太多灵魂画手了,画风清奇,或者你们没有心有灵犀,根本就不好猜啊!这时候屏幕上会出现一些提示词比如3个字,水果,那岂不是好猜一点了嘛,毕竟3个字的水果也不多呀。看到了吧,这就是prompt的魅力,让我们心有灵犀一点通!

  • 任务提示型prompt

  • 答案指示型prompt

模型对prompt很敏感,不同的模板得到的效果差别很大。

实现 

@RequestMapping(value = "/ai/chat2") // 定义一个请求映射,当访问"/ai/chat2"路径时,会调用下面的chat2方法
public Object chat2(@RequestParam(value = "msg") String msg) { // 定义一个名为chat2的方法,接收一个名为msg的请求参数
    ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg)); // 使用openAiChatClient对象调用call方法,并传入一个新的Prompt对象,该对象包含msg参数的值
    return chatResponse.getResult().getOutput().getContent(); // 从chatResponse对象中获取结果,然后获取输出内容,并将其作为返回值返回
}

结构化 Prompt 与面向对象编程的类比

1. 万物皆对象 / 万事皆主题

  • 面向对象编程:在OOP中,一切都被视为对象,每个对象都有其属性和方法。
  • 结构化 Prompt:在撰写文章或指导ChatGPT时,每个主题或问题都被视为一个“对象”,每个对象都有其详细的描述和子话题。

2. 类和继承 / 结构化模板和延伸

  • 面向对象编程:类定义了对象的蓝图,而继承允许新类采用并扩展现有类的属性。
  • 结构化 Prompt:模板定义了Prompt的基本结构,包括角色、规则、技能等,可以根据需要进行扩展和修改,以适应不同的场景。

3. 封装和接口 / 主题分隔和提示

  • 面向对象编程:封装隐藏了对象的内部实现,而接口定义了与对象交互的方式。
  • 结构化 Prompt:每个主题部分被清晰地隔开,例如使用标题和子标题,同时通过明确的指示(如指令、问题)定义与ChatGPT的交互方式。

4. 多态性 / 灵活的响应

  • 面向对象编程:多态性允许对象以多种形式表现。
  • 结构化 Prompt:根据不同的输入,ChatGPT可以灵活地调整其响应,即使是基于相同的基础模板。

5. 对象的生命周期 / Prompt 的发展

  • 面向对象编程:对象从创建到销毁经历一个完整的生命周期。
  • 结构化 Prompt:一个Prompt从创建开始,随着交互的深入和用户需求的变化,可能会发展和变化,直到其目的被满足。

结构化 Prompt 的开发工作流

日常使用时,直接问 ChatGPT 效果可以的话,直接问就行。

构建复杂高性能结构化 Prompt 有以下几种工作流:

  1. 自动化生成初版结构化 Prompt -> 手工迭代调优 -> 符合需求的 prompt (推荐)
  2. 自动化生成初版结构化 Prompt -> 自动化分析评估 Prompt -> 基于评估结果迭代调优 -> 符合需求的 prompt (推荐)
  3. 手工套用现有模板 —> 手工迭代调优 -> 符合需求的 prompt

1, 2 较为推荐,能够大大降低工作量,大佬请随意。

自动化生成初版结构化 Prompt 推荐使用 LangGPT,使用其他 Prompt 生成方法也可。

自动化分析评估 Prompt 可以使用 prompt 评分分析类 Prompt,可参考 AI Prompt 群精选——Prompt 优化。中的高质量 Prompt。

结构化 Prompt 的局限性

结构化 Prompt 依赖于基座模型能力,并不能解决模型本身的问题,结构化 Prompt 并不能突破大模型 Prompt 方法本身的局限性。

已知的无法解决的问题: 大模型本身的幻觉问题 大模型本身知识老旧问题 大模型的数学推理能力弱问题 (解数学问题) 大模型的视觉能力弱问题(构建 SVG 矢量图等场景) 大模型字数统计问题(不论是字符数和 token 数,大模型都无法统计准确。需要输出指定字数时,将数值设定的高一些,后期自己调整一下,比如希望他输出100字文案,告诉他输出150字。) 同一 Prompt 在不同模型间的性能差异问题 * 其他已知问题等

可参考:构建生产级鲁棒高性能 Prompt

2.3方式三 Prompt加参数

   /**
     * 调用OpenAI的接口
     *
     * @param msg 我们提的问题
     * @return
     */
    @RequestMapping(value = "/ai/chat3")
    public Object chat3(@RequestParam(value = "msg") String msg) {
        //可选参数在配置文件中配置了,在代码中也配置了,那么以代码的配置为准,也就是代码的配置会覆盖掉配置文件中的配置
        ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg, OpenAiChatOptions.builder()
                .withModel("gpt-4-32k") //gpt的版本,32k是参数量
                .withTemperature(0.4F) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好
                .build()));
        return chatResponse.getResult().getOutput().getContent();
    }

2.4方式四flux+配置文件

spring.ai.openai.api-key=sk-
spring.ai.openai.chat.options.model=gpt-3.5-turbo
spring.ai.openai.chat.options.temperature=0.7
  /**
     * 调用OpenAI的接口
     *
     * @param msg 我们提的问题
     * @return
     */
    @RequestMapping(value = "/ai/chat4")
    public Object chat4(@RequestParam(value = "msg") String msg) {
        //可选参数在配置文件中配置了,在代码中也配置了,那么以代码的配置为准,也就是代码的配置会覆盖掉配置文件中的配置
        Flux<ChatResponse> flux = openAiChatClient.stream(new Prompt(msg, OpenAiChatOptions.builder()
                //.withModel("gpt-4-32k") //gpt的版本,32k是参数量
                .withTemperature(0.4F) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好
                .build()));

        flux.toStream().forEach(chatResponse -> {
            System.out.println(chatResponse.getResult().getOutput().getContent());
        });
        return flux.collectList(); //数据的序列,一序列的数据,一个一个的数据返回
    }

三、Spring Ai图像

3.1方式一 

package com.yanyu.springai02image.Controller;

import jakarta.annotation.Resource;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.OpenAiImageClient;
import org.springframework.ai.openai.OpenAiImageOptions;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ImageController {

    @Resource
    private OpenAiImageClient openAiImageClient;


    @RequestMapping("/ai/image")
    private Object image(@RequestParam(value = "msg") String msg) {
        ImageResponse imageResponse = openAiImageClient.call(new ImagePrompt(msg));
        System.out.println(imageResponse);

        String imageUrl = imageResponse.getResult().getOutput().getUrl();
        //把图片进行业务处理

        return imageResponse.getResult().getOutput();
    }

   
}

3.2方式二参数配置

  @RequestMapping("/ai/image2")
    private Object image2(@RequestParam(value = "msg") String msg) {
        ImageResponse imageResponse = openAiImageClient.call(new ImagePrompt(msg, OpenAiImageOptions.builder()
                .withQuality("hd") //高清图像
                .withN(1)  //生成1张图片
                .withHeight(1024) //生成的图片高度
                .withWidth(1024) //生成的图片宽度
                .build()));
        System.out.println(imageResponse);

        String imageUrl = imageResponse.getResult().getOutput().getUrl();
        //把图片进行业务处理
        return imageResponse.getResult().getOutput();
    }

四、Spring AI文本到语音

4.1转文本

@RestController
public class TranscriptionController {

    @Resource
    private OpenAiAudioTranscriptionClient openAiAudioTranscriptionClient;

    @RequestMapping(value = "/ai/transcription")
    public Object transcription() {
        //org.springframework.core.io.Resource audioFile = new ClassPathResource("jfk.flac");
        org.springframework.core.io.Resource audioFile = new ClassPathResource("D:\\桌面\\好玩的\\跨年烟花3.0\\跨年烟花\\跨年烟花\\fire\\打上花火.mp3");
        String called = openAiAudioTranscriptionClient.call(audioFile);
        System.out.println(called);

        return called;
    }
}

4.2配置

spring:
  application:
      name: spring-ai-03-transcription
  ai:
    openai:
      api-key: s
      base-url:   h
      chat:
        options:
          model: gpt-4-32k
      audio:
        transcription:
          options:
            model: whisper-1

4.3文本转语言

@RestController
public class TTSController {

    @Resource
    private OpenAiAudioSpeechClient openAiAudioSpeechClient;

    @RequestMapping(value = "/ai/tts")
    public Object tts() {
        String text = "2023年全球汽车销量重回9000万辆大关,同比2022年增长11%。分区域看,西欧(14%)、中国(12%)两大市场均实现两位数增长。面对这样亮眼的数据,全球汽车行业却都对2024年的市场前景表示悲观,宏观数据和企业体感之前的差异并非中国独有,在汽车市场中,这是共性问题。";
        byte[] bytes = openAiAudioSpeechClient.call(text);
        FileUtils.save2File("D:\\SpringAI\\test.mp3", bytes);
        return "OK";
    }

    @RequestMapping(value = "/ai/tts2")
    public Object tts2() {
        String text = "Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design and promote using POJOs as the building blocks of an application to the AI domain.";
        byte[] bytes = openAiAudioSpeechClient.call(text);
        FileUtils.save2File("D:\\SpringAI\\test2.mp3", bytes);
        return "OK";
    }
}

工具类

public class FileUtils {

    public static boolean save2File(String fname, byte[] msg) {
        OutputStream fos = null;
        try{
            File file = new File(fname);
            File parent = file.getParentFile();
            boolean bool;
            if ((!parent.exists()) &&
                    (!parent.mkdirs())) {
                return false;
            }
            fos = new FileOutputStream(file);
            fos.write(msg);
            fos.flush();
            return true;
        }catch (FileNotFoundException e){
            return false;
        }catch (IOException e){
            e.printStackTrace();
            return false;
        }
        finally{
            if (fos != null) {
                try{
                    fos.close();
                }catch (IOException e) {}
            }
        }
    }
}

五、Spring Ai 多模态

  • 多模态是指模型同时理解和处理来自各种来源的信息的能力,包括文本、图像、音频和其他数据格式;
  • 多模式大语言模型(LLM)特征使模型能够结合其他模态(如图像、音频或视频)来处理和生成文本;
  • Spring AI 多模态API提供了所有必要的统一抽象和代码封装来支持多模式LLM;
@RestController
public class MultiModelController {

    @Resource
    private ChatClient chatClient;

    @RequestMapping(value = "/ai/multi")
    public Object multi(String msg, String imageUrl) {

        UserMessage userMessage = new UserMessage(msg, List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageUrl)));

        ChatResponse response = chatClient.call(new Prompt(userMessage, OpenAiChatOptions.builder()
                .withModel(OpenAiApi.ChatModel.GPT_4_VISION_PREVIEW.getValue())
                .build()));

        System.out.println(response.getResult().getOutput());
        return response.getResult().getOutput().getContent();
    }
}

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

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

相关文章

AWS宣布推出Amazon Q :针对商业数据和软件开发的生成性AI助手

亚马逊网络服务&#xff08;AWS&#xff09;近日宣布推出了一项名为“Amazon Q”的新服务&#xff0c;旨在帮助企业利用生成性人工智能&#xff08;AI&#xff09;技术&#xff0c;优化工作流程和提升业务效率。这一创新平台的推出&#xff0c;标志着企业工作方式的又一次重大变…

JetBrains DataSpell v2024.1 激活版 (数据科学家开发环境)

JetBrains系列软件安装目录 一、JetBrains IntelliJ IDEA v2024.1 安装教程 (Java集成开发IDE) 二、JetBrains WebStorm v2024.1 激活版 (JavaScript集成开发IDE) 三、JetBrains PhpStorm v2024.1 安装教程 (PHP集成开发IDE) 四、JetBrains PyCharm Pro v2024.1 安装教程 (…

burp靶场sql注入通关—下

第十一关&#xff08;布尔盲注&#xff09;&#xff1a; 1.根据提示修改包含 TrackingId cookie的请求&#xff0c;先抓包并修改这个值&#xff0c;在后面加上永真式发现出现Welcome back TrackingIdxxxx and 11 再修改这个值为永假式看看&#xff0c;发现没有Welcome back&am…

第二证券|A股,突现两大重磅!

大摩又看上新标的&#xff01; 就在刚才&#xff0c;五粮液和泸州老窖传来重磅音讯&#xff1a;摩根士丹利将泸州老窖目标价从194元上调至206元&#xff0c;将五粮液目标价从180元上调至182元。按这个目标价核算&#xff0c;五粮液还有20%的空间。而摩根士丹利最近似有一种魔力…

【触摸案例-手势解锁案例-按钮高亮 Objective-C语言】

一、我们来说这个self.btns,这个问题啊,为什么不用_btns, 1.我们说,在懒加载里边儿,经常是写下划线啊,_btns,为什么不写,首先啊,这个layoutSubviews:我们第一次,肯定会去执行这个layoutSubviews: 然后呢,去懒加载这个数组, 然后呢,接下来啊,走这一句话, 第一次…

rust容器、迭代器

一&#xff0c;std容器 1&#xff0c;Vec&#xff08;向量、栈&#xff09; use std::vec::Vec; &#xff08;1&#xff09;用作vector let nums:Vec<i32>vec![1,2,4,3];assert_eq!(nums.len(),4);assert_eq!(nums[3],3);assert_eq!(nums.is_empty(),false); 遍历&…

山西·长治大广赛赛题详解

大广赛新命题又又又又来啦&#xff0c;它就是山西长治&#xff0c;让我们一起来看看命题详情吧~ 2024年第16届全国大学生广告艺术大赛山西长治命题素材和资料下载&#xff1a; 命题素材下载https://js.design/f/ZRLbti?sourcecsdn&planbttss507 广告主题&#xff1a; 一…

美易官方:美股周一收高,道指连续第四个交易日上涨

收盘之际&#xff0c;美股市场周一的表现可圈可点&#xff0c;各大股指纷纷走高&#xff0c;道指更是连续第四个交易日实现上涨。这一积极态势不仅凸显了投资者对于全球经济的信心&#xff0c;也反映了市场对于未来前景的乐观预期。 道指涨176.59点&#xff0c;涨幅为0.46%&…

探索5个独特AI工具:它们是否值得独立存在?

在这个“地下AI”系列的最新一集中&#xff0c;我们深入挖掘了一些鲜为人知的AI工具。这些工具并非出自OpenAI、微软或谷歌等科技巨头之手&#xff0c;而是独立创造者和小型团队的智慧结晶。我们的目标是发现利用最新AI技术的独特工具。但这次有个新玩法&#xff1a;我们玩一个…

使用 OpenNJet 分分钟完成打地鼠小游戏部署

文章目录 OpenNJet应用引擎什么是应用引擎什么是OpenNJet独特优势技术架构 OpenNJet安装RPM安装 部署打地鼠小游戏配置OpenNJet部署打地鼠小游戏启动 NJet访问打地鼠小游戏 总结 今天阿Q打算使用OpenNJet应用引擎来部署一下我们的打地鼠小游戏。在开始部署之前&#xff0c;我们…

FME学习之旅---day26

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 【由于上周&#xff0c;上班状态不是很好&#xff0c;事情多又杂&#xff0c;没有学习的劲头&#xff0c;就短暂的休息了一下下。双休爬山&#xff0c;给自己上了强度&#xff0c;今天才缓过来…

PMP培训一般要多久?

考过PMP很久了&#xff0c;学习时长还是记得很清楚的。因为有一部分的项目经验&#xff0c;报了威班PMP的培训&#xff0c;看了宣传是50天通过PMP&#xff0c;但是我仅仅用了一个月出头就搞定了&#xff0c;算下来才四十天不到就已经学完在准备冲刺参加考试了&#xff0c;最后5…

气膜冰球馆助力冰雪运动高速发展—轻空间

冰上运动一直备受人们热爱&#xff0c;其中冰球更是广受欢迎。近年来&#xff0c;随着技术的飞速发展&#xff0c;气膜冰球馆成为了冰上运动领域的新宠。本文将探讨气膜冰球馆在冰上运动中的重要性&#xff0c;以及其未来发展的前景。 气膜冰球馆具有明显的优势。相比传统冰球馆…

C#标签设计打印软件开发

1、新建自定义C#控件项目Custom using System; using System.Collections.Generic; using System.Text;namespace CustomControls {public class CommonSettings{/// <summary>/// 把像素换算成毫米/// </summary>/// <param name="Pixel">多少像素…

社交媒体数据恢复:华为畅连

尊敬的用户您好&#xff0c;以下是关于社交软件华为畅连的聊天记录数据恢复教程。在华为手机中&#xff0c;我们可以通过华为云服务和第三方软件来恢复删除的聊天记录。以下是详细的步骤&#xff1a; 第一步&#xff1a;登录华为云服务 请在您的华为手机上找到并打开“云服务”…

Learning C# Programming with Unity 3D

作者&#xff1a;Alex Okita 源码地址&#xff1a;GitHub - badkangaroo/UnityProjects: A repo for all of the projects found in the book. 全书 686 页。

实操专区-第11周-课堂练习专区-图的标记线和标记点

下载安装ECharts&#xff0c;完成如下样式图形。 代码和截图上传 完成 3.1.3.5 图的标记线和标记点 中的任务点 在一些折线图或柱状图当中&#xff0c;可以经常看到图中对最高值和最低值进行了标记。 在ECharts中&#xff0c;标记点&#xff08;markPoint&#xff09;常用于表示…

【YesPMP】众包平台5月7日最新外包项目

【YesPMP】众包平台5月7日最新外包项目&#xff0c;感兴趣的小伙伴&#xff0c;可进入平台参与竞标&#xff0c;竞标后与项目方直接与联系&#xff0c;双方直接对接。 1.查看项目&#xff1a;按照客户提供的设计稿美化页面&#xff0c;改html和js代码-YesPMP平台给你设计图&am…

使用免费的数据恢复软件通过简单的步骤恢复丢失的数据

犯错是人之常情&#xff01;您有时可能会意外地从PC或笔记本电脑中删除重要数据&#xff0c;旧的家庭或大学视频/照片&#xff0c;如果您面临数据丢失&#xff0c;则可以使用数据恢复软件轻松恢复丢失的数据。 奇客数据恢复软件可让您从笔记本电脑&#xff0c;PC和可移动存储设…

PowerShell ⇒ Excel 批量创建Excel

New-Object -ComObject Excel.Application&#xff1a;创建Excel对象[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null 用来显式释放 Excel COM 对象的资源&#xff0c;以确保在脚本执行完成后&#xff0c;释放 Excel 进程和相关资源&#xff0…