当前位置: 首页 > ds >正文

Spring AI 开发 - 快速入门

先看效果

项目搭建

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

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

环境要求:

JDK :17以上(包括17)

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

主要的 maven 依赖

<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 的模型也是类似。

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

编写接口

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

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可以实时的将大模型的结果推送到前端。

@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;
}

完整的接口代码如下:

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();}@GetMappingpublic 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;}}

http://www.xdnf.cn/news/479.html

相关文章:

  • 让机器学习更透明:使用 Python 开发可解释性模型工具包
  • 检索增强生成(RAG)系统的技术演进、核心架构与优化实践
  • Python语法系列博客 · 第5期[特殊字符] 模块与包的导入:构建更大的程序结构
  • 验证Kubernetes的服务发现机制
  • 【信息系统项目管理师】高分论文:论信息系统项目的干系人管理(ERP运营管理系统)
  • 大模型如何重塑未来:从技术突破到商业应用
  • leetcode0113. 路径总和 II - medium
  • Linux系统:详解进程等待wait与waitpid解决僵尸进程
  • cJSON_Print 和 cJSON_PrintUnformatted的区别
  • MinnowBoard MAX单板UEFI BIOS代码编译教程
  • 使用AOP完成添加日志
  • 【AI提示词】IT专家顾问
  • 文件上传及验证绕过漏洞
  • Delphi 常用关键字收录
  • 基础智能体的进展与挑战第 6 章【情绪建模】
  • Python遥感开发之Hurst指数的实现
  • Zookeeper的典型应用场景?
  • Keil MDK中禁用半主机(No Semihosting)
  • 齐次坐标变换+Unity矩阵变换
  • 【Tauri2】026——Tauri+Webassembly
  • 代谢组数据分析(二十四):基于tidymass包从质谱原始数据到代谢物注释结果的实践指南
  • vue3 watch和watchEffect 的用法和区别
  • 计算机视觉算法实现——智能座椅坐姿识别
  • 基于GRPO将QWEN训练为和deepseek一样的推理模型!
  • linux kernel irq相关函数详解
  • 国产的 Java Solon v3.2.0 发布(央企信创的优选)
  • Day10【基于encoder- decoder架构实现新闻文本摘要的提取】
  • 第3章 垃圾收集器与内存分配策略《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》
  • 从0开发一个unibest+vue3项目,使用vscode编辑器开发,总结vue2升vue3项目开始,小白前期遇到的问题
  • Flask应用部署通用指南