Spring AI 开发 - 快速入门

先看效果

项目搭建

Spring AI 是 Spring 推出的一个项目,目标是提供统一的API抽象层,屏蔽不同AI模型和服务的底层差异,实现跨平台兼容性。

演示使用的模型是阿里的 qwq-32b。

环境要求:

JDK :17以上(包括17)

Spring Boot 版本:目前支持 3.4.X,3.5.X 发布后也会同步支持。

主要的 maven 依赖

XML 复制代码
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
    <version>1.0.0-M6</version>
</dependency>

配置文件:

qwq-32b的接口类似于**openai ,**所以直接使用 openai 的配置即可,其他类 openai 的模型也是类似。

java 复制代码
spring:
  ai:
    openai:
      api-key: #申请的 key
      base-url: https://dashscope.aliyuncs.com/compatible-mode #api地址
      chat:
        options:
          model: qwq-32b # 模型名称

编写接口

创建 ChatClient。ChatClient 提供了与 AI 模型通信的 Fluent API,它支持同步和反应式(Reactive)编程模型。

java 复制代码
this.chatClient = ChatClient.builder(chatModel)
        .defaultSystem(DEFAULT_PROMPT)
        .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
        .defaultAdvisors(new SimpleLoggerAdvisor())
        .defaultOptions(OpenAiChatOptions.builder().temperature(0.7d).build())
        .build();

创建接口,使用 SSE 响应结果,SSE 是一个单向的、从服务端向客户端推送数据的技术。使用SSE可以实时的将大模型的结果推送到前端。

java 复制代码
@GetMapping
public SseEmitter chat(String message) {
    SseEmitter emitter = new SseEmitter();
    // 先把结果返回,后续逐渐响应结果
    CompletableFuture.runAsync(() -> {
        chatClient.prompt(message).stream()
                .content()
                .doOnComplete(emitter::complete)
                .subscribe(result -> {
                    try {
                        emitter.send(result);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                });
    });


    return emitter;
}

完整的接口代码如下:

java 复制代码
package cn.salim.ai.controller;


import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;


import java.io.IOException;
import java.util.concurrent.CompletableFuture;


@RestController
@RequestMapping("ai")
public class AiController {
    private static final String DEFAULT_PROMPT = "你是一个资深Java程序员,你熟悉各种JAVA框架,包括SpringBoot、Mybatis等等";


    private final ChatClient chatClient;


    public AiController(OpenAiChatModel chatModel) {
        this.chatClient = ChatClient.builder(chatModel)
                .defaultSystem(DEFAULT_PROMPT)
                .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
                .defaultAdvisors(new SimpleLoggerAdvisor())
                .defaultOptions(OpenAiChatOptions.builder().temperature(0.7d).build())
                .build();
    }




    @GetMapping
    public SseEmitter chat(String message) {
        SseEmitter emitter = new SseEmitter();


        CompletableFuture.runAsync(() -> {
            chatClient.prompt(message).stream()
                    .content()
                    .doOnComplete(emitter::complete)
                    .subscribe(result -> {
                        try {
                            emitter.send(result);
                        } catch (IOException e) {
                            throw new RuntimeException(e);
                        }
                    });
        });


        return emitter;
    }




}
相关推荐
扫地的小何尚8 分钟前
NVIDIA Dynamo深度解析:如何优雅地解决LLM推理中的KV缓存瓶颈
开发语言·人工智能·深度学习·机器学习·缓存·llm·nvidia
野犬寒鸦8 分钟前
多级缓存架构:性能与数据一致性的平衡处理(原理及优势详解+项目实战)
java·服务器·redis·后端·缓存
帧栈2 小时前
开发避坑指南(58):Java Stream 按List元素属性分组实战指南
java
Da Da 泓3 小时前
LinkedList模拟实现
java·开发语言·数据结构·学习·算法
张较瘦_3 小时前
[论文阅读] AI赋能 | 当AI看懂交通摄像头:多模态大模型零样本检测的实战报告
论文阅读·人工智能
海琴烟Sunshine3 小时前
Leetcode 14. 最长公共前缀
java·服务器·leetcode
cxr8283 小时前
BMAD框架实践:掌握story-checklist提升用户故事质量
前端·人工智能·agi·智能体·ai赋能
城管不管3 小时前
Lambda
java
龙茶清欢4 小时前
5、urbane-commerce 微服务统一依赖版本管理规范
java·运维·微服务
Dongsheng_20194 小时前
【汽车篇】AI深度学习在汽车零部件外观检测——机电轴承的应用
人工智能·深度学习·汽车