5分钟搞定:Spring AI支持SpringBoot快速构建人工智能AI应用_springai_springboot_AI应用

通过阅读这篇文章,你将了解Spring AI, 它是一个借鉴了langchain的设计理念,并结合Java的优势,为开发者提供易于替换实现的统一接口。

此外,文章还基于 Spring AI的 模型调用和Prompt模板 ,构建一个可操作的示例,让你可以快速的了解具体怎么在springboot的环境下 使用spring ai 来构建人工智能AI的应用

Spring AI:简化Java大模型集成的统一框架

在Java调用大模型时,缺少一个良好的AI应用框架支持,导致开发者需要频繁查阅不同提供商的文档,增加了开发难度。Spring作为成熟的Java应用框架供应商,推出了Spring AI以解决这一问题。它借鉴了langchain的一些设计理念,并结合了Java面向对象编程的优势,提供了统一接口、易于替换实现的特点。此外,还有专门团队负责维护和更新。例如,通过Spring AI Alibaba接入阿里云通义大模型,开发者可以轻松地利用该框架来添加AI能力到自己的项目中。一旦掌握了如何使用Spring AI与通义合作,将同样适用于其他大模型实现,只需简单更改配置即可。这使得基于Java构建的大模型应用变得更加灵活且易于管理。

Spring AI Alibaba功能概览与使用指南

Spring AI Alibaba 是基于 Spring AI 的一个实现,专为整合阿里云的AI能力而设计。它继承了Spring AI的核心优势,如可移植性和模块化设计,并特别针对国内开发者的需求进行了优化。作为国内最好的Spring AI实现之一,Spring AI Alibaba不仅提供了与Spring Cloud Alibaba相似的最佳实践集成,还支持多种强大的功能和能力,比如模型调用、Prompt模板、RAG(Retrieval-Augmented Generation)、文生图以及文字识别等。通过使用Spring AI Alibaba,开发者可以轻松地在自己的项目中引入这些先进的AI特性,简化开发流程并提高效率。本文将重点介绍如何利用Prompt模板和模型调用来接入Spring AI Alibaba。

阿里巴巴云开发的通义千问Qwen:在多个评测中表现出色并位居榜首

通义千问Qwen是阿里巴巴云开发的预训练模型,在多个基准测评中表现出色。在MMLU、TheoremQA和GPQA等评测指标上,Qwen超越了Llama 3 70B, 这些指标都是国际公认的大模型评测指标。

在Hugging Face开源大模型排行榜Open LLM Leaderboard上位居榜首,展示了其卓越的能力。

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

使用SpringBoot集成Spring AI Alibaba

要基于Spring Boot集成Spring AI Alibaba,并完成一个简单的对话模型,构建支持prompt的流返回接口项目,我们需要遵循一定的步骤来确保配置和代码的完整性。以下将详细介绍如何实现这一目标,包括环境设置、必要的依赖添加以及具体的Controller实现。

环境要求
  • JDK版本需为17或更高。
  • Spring Boot版本需为3.3.x或以上。
申请API Key

首先需要在阿里云平台获取通义千问(或其他所需大模型)的API Key:

  1. 访问阿里云百炼页面并登录账号。
  1. 开通“百炼大模型推理”服务。
  1. 创建新的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-starter尚未发布到Maven中央仓库,因此您需要手动添加Spring及其快照仓库以访问相关依赖:

<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的依赖:

<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-M2</version>

    </dependency>

    <!-- 其他依赖 -->
</dependencies>
编写Controller

创建一个新的Controller类,注入ChatClient实例,并实现一个GET请求处理方法来响应客户端的消息输入。这里我们还启用了跨域资源共享(CORS),使得前端可以更方便地与后端交互。

@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*")  // 启用CORS
public class ChatController {

    private final ChatClient chatClient;

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

    @GetMapping(value = "/steamChat")
    public Flux<String> steamChat(@RequestParam String input) {
        return chatClient.prompt().user(input).stream().content();
    }
}

通过上述配置与代码实现,您就建立了一个基本的基于Spring Boot的聊天应用,它利用了Spring AI Alibaba提供的ChatClient功能来生成回复,并且能够以流式方式返回数据给调用者。此外,该应用还支持CORS,允许从不同源发起的请求进行通信。最后,请确保你的应用程序运行在http://localhost:8080/上,以便通过http://localhost:8080/ai/steamChat?input=... URL正确访问这个新创建的服务。

### 使用 Spring Boot 对接 Dify 实现文本生成图像和图像生成图像功能 为了实现这一目标,首先需要创建一个新的 Spring Boot 项目,并确保其配置能够支持外部 API 的调用。建议使用 Spring Initializr 创建新项目,推荐版本为 3.2.x 或更高版本以获得最新的特性和更好的兼容性[^1]。 #### 添加必要的依赖项 除了标准的 Spring Boot Starter 外,还需要引入用于处理 HTTP 请求的相关库以及可能涉及图片操作的库。对于与 Dify 平台对接的需求来说,可以考虑添加如下 Maven 依赖: ```xml <dependencies> <!-- Spring Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JSON Processing --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <!-- Apache HttpClient for making REST calls --> <dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> </dependency> <!-- Image processing library (optional, depending on requirements) --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.17</version> </dependency> <!-- AI integration starter from previous example --> <dependency> <groupId>io.springboot.ai</groupId> <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> <version>1.0.3</version> </dependency> </dependencies> ``` 上述代码片段展示了如何通过 Maven 配置文件来增加所需的 Java 库,以便于后续开发工作中的数据交换和服务交互[^2]。 #### 编写服务类进行API请求封装 接下来定义一个名为 `DifyService` 的组件,在其中编写方法用来发送 POST 请求给 Dify 提供的服务端点,从而完成文字转图或图片转换的任务。这里假设已经获取到了有效的 API Key 和 URL 地址作为环境变量注入到应用程序中。 ```java @Service public class DifyService { private final RestTemplate restTemplate; private static final String BASE_URL = "https://api.dify.com"; private static final String TEXT_TO_IMAGE_ENDPOINT = "/text-to-image"; private static final String IMAGE_TO_IMAGE_ENDPOINT = "/image-to-image"; @Value("${dify.api.key}") private String apiKey; public DifyService(RestTemplateBuilder restTemplateBuilder){ this.restTemplate = restTemplateBuilder.build(); } /** * Convert text into an image using the provided prompt. */ public ResponseEntity<byte[]> convertTextToImage(String prompt){ HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setBearerAuth(apiKey); Map<String,Object> body = new HashMap<>(); body.put("prompt", prompt); HttpEntity<Map<String,Object>> request = new HttpEntity<>(body,headers); return restTemplate.postForEntity(BASE_URL + TEXT_TO_IMAGE_ENDPOINT,request,byte[].class); } /** * Transform one image to another based on certain parameters. */ public ResponseEntity<byte[]> transformImage(MultipartFile file,MultipartFile maskFile){ // Implementation details depend heavily upon what exactly is required by Dify's endpoint throw new UnsupportedOperationException("Not implemented yet."); } } ``` 这段 Java 代码实现了两个主要的方法:一个是基于输入的文字提示 (`String`) 来生成对应的图形;另一个则是接收原始图片和其他参数来进行变换操作。注意实际应用时需按照官方文档调整具体的接口路径及参数设置。 #### 控制器层暴露RESTful接口 为了让前端或者其他系统能方便地访问这些能力,可以在控制器层面设计相应的路由映射函数。下面是一个简单的例子说明怎样构建这样的入口点。 ```java @RestController @RequestMapping("/api/dify") @RequiredArgsConstructor public class DifyController { private final DifyService difyService; @PostMapping("/convert/text/image") public ResponseEntity<Resource> convertTextToImage(@RequestParam String prompt)throws IOException{ byte[] imageData = Objects.requireNonNull(difyService.convertTextToImage(prompt).getBody()); ByteArrayResource resource = new ByteArrayResource(imageData); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION,"attachment;filename=image.png") .contentType(MediaType.IMAGE_PNG) .contentLength(imageData.length) .body(resource); } @PostMapping("/transform/image") public void transformImage(/* Parameters */){ // To be defined according to actual needs and implementation of service method } } ``` 此部分提供了对外部系统的接入方式,允许它们提交待处理的数据并通过返回的结果得知执行状态或下载产物。具体细节会依据业务逻辑有所变化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值