SpringAI的简单理解
SpringAI
Spring AI 是 Spring 官方针对人工智能(AI)应用开发推出的标准化框架。
它的核心宗旨是将 Spring 开发者熟悉的“依赖注入、统一抽象、声明式配置、面向接口编程”等生态优势,完美复刻到 AI 和大模型开发领域。
Java 程序员,想在项目里接入大模型、搞 RAG 知识库或者搞 Agent,Spring AI 就是量身定制的大模型开发脚手架。
Spring AI 如何调用模型
Spring AI 推荐使用 ChatClient;Spring Boot 会根据 starter 和配置自动创建 ChatModel、EmbeddingModel 与 ChatClient.Builder。
1. Maven 依赖
使用 Ollama:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>2.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
</dependencies>
该 starter 同时提供 Ollama Chat 和 Embedding 自动配置。Spring AI Ollama 文档
2. 模型配置
application.yml:
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
options:
model: qwen3:8b
temperature: 0.7
embedding:
options:
model: qwen3-embedding:0.6b
确保本地已经存在模型,模型下载详情见:https://blog.csdn.net/sinat_32502451/article/details/163534744
ollama pull qwen3:8b
ollama pull qwen3-embedding:0.6b
3. 使用 ChatClient 调用模型
package com.example.ai;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
@Service
public class AiChatService {
private final ChatClient chatClient;
public AiChatService(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
/**
* 同步调用模型。
*/
public String chat(String question) {
return chatClient.prompt()
.user(question)
.call()
.content();
}
/**
* 携带系统提示词调用模型。
*/
public String chat(String systemPrompt, String question) {
return chatClient.prompt()
.system(systemPrompt)
.user(question)
.call()
.content();
}
/**
* 流式调用模型。
*/
public Flux<String> stream(String question) {
return chatClient.prompt()
.user(question)
.stream()
.content();
}
}
核心调用只有:
String answer = chatClient.prompt()
.system("你是一个 Java 技术助手")
.user("介绍一下 Spring AI")
.call()
.content();
各方法含义:
prompt():创建一次模型请求。system():设置系统提示词。user():设置用户消息。call():同步调用模型。stream():流式调用模型。content():取得模型返回的文本。
4. 提供 REST 接口
package com.example.ai;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
@RestController
@RequestMapping("/api/ai")
public class AiController {
private final AiChatService aiChatService;
public AiController(AiChatService aiChatService) {
this.aiChatService = aiChatService;
}
/**
* 普通问答。
*/
@GetMapping("/chat")
public String chat(@RequestParam String question) {
return aiChatService.chat(question);
}
/**
* 流式问答。
*/
@GetMapping(
value = "/stream",
produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> stream(@RequestParam String question) {
return aiChatService.stream(question);
}
}
普通调用:
curl 'http://localhost:8080/api/ai/chat?question=介绍一下Spring%20AI'
流式调用:
curl -N 'http://localhost:8080/api/ai/stream?question=介绍一下Spring%20AI'
5. 使用底层 ChatModel
ChatClient 底层使用的是 ChatModel。如果需要更直接地控制调用,可以直接注入:
package com.example.ai;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.stereotype.Service;
@Service
public class LowLevelChatService {
private final ChatModel chatModel;
public LowLevelChatService(ChatModel chatModel) {
this.chatModel = chatModel;
}
/**
* 直接通过 ChatModel 调用模型。
*/
public String chat(String question) {
Prompt prompt = new Prompt(question);
ChatResponse response = chatModel.call(prompt);
return response.getResult()
.getOutput()
.getText();
}
}
也可以显式构造消息:
import java.util.List;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
SystemMessage systemMessage =
new SystemMessage("你是一个 Java 技术助手");
UserMessage userMessage =
new UserMessage("Spring AI 是什么?");
Prompt prompt = new Prompt(List.of(
systemMessage,
userMessage));
ChatResponse response = chatModel.call(prompt);
String answer = response.getResult()
.getOutput()
.getText();
6. 调用 Embedding 模型
Spring Boot 同样会自动创建 EmbeddingModel。Spring AI Ollama Embedding 文档
package com.example.ai;
import java.util.List;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.stereotype.Service;
@Service
public class AiEmbeddingService {
private final EmbeddingModel embeddingModel;
public AiEmbeddingService(EmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
/**
* 将一段文本转换为向量。
*/
public float[] embed(String text) {
return embeddingModel.embed(text);
}
/**
* 批量将文本转换为向量。
*/
public List<float[]> embedAll(List<String> texts) {
return embeddingModel.embed(texts);
}
}
使用:
float[] vector = aiEmbeddingService.embed("Spring AI 模型调用示例");
System.out.println(vector.length);
底层交互过程
Java 代码:
chatClient.prompt()
.user("你好")
.call()
.content();
Spring AI 内部执行:
ChatClient
↓
OllamaChatModel
↓
将 Prompt 转换成 Ollama JSON 请求
↓
POST http://localhost:11434/api/chat
↓
Ollama 调用 qwen3:8b
↓
JSON 响应转换为 ChatResponse
↓
content() 返回文本
Embedding 调用则是:
EmbeddingModel.embed(text)
↓
OllamaEmbeddingModel
↓
POST http://localhost:11434/api/embed
↓
qwen3-embedding:0.6b
↓
返回 float[] 向量
Java 业务代码本身是供应商无关的。以后切换到 OpenAI、Azure OpenAI 或其他模型时,通常只需要更换 starter 和 application.yml,ChatClient、ChatModel、EmbeddingModel 的调用代码可以保持不变。
资料
spring-ai官方文档: https://docs.spring.io/spring-ai/reference/index.html
浙公网安备 33010602011771号