一、引入依赖
继承父版本的springboot依赖,最好是比较新的依赖。
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/> <!-- lookup parent from repository --></parent><dependency><!-- 热部署插件--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency>
jdk版本
<properties><java.version>17</java.version></properties>
springAI版本
根据官网:Spring AI
选择稳定版本0.8.1
引入依赖:
<properties><java.version>17</java.version><spring-ai.version>0.8.1</spring-ai.version></properties> <dependencies><!--spring ai的starter依赖,启动依赖,起步依赖--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency></dependencies><!--相当于是继承一个父项目:spring-ai-bom父项目--><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
由于阿里云的仓库还没更新springai的maven坐标,所以需要配置其他仓库,加入下面的依赖
快照版本是如果你使用下面这种先行版则选择这个版本的仓库,一般我们使用稳定版本的maven
<!--配置本项目的仓库:因为maven中心仓库还没有更新spring ai的jar包--><repositories>
<!-- <!–快照版本的仓库–>-->
<!-- <repository>-->
<!-- <id>spring-snapshot</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>
二、写配置
在自己的yml文件里面配置springAI的信息
server:port: 8080spring:application:name: #写自己的项目名ai:openai:
# api-key: sk-xxx #写自己的key
## 可以写直接地址,也可以写中转地址(镜像地址)
# base-url: https://api.openai.comapi-key: sk-xxx #写自己的key #这个是我在淘宝买的key,一般配上中转地址base-url: https://apikeyplus.com/ #这个是我买的淘宝中转地址chat:options:model: gpt-3.5-turbo #版本temperature: 0.3F #温度mvc:async:request-timeout: -1
这里提示一下用买的中转地址不用科学上网也可以使用。
在这里我遇到了一个问题,不知道为什么我用自己的chatgpt3账号去官网申请了一个key,但是却用不了那个key,加上魔法也访问不了会超时,有大佬会解决可以留言一下!!!
报错信息部分如下:I/O error on POST request for "https://api.openai.com/v1/chat/completions": Connection timed out: connect] with root cause
申请地址的官方网址:https://platform.openai.com/api-keys
三、写接口
@Slf4j
@RestController
public class ChatController {/*** spring-ai 自动装配的,可以直接注入使用*/@Resourceprivate OpenAiChatClient openAiChatClient;/*** 调用OpenAI的接口** @param msg 我们提的问题* @return*/@RequestMapping(value = "/ai/chat")public String chat(@RequestParam(value = "msg",defaultValue = "给我讲一个笑话") String msg) {log.info("发送的消息是:{}",msg);String call = openAiChatClient.call(msg);log.info("返回的消息是:{}",call);return call;}/*** 调用OpenAI的接口** @param msg 我们提的问题* @return*/@RequestMapping(value = "/ai/chat2")public Object chat2(@RequestParam(value = "msg") String msg) {ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg));return chatResponse.getResult().getOutput().getContent();}/*** 调用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();}/*** 调用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(); //数据的序列,一序列的数据,一个一个的数据返回}}
测试:http://localhost:8080/ai/chat3?msg=java是什么
四、问题
最后还是希望有大佬能解决我上面写配置那边的问题(自己搞的key科学上网也会报错)!!!