一、Google VertexAI API
VertexAI API 通过最少的机器学习专业知识和工作量,提供高质量的定制机器学习模型。
Spring AI 通过以下客户端与 VertexAI API 集成:
VertexAI Gemini 对话模型
二、VertexAI Gemini 对话模型
Vertex AI Gemini API 允许开发者使用 Gemini 模型构建生成式 AI 应用程序。Vertex AI Gemini API 支持多模态提示作为输入,并输出文本或代码。多模态模型是能够处理来自多种模态信息的模型,包括图像、视频和文本。例如,您可以向模型发送一盘饼干的照片,并让它给出这些饼干的配方。
Gemini 是由 Google DeepMind 开发的生成式 AI 模型系列,专为多模态用例设计。Gemini API 让您能够访问 Gemini 2.0 Flash 和 Gemini 2.0 Flash-Lite。有关 Vertex AI Gemini API 模型的规格,请参阅 模型信息。
Gemini API 参考
三、先决条件
安装适用于您操作系统的 gcloud CLI。
运行以下命令进行身份验证。将 PROJECT_ID 替换为您的 Google Cloud 项目 ID,将 ACCOUNT 替换为您的 Google Cloud 用户名。
gcloud config set project <PROJECT_ID> &&
gcloud auth application-default login <ACCOUNT>
四、自动配置
Spring AI 的自动配置和 starter 模块的工件名称发生了重大变化。更多信息请参考升级说明。
Spring AI 为 VertexAI Gemini 聊天客户端提供了 Spring Boot 自动配置。要启用它,请将以下依赖项添加到项目的 Maven pom.xml 或 Gradle build.gradle 构建文件中:
Maven
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-vertex-ai-gemini</artifactId>
</dependency>
Gradle
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-vertex-ai-gemini'
}
请参阅 “依赖管理” 部分,将 Spring AI BOM 添加到您的构建文件中。
4.1 聊天属性
聊天自动配置的启用和禁用现在通过前缀为 spring.ai.model.chat 的顶级属性进行配置。
要启用:spring.ai.model.chat=vertexai(默认已启用)。
要禁用:spring.ai.model.chat=none(或任何不匹配 vertexai 的值)。
此项更改是为了支持配置多个模型。
前缀 spring.ai.vertex.ai.gemini 用作属性前缀,允许您连接到 VertexAI。

前缀 spring.ai.vertex.ai.gemini.chat 是用于配置 VertexAI Gemini 聊天模型实现的属性前缀。

所有以 spring.ai.vertex.ai.gemini.chat.options 为前缀的属性都可以在运行时通过向 Prompt 调用添加请求特定的“运行时选项”来覆盖。
五、运行时选项
VertexAiGeminiChatOptions.java 提供了模型配置,例如温度、topK 等。
在启动时,可以通过 VertexAiGeminiChatModel(api, options) 构造函数或 spring.ai.vertex.ai.chat.options.* 属性来配置默认选项。
在运行时,您可以通过向 Prompt 调用添加新的、特定于请求的选项来覆盖默认选项。例如,为特定请求覆盖默认温度:
ChatResponse response = chatModel.call(
new Prompt(
"生成 5 个著名海盗的名字。",
VertexAiGeminiChatOptions.builder()
.temperature(0.4)
.build()
));
除了模型特定的 VertexAiGeminiChatOptions,您还可以使用可移植的 ChatOptions 实例,该实例通过 ChatOptions#builder() 创建。
六、工具调用
Vertex AI Gemini 模型支持工具调用(在 Google Gemini 上下文中,称为函数调用)功能,允许模型在对话过程中使用工具。以下是如何定义和使用基于 @Tool 的工具的示例:
public class WeatherService {
@Tool(description = "获取指定地点的天气")
public String weatherByLocation(@ToolParam(description= "城市或州名") String location) {
...
}
}
String response = ChatClient.create(this.chatModel)
.prompt("波士顿的天气怎么样?")
.tools(new WeatherService())
.call()
.content();
您也可以使用 java.util.function bean 作为工具:
@Bean
@Description("获取指定地点的天气。以 36°F 或 36°C 格式返回温度。")
public Function<Request, Response> weatherFunction() {
return new MockWeatherService();
}
String response = ChatClient.create(this.chatModel)
.prompt("波士顿的天气怎么样?")
.toolNames("weatherFunction")
.inputType(Request.class)
.call()
.content();
更多信息请参阅 工具文档。
七、多模态
多模态性是指模型能够同时理解和处理来自各种(输入)源的信息,包括文本、PDF、图像、音频和其他数据格式。
7.1 图像、音频、视频
Google 的 Gemini AI 模型通过理解和集成文本、代码、音频、图像和视频来支持此功能。更多详情,请参阅博客文章《Introducing Gemini》。
Spring AI 的 Message 接口通过引入 Media 类型来支持多模态 AI 模型。此类型包含消息中媒体附件的数据和信息,使用 Spring 的 org.springframework.util.MimeType 和用于原始媒体数据的 java.lang.Object。
以下是从 VertexAiGeminiChatModelIT#multiModalityTest() 中提取的简单代码示例,演示了用户文本与图像的结合。
byte[] data = new ClassPathResource("/vertex-test.png").getContentAsByteArray();
var userMessage = new UserMessage("解释一下你在这张图片中看到了什么?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, this.data)));
ChatResponse response = chatModel.call(new Prompt(List.of(this.userMessage)));
7.2 PDF 格式
最新的 Vertex Gemini 支持 PDF 输入类型。使用 application/pdf 媒体类型将 PDF 文件附加到消息:
var pdfData = new ClassPathResource("/spring-ai-reference-overview.pdf");
var userMessage = new UserMessage(
"你是一位非常专业的文档摘要专家。请总结给定的文档。",
List.of(new Media(new MimeType("application", "pdf"), pdfData)));
var response = this.chatModel.call(new Prompt(List.of(userMessage)));
八、安全设置和安全评分
Vertex AI Gemini API 提供了安全过滤功能,帮助您控制提示和响应中的有害内容。更多详情,请参阅 Vertex AI 安全过滤器文档。
8.1 配置安全设置
您可以配置安全设置来控制不同危害类别的内容被阻止的阈值。可用的危害类别有:
HARM_CATEGORY_HATE_SPEECH – 仇恨言论内容
HARM_CATEGORY_DANGEROUS_CONTENT – 危险内容
HARM_CATEGORY_HARASSMENT – 骚扰内容
HARM_CATEGORY_SEXUALLY_EXPLICIT – 色情内容
HARM_CATEGORY_CIVIC_INTEGRITY – 公民诚信内容
可用的阈值级别有:
BLOCK_LOW_AND_ABOVE – 当低、中或高概率存在不安全内容时阻止
BLOCK_MEDIUM_AND_ABOVE – 当中或高概率存在不安全内容时阻止
BLOCK_ONLY_HIGH – 仅当高概率存在不安全内容时阻止
BLOCK_NONE – 从不阻止(谨慎使用)
List<VertexAiGeminiSafetySetting> safetySettings = List.of(
VertexAiGeminiSafetySetting.builder()
.withCategory(VertexAiGeminiSafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT)
.withThreshold(VertexAiGeminiSafetySetting.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE)
.build(),
VertexAiGeminiSafetySetting.builder()
.withCategory(VertexAiGeminiSafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH)
.withThreshold(VertexAiGeminiSafetySetting.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE)
.build());
ChatResponse response = chatModel.call(new Prompt("您的提示在这里",
VertexAiGeminiChatOptions.builder()
.safetySettings(safetySettings)
.build()));
8.2 访问响应中的安全评分
配置安全设置后,Gemini API 会为每个响应候选返回安全评分。这些评分表明每个类别中有害内容的概率和严重性。
安全评分可在 AssistantMessage 元数据中的 “safetyRatings” 键下找到:
ChatResponse response = chatModel.call(new Prompt(prompt,
VertexAiGeminiChatOptions.builder()
.safetySettings(safetySettings)
.build()));
// 从响应中访问安全评分
List<VertexAiGeminiSafetyRating> safetyRatings =
(List<VertexAiGeminiSafetyRating>) response.getResult()
.getOutput()
.getMetadata()
.get("safetyRatings");
for (VertexAiGeminiSafetyRating rating : safetyRatings) {
System.out.println("类别:" + rating.category());
System.out.println("概率:" + rating.probability());
System.out.println("严重性:" + rating.severity());
System.out.println("是否被阻止:" + rating.blocked());
}
VertexAiGeminiSafetyRating 记录包含:
category – 危害类别(例如,HARM_CATEGORY_HARASSMENT)
probability – 概率级别(NEGLIGIBLE、LOW、MEDIUM、HIGH)
blocked – 内容是否因该评分而被阻止
probabilityScore – 原始概率分数(0.0 到 1.0)
severity – 严重性级别(HARM_SEVERITY_NEGLIGIBLE、HARM_SEVERITY_LOW、HARM_SEVERITY_MEDIUM、HARM_SEVERITY_HIGH)
severityScore – 原始严重性分数(0.0 到 1.0)
九、示例控制器
创建一个新的 Spring Boot 项目,并将 spring-ai-starter-model-vertex-ai-gemini 添加到您的 pom(或 gradle)依赖项中。
在 src/main/resources 目录下添加一个 application.properties 文件,以启用和配置 VertexAi 聊天模型:
spring.ai.vertex.ai.gemini.project-id=项目_ID
spring.ai.vertex.ai.gemini.location=区域
spring.ai.vertex.ai.gemini.chat.options.model=gemini-2.0-flash
spring.ai.vertex.ai.gemini.chat.options.temperature=0.5
请将 project-id 替换为您的 Google Cloud 项目 ID,location 是 Google Cloud 区域,例如 us-central1、europe-west1 等。
每个模型都有自己支持的区域列表,您可以在模型页面上找到支持的区域列表。
例如,model=gemini-2.5-flash 当前仅在 us-central1 区域可用,您必须设置 location=us-central1,遵循模型页面 Gemini 2.5 Flash – 支持区域的说明。
这将创建一个 VertexAiGeminiChatModel 实现,您可以将其注入到您的类中。以下是一个简单的 @Controller 类示例,该类使用聊天模型进行文本生成。
@RestController
public class ChatController {
private final VertexAiGeminiChatModel chatModel;
@Autowired
public ChatController(VertexAiGeminiChatModel chatModel) {
this.chatModel = chatModel;
}
@GetMapping("/ai/generate")
public Map generate(@RequestParam(value = "message", defaultValue = "给我讲个笑话") String message) {
return Map.of("generation", this.chatModel.call(message));
}
@GetMapping("/ai/generateStream")
public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "给我讲个笑话") String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return this.chatModel.stream(prompt);
}
}
十、手动配置
VertexAiGeminiChatModel 实现了 ChatModel,并使用 VertexAI 连接到 Vertex AI Gemini 服务。
将 spring-ai-vertex-ai-gemini 依赖项添加到项目的 Maven pom.xml 文件中:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-vertex-ai-gemini</artifactId>
</dependency>
或者添加到您的 Gradle build.gradle 构建文件中。
dependencies {
implementation 'org.springframework.ai:spring-ai-vertex-ai-gemini'
}
请参阅 “依赖管理” 部分,将 Spring AI BOM 添加到您的构建文件中。
接下来,创建一个 VertexAiGeminiChatModel 并将其用于文本生成:
VertexAI vertexApi = new VertexAI(projectId, location);
var chatModel = new VertexAiGeminiChatModel(this.vertexApi,
VertexAiGeminiChatOptions.builder()
.model(ChatModel.GEMINI_2_0_FLASH)
.temperature(0.4)
.build());
ChatResponse response = this.chatModel.call(
new Prompt("生成 5 个著名海盗的名字。"));
VertexAiGeminiChatOptions 为聊天请求提供配置信息。VertexAiGeminiChatOptions.Builder 是一个流畅的选项构建器。
十一、低级 Java 客户端
下面的类图说明了 Vertex AI Gemini 原生 Java API:
