找回密码
 立即注册
首页 业界区 安全 2. Spring AI 快速入门使用

2. Spring AI 快速入门使用

终秀敏 2025-9-23 10:07:03
2. Spring AI 快速入门使用

@
目录

  • 2. Spring AI 快速入门使用

    • 快速使用

      • 接入deepseek

        • 流式对话
        • options配置选项

          • temperature(温度)

            • 建议

          • maxTokens
          • stop
          • 模型推理

        • 原理:

      • 接入阿里百炼

        • 使用
        • 文生图
        • 文生语音text2audio
        • 语音翻译audio2text
        • 多模态
        • 文生视频(更多功能)



  • 最后:

快速使用


  • 创建项目
1.png
  1. <?xml version="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.0</modelVersion>
  5.     <parent>
  6.         <groupId>org.springframework.boot</groupId>
  7.         spring-boot-starter-parent</artifactId>
  8.         <version>3.4.5</version>
  9.         <relativePath/>
  10.     </parent>
  11.     <groupId>com.xs</groupId>
  12.     spring-ai-GA</artifactId>
  13.     <version>0.0.1-SNAPSHOT</version>
  14.     <name>spring-ai-GA</name>
  15.     <properties>
  16.         <java.version>17</java.version>
  17.         <spring-ai.version>1.0.0</spring-ai.version>
  18.     </properties>
  19.     <dependencies>
  20.         <dependency>
  21.             <groupId>org.springframework.boot</groupId>
  22.             spring-boot-starter-web</artifactId>
  23.         </dependency>
  24.         <dependency>
  25.             <groupId>org.springframework.boot</groupId>
  26.             spring-boot-starter-test</artifactId>
  27.             <scope>test</scope>
  28.         </dependency>
  29.     </dependencies>
  30.     <dependencyManagement>
  31.         <dependencies>
  32.          
  33.             <dependency>
  34.                 <groupId>org.springframework.ai</groupId>
  35.                 spring-ai-bom</artifactId>
  36.                 <version>${spring-ai.version}</version>
  37.                 <type>pom</type>
  38.                 <scope>import</scope>
  39.             </dependency>
  40.         </dependencies>
  41.     </dependencyManagement>
  42.     <build>
  43.         <plugins>
  44.             <plugin>
  45.                 <groupId>org.springframework.boot</groupId>
  46.                 spring-boot-maven-plugin</artifactId>
  47.             </plugin>
  48.         </plugins>
  49.     </build>
  50. </project>
复制代码
接入deepseek


  • 依赖
  1.         <dependency>
  2.             <groupId>org.springframework.ai</groupId>
  3.             spring-ai-starter-model-deepseek</artifactId>
  4.         </dependency>
复制代码

  • 获取deepseek api-key


  • API Key:需从 DeepSeek 创建并获取 API 密钥:https://platform.deepseek.com/api_keys
2.png

3.png


  • 配置
  1. spring:
  2.   ai:
  3.     deepseek:
  4.       api-key: ${DEEP_SEEK_KEY}
  5.       chat:
  6.         options:
  7.           model: deepseek-chat
复制代码

  • 测试
spring-ai-starter-model-deepseek 会为你增加自动配置类, 其中DeepSeekChatModel这个就是专门负责智能对话的。
  1. package com.xs.springaiga;
  2. import org.junit.jupiter.api.Test;
  3. import org.springframework.ai.deepseek.DeepSeekChatModel;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. @SpringBootTest
  7. public class DeepseelTest {
  8.     @Test
  9.     public void testChat(@Autowired
  10.                          DeepSeekChatModel chatModel) {
  11.         String call = chatModel.call("你是谁");
  12.         System.out.println(call);
  13.     }
  14. }
复制代码
4.png

