Spring AI项目Open AI对话接口开发指导

文章目录

  • 创建Spring AI项目
  • 配置项目pom、application文件
  • controller接口开发
  • 接口测试

创建Spring AI项目

  1. 打开IDEA创建一个新的spring boot项目,填写项目名称和位置,类型选择maven,组、工件、软件包名称可以自定义,JDK选择17+即可,java语言标准和JDK相同即可
    在这里插入图片描述
  2. 配置Spring Boot版本和开发所需的依赖,主要如下图所示
    • Spring Boot版本可以选择3.2.5或者更高的版本(作者使用3.2.5和3.2.6(SNAPSHOT)可以正常开发)
    • Spring Boot DevTools:spring项目热部署工具,修改完代码(不含application和pom配置文件)即刻热部署项目
    • Lombok:通过配置快速配置对象的get、set、toString
    • Spring AI:Spring AI是一个用于AI工程的应用框架
      在这里插入图片描述
  3. 创建完成后,项目结构大体如下(这里删除了无用的maven文件内容、修改application的文件格式为yaml)
    在这里插入图片描述

配置项目pom、application文件

  • 注意:修改pom文件,重新下载spring ai依赖需要科学上网,请确保网络连接没有问题
  1. 打开项目的pom文件,修改spring ai的版本(项目默认使用稳定版0.8.1)
    • 主要注意默认的spring ai版本和配置依赖jar包仓库(maven仓库中还没有spring ai的依赖)
<properties><java.version>21</java.version><spring-ai.version>0.8.1</spring-ai.version>
</properties><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository>
</repositories><pluginRepositories><pluginRepository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></pluginRepository>
</pluginRepositories>
  1. 配置application文件(api-key的获取参考Spring AI开发前期开发指导)
spring:application:name: Chatai:openai:api-key: hk-xxxbase-url: https://api.openai-hk.com #请根据自己的api-key自定义配置chat:options:model: gpt-3.5-turbo #默认model为 gpt-3.5-turbotemperature: 0.5
server:port: 8080

controller接口开发

  • 这里列举可常用接口的使用方法,更详细的配置请参考官网的开发文档
