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 自动装配的,可以直接注入使用*/@Resourceprivate 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 {@Resourceprivate 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 {@Resourceprivate 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-transcriptionai:openai:api-key: sbase-url:   hchat:options:model: gpt-4-32kaudio:transcription:options:model: whisper-1

4.3文本转语言

@RestController
public class TTSController {@Resourceprivate 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 {@Resourceprivate 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();}
}

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

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

相关文章

虚幻引擎5 Gameplay框架(二)

Gameplay重要类及重要功能使用方法&#xff08;一&#xff09; 配置LOG类及PlayerController的网络机制 探索验证GamePlay重要函数、类的执行顺序与含义 我们定义自己的日志&#xff0c;专门建立一个存放自己日志的类&#xff0c;这个类继承自BlueprintFunctionLibrary 然后…

零基础怎么学鸿蒙开发?

对于零基础的学习者来说&#xff0c;掌握鸿蒙开发不仅是迈向新技术的第一步&#xff0c;更是开拓职业道路的重要机遇。随着鸿蒙系统在各行各业的应用逐渐扩展&#xff0c;对于掌握这一项技术的开发人员需求也随之增长。下文将为大家提供针对零基础学习鸿蒙开发的逻辑&#xff0…

提高曝光率与点击率:海外KOL推广与社交媒体算法的完美结合

在当今数字化时代&#xff0c;社交媒体已经成为了企业和品牌推广的重要渠道之一&#xff0c;海外KOL也在各个领域拥有着庞大的粉丝群体和影响力。然而&#xff0c;想要在众多内容中脱颖而出&#xff0c;提高推广内容的曝光率和点击率&#xff0c;仅仅依靠KOL的影响力是不够的&a…

论文阅读-THE GENERALIZATION GAP IN OFFLINE REINFORCEMENT LEARNING(ICLR 2024)

1.Motivation 本文希望比较online RL、offline RL、序列决策和BC等方法的泛化能力(对于不同的初始状态、transition functions、reward functions&#xff0c;现阶段offline RL训练的方式都是在同一个环境下的数据集进行训练)。实验发现offline的算法相较于online算法对新环境…

特别提醒:2024年软考连考时间再次调整!

近期&#xff0c;辽宁省发布了今年5月软考考试安排&#xff0c;有以下变化&#xff1a; 高级论文单独考试&#xff08;2小时&#xff09;&#xff0c;之前是案例和论文一起考&#xff0c;案例剩下的时间可以给论文用&#xff0c;现在是综合和案例一起考&#xff0c;综合剩下的…

菜鸡学习netty源码(一)——ServerBootStrap启动

1.概述 对于初学者而然,写一个netty本地进行测试的Server端和Client端,我们最先接触到的类就是ServerBootstrap和Bootstrap。这两个类都有一个公共的父类就是AbstractBootstrap. 那既然 ServerBootstrap和Bootstrap都有一个公共的分类,那就证明它们两个肯定有很多公共的职…

Redis集群.md

Redis集群 本章是基于 CentOS7 下的 Redis 集群教程&#xff0c;包括&#xff1a; 单机安装RedisRedis主从Redis分片集群 1.单机安装Redis 首先需要安装Redis所需要的依赖&#xff1a; yum install -y gcc tcl然后将课前资料提供的Redis安装包上传到虚拟机的任意目录&#xf…

如何在CentOS部署青龙面板并实现无公网IP远程访问本地面板

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java双亲委派机制

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 概述 Java程序在运…

一起长锈:4 默认不可变的变量绑定与引用(从Java与C++转Rust之旅)

讲动人的故事,写懂人的代码 故事梗概:在她所维护的老旧Java系统即将被淘汰的危机边缘,这位在编程中总想快速完事的女程序员,希望能转岗到公司内部使用Rust语言的新项目组,因此开始自学Rust;然而,在掌握了Rust编程知识之后,为了通过Rust项目组的技术面试,使得转岗成功而…

sql优化思路

sql的优化经验 这里解释一下SQL语句的优化的原理 1.指明字段名称&#xff0c;可以尽量使用覆盖索引&#xff0c;避免回表查询&#xff0c;因此可以提高效率 2.字面意思&#xff0c;无需过多赘述。索引就是为了提高查询效率的。 3.图中两条sql直接可以使用union all 或者 uni…

羊大师分解,羊奶不为人知的健康奇迹

羊大师分解&#xff0c;羊奶不为人知的健康奇迹 羊奶是一种营养丰富的食品&#xff0c;拥有许多不为人知的健康益处。 益智健脑&#xff1a;羊奶中含有较高的钙、蛋白质、氨基酸、维生素、矿物质、无机盐、核酸等营养成分&#xff0c;这些都对大脑发育及增强智力有很大帮助。…

MySQL mydumper工具

目录 1. mydumper介绍 2. mydumper参数解释 3. 备份例子 3.1 备份全库(未包含其他) 3.2 备份全库(包含其他) 3.3 备份指定数据库(-B或--database) 3.4 导出指定表(-T或--tables-list) 3.5 只导出表结构&#xff0c;不导出表数据(-d或--no-data) 3.6 只导出表数据&#…

包管理工具npm的安装和使用

包管理工具 管理 包 的应用软件&#xff0c;可以对 包 进行下载 安装&#xff0c;更新&#xff0c;删除&#xff0c;上传 等操作。 借助包管理工具&#xff0c;可以快速开发项目&#xff0c;提升开发效率。 包管理工具是一个通用的概念&#xff0c;很多编程语言都有包管理工…

likeshop多商户单商户商城_likeshop跑腿源码_likeshop物品租赁系统开源版怎么配置小程序对接?

本人是商业用户所以能持续得到最新商业版&#xff0c;今天我说下likeshop里面怎么打包小程序&#xff0c;大家得到程序时候会发现它有admin目录 app目录 server目录 这三个目录分别是做什么呢&#xff1f; 1.admin目录 下面都是架构文件使用得是Node.js打包得&#xff0c;至于…

管道通信与Linux命令的执行-(读书笔记-十三)

|前一个命令的输出作为后一个命令的输入。 在Linux中&#xff0c;|符号是一个管道符号&#xff0c;用于将前一个命令的输出作为后一个命令的输入。这种机制允许你将多个命令组合在一起&#xff0c;以执行复杂的操作。下面是一些基本的例子&#xff1a; 查看当前目录下的文件列…

数据互通新纪元,企业如何实现系统无缝对接?

一、客户介绍 某文化发展有限公司&#xff0c;是一家在二次元文化领域深耕的领先企业&#xff0c;自成立以来&#xff0c;始终致力于为广大二次元爱好者提供丰富多样的正版衍生品和独特的文化体验。作为一家专注于二次元周边产品的公司&#xff0c;该公司拥有全面的产品线&…

网站访问免费升级成 HTTPS——值得收藏

实现HTTPS协议可以分为四个主要步骤&#xff0c;以确保网站数据传输的安全性。以下是简明清晰的流程概述&#xff1a; 1. 申请SSL证书 - SSL证书是实现HTTPS的基础&#xff0c;它包含了网站的身份信息以及公钥等。首先&#xff0c;你需要从受信任的证书颁发机构(CA)申请一个SSL…

新建的springBoot WEB项目无法自动返回html模版(gradle+kotlin版本)

最近研究了springBoot创建web项目&#xff0c; 第一步服务端返回字符串没有问题&#xff0c;第二步返回html时&#xff0c;还是返回的字符串。 文章目录 一、参考方案二、新建springBoot web项目三、启动项目的三种方式 一、参考方案 将控制器类的 RestController 改为 Contro…

Listview控件的5种视图

在C#中&#xff0c;ListView控件是用于显示和编辑列表数据的常用控件。它可以显示数据项的列表&#xff0c;并允许用户对列表中的数据进行操作。 ListView控件有五种视图模式&#xff0c;分别是&#xff1a; LargeIcon视图&#xff1a;在此视图中&#xff0c;每个数据项都显示…