SpringAI学习(1)
SpringAI为Java开发者提供了便捷的AI集成方案,本文介绍了其快速入门方法:首先配置SpringBoot环境和DeepSeek API密钥,通过OpenAiChatModel实现基础对话功能;然后探讨了ChatClient接口的使用、角色预设实现和流式响应处理;最后解析了底层ChatModel接口设计。通过示例代码展示了如何在Spring项目中快速集成AI能力,为后续深入学习SpringA
前言
随着人工智能技术的快速发展,Spring生态也迎来了自己的AI模块——Spring AI。作为Java开发者,我们现在可以在熟悉的Spring环境中轻松集成各种AI能力。本文将带你快速入门Spring AI,并展示如何将其应用到实际项目中。
一、Spring AI简介
Spring AI是Spring官方推出的AI项目,旨在为Java开发者提供简单、一致的API来访问各种人工智能模型和服务。它的核心特点包括:
统一API:屏蔽不同AI提供商的技术细节
模块化设计:可按需引入特定功能
Spring风格:与Spring生态无缝集成
多模型支持:OpenAI、Azure OpenAI、HuggingFace等
官网: https://spring.io/projects/spring-ai

二、准备开发环境
(1)准备开发的大模型
以deepseek为例,去到其大模型API平台DeepSeek 开放平台,在其中获取自己的key

(注意创建出来的时候要保存,关掉窗口后将无法查看)
(2)准备springboot环境
首先创建一个普通的java工程,接下来导入maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<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>
之后进行环境配置,创建application.propeties
server.port=8899 spring.application.name=spring-ai-deepseek spring.ai.openai.api-key= #####你的key值 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
三 快速入门
环境配置好后,我们就可以进行一个简单的测验
创建DeepSeekController
@RestController
@RequestMapping("/deepseek")
public class DeepSeekController {
// DeepSeek AI 的 ChatModel
@Autowired
private OpenAiChatModel openAiChatModel;
@GetMapping("/ai/generate")
public String generate(@RequestParam(value = "message",
defaultValue = "hello") String message){
// 调用 DeepSeek AI 生成文本
String call = openAiChatModel.call(message);
System.out.println(call);
return call;
}
}
测试,可以添加knife4j依赖,生成一个接口文档,地址为localhost:你程序的ip/doc.html
<!-- 前后端分离中的后端接口测试工具,会生成一个接口文档 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
启动SpringAiDemoApplication,在文档中进行测试

可以看出deepseek给出了自己的回答,我们的快速入门成功
四 Spring AI的聊天模型
Spring AI 提供了一套简洁而强大的聊天模型接口,让开发者能够轻松集成各种AI聊天能力到Java应用中。下面我将介绍Spring AI的聊天模型接口及其使用方法。
(1)ChatClient接口
ChatClient 是一个接口,它定义了一个与聊天服务交互的客户端。这个接口主要用于创建聊天客户端对象,设置请求规范,以及发起聊天请求。
具体代码:
@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();
}
}
最后测试得知也同样可行,但是大家发现没有我们现在的chatclient初始化很麻烦所以可以写一个config,之后就可以实现便捷注入
//用于chatClient的构建
@Configuration
public class AIConfig {
@Bean
public ChatClient chatClient(ChatClient.Builder chatClientBuilder) {
// 创建 ChatClient.Builder 实例
return chatClientBuilder.build();
}
}
(2) 实现角色预设
Spring AI 提供了强大的角色预设(Persona)功能,允许开发者定义AI助手的角色、行为和响应风格。这个功能对于构建专业领域的对话系统特别有用。
实现方式:在config中配置
//用于chatClient的构建
@Configuration
public class AIConfig {
@Bean
public ChatClient chatClient(ChatClient.Builder chatClientBuilder) {
// 创建 ChatClient.Builder 实例
return chatClientBuilder.defaultSystem("你是一个医生").build();
}
}

回答了相应的答案 ,说明我们的身份预设有用
(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();
}
(4)Chatmodel模型
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 create(chatModel, ObservationRegistry.NOOP);
}
今天就学了这么多,下次继续学习
更多推荐


所有评论(0)