上述是一种阻塞输出方式,就是要等服务器全部处理完了,才会被响应出来。
流式对话
  1. @Test
  2.     public void testChat2(@Autowired
  3.                          DeepSeekChatModel chatModel) {
  4.         Flux<String> stream = chatModel.stream("你是谁");
  5.         // 流式输出
  6.         stream.toIterable().forEach(System.out::print);
  7.     }
复制代码
流式输出,就是服务器接受到一点,就输出一点
options配置选项

temperature(温度)

0-2 浮点数值
数值越高 更有创造性 热情
数值越低 保守
  1. @Test
  2. public void testChatOptions(@Autowired
  3.                             DeepSeekChatModel chatModel) {
  4.     DeepSeekChatOptions options = DeepSeekChatOptions.builder()
  5.                                 .temperature(1.9d).build();
  6.     ChatResponse res = chatModel.call(new Prompt("请写一句诗描述清晨。", options));
  7.     System.out.println(res.getResult().getOutput().getText());
  8. }
复制代码
也可以通过配置文件配置
  1. spring.ai.deepseek.chat.options.temperature=0.8
复制代码
temperature:0.2 规规矩矩,像是被应试教育出来的老实学生没有创造力
5.png

temperature:1.9 可以看出来表现欲更强, 像是一个在领导面前想要表现的你.
6.png

也可以通过提示词降低他的主观臆想:

  • 只引用可靠来源中的信息,不做任何假设或扩展描述。
  • 请只基于已知事实回答,不要主观臆想或添加额外内容。
  • 请简明、客观地给出答案,不要进行修饰或补充未经请求的信息。
建议

temperature 范围建议业务场景输出风格说明/应用举例0.0 ~ 0.2严谨问答、代码补全、数学答题严格、确定、标准法律/金融答题、接口返回模板、考试答卷等0.3 ~ 0.6聊天机器人、日常摘要、辅助写作稍有变化、较稳妥公众号摘要、普通对话、邮件生成等0.7 ~ 1.0创作内容、广告文案、标题生成丰富、有创意、灵活诗歌、短文案、趣味对话、产品描述等1.1 ~ 1.5脑洞风格、头脑风暴、灵感碰撞场景大开脑洞、变化极强故事创作、异想天开的推荐语、多样化内容说明:

  • 温度越低,输出越收敛和中规中矩;
  • 温度越高,输出越多变、富有惊喜但有风险;
  • 实战用法一般建议选 0.5~0.8 作为日常生产起点,需要根据业务不断测试调整。
maxTokens

默认低 token
maxTokens: 限制AI模型生成的最大token数(近似理解为字数上限)。

  • 需要简洁回复、打分、列表、短摘要等,建议小值(如10~50)。
  • 防止用户跑长对话导致无关内容或花费过多token费用。
  • 如果遇到生成内容经常被截断,可以适当配置更大maxTokens。
stop

截断你不想输出的内容 比如:
  1. spring:
  2.   ai:
  3.     deepseek:
  4.       api-key: ${DEEP_SEEK_KEY}
  5.       chat:
  6.         options:
  7.           model: deepseek-chat          max-tokens: 20          stop:              - "\n"    #只想一行              - "。"    #只想一句话              - "政治"  #敏感词              - "最后最总结一下"  #这种AI惯用的模板词, 减少AI词汇, 让文章更拟人
复制代码
模型推理

设置深度思考, 思考的内容有个专业名词叫:Chain of Thought (CoT)
7.png