import jakarta.annotation.Resource;
import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatClient;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;@RestController
public class ChatController {@Resourceprivate OpenAiChatClient openAiChatClient;@RequestMapping("/ai/chat")public String chat(@RequestParam(value = "msg") String msg){return openAiChatClient.call(msg);}@RequestMapping("/ai/chat2")public String chatCall(@RequestParam(value = "msg") String msg){ChatResponse response = openAiChatClient.call(new Prompt(msg));return response.getResult().getOutput().getContent();}@RequestMapping("/ai/chat4")public String chatCall2(@RequestParam(value = "msg") String msg){//可选参数可以覆盖 项目配置文件中的参数(以代码中内容为准)ChatResponse response = openAiChatClient.call(new Prompt(msg,OpenAiChatOptions.builder().withModel("gpt-4-vision-preview") //gpt版本 可以填写字符串或者使用OpenAiApi.ChatModel中提供的常量.withTemperature(0.8F) //温度高,回答创新型越高;越低,越准确.build()));return response.getResult().getOutput().getContent();}@RequestMapping("/ai/chat5")public Object chatStream(@RequestParam(value = "msg") String msg){Flux<ChatResponse> flux = openAiChatClient.stream(new Prompt(msg,OpenAiChatOptions.builder().withModel(OpenAiApi.ChatModel.GPT_4_VISION_PREVIEW.getValue()) //gpt版本 "gpt-4-vision-preview".withTemperature(0.5F) //温度高,回答创新型越高;越低,越准确.withMaxTokens(4096) //显示最大token.build()));flux.toStream().forEach(chatResponse -> {System.out.print(chatResponse.getResult().getOutput().getContent());});return flux.collectList();}
}

接口测试

http://localhost:8080/ai/chat4?msg=河南大学大礼堂被烧毁了,请作一首诗表示悲痛
在这里插入图片描述

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

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

相关文章

运动学模型和约束

先发个空白博客&#xff0c;之后补上

AI预测体彩排3采取878定位大底=23策略+杀断组+杀组选+杀和尾+杀和值012缩水测试5月15日预测第1弹

昨天与一位玩排3的彩友通过视频直播的形式聊了下&#xff0c;受益匪浅&#xff0c;给我提供了一些比较有价值的建议&#xff0c;比如&#xff0c;对于878的定位策略&#xff0c;方向是没问题的&#xff0c;但是8783的话&#xff0c;还是缺乏一定的命中率&#xff0c;如果87823&…

js设计模式: 单例模式

单例模式 确保一个类只有一个实例存在。并提供一个全局的访问点,而且只能通过静态方法来获取 方式一&#xff1a; class Single {constructor() {if(Single._instace) throw new Error(已经存在单例)Single._instance this}static getInstance () {if(!Single._instance) Sing…

photoshop(PS)有什么快速提升工作效率的功能?或者实用功能?这里告诉你5条!

1:文件太多&#xff0c;不方便马上找到需要插入元素&#xff08;元素放入PS会发现&#xff0c;位置不知道在哪里&#xff09;&#xff0c;点击需要选中或者搭配的元素&#xff0c;ctrlV就可以快速插入目标元素的位置了&#xff01; 点击当前元素&#xff0c;选中&#xff0c;c…

U盘中毒文件变乱码?揭秘原因与高效恢复方法!

在日常使用U盘的过程中&#xff0c;有时我们会遭遇到一个非常棘手的问题——文件突然出现乱码。当你满怀期待地插入U盘&#xff0c;准备打开某个重要文件时&#xff0c;却发现文件名或内容变成了一堆无法识别的字符&#xff0c;这种心情无异于晴天霹雳。乱码文件不仅影响了我们…

Java接口限制请求次数

定义接口访问频率注解 /** * 接口访问频率注解&#xff0c;默认一分钟只能访问60次 */ Documented Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface RequestLimit { // 限制时间 单位&#xff1a;秒(默认值&#xff1a;一分钟&am…

微分阻尼作用的理解

先说阻尼的作用,阻尼能够缩短系统整定时间,减小系统响应的振动幅度。 1、CODESYS位置式PID(完整ST源代码) CODESYS位置式PID(完整ST源代码)_codesys pid功能块-CSDN博客文章浏览阅读1.2k次,点赞2次,收藏2次。CODESYS增量式PID完整源代码请参看下面文章链接:CODESYS增量式…

【代码随想录】day55

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、392判断子序列二、115不同的子序列 一、392判断子序列 双指针&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {int i 0;int…

卡码网笔试题 | 114 小欧的平均数、115 组装手机、116 小欧的卡牌

114 小欧的平均数 这题审题要仔细一些&#xff0c;注意题目的真正意思其实是要我们确定三个数的奇偶性&#xff0c;当其中两个分别为一个奇数一个偶数时&#xff0c;我们可以调整第三个数&#xff0c;之后切换到可以匹配的状态下再次调整刚才那两个数中的一个。而不是找到加起…

[图解]SysML和EA建模住宅安全系统-04

1 00:00:01,200 --> 00:00:04,710 我们首先来看一下需求图的一些要点 2 00:00:05,810 --> 00:00:07,080 需求图用来干什么 3 00:00:07,210 --> 00:00:12,080 用来记录文本形式的一些需求 4 00:00:12,090 --> 00:00:13,480 和需求的素材 5 00:00:14,540 --> …

南网上行通信规约报文解析软件

本文分享一个南网上行通信规约20140617 报文解析软件 下载链接: https://pan.baidu.com/s/1ngbBG-yL8ucRWLDflqzEnQ 提取码: y1de 主界面如下图所示&#xff1a; 本软件同时支持南网上行通信规约20140617-Fn查询功能 软件同时支持多种规约类型&#xff0c;如&#xff1a;国网…

基于springboot实现酒店管理系统项目【项目源码+论文说明】

基于springboot实现酒店管理系统演示 摘要 时代的发展带来了巨大的生活改变&#xff0c;很多事务从传统手工管理转变为自动管理。自动管理是利用科技的发展开发的新型管理系统&#xff0c;这类管理系统可以帮助人完成基本的繁琐的反复工作。酒店是出门的必需品&#xff0c;无论…

Kotlin扩展函数和运算符重载

扩展函数 fun String.lettersCount():Int{var count 0for(i in this){if(i.isLetter())count}return count } fun main(){val str:String "12we"println(str.lettersCount()) } 相当于直接将方法写在类里面。函数体内可以直接使用this而不用传参。 运算符重载 …

【算法】买卖股票的最佳时机【JS方案】

【算法】买卖股票的最佳时机 问题描述基本概念和作用说明解决方案暴力解法一次遍历法代码示例 总结与讨论 在前端开发中&#xff0c;虽然我们主要关注的是构建用户界面和交互逻辑&#xff0c;但掌握一些基本的算法和数据结构知识也是非常有用的。今天&#xff0c;我们就来探讨一…

STM32多个外部中断可能共享同一个中断向量

在STM32F4系列微控制器中&#xff0c;多个外部中断可能共享同一个中断向量&#xff08;例如&#xff0c;EXTI9_5_IRQn&#xff09;&#xff0c;因此需要在中断服务例程&#xff08;ISR&#xff09;中区分是哪个中断线触发了中断。对于PB6和PB7&#xff0c;它们都连接到EXTI9_5_…

维修MAHLO / BR贝加莱5D5202.05工控机电脑 人机界面液晶显示屏

贝加莱5D5202.05触摸屏 我们的维修业务&#xff1a; AB、ABB、贝加莱、博世力士乐、霍尼韦尔、艾默生、伦茨、施耐德、西门子、AMAT、松下、三菱、NSK、安川、欧姆龙、日立、光洋、台达、基恩士、横河、东芝等 深圳捷达工控维修是一家专注于人机界面触摸屏的全球维修商&#…

vsCode 设置上下级文件夹目录分离展示?

默认情况下&#xff0c;vsCode目录文件夹会使用/合并展示在一行&#xff0c;这样视觉上看着并不直观&#xff0c;设置目录文件分离展示方法如下&#xff1a; 1、点击左下角设置图标&#xff0c;点击setting&#xff1b; 2、搜索栏输入compact&#xff1b; 3、取消勾选第一个选…

OV SSL证书年度成本概览:确保企业级安全的经济之选

随着网络安全意识的日益增强&#xff0c;SSL证书成为了网站安全的标配&#xff0c;尤其是对于企业而言&#xff0c;选择一款既能确保数据传输安全又符合预算的证书至关重要。在众多SSL证书中&#xff0c;组织验证型&#xff08;Organization Validation&#xff0c;简称OV&…

互联网轻量级框架整合之装配Bean

依赖注入和依赖查找 应该说IoC的工作方式有两种&#xff0c;一种是依赖查找&#xff0c;通过资源定位&#xff0c;把对应的资源查找出来&#xff0c;例如通过JNDI找到数据源&#xff0c;依赖查找被广泛使用在第三方的资源注入上&#xff0c;比如在Web项目中&#xff0c;数据源往…

3588 pwm android12 的操作,包含 NDK native C++

问题&#xff1a; 客户需要在android12 的界面上操作板卡上的 PWM 蜂鸣器设备。 过程&#xff1a; 1 了解一下 3588 android12 源码的 关于PWM 的驱动。 设备树找不到 pwm 但是&#xff0c; 还不知道&#xff0c;android12 最终包含的 设备树是哪个&#xff0c;但是经过我的…