SpringAI 基础使用
- 前言
- Spring AI
- ChatClient
- ImageClient
- OpenAiAudioTranscriptionClient
- EmbeddingClient
- 总结
前言
Spring AI,听着名字就感觉很好使用,快速上手,虽然功能没有太完善,但是社区活跃度很高,可以看看源码,让我们一起成为贡献者吧。
Spring AI
新建SpringBoot工程,然后添加以下依赖:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.1</version>
</parent><groupId>com.qjc</groupId>
<artifactId>spring-ai-demo</artifactId>
<version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>0.8.1-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency>
</dependencies><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository>
</repositories>
需要注意的是:由于版本的不同,可能会引起很多的问题,因为底层的版本使用的webflux,需要对应,这是我碰到的问题。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>
然后定义一个ChatController:
package com.qjc.demo.controller;import org.springframework.ai.chat.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/**** @projectName spring-ai-demo* @packageName com.qjc.demo.controller* @author qjc* @description TODO* @Email qjc1024@aliyun.com* @date 2024-10-16 09:05**/
@RestController
public class ChatController {@Autowiredprivate ChatClient chatClient;@GetMapping("/chat")public String generate(@RequestParam String message) {return chatClient.call(message);}}
由于依赖了:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
该starter中间接依赖了:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-spring-boot-autoconfigure</artifactId><version>0.8.1-SNAPSHOT</version><scope>compile</scope>
</dependency>
而该依赖中针对各个大模型提供了一个对应的自动配置类,比如OpenAiAutoConfiguration,而在该自动配置类中定义了以下几个Bean:
- OpenAiChatClient:文字聊天客户端
- OpenAiEmbeddingClient:文本向量化客户端
- OpenAiImageClient:文生图客户端
- OpenAiAudioTranscriptionClient:语音转文字客户端
这些Bean在创建时就会构造底层连接OpenAi的客户端OpenAiApi对象,其中会用到以下几种配置:
- OpenAiConnectionProperties:连接配置
- OpenAiChatProperties:聊天配置
- OpenAiEmbeddingProperties:向量化配置
- OpenAiImageProperties:文生图配置
- OpenAiAudioTranscriptionProperties:语音转文字配置
连接OpenAi的地址就apiKey就在OpenAiConnectionProperties中,比如application.properties的配置为:
spring.ai.openai.base-url=http://localhost:3000
spring.ai.openai.api-key=sk-xxxxx
ChatClient
所以,当我们需要基于OpenAI来提问时,直接注入ChatClient或OpenAiChatClient就可以了:
@Autowired
private ChatClient chatClient;
然后就可以使用call()方法来进行提问了:
@GetMapping("/chat")
public String chat(@RequestParam String message) {return chatClient.call(message);
}
ImageClient
使用下文生图的API:
@Autowired
private ImageClient imageClient;@GetMapping("/image")
public String image(@RequestParam String message) {ImagePrompt imagePrompt = new ImagePrompt(message);ImageResponse imageResponse = imageClient.call(imagePrompt);return imageResponse.getResult().getOutput().getUrl();
}
访问该URL即可拿到对应图片。
OpenAiAudioTranscriptionClient
也可以使用语音转文字的API:
@Value("classpath:/abc.flac")
private Resource audioFile;@Autowired
private OpenAiAudioTranscriptionClient audioTranscriptionClient;@GetMapping("/audio")
public String audio() {AudioTranscriptionPrompt transcriptionRequest = new AudioTranscriptionPrompt(audioFile);AudioTranscriptionResponse response = audioTranscriptionClient.call(transcriptionRequest);return response.getResult().getOutput();
}
EmbeddingClient
也可以用来对文本进行向量化:
@Autowired
private EmbeddingClient embeddingClient;@GetMapping("/embedding")
public List<Double> embedding(@RequestParam String message) {return embeddingClient.embed(message);
}
总结
SpringBoot的自动配置,基于自动配置,我们只需要直接依赖注入对应的Client就可以使用了,还是那么的善解人意,LangChain4j虽好但不是我的最爱,我更加的偏向Spring AI,因为使用简单,扩展方便,拥有强大的自动配置等,更适用于SpringBoot 让开发更加简洁。