内容来自尚硅谷
文章目录
SpringAI
第一章 Spring AI简介
在当今这样一个快速发展的技术时代,人工智能(AI)已经成为各行各业的一种标配。而作为一款主流的Java应用开发框架Spring,肯定会紧跟时代的潮流,所以,推出了Spring AI框架。
1.1 Spring AI是什么
1.1.1 官网描述

- Spring AI是一个AI工程领域的应用程序框架;
- Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI 领域,并促进使用 POJO 作为应用程序的构建块到 AI 领域。
- 它的目标是将Spring生态系统的设计原则应用于 AI 领域,比如Spring生态系统的可移植性和模块化设计,并促进使用 POJO 作为应用程序的构建块到 AI 领域;
- Spring AI 的核心是提供了开发 AI 大模型应用所需的基本抽象模型,这些抽象拥有多种实现方式,使得开发者可以用很少的代码改动就能实现组件的轻松替换;
- 简言之,Spring AI 是一个 AI 工程师的应用框架,它提供了一个友好的 API 和开发 AI 应用的抽象,旨在简化 AI 大模型应用的开发工作。
1.1.2 发布版本

- 目前Spring AI 推出了一个稳定版(CURRENT)和一个快照版(SNAPSHOT),GA版尚未发布,大家可以提前学习,等GA版发布后再真正用在项目中。
SNAPSHOT指的是快照版,会在此版本上持续更新。
PRE指的是预览版,主要提供给开发测试人员找bug,不到修改完善的。
CURRENT指的是官方当前建议采用的版本。
GA指的是 General Availability,意为正式发布的版本,推荐使用(主要是稳定)。
1.2 Spring AI的主要功能
- 第一、 对主流 AI 大模型供应商提供了支持,比如:OpenAI、DeepSeek、Microsoft、Ollama、Amazon、Google HuggingFace等。
- 第二、 支持AI大模型类型包括:聊天、文本到图像、文本到声音等。
- 第三、 支持主流的Embedding Models(嵌入模型)和向量数据库,比如:Azure Vector Search、Chroma、Milvus、Neo4j、Redis、PineCone、PostgreSQL/PGVector 等。
- 第四、 把 AI 大模型输出映射到简单的 Java 对象(POJOs)上。
- 第五、 支持了函数调用(Function calling)功能。
- 第六、 为数据工程提供 ETL(数据抽取、转换和加载)框架。
- 第七、 支持 Spring Boot 自动配置和快速启动,便于运行 AI 模型和管理向量库。
第二章 Spring AI快速入门
2.1 准备工作
2.1.1 什么是DeepSeek
DeepSeek 是一款由深度求索所开发的 AI 人工智能大模型,其基于深度学习和多模态数据融合技术,采用先进的 Transformer 架构和跨模态协同算法,可实现对复杂文档和图像的自动化解析与结构化信息提取。
依托于最新推出的“深度思考”模式(R1),这款AI大模型在极低成本下实现了与国际顶尖模型ChatGPT-o1相媲美的性能表现,其中文理解与输出能力更是远超ChatGPT、Claude等顶尖模型。再加上极具竞争力的API定价和全面开源的策略,让这款AI大模型成功在国际上火爆出圈
如果说AI是一个广泛的概念,那么DeepSeek就是是AI领域中的一个具体产品。
DeepSeek的特点:
- 成本:DeepSeek致力于降低AI应用的成本。通过采用先进的技术和独特的模型架构,DeepSeek在保持高性能的同时,显著降低了推理和训练的成本。
- 性能:DeepSeek在性能上表现出色。它使用强化学习技术训练,推理过程中包含大量反思与验证,能够处理更加复杂的数据和任务。在一些benchmark测试中,其性能与OpenAI的模型相当,但推理成本远低于同类产品。
- 功能:DeepSeek擅长处理数学、编程和复杂逻辑推理等任务。它的推理能力源于深度思考特性,推理长度与准确率呈正相关。此外,DeepSeek还支持多模态信息处理,能够应对更加多样化的应用场景。
- 应用领域:DeepSeek在多个领域展现出巨大的应用潜力。无论是在医疗、教育、交通等传统领域,还是在智能制造、智慧城市等新兴领域,DeepSeek都有望发挥重要作用。
综上所述,AI是一个广泛的概念,涵盖了人工智能领域的所有技术和应用。而DeepSeek则是AI领域中的一个具体产品,它在成本、性能、功能和应用领域等方面都有着独特的特点和优势。两者之间的关系可以理解为:DeepSeek是AI领域中的一个具体实现和优秀代表。
如何使用Java集成DeepSeek:
DeepSeek 作为一款卓越的国产 AI 模型,越来越多的公司考虑在自己的应用中集成。对于 Java 应用来说,我们可以借助 Spring AI 集成 DeepSeek,非常简单方便!
2.1.2 DeepSeek开放平台创建API KEY
- 进入DeepSeek官网 https://www.deepseek.com/ 点击右上角的 API开放平台

-
进入API开放平台,注册用户

-
创建API key

-
根据自己需要,自行充值

-
Spring AI 的 openai starter 本质上是通过 RestTemplate 发请求

2.2 创建SpringBoot工程
2.2.1 引入依赖
- SpringAI对于SpringBoot和JDK的版本要求

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.example</groupId>
<artifactId>springai-deepseek</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<spring-ai.version>1.0.0-M5</spring-ai.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.2.2 创建配置文件
application.properties
server.port=8899
spring.application.name=spring-ai-deepseek-demo
spring.ai.openai.api-key=sk-139298b9e929496290******
spring.ai.openai.base-url=https://api.deepseek.com
spring.ai.openai.chat.options.model=deepseek-chat
spring.ai.openai.chat.options.temperature=0.7
-
temperature参数用于控制生成文本的多样性。具体来说:
值越高,生成的文本越多样化,但也可能包含更多的随机性和不可预测的内容。
值越低,生成的文本越接近于确定性的结果,即生成的文本会更加一致和可预测。
2.2.3 创建启动类
@SpringBootApplication
public class SpringAiDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAiDemoApplication.class, args);
}
}
2.2.4 创建Controller
@RestController
public class ChatDeepSeekController {
@Autowired
private OpenAiChatModel chatModel;
@GetMapping("/ai/generate")
public String generate(@RequestParam(value = "message", defaultValue = "hello")
String message) {
String response = this.chatModel.call(message);
System.out.println("response : "+response);
return response;
}
}
2.2.5 测试

第三章 Spring AI的聊天模型
3.1 概述
- Spring AI的聊天模型API为开发者提供了一条便捷通道,能够将强大的AI驱动的聊天完成功能无缝集成到各类应用中。借助预先训练的语言模型,如广为人知的GPT,它能够依据用户输入生成自然流畅、类人化的回复。这一API不仅工作机制高效,而且设计理念极为先进,旨在实现简单易用与高度可移植性,让开发者能以极少的代码改动在不同AI模型间自由切换,充分契合Spring框架一贯秉持的模块化与可互换性原则。
3.2 ChatClient接口
ChatClient 是一个接口,它定义了一个与聊天服务交互的客户端。这个接口主要用于创建聊天客户端对象,设置请求规范,以及发起聊天请求。
3.2.1 实现简单的对话
1 需求
用户输入设置用户消息的内容,通过SpringBoot AI封装的方法向 AI 模型发送请求,以字符串形式返回 AI 模型的响应。
2 编写Controller方法
@RestController
public class ChatDeepSeekController {
private final ChatClient chatClient;
public ChatDeepSeekController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
@GetMapping("/chat")
public String chat(@RequestParam(value = "msg",defaultValue = "给我讲个笑话")
String message) {
//prompt:提示词
return this.chatClient.prompt()
//用户输入的信息
.user(message)
//请求大模型
.call()
//返回文本
.content();
}
}
3 测试结果

4 总结
ChatClient 接口提供了构建和配置聊天客户端对象的灵活性,以及发起和处理聊天请求的能力。用户可以通过 ChatClient.Builder 来定制客户端的行为,然后使用 prompt() 和 prompt(Prompt prompt) 方法设置请求规范,最后通过 call() 方法发起聊天请求。
3.2.2 实现角色预设
1 配置默认角色
@Configuration
public class AIConfig {
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder.defaultSystem("你是尚硅谷教育的一名老师,你精通Java开发," +
"你的名字叫尚硅谷。").build();
}
}
2 编写controller
@RestController
@RequestMapping("/ai")
public class AIController {
@Autowired
private ChatClient chatClient;
@GetMapping("/chat")
public String chat(@RequestParam(value = "msg") String message) {
return chatClient.prompt().user(message).call().content();
}
}
3 测试结果

3.2.3 实现流式响应
1 call和stream的区别
(1)非流式输出 call:等待大模型把回答结果全部生成后输出给用户;
(2)流式输出stream:逐个字符输出,一方面符合大模型生成方式的本质,另一方面当模型推理效率不是很高时,流式输出比起全部生成后再输出大大提高用户体验。
2 编写Controller
@GetMapping(value = "/chat/stream",produces="text/html;charset=UTF-8")
public Flux<String> chatStream(@RequestParam(value = "msg") String message) {
return chatClient.prompt().user(message).stream().content();
}
3 测试结果

3.3 ChatModel接口
3.3.1 概述
ChatModel接口作为核心,定义了与AI模型交互的基本方法。它继承自Model<Prompt, ChatResponse>,提供了两个重载的call方法:
public interface ChatModel extends Model<Prompt, ChatResponse> {
default String call(String message) {
...}
@Override
ChatResponse call(Prompt prompt);
}
在ChatModel接口中,带有String参数的call()方法简化了实际的使用,避免了更复杂的Prompt和 ChatResponse类的复杂性。但是在实际应用程序中,更常见的是使用ChatResponse call()方法,该方法采用Prompt实例并返回ChatResponse。
我们使用的ChatClient底层是使用ChatModel作为属性的,在初始化ChatClient的时候可以指定ChatModel,这里我们直接看底层源码:
//ChatClient(部分构造器代码)
static ChatClient create(ChatModel chatModel) {
return<
Spring AI入门及高级应用详解


最低0.47元/天 解锁文章
3664

被折叠的 条评论
为什么被折叠?