在deepseek中, deepseek-reasoner模型是深度思考模型:
8.png
  1. @Test
  2.     public void deepSeekReasonerExample(@Autowired DeepSeekChatModel deepSeekChatModel) {
  3.         DeepSeekChatOptions options = DeepSeekChatOptions.builder()
  4.                 .model("deepseek-reasoner").build();
  5.         Prompt prompt = new Prompt("请写一句诗描述清晨。", options);
  6.         ChatResponse res = deepSeekChatModel.call(prompt);
  7.         DeepSeekAssistantMessage assistantMessage =  (DeepSeekAssistantMessage)res.getResult().getOutput();
  8.         String reasoningContent = assistantMessage.getReasoningContent();
  9.         String content = assistantMessage.getText();
  10.         System.out.println(reasoningContent);
  11.         System.out.println("--------------------------------------------");
  12.         System.out.println(content);
  13.     }
  14.     @Test
  15.     public void deepSeekReasonerStreamExample(@Autowired DeepSeekChatModel deepSeekChatModel) {
  16.         DeepSeekChatOptions options = DeepSeekChatOptions.builder()
  17.                 .model("deepseek-reasoner").build();
  18.         Prompt prompt = new Prompt("请写一句诗描述清晨。", options);
  19.         Flux<ChatResponse> stream = deepSeekChatModel.stream(prompt);
  20.         stream.toIterable().forEach(res -> {
  21.             DeepSeekAssistantMessage assistantMessage =  (DeepSeekAssistantMessage)res.getResult().getOutput();
  22.             String reasoningContent = assistantMessage.getReasoningContent();
  23.             System.out.print(reasoningContent);
  24.         });
  25.         System.out.println("--------------------------------------------");
  26.         stream.toIterable().forEach(res -> {
  27.             DeepSeekAssistantMessage assistantMessage =  (DeepSeekAssistantMessage)res.getResult().getOutput();
  28.             String content = assistantMessage.getText();
  29.             System.out.print(content);
  30.         });
  31.     }
复制代码
也可以在配置文件中配置
  1. spring.ai.deepseek.chat.options.model= deepseek-reasoner
复制代码
原理:

9.png


  • 当调用chatModel.call
  1. default String call(String message) {
  2.     Prompt prompt = new Prompt(new UserMessage(message));
  3.     Generation generation = call(prompt).getResult();
  4.     return (generation != null) ? generation.getOutput().getText() : "";
  5. }
复制代码
  1. 1. 首先会将提示词解析到Prompt对象中 (用于远程请求的messages)
复制代码
10.png


  • 调用deepseekModel#call---> internalCall方法
  1. public ChatResponse internalCall(Prompt prompt, ChatResponse previousChatResponse) {
  2.     // a
  3.     ChatCompletionRequest request = createRequest(prompt, false);
  4.     //..省略   
  5.     ResponseEntity<ChatCompletion> completionEntity = this.retryTemplate
  6.     // b
  7.     .execute(ctx -> this.deepSeekApi.chatCompletionEntity(request));
  8.     var chatCompletion = completionEntity.getBody();
  9.     //..省略
  10.     ChatResponse chatResponse = new ChatResponse(generations,
  11.                                                  from(completionEntity.getBody(), accumulatedUsage));
  12.     observationContext.setResponse(chatResponse);
  13.     return chatResponse;
  14.     //.. 省略
  15.     return response;
  16. }
复制代码
  1. 1. 通过createRequest封装为远程请求所需的json对象
  2. 2. 通过spring retry 重试机制去远程请求
复制代码
deepseekthis.deepSeekApi.chatCompletionEntity(request)
  1. // 通过restClient 进行远程请求
  2. public ResponseEntity<ChatCompletion> chatCompletionEntity(ChatCompletionRequest chatRequest) {
  3.                 return this.restClient.post()
  4.                         .uri(this.getEndpoint(chatRequest))
  5.                         .body(chatRequest)
  6.                         .retrieve()
  7.                         .toEntity(ChatCompletion.class);
  8.         }
复制代码
  1. 1. 封装响应数据
复制代码
接入阿里百炼

https://bailian.console.aliyun.com/?tab=home#/home
11.png

阿里自己的团队维护spring-ai-alibaba. 但是也必须依赖spring-ai 。 好处是扩展度更高,坏处是必须是springai先出来, spring-ai-alibaba.延迟几天出来。
如果需要接入阿里的百炼平台, 就必须用该组件
使用


  • 申请api-key
在调用前,您需要开通模型服务并获取API Key,再配置API Key到环境变量。

  • 依赖
  1. <dependencyManagement>
  2.   <dependencies>
  3.    
  4.     <dependency>
  5.       <groupId>com.alibaba.cloud.ai</groupId>
  6.       spring-ai-alibaba-bom</artifactId>
  7.       <version>1.0.0.2</version>
  8.       <type>pom</type>
  9.       <scope>import</scope>
  10.     </dependency>
  11.   </dependencies>
  12. </dependencyManagement>
  13. <dependencies>
  14.   
  15.   <dependency>
  16.     <groupId>com.alibaba.cloud.ai</groupId>
  17.     spring-ai-alibaba-starter-dashscope</artifactId>
  18.   </dependency>
  19. </dependencies>
复制代码

  • 配置
不配置指定通义千问的模型名的话,也是会自动配置一个默认模型名。
  1. spring:
  2.   ai:
  3.     dashscope:
  4.       api-key: ${AI_DASHSCOPE_API_KEY}
复制代码

  • 使用
  1. @Test
  2.     public void testQwen(@Autowired DashScopeChatModel dashScopeChatModel) {
  3.         String content = dashScopeChatModel.call("你好你是谁");
  4.         System.out.println(content);
  5.     }
复制代码
文生图
  1. @Test
  2.     public void text2Img(
  3.         // 注意:这里是图片生成使用的是 DashScopeImageModel 也是被自动装配了。
  4.            @Autowired DashScopeImageModel imageModel) {
  5.         DashScopeImageOptions imageOptions = DashScopeImageOptions.builder()
  6.                 .withModel("wanx2.1-t2i-turbo").build();  // 构建配置项
  7.         // 返回一个图片想 Response 返回类
  8.         ImageResponse imageResponse = imageModel.call(
  9.                 new ImagePrompt("小兔子", imageOptions));
  10.         String imageUrl = imageResponse.getResult().getOutput().getUrl();
  11.         // 图片url
  12.         System.out.println(imageUrl);
  13.         // 图片base64
  14.         // imageResponse.getResult().getOutput().getB64Json();
  15.         /*
  16.         按文件流相应
  17.         InputStream in = url.openStream();
  18.         response.setHeader("Content-Type", MediaType.IMAGE_PNG_VALUE);
  19.         response.getOutputStream().write(in.readAllBytes());
  20.         response.getOutputStream().flush();*/
  21.     }
复制代码
文生语音text2audio
  1. // https://bailian.console.aliyun.com/?spm=5176.29619931.J__Z58Z6CX7MY__Ll8p1ZOR.1.74cd59fcXOTaDL&tab=doc#/doc/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2842586.html&renderType=iframe
  2.     @Test
  3.     public void testText2Audio(
  4.         //  DashScopeSpeechSynthesisModel 自动装配生成 语言类
  5.         @Autowired DashScopeSpeechSynthesisModel speechSynthesisModel) throws IOException {
  6.         // 语言配置项,.出来
  7.         DashScopeSpeechSynthesisOptions options = DashScopeSpeechSynthesisOptions.builder()
  8.                 //.voice()   // 人声
  9.                 //.speed()    // 语速
  10.                 //.model()    // 模型
  11.                 //.responseFormat(DashScopeSpeechSynthesisApi.ResponseFormat.MP3)
  12.                 .build();
  13.         SpeechSynthesisResponse response = speechSynthesisModel.call(
  14.                 new SpeechSynthesisPrompt("大家好, 我是李华。",options)
  15.         );
  16.         File file = new File( System.getProperty("user.dir") + "/output.mp3");
  17.         try (FileOutputStream fos = new FileOutputStream(file)) {
  18.             // 响应的语言的二进制流
  19.             ByteBuffer byteBuffer = response.getResult().getOutput().getAudio();
  20.             // 保存到我们,根路径下
  21.             fos.write(byteBuffer.array());
  22.         }
  23.         catch (IOException e) {
  24.             throw new IOException(e.getMessage());
  25.         }
  26.     }
复制代码
语音翻译audio2text
  1. // 这个设置的是一个远程的 url 文本内容
  2. private static final String AUDIO_RESOURCES_URL = "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav";
  3. @Test
  4.     public void testAudio2Text(
  5.             @Autowired
  6.             DashScopeAudioTranscriptionModel transcriptionModel
  7.     ) throws MalformedURLException {
  8.         DashScopeAudioTranscriptionOptions transcriptionOptions = DashScopeAudioTranscriptionOptions.builder()
  9.                 //.withModel()   模型
  10.                 .build();
  11.         AudioTranscriptionPrompt prompt = new AudioTranscriptionPrompt(
  12.                 new UrlResource(AUDIO_RESOURCES_URL),
  13.                 transcriptionOptions
  14.         );
  15.         AudioTranscriptionResponse response = transcriptionModel.call(
  16.                 prompt
  17.         );
  18.         System.out.println(response.getResult().getOutput());
  19.     }
复制代码
多模态

图片,语音,视频 传给大模型让大模型识别,理解其中的内容。
  1. @Test
  2. public void testMultimodal(@Autowired DashScopeChatModel dashScopeChatModel
  3.                           ) throws MalformedURLException {
  4.     // flac、mp3、mp4、mpeg、mpga、m4a、ogg、wav 或 webm。
  5.     var audioFile = new ClassPathResource("/files/xushu.png");
  6.   // MimeTypeUtils.IMAGE_JPEG 表示我们传递的文件类型
  7.     Media media = new Media(MimeTypeUtils.IMAGE_JPEG, audioFile);
  8.     DashScopeChatOptions options = DashScopeChatOptions.builder()
  9.     .withMultiModel(true)  // 使用多模态要设置为 true
  10.     .withModel("qwen-vl-max-latest").build();
  11.    
  12.     Prompt  prompt= Prompt.builder().chatOptions(options)
  13.     .messages(UserMessage.builder().media(media)
  14.               // 设置提示词 为“识别图片”
  15.               .text("识别图片").build())
  16.     .build();
  17.     ChatResponse response = dashScopeChatModel.call(prompt);
  18.    
  19.     System.out.println(response.getResult().getOutput().getText());
  20. }
复制代码
文生视频(更多功能)

因为这里的 Spring AI 目前并没有提供文生视频的 Modles 内容,需要接入第三方的依赖,使用第三方 API。
  1. <dependency>
  2.     <groupId>com.alibaba</groupId>
  3.     dashscope-sdk-java</artifactId>
  4.    
  5.     <version>the-latest-version</version>
  6.   <version>2.20.6</version>
  7. </dependency>
复制代码
  1. @Test
  2.     public void text2Video() throws ApiException, NoApiKeyException, InputRequiredException {
  3.         VideoSynthesis vs = new VideoSynthesis();
  4.         VideoSynthesisParam param =
  5.                 VideoSynthesisParam.builder()
  6.                         .model("wanx2.1-t2v-turbo")
  7.                         .prompt("一只小猫在月光下奔跑")
  8.                         .size("1280*720")
  9.             // 因为这里我们接入的是第三方API,对应的key并没有采用application.yaml的配置
  10.            // 所以需要我们手动,System.getenv() 获取到环境变量当中的key值
  11.                         .apiKey(System.getenv("ALI_AI_KEY"))
  12.                         .build();
  13.         System.out.println("please wait...");
  14.         VideoSynthesisResult result = vs.call(param);
  15.         System.out.println(result.getOutput().getVideoUrl());
  16.     }
复制代码
更多的内容可以去参考阿里云百炼广场 https://bailian.console.aliyun.com/?tab=home#/home 当中的 SDK,以及提供的一些 Demo 进行配置操作。
最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
12.gif


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册