跳到主要内容

Google Vertex AI Gemini

Vertex AI 是 Google Cloud 的全托管 AI 开发平台,提供访问 Google 的大型生成模型的能力,包括旧一代(PaLM2)和新一代(Gemini)模型。

要使用 Vertex AI,首先必须创建一个 Google Cloud Platform 账户。

入门

创建 Google Cloud 账户

如果您是 Google Cloud 的新用户,可以通过点击以下页面上 Get set up on Google Cloud 下拉菜单下的 [create an account] 按钮来创建新账户:

创建账户

在您的 Google Cloud Platform 账户中创建项目

在您的 Google Cloud 账户中创建一个新项目并启用 Vertex AI API,请按照以下步骤操作:

创建新项目

记下您的 PROJECT_ID,因为将来的 API 调用需要它。

选择 Google Cloud 认证策略

有几种方式可以让您的应用程序向 Google Cloud 服务和 API 进行认证。例如,您可以创建一个服务账户并设置环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向包含您凭据的 JSON 文件路径。

您可以在这里了解所有认证策略。但为了简化本地测试,我们将使用 gcloud 工具进行认证。

安装 Google Cloud CLI(可选)

要在本地访问您的云项目,您可以按照安装说明安装 gcloud 工具。对于 GNU/Linux 操作系统,安装步骤如下:

  1. 下载 SDK:
curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-467.0.0-linux-x86_64.tar.gz
  1. 解压归档文件:
tar -xf google-cloud-cli-467.0.0-linux-x86_64.tar.gz
  1. 运行安装脚本:
cd google-cloud-sdk/
./install.sh
  1. 运行以下命令设置默认项目和认证凭据:
gcloud auth application-default login

这种认证方法与 vertex-ai(嵌入模型,PaLM2)和 vertex-ai-gemini(Gemini)包都兼容。

添加依赖

要开始使用,请将以下依赖项添加到您项目的 pom.xml 中:

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-vertex-ai-gemini</artifactId>
<version>1.0.0-beta3</version>
</dependency>

或项目的 build.gradle 中:

implementation 'dev.langchain4j:langchain4j-vertex-ai-gemini:1.0.0-beta3'

尝试示例代码:

使用聊天模型进行文本预测的示例

带图像输入的 Gemini Pro Vision

PROJECT_ID 字段表示您在创建新 Google Cloud 项目时设置的变量。

import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ImageContent;
import dev.langchain4j.data.message.TextContent;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.model.vertexai.VertexAiGeminiChatModel;

public class GeminiProVisionWithImageInput {

private static final String PROJECT_ID = "YOUR-PROJECT-ID";
private static final String LOCATION = "us-central1";
private static final String MODEL_NAME = "gemini-1.5-flash";

public static void main(String[] args) {
ChatLanguageModel model = VertexAiGeminiChatModel.builder()
.project(PROJECT_ID)
.location(LOCATION)
.modelName(MODEL_NAME)
.build();

// 从文件加载图像
byte[] imageBytes = Files.readAllBytes(Paths.get("path/to/your/image.jpg"));
String base64Image = Base64.getEncoder().encodeToString(imageBytes);

// 创建包含图像的用户消息
UserMessage userMessage = UserMessage.from(
TextContent.from("描述这张图片"),
ImageContent.from(base64Image, "image/jpeg")
);

// 发送消息并获取响应
Response<AiMessage> response = model.chat(userMessage);
System.out.println(response.content().text());
}
}

使用结构化输出

Gemini 支持结构化输出,这意味着您可以要求模型以特定的 JSON 格式返回响应。这对于需要解析和处理模型输出的应用程序特别有用。

要使用结构化输出,您需要定义一个 Schema 对象,该对象描述了您期望的 JSON 结构:

import com.google.cloud.vertexai.api.Schema;
import com.google.cloud.vertexai.api.Type;

Schema schema = Schema.newBuilder()
.setType(Type.OBJECT)
.putProperties("name", Schema.newBuilder()
.setType(Type.STRING)
.build())
.putProperties("address", Schema.newBuilder()
.setType(Type.OBJECT)
.putProperties("street",
Schema.newBuilder().setType(Type.STRING).build())
.putProperties("zipcode",
Schema.newBuilder().setType(Type.STRING).build())
.build())
.build();

var model = VertexAiGeminiChatModel.builder()
.project(PROJECT_ID)
.location(LOCATION)
.modelName(GEMINI_1_5_PRO)
.responseMimeType("application/json")
.responseSchema(Schema)
.build();

有一个便捷方法允许您为 Java 类生成 schema:

class Artist {
public String artistName;
int artistAge;
protected boolean artistAdult;
private String artistAddress;
public Pet[] pets;
}

class Pet {
public String name;
}

Schema schema = SchemaHelper.fromClass(Artist.class);

var model = VertexAiGeminiChatModel.builder()
.project(PROJECT_ID)
.location(LOCATION)
.modelName(GEMINI_1_5_PRO)
.responseMimeType("application/json")
.responseSchema(schema)
.build();

另一个方法允许您从 JSON schema 字符串创建 schema: SchemaHelper.fromJson(...)

Gemini 支持 JSON 对象和数组作为结构化输出, 但也有一个特殊情况是将 JSON 字符串枚举作为输出, 这在要求 Gemini 执行分类任务时特别有用 (如情感分析):

var model = VertexAiGeminiChatModel.builder()
.project(PROJECT_ID)
.location(LOCATION)
.modelName(GEMINI_1_5_PRO)
.logRequests(true)
.logResponses(true)
.responseSchema(Schema.newBuilder()
.setType(Type.STRING)
.addAllEnum(Arrays.asList("POSITIVE", "NEUTRAL", "NEGATIVE"))
.build())
.build();

在这种情况下,隐式响应 MIME 类型被设置为 text/x.enum (这不是官方注册的 MIME 类型)。

指定安全设置

如果您想过滤或阻止有害内容,可以设置不同阈值级别的安全设置:

HashMap<HarmCategory, SafetyThreshold> safetySettings = new HashMap<>();
safetySettings.put(HARM_CATEGORY_HARASSMENT, BLOCK_LOW_AND_ABOVE);
safetySettings.put(HARM_CATEGORY_DANGEROUS_CONTENT, BLOCK_ONLY_HIGH);
safetySettings.put(HARM_CATEGORY_SEXUALLY_EXPLICIT, BLOCK_MEDIUM_AND_ABOVE);

var model = VertexAiGeminiChatModel.builder()
.project(PROJECT_ID)
.location(LOCATION)
.modelName("gemini-1.5-flash-001")
.safetySettings(safetySettings)
.logRequests(true)
.logResponses(true)
.build();

参考

可用位置

多模态能力

示例