Spring Alibaba Ai 实现聊天和文生图功能

前言

spring ai前不久刚刚问世,但由于各种原因,我们无法正常使用。但感谢alibaba,让我们可以在开发中为项目便捷的引入各种ai功能。

首先获取Api-Key

为使示例能够正常接入spring alibaba ai,需要申请有效的 API-KEY 。具体操作步骤可参见官方文档:

https://help.aliyun.com/zh/dashscope/developer-reference/activate-dashscope-and-create-an-api-keyicon-default.png?t=N7T8https://help.aliyun.com/zh/dashscope/developer-reference/activate-dashscope-and-create-an-api-key?spm=5176.29160081.0.0.74807a3ci0duRk

 创建springboot项目

idea新建springboot项目,选上spring web依赖

引入相关依赖

在pom.xml文件中添加如下内容

<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>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2023.0.1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-ai</artifactId>
 </dependency>

编写配置文件

在application.yaml文件中添加内容,配置好一开始获取的api-key

这里填自己的api-key就行,上图为本人的api-key,为隐私信息故涂去

编写项目代码

项目结构

在项目中新建如下文件夹

controller

helloworld

images

models

service

serviceImpl

service文件夹

创建接口TongYiService,代码如下

public interface TongYiService {


    String completion(String message);

    Map<String, String> streamCompletion(String message);

    ActorsFilms genOutputParse(String actor);

    AssistantMessage genPromptTemplates(String adjective, String topic);

    AssistantMessage genRole(String message, String name, String voice);

    Completion stuffCompletion(String message, boolean stuffit);

    ImageResponse genImg(String imgPrompt);

    String genAudio(String text);

    String audioTranscription(String audioUrls);

    List<Double> textEmbedding(String text);

}

serviceImpl文件夹

创建abstract类AbstractTongYiServiceImpl代码如下

public abstract class AbstractTongYiServiceImpl implements TongYiService {

    private static final String INFO_PREFIX = "please implement ";
    private static final String INFO_SUFFIX = "() method.";

    @Override
    public String completion(String message) {

        throw new RuntimeException(INFO_PREFIX + Thread.currentThread().getStackTrace()[2].getMethodName());
    }

    @Override
    public Map<String, String> streamCompletion(String message) {

        throw new RuntimeException(INFO_PREFIX + Thread.currentThread()
                .getStackTrace()[2].getMethodName() + INFO_SUFFIX);
    }

    @Override
    public ActorsFilms genOutputParse(String actor) {

        throw new RuntimeException(INFO_PREFIX + Thread.currentThread()
                .getStackTrace()[2].getMethodName() + INFO_SUFFIX);
    }

    @Override
    public AssistantMessage genPromptTemplates(String adjective, String topic) {

        throw new RuntimeException(INFO_PREFIX + Thread.currentThread()
                .getStackTrace()[2].getMethodName() + INFO_SUFFIX);
    }

    @Override
    public AssistantMessage genRole(String message, String name, String voice) {

        throw new RuntimeException(INFO_PREFIX + Thread.currentThread()
                .getStackTrace()[2].getMethodName() + INFO_SUFFIX);
    }

    @Override
    public Completion stuffCompletion(String message, boolean stuffit) {

        throw new RuntimeException(INFO_PREFIX + Thread.currentThread()
                .getStackTrace()[2].getMethodName() + INFO_SUFFIX);
    }

    @Override
    public ImageResponse genImg(String imgPrompt) {

        throw new RuntimeException(INFO_PREFIX + Thread.currentThread()
                .getStackTrace()[2].getMethodName() + INFO_SUFFIX);
    }

    @Override
    public String genAudio(String text) {

        throw new RuntimeException(INFO_PREFIX + Thread.currentThread()
                .getStackTrace()[2].getMethodName() + INFO_SUFFIX);
    }

    @Override
    public List<Double> textEmbedding(String text) {

        throw new RuntimeException(INFO_PREFIX + Thread.currentThread()
                .getStackTrace()[2].getMethodName() + INFO_SUFFIX);
    }

    @Override
    public String audioTranscription(String url) {

        throw new RuntimeException(INFO_PREFIX + Thread.currentThread()
                .getStackTrace()[2].getMethodName() + INFO_SUFFIX);
    }

}

models文件夹

创建工具类ActorFilms和Completion,代码如下

public class ActorsFilms {

    private String actor;

    private List<String> movies;

    public ActorsFilms() {
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    public List<String> getMovies() {
        return movies;
    }

    public void setMovies(List<String> movies) {
        this.movies = movies;
    }

    @Override
    public String toString() {
        return "ActorsFilms{" + "actor='" + actor + '\'' + ", movies=" + movies + '}';
    }

}
public class Completion {

    private final String completion;

    public Completion(String completion) {
        this.completion = completion;
    }

    public String getCompletion() {
        return completion;
    }

}

 helloworld文件夹(实现chatgpt聊天功能)

创建类TongYiSimpleServiceImpl

@Service
public class TongYiSimpleServiceImpl extends AbstractTongYiServiceImpl {
    private final ChatClient chatClient;

    private final StreamingChatClient streamingChatClient;
    @Autowired
    public TongYiSimpleServiceImpl(ChatClient chatClient, StreamingChatClient streamingChatClient) {
        this.chatClient = chatClient;
        this.streamingChatClient = streamingChatClient;
    }
    @Override
    public String completion(String message) {

        Prompt prompt = new Prompt(new UserMessage(message));

        return chatClient.call(prompt).getResult().getOutput().getContent();
    }

    @Override
    public Map<String, String> streamCompletion(String message) {

        StringBuilder fullContent = new StringBuilder();

        streamingChatClient.stream(new Prompt(message))
                .flatMap(chatResponse -> Flux.fromIterable(chatResponse.getResults()))
                .map(content -> content.getOutput().getContent())
                .doOnNext(fullContent::append)
                .last()
                .map(lastContent -> Map.of(message, fullContent.toString()))
                .block();


        return Map.of(message, fullContent.toString());
    }

}

image文件夹(实现文生图功能) 

 创建类TongYiImagesServiceImpl,代码如下

@Service
public class TongYiImagesServiceImpl extends AbstractTongYiServiceImpl {

    private final ImageClient imageModel;

    @Autowired
    public TongYiImagesServiceImpl(ImageClient imageModel) {

        this.imageModel = imageModel;
    }

    @Override
    public ImageResponse genImg(String imgPrompt) {

        var prompt = new ImagePrompt(imgPrompt);
        return imageModel.call(prompt);
    }
}

 controller文件夹

创建ChatController类

@RestController
public class ChatController {
    @Autowired
    @Qualifier("tongYiSimpleServiceImpl")
    private TongYiService tongYiSimpleService;

    @GetMapping("/example")
    public String completion(
            @RequestParam(value = "message", defaultValue = "Tell me a joke")
            String message
    ) {

        return tongYiSimpleService.completion(message);
    }
    @Autowired
    @Qualifier("tongYiImagesServiceImpl")
    private TongYiService tongYiImgService;

    @GetMapping("/img")
    public ImageResponse genImg(@RequestParam(value = "prompt",
            defaultValue = "Painting a picture of blue water and blue sky.") String imgPrompt) {

        return tongYiImgService.genImg(imgPrompt);
    }
}

进行测试

访问http://localhost:8080/example,设置message参数为自己想问ai的问题

访问http://localhost:8080/img,设置prompt参数为对目标图像的描述

总结

以上即为简易的实现,如有任何问题

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值