当前位置:   article > 正文

Spring AI聊天功能开发_org.springframework.ai.retry.nontransientaiexcepti

org.springframework.ai.retry.nontransientaiexception

一、引入依赖

继承父版本的springboot依赖,最好是比较新的依赖。

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>3.2.4</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. <dependency>
  8. <!-- 热部署插件-->
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-devtools</artifactId>
  11. <scope>runtime</scope>
  12. <optional>true</optional>
  13. </dependency>

jdk版本

  1. <properties>
  2. <java.version>17</java.version>
  3. </properties>

springAI版本

根据官网:Spring AI

选择稳定版本0.8.1

引入依赖:

  1. <properties>
  2. <java.version>17</java.version>
  3. <spring-ai.version>0.8.1</spring-ai.version>
  4. </properties>
  5. <dependencies>
  6. <!--spring ai的starter依赖,启动依赖,起步依赖-->
  7. <dependency>
  8. <groupId>org.springframework.ai</groupId>
  9. <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
  10. </dependency>
  11. </dependencies>
  12. <!--相当于是继承一个父项目:spring-ai-bom父项目-->
  13. <dependencyManagement>
  14. <dependencies>
  15. <dependency>
  16. <groupId>org.springframework.ai</groupId>
  17. <artifactId>spring-ai-bom</artifactId>
  18. <version>${spring-ai.version}</version>
  19. <type>pom</type>
  20. <scope>import</scope>
  21. </dependency>
  22. </dependencies>
  23. </dependencyManagement>

由于阿里云的仓库还没更新springai的maven坐标,所以需要配置其他仓库,加入下面的依赖

快照版本是如果你使用下面这种先行版则选择这个版本的仓库,一般我们使用稳定版本的maven

aae8a14bf78540c3a18b2617210e996c.png

  1. <!--配置本项目的仓库:因为maven中心仓库还没有更新spring ai的jar包-->
  2. <repositories>
  3. <!-- &lt;!&ndash;快照版本的仓库&ndash;&gt;-->
  4. <!-- <repository>-->
  5. <!-- <id>spring-snapshot</id>-->
  6. <!-- <name>Spring Snapshots</name>-->
  7. <!-- <url>https://repo.spring.io/snapshot</url>-->
  8. <!-- <releases>-->
  9. <!-- <enabled>false</enabled>-->
  10. <!-- </releases>-->
  11. <!-- </repository>-->
  12. <!--里程碑版本的仓库-->
  13. <repository>
  14. <id>spring-milestones</id>
  15. <name>Spring Milestones</name>
  16. <url>https://repo.spring.io/milestone</url>
  17. <snapshots>
  18. <enabled>false</enabled>
  19. </snapshots>
  20. </repository>
  21. </repositories>

二、写配置

在自己的yml文件里面配置springAI的信息

  1. server:
  2. port: 8080
  3. spring:
  4. application:
  5. name: #写自己的项目名
  6. ai:
  7. openai:
  8. # api-key: sk-xxx #写自己的key
  9. ## 可以写直接地址,也可以写中转地址(镜像地址)
  10. # base-url: https://api.openai.com
  11. api-key: sk-xxx #写自己的key #这个是我在淘宝买的key,一般配上中转地址
  12. base-url: https://apikeyplus.com/ #这个是我买的淘宝中转地址
  13. chat:
  14. options:
  15. model: gpt-3.5-turbo #版本
  16. temperature: 0.3F #温度
  17. mvc:
  18. async:
  19. request-timeout: -1

这里提示一下用买的中转地址不用科学上网也可以使用。

在这里我遇到了一个问题,不知道为什么我用自己的chatgpt3账号去官网申请了一个key,但是访问的时候却报错,这个是idea需要开启代理。

报错信息部分如下:I/O error on POST request for "https://api.openai.com/v1/chat/completions": Connection timed out: connect] with root cause

解决:在idea配置里面加上一下下面的信息

-Djava.net.useSystemProxies=true

 

但是还有可能出现下面的报错:

org.springframework.ai.retry.NonTransientAiException: 429 - { "error": { "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", "type": "insufficient_quota", "param": null, "code": "insufficient_quota" } }

这个原因是你的ChatGPT这个账号里面的key的使用额度用完了。

申请key地址的官方网址:https://platform.openai.com/api-keys

三、写接口

  1. @Slf4j
  2. @RestController
  3. public class ChatController {
  4. /**
  5. * spring-ai 自动装配的,可以直接注入使用
  6. */
  7. @Resource
  8. private OpenAiChatClient openAiChatClient;
  9. /**
  10. * 调用OpenAI的接口
  11. *
  12. * @param msg 我们提的问题
  13. * @return
  14. */
  15. @RequestMapping(value = "/ai/chat")
  16. public String chat(@RequestParam(value = "msg",defaultValue = "给我讲一个笑话") String msg) {
  17. log.info("发送的消息是:{}",msg);
  18. String call = openAiChatClient.call(msg);
  19. log.info("返回的消息是:{}",call);
  20. return call;
  21. }
  22. /**
  23. * 调用OpenAI的接口
  24. *
  25. * @param msg 我们提的问题
  26. * @return
  27. */
  28. @RequestMapping(value = "/ai/chat2")
  29. public Object chat2(@RequestParam(value = "msg") String msg) {
  30. ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg));
  31. return chatResponse.getResult().getOutput().getContent();
  32. }
  33. /**
  34. * 调用OpenAI的接口
  35. *
  36. * @param msg 我们提的问题
  37. * @return
  38. */
  39. @RequestMapping(value = "/ai/chat3")
  40. public Object chat3(@RequestParam(value = "msg") String msg) {
  41. //可选参数在配置文件中配置了,在代码中也配置了,那么以代码的配置为准,也就是代码的配置会覆盖掉配置文件中的配置
  42. ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg, OpenAiChatOptions.builder()
  43. //.withModel("gpt-4-32k") //gpt的版本,32k是参数量,参数量越大回答的问题质量会越好,准确率会越高
  44. .withTemperature(0.4F) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好
  45. .build()));
  46. return chatResponse.getResult().getOutput().getContent();
  47. }
  48. /**
  49. * 调用OpenAI的接口
  50. * 流式访问,一个一个字的输出
  51. * @param msg 我们提的问题
  52. * @return
  53. */
  54. @RequestMapping(value = "/ai/chat4")
  55. public Object chat4(@RequestParam(value = "msg") String msg) {
  56. //可选参数在配置文件中配置了,在代码中也配置了,那么以代码的配置为准,也就是代码的配置会覆盖掉配置文件中的配置
  57. Flux<ChatResponse> flux = openAiChatClient.stream(new Prompt(msg, OpenAiChatOptions.builder()
  58. //.withModel("gpt-4-32k") //gpt的版本,32k是参数量
  59. .withTemperature(0.4F) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好
  60. .build()));
  61. flux.toStream().forEach(chatResponse -> {
  62. System.out.println(chatResponse.getResult().getOutput().getContent());
  63. });
  64. return flux.collectList(); //数据的序列,一序列的数据,一个一个的数据返回
  65. }
  66. }

测试:http://localhost:8080/ai/chat3?msg=java是什么

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号