Bootstrap

Spring AI : 让ChatGPT成为你构建应用的核心亮点

本文是一篇介绍spring ai的文章,主要介绍了生成文本内容,以及读取图片中内容两个能力。

之所以介绍这两个能力,是因为 大模型目前最适合做的事情有两个:

1) 非结构化数据的结构化(图片转文字,转excel)

2) 基于结构化数据做文字和图片的输出

这两个能力可以有效的提高应用与用户的交互效率。

目录

Java接入大模型

Spring AI:统一接口的Java大模型应用框架

Spring AI Alibaba概览

通义千问Qwen简介:阿里巴巴云开发的先进语言模型,在MMLU、TheoremQA和GPQA等多项权威评测中超越Llama 3 70B,位居Hugging Face开源大模型排行榜榜首,展现出色性能与广泛应用前景。

SpringBoot集成Spring AI Alibaba实现对话模型

环境要求

申请API Key

配置环境变量与项目属性

添加仓库和依赖

创建Controller类

使用Spring AI Alibaba实现图像识别的详尽示例

1. 前置准备

2. 申请开通资源

3. 配置百炼 API KEY

4. 开通通义万象图像生成模型

5. 添加Spring仓库和依赖

6. 构建读图代码

7. 运行项目

Spring AI 介绍:

当前在Java中调用大模型时,往往缺乏一个成熟且易于使用的AI应用框架。为了解决这个问题,Spring作为老牌的Java应用框架厂商,推出了Spring AI。它借鉴了langchain的一些核心设计理念,并结合了Java面向对象编程的优势,旨在提供一种更高效、灵活的方式来与各种大模型进行交互。Spring AI的核心优势在于其统一了不同AI服务提供商(如OpenAI、阿里云等)的接口实现,使得开发者只需编写一次代码,通过简单的配置更改即可轻松切换至不同的AI实现,极大地提升了开发效率和可维护性。此外,该框架还有专门的团队负责维护和更新。本次示例将以Spring AI Alibaba接入通义大模型为例,展示如何利用这一强大工具来快速构建基于Java的大模型应用;当然,在熟悉整个过程后,开发者也可以根据自身需求,方便地替换为自己所需的其他大模型支持。

Spring AI Alibaba简介:

Spring AI Alibaba是Spring AI针对阿里云生态的实现,它继承了Spring生态系统的设计原则如可移植性和模块化设计,并专注于将这些原则应用于AI领域。作为国内最好的Spring AI实现之一,Spring AI Alibaba整合了阿里巴巴的最佳实践,提供了与Spring Cloud Alibaba相似的集成度和易用性。通过Spring AI Alibaba,开发者能够轻松地在应用程序中接入各种AI能力,包括但不限于模型调用、Prompt模板、RAG(检索增强生成)、文生图以及文字识别等。本文将以Prompt模板和模型调用为例,展示如何利用Spring AI Alibaba来丰富您的项目功能。

通义千问Qwen简介:

通义千问Qwen是阿里巴巴云推出的一种先进的语言模型,在多个权威基准测评中表现出色。它在MMLU、TheoremQA和GPQA等评测指标上超越了Llama 3 70B,并在Hugging Face的开源大模型排行榜Open LLM Leaderboard上位居第一,展示了其卓越的性能和广泛的应用潜力。

另外,在真人参与评测的arena里面,它不仅在思南平台 上仅次于国际知名的GPT和Claude系列,还在 Hugging Face的视觉模型竞技场 中稳居中国首位。

SpringBoot集成Spring AI Alibaba实现对话模型

为了基于Spring Boot集成Spring AI Alibaba,并完成一个简单的对话模型,构建支持prompt的流返回接口的项目,你需要按照以下步骤进行操作。根据提供的我了解的信息,以下是详细的执行步骤:

环境要求

  • JDK版本需要在17(含)以上。
  • Spring Boot版本需在3.3.x以上。

申请API Key

首先,前往阿里云百炼页面开通“百炼大模型推理”服务,并创建一个新的API Key。请记录下这个Key,之后将它配置到你的项目中。

配置环境变量与项目属性

设置环境变量以存储您的API Key:

export AI_DASHSCOPE_API_KEY=${REPLACE-WITH-VALID-API-KEY}

并在application.properties文件中加入API Key配置:

spring.ai.dashscope.api-key: ${AI_DASHSCOPE_API_KEY}

添加仓库和依赖

由于Spring AI Alibaba相关的库还未提交到Maven中央仓库,您需要添加Spring自有的仓库及快照仓库到您的pom.xml文件里:

<repositories>
    <repository>
        <id>sonatype-snapshots</id>

        <url>https://oss.sonatype.org/content/repositories/snapshots</url>

        <snapshots>
            <enabled>true</enabled>

        </snapshots>

    </repository>

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

同时,在dependencies部分添加对spring-ai-alibaba-starter的依赖:

<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>

    <artifactId>spring-ai-alibaba-starter</artifactId>

    <version>1.0.0-M2</version>

</dependency>

创建Controller类

定义一个Controller类来处理GET请求,该请求将接收用户输入并通过ChatClient调用通义千问模型,最后返回Flux形式的结果。记得启用跨域资源共享(CORS)以允许来自不同源的请求。

@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*") // 允许所有来源的CORS
public class ChatController {

    private final ChatClient chatClient;
    
    @Value("classpath:correct-and-expand.st")
    Resource resource;

    public ChatController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping("/steamChat")
    public Flux<String> steamChat(@RequestParam String input) {
        PromptTemplate promptTemplate = new PromptTemplate(resource);
        Prompt prompt = promptTemplate.create(Map.of("input", input));
        
        return chatClient.prompt(prompt)
                .stream()
                .content();
    }
}

这段代码首先注入了ChatClient实例,然后通过构造函数接受一个Prompt模板路径用于动态生成提示内容。当访问/ai/steamChat?input=...时,会根据传入参数调用AI模型并以流的形式返回结果。

确保已经正确设置了项目的入口点以及相关配置后,启动应用程序。现在,你应该能够通过指定的URL向聊天机器人发送消息,并获得相应的回复了。

此解决方案充分利用了Spring AI Alibaba提供的功能,包括但不限于使用ChatClient进行文本生成、应用Prompt模板定制化输入以及利用Stream API实现异步响应。

使用Spring AI Alibaba实现图像识别的详尽示例

1. 前置准备

在开始之前,请确保满足以下条件:

  • JDK版本为JDK 17或更高。
  • Spring Boot版本为3.3.x或更高。

2. 申请开通资源

  1. 访问阿里云百炼页面并登录您的阿里云账号。
  1. 选择开通“百炼大模型推理”服务,并等待开通成功的短信通知。
  1. 开通成功后,再次登录阿里云百炼页面,点击右上角的小人图标,选择API-KEY选项,然后点击【创建新的API-KEY】生成一个API-KEY。请记录这个key,后续需要配置使用。

3. 配置百炼 API KEY

在终端中运行以下命令来配置百炼 API KEY:

export AI_DASHSCOPE_API_KEY=${REPLACE-WITH-VALID-API-KEY}

${REPLACE-WITH-VALID-API-KEY}替换为您实际的API-KEY值。

4. 开通通义万象图像生成模型

  1. 打开百炼控制台
  1. 在左侧列表栏中选择模型广场,找到图像生成模块下的通义万象模型。
  1. 点击通义万象模型对应的“API调用”按钮。
  1. 在打开的页面左上角,找到模型英文名(qwen-vl-max-latest),这是后面配置时需要指定的模型名称。

5. 添加Spring仓库和依赖

首先,在项目的pom.xml文件中添加Spring自己的仓库以及snapshot仓库,如下所示:

<repositories>
    <repository>
      <id>sonatype-snapshots</id>

      <url>https://oss.sonatype.org/content/repositories/snapshots</url>

      <snapshots>
        <enabled>true</enabled>

      </snapshots>

    </repository>

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

接着,在pom.xml文件中添加spring-ai-alibaba-starter依赖项以及Spring Boot的父依赖项:

<parent>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>3.3.4</version>

    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
      <groupId>com.alibaba.cloud.ai</groupId>

      <artifactId>spring-ai-alibaba-starter</artifactId>

      <version>1.0.0-M3.1</version>

    </dependency>

    ...other dependencies...
</dependencies>

6. 构建读图代码

创建一个新的Controller类ChatModelController,并在其中注入ChatClient实例。同时设置默认Prompt为“识别图中的文字”,默认模型为“qwen-vl-max-latest”。

@RestController
@RequestMapping("/ai")
public class ChatModelController {

    private static final Logger logger = LoggerFactory.getLogger(ChatModelController.class);

    @Value("classpath:qrcode.png")
    private Resource imageResource;

    private final ChatModel chatModel;

    public ChatModelController(ChatModel chatModel) {
        this.chatModel = chatModel;
    }

    private static final String DEFAULT_PROMPT = "识别图中的文字";

    private static final String DEFAULT_MODEL = "qwen-vl-max-latest";

    @GetMapping("/imageRecognition")
    public Flux<String> imageRecognition(
            @RequestParam(value = "prompt", required = false, defaultValue = DEFAULT_PROMPT) String prompt,
            HttpServletResponse response)
            throws Exception {
        response.setCharacterEncoding("UTF-8");

        List<Media> mediaList = List.of(
                new Media(
                        MimeTypeUtils.IMAGE_PNG,
                        imageResource));
        UserMessage message = new UserMessage(prompt, mediaList);
        message.getMetadata().put(DashScopeChatModel.MESSAGE_FORMAT, MessageFormat.IMAGE);

        Flux<ChatResponse> fluxResponse = chatModel.stream(
                new Prompt(
                        message,
                        DashScopeChatOptions.builder()
                                .withModel(DEFAULT_MODEL)
                                .withMultiModel(true)
                                .build()));
        Flux<String> fluxString = fluxResponse.map(resp -> resp.getResult().getOutput().getContent());
        return fluxString;
    }
}

确保将二维码图片命名为qrcode.png,并将其放置在src/main/resources/目录下。

7. 运行项目

完成上述步骤后,您可以启动项目并访问http://localhost:8080/ai/imageRecognition来让模型识别本地二维码图片,并以流式返回结果。

通过以上详细步骤,您就可以基于Spring AI Alibaba实现二维码图像识别功能了。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;