Spring AI Java程序员的AI之Spring AI(一)

发布于:2024-10-18 ⋅ 阅读:(12) ⋅ 点赞:(0)

前言

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 {

    @Autowired
    private 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:

  1. OpenAiChatClient:文字聊天客户端
  2. OpenAiEmbeddingClient:文本向量化客户端
  3. OpenAiImageClient:文生图客户端
  4. OpenAiAudioTranscriptionClient:语音转文字客户端

这些Bean在创建时就会构造底层连接OpenAi的客户端OpenAiApi对象,其中会用到以下几种配置:

  1. OpenAiConnectionProperties:连接配置
  2. OpenAiChatProperties:聊天配置
  3. OpenAiEmbeddingProperties:向量化配置
  4. OpenAiImageProperties:文生图配置
  5. 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 让开发更加简洁。