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 操作系统,安装步骤如下:
- 下载 SDK:
curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-467.0.0-linux-x86_64.tar.gz
- 解压归档文件:
tar -xf google-cloud-cli-467.0.0-linux-x86_64.tar.gz
- 运行安装脚本:
cd google-cloud-sdk/
./install.sh
- 运行以下命令设置默认项目和认证凭据:
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'
尝试示例代码:
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();