• 超级详细Spring AI+ChatGPT(java接入OpenAI大模型)


    Spring AI

    对接各种AI大模型(AI工程领域的应用程序框架)

    前期准备

    API-Key:sk-3sfER03LDLG3SDFsdlwe283JSdw023lkrmrHDND32fmREKFD

    (格式长这样,这个不可用)

    免费使用

    • 🚀申请领取内测免费API Key
    • 免费版支持gpt-3.5-turbo, embedding, gpt-4。其中gpt-4由于价格过高,每24小时限制10次调用,且不支持流式传输。需要更稳定快速的gpt-4请使用付费版。
    • 转发Host1: https://api.chatanywhere.tech (国内中转,延时更低,host1和host2二选一)
    • 转发Host2: https://api.chatanywhere.com.cn (国内中转,延时更低,host1和host2二选一)
    • 转发Host3: https://api.chatanywhere.cn (国外使用,国内需要全局代理)

    创建项目

    pom文件配置

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>3.2.5version>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.zzqgroupId>
    12. <artifactId>spring-ai-chat01artifactId>
    13. <version>1.0.1-SNAPSHOTversion>
    14. <name>spring-ai-chat01name>
    15. <description>spring-ai-chat01description>
    16. <properties>
    17. <java.version>17java.version>
    18. <spring-ai.version>1.0.0-SNAPSHOTspring-ai.version>
    19. properties>
    20. <dependencies>
    21. <dependency>
    22. <groupId>org.springframework.bootgroupId>
    23. <artifactId>spring-boot-starter-webartifactId>
    24. dependency>
    25. <dependency>
    26. <groupId>org.springframework.aigroupId>
    27. <artifactId>spring-ai-openai-spring-boot-starterartifactId>
    28. dependency>
    29. <dependency>
    30. <groupId>org.springframework.bootgroupId>
    31. <artifactId>spring-boot-devtoolsartifactId>
    32. <scope>runtimescope>
    33. <optional>trueoptional>
    34. dependency>
    35. <dependency>
    36. <groupId>org.projectlombokgroupId>
    37. <artifactId>lombokartifactId>
    38. <optional>trueoptional>
    39. dependency>
    40. <dependency>
    41. <groupId>org.springframework.bootgroupId>
    42. <artifactId>spring-boot-starter-testartifactId>
    43. <scope>testscope>
    44. dependency>
    45. dependencies>
    46. <dependencyManagement>
    47. <dependencies>
    48. <dependency>
    49. <groupId>org.springframework.aigroupId>
    50. <artifactId>spring-ai-bomartifactId>
    51. <version>${spring-ai.version}version>
    52. <type>pomtype>
    53. <scope>importscope>
    54. dependency>
    55. dependencies>
    56. dependencyManagement>
    57. <build>
    58. <plugins>
    59. <plugin>
    60. <groupId>org.springframework.bootgroupId>
    61. <artifactId>spring-boot-maven-pluginartifactId>
    62. <configuration>
    63. <excludes>
    64. <exclude>
    65. <groupId>org.projectlombokgroupId>
    66. <artifactId>lombokartifactId>
    67. exclude>
    68. excludes>
    69. configuration>
    70. plugin>
    71. plugins>
    72. build>
    73. <repositories>
    74. <repository>
    75. <id>spring-snapshotid>
    76. <name>Spring Snapshotsname>
    77. <url>https://repo.spring.io/snapshoturl>
    78. <releases>
    79. <enabled>falseenabled>
    80. releases>
    81. repository>
    82. repositories>
    83. project>

    配置application文件

    文件内容: 

    1. spring:
    2. application:
    3. name:spring-ai-01-chat
    4. ai:
    5. openai:
    6. api-key: ${OPENAI_API_KEY}
    7. base-url: ${OPENAI_API_URL}
    8. chat:
    9. option:
    10. #model:gpt-4-32k
    11. model:gpt-3.5-turbo
    12. temperature:0.3F

    http://t.csdnimg.cn/32fqr小白如何设置openai api key的环境变量

    controller文件内容:

    生成文字

    1. package com.zzq.controller;
    2. import jakarta.annotation.Resource;
    3. import org.springframework.ai.chat.ChatResponse;
    4. import org.springframework.ai.chat.prompt.Prompt;
    5. import org.springframework.ai.openai.OpenAiChatClient;
    6. import org.springframework.ai.openai.OpenAiChatOptions;
    7. import org.springframework.web.bind.annotation.RequestMapping;
    8. import org.springframework.web.bind.annotation.RequestParam;
    9. import org.springframework.web.bind.annotation.RestController;
    10. import reactor.core.publisher.Flux;
    11. @RestController
    12. public class ChatController {
    13. /**
    14. * OpenAi自动装配,可以直接注入使用
    15. */
    16. @Resource
    17. private OpenAiChatClient openAiChatClient;
    18. /**
    19. * 调用OpenAi的接口,call方法为同步的api
    20. * @param msg 你要问的问题
    21. * @return
    22. */
    23. @RequestMapping("/ai/chat")
    24. public String chat(@RequestParam("msg") String msg) {
    25. String called = openAiChatClient.call(msg);
    26. return called;
    27. }
    28. /**
    29. * 调用OpenAi的接口
    30. * @param msg 你要问的问题
    31. * @return Object--json对象
    32. */
    33. @RequestMapping ("/ai/chat1")
    34. public Object chat1(@RequestParam("msg") String msg) {
    35. ChatResponse response = openAiChatClient.call(new Prompt(msg));
    36. return response;
    37. // return response.getResult().getOutput().getContent();//只拿到内容
    38. }
    39. /**
    40. * 调用OpenAi的接口
    41. * @param msg 你要问的问题
    42. * @return
    43. */
    44. @RequestMapping ("/ai/chat3")
    45. public String chat3(@RequestParam("msg") String msg) {
    46. //可选参数在yml配置,同时在代码中也配置,那么会以代码为准
    47. ChatResponse response = openAiChatClient.call(new Prompt(msg, OpenAiChatOptions.builder()
    48. // .withModel("gpt-4-32k")//使用的模型,32k是参数量//参数量越高,准确率越高
    49. .withTemperature(0.3F)//温度越高回答越慢,温度越低回答越快
    50. .build()));
    51. return response.getResult().getOutput().getContent();
    52. }
    53. /**
    54. * 调用OpenAi的接口 stream是流式的api
    55. * @param msg 你要问的问题
    56. * @return
    57. */
    58. @RequestMapping ("/ai/chat4")
    59. public Object chat4(@RequestParam("msg") String msg) {
    60. //可选参数在yml配置,同时在代码中也配置,那么会以代码为准
    61. Flux flux = openAiChatClient.stream(new Prompt(msg, OpenAiChatOptions.builder()
    62. // .withModel("gpt-3.5")//使用的模型
    63. .withTemperature(0.3F)//温度越高回答越慢,温度越低回答越快
    64. .build()));
    65. flux.toStream().forEach(chatResponse ->{
    66. System.out.println(chatResponse.getResult().getOutput().getContent());
    67. });
    68. return flux.collectList();//数据的序列,一序列的数据,一个一个的数据返回
    69. }
    70. }

    spring-ai-02-image

    application文件内容(代码配置的会覆盖yml文件中的)

    更改可以生成image的api-key

    画图模型版本

    n:1(生成图片两张)

    height:1024(高度)

    width:1024(宽度)

    quality:hd(高清)

    1. spring:
    2. application:
    3. name:spring-ai-02-image
    4. ai:
    5. openai:
    6. api-key: ${OPENAI_API_KEY}
    7. base-url: ${OPENAI_API_URL}
    8. image:
    9. options:
    10. model:gpt-4-dalle

    controller内容:

    生成图片

    图片无法使用流式api

    1. package com.zzq.controller;
    2. import jakarta.annotation.Resource;
    3. import org.springframework.ai.image.ImageOptionsBuilder;
    4. import org.springframework.ai.image.ImagePrompt;
    5. import org.springframework.ai.image.ImageResponse;
    6. import org.springframework.ai.openai.OpenAiImageClient;
    7. import org.springframework.web.bind.annotation.GetMapping;
    8. import org.springframework.web.bind.annotation.RequestParam;
    9. import org.springframework.web.bind.annotation.RestController;
    10. @RestController
    11. public class ImageController {
    12. @Resource
    13. private OpenAiImageClient openAiImageClient;
    14. @RequestMapping("/ai/image")
    15. private Object image(@RequestParam(value="msg")String msg){
    16. ImageResponse imageResponse=openAiImageClient.call(new ImagePrompt(msg));
    17. System.out.println(imageResonse);
    18. //把图片进行业务处理
    19. String imageUrl=return response.getResult().getOutput().getUrl();
    20. return response.getResult().getOutput().getUrl();
    21. /* @GetMapping("/ai/draw")
    22. public String drawImage(@RequestParam(value = "msg") String msg){
    23. ImageResponse response = openAiImageClient.call(new ImagePrompt(msg,
    24. ImageOptionsBuilder
    25. .builder()
    26. .withQuality("hd")//高清图像
    27. .withModel("dall-e-3") //绘画模型
    28. .withN(1) //生成图像的个数
    29. .withWidth(1024) //图像宽度 默认值
    30. .withHeight(1024) //图像高度 默认值
    31. .build()
    32. )
    33. );
    34. //返回结果图片的地址
    35. return response.getResult().getOutput().getUrl();
    36. */
    37. }
    38. }

    生成语音

    Ai音频转文本

    spring-ai-03-transcription

    更改可以生成声音的api-key

    声音模型版本

    application文件内容

    1. spring:
    2. application:
    3. name:spring-ai-03-trascription
    4. ai:
    5. openai:
    6. api-key: ${OPENAI_API_KEY}
    7. base-url: ${OPENAI_API_URL}
    1. import jakarta.annotation.Resource;
    2. import org.springframework.ai.openai.OpenAiAudioSpeechClient;
    3. import org.springframework.ai.openai.OpenAiAudioTranscriptionClient;
    4. import org.springframework.core.io.ClassPathResource;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. import org.springframework.web.bind.annotation.RestController;
    7. import static com.ysl.utisl.save2File.save2File;
    8. @RestController
    9. public class TranscriptionController {
    10. @Resource
    11. private OpenAiudioTranscriptionClient openAiAudioTranscriptionClient;
    12. @RequestMapping(value="/ai/transcription")
    13. public Object transcription(){
    14. org,springframework.core.io.Resourse audioFile = new ClassPathResourse("文件名jfk.mp3")
    15. String called = openAiAudioTranscriptiomClient.call(audioFile)
    16. System.out.println(called);
    17. return called;
    18. }
    19. /*
    20. @RestController
    21. public class TranscriptionController {
    22. //将音频转文字时使用
    23. @Resource
    24. private OpenAiAudioTranscriptionClient transcriptionClient;
    25. //将文字转语音时使用
    26. @Resource
    27. private OpenAiAudioSpeechClient speechClient;
    28. /**
    29. * 将音频转文字
    30. * @return
    31. */
    32. /* @RequestMapping("/ai/transcription")
    33. public Object transcription() {
    34. //读取的是磁盘的路径
    35. //FileSystemResource audioFile = new FileSystemResource("C:\\Users\\DELL\\Desktop\\luyin.m4a");
    36. //读取的是classpath静态资源下的文件
    37. ClassPathResource audioFile = new ClassPathResource("luyin.m4a");
    38. String call = transcriptionClient.call(audioFile);
    39. System.out.println(call);
    40. return call;
    41. }
    42. /**
    43. * 将文字转音频
    44. * @return
    45. */
    46. /* @RequestMapping("/ai/tts")
    47. public Object tts() {
    48. String text = "Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI,并推广使用 POJO 作为 AI 领域应用程序的构建块。 跨 AI 提供商的可移植 API 支持,适用于聊天、文本到图像和嵌入模型。支持同步和流 API 选项。还支持下拉以访问特定于模型的功能";
    49. byte[] bytes = speechClient.call(text);
    50. save2File("C:\\Users\\DELL\\Desktop\\test.mp3",bytes);
    51. return "OK";
    52. }
    53. */
    54. /*
    55. @RequestMapping("/ai/tts")
    56. public Object tts() {
    57. String text = "Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI,并推广使用 POJO 作为 AI 领域应用程序的构建块。 跨 AI 提供商的可移植 API 支持,适用于聊天、文本到图像和嵌入模型。支持同步和流 API 选项。还支持下拉以访问特定于模型的功能";
    58. byte[] bytes = openAiAudioSpeechClient..call(text);
    59. FileUtilssave2File("C:\\Users\\DELL\\Desktop\\test.mp3",bytes);
    60. return "OK";
    61. }
    62. */
    63. }

    Spring Ai---多模态

    多模态API

    多模态是指模型同时理解和处理来自各种来源信息的能力,包括文本、图像、音频和其他数据格式

    多模型大语言(LLM)特征使模型能够结合其他模态(如图像、音频或视频)来处理和生成文本

    spring-ai-05-multimodel

    1. package com.zzq.controller;
    2. import jakarta.annotation.Resource;
    3. import org.springframework.ai.chat.ChatClient;
    4. import org.springframework.ai.chat.ChatResponse;
    5. import org.springframework.ai.chat.messages.Media;
    6. import org.springframework.ai.chat.messages.UserMessage;
    7. import org.springframework.ai.chat.prompt.Prompt;
    8. import org.springframework.ai.openai.OpenAiChatOptions;
    9. import org.springframework.ai.openai.api.OpenAiApi;
    10. import org.springframework.util.MimeTypeUtils;
    11. import org.springframework.web.bind.annotation.RequestMapping;
    12. import org.springframework.web.bind.annotation.RestController;
    13. import java.util.List;
    14. @RestController
    15. public class MultiModelController {
    16. @Resource
    17. private ChatClient chatClient;
    18. @RequestMapping(value = "/ai/multi")
    19. public Object multi(String msg,String imageUrl){
    20. UserMessage userMessage=new UserMessage(msg,
    21. List.of(new Media(MimeTypeUtils.IMAGE_PNG,imageUrl))
    22. );
    23. ChatResponse response=chatClient.call(new Prompt(List.of(userMessage),
    24. OpenAiChatOptions.builder()
    25. .withModel(OpenAiApi.ChatModel.GPT_4_VISION_PREVIEW.getValue())
    26. .build()
    27. ));
    28. return response.getResult().getOutput().getContent();
    29. }
    30. }
  • 相关阅读:
    【网络安全】网络攻击的类型有哪些?
    小白学爬虫:通过商品ID或商品链接封装接口获取淘宝商品销量数据接口|淘宝商品销量接口|淘宝月销量接口|淘宝总销量接口
    【任务调度框架】「分析技术指南」带你一同盘点一下常用的任务调度框架的方案和原理开发指南
    【音视频播放器测试】确保卓越的媒体体验
    数控加工题,每个图片能做一道就好,help同学吧
    ​LeetCode解法汇总2605. 从两个数字数组里生成最小数字
    19、Python单元测试基础:unittest模块的基本使用
    如何开家有品味的咖啡馆
    汇编书摘抄
    Day42-43
  • 原文地址:https://blog.csdn.net/qq_73735007/article/details/139039494