При вызове Gemini API из вашего приложения с помощью Vertex AI in Firebase SDK вы можете предложить модели Gemini сгенерировать текст на основе мультимодальных входных данных. Мультимодальные подсказки могут включать в себя несколько модальностей (или типов ввода), например текст, изображения, PDF-файлы, видео и аудио.
Для нетекстовых частей входных данных (например, медиафайлов) вы можете дополнительно использовать Cloud Storage for Firebase для включения файлов в запрос. Вкратце, вот что вам нужно знать об этой функции:
Вы можете использовать Cloud Storage for Firebase с любым мультимодальным запросом (например, созданием текста и чатом). Примеры в этом руководстве демонстрируют базовый ввод текста и изображений.
Во входных данных запроса вы указываете MIME-тип файла и его URL-адрес Cloud Storage for Firebase (который всегда начинается с
gs://
). Эти значения представляют собой метаданные, автоматически присваиваемые любому файлу, загружаемому в корзину Cloud Storage .Вам необходимо использовать поддерживаемый тип файла и URL-адрес .
В этом руководстве по решению описывается, как настроить Cloud Storage for Firebase , загрузить файл в корзину Cloud Storage for Firebase из вашего приложения, а затем включить MIME-тип файла и URL-адрес Cloud Storage for Firebase в свой мультимодальный запрос к Gemini API .
Хотите увидеть примеры кода? Или вы уже настроили Cloud Storage for Firebase и готовы начать использовать его для своих мультимодальных запросов?
Зачем использовать Cloud Storage for Firebase со своим приложением?
Cloud Storage for Firebase использует ту же быструю, безопасную и масштабируемую инфраструктуру, что и Google Cloud Storage для хранения больших двоичных объектов и файлов, а его клиентские SDK специально созданы для мобильных и веб-приложений.
Для Vertex AI in Firebase SDK максимальный размер запроса составляет 20 МБ. Вы получаете ошибку HTTP 413, если запрос слишком велик. Если из-за размера файла общий размер запроса превышает 20 МБ, используйте URL-адрес Cloud Storage for Firebase чтобы включить файл в свой мультимодальный запрос. Однако, если файл небольшой, вы часто можете передать его напрямую как встроенные данные (однако обратите внимание, что файл, предоставленный как встроенные данные, при передаче кодируется в base64, что увеличивает размер запроса).
Вот некоторые дополнительные преимущества использования Cloud Storage for Firebase :
Вы можете позволить конечным пользователям загружать изображения непосредственно из вашего приложения в корзину Cloud Storage for Firebase , а затем включить эти изображения в свои мультимодальные запросы, просто указав MIME-тип файла и URL-адрес Cloud Storage for Firebase (который является идентификатором файла). файл).
Вы можете сэкономить время и пропускную способность конечных пользователей, если им необходимо предоставить изображения, особенно если у них плохое или нестабильное качество сети.
- Если загрузка или загрузка файла прерывается, Cloud Storage for Firebase SDK автоматически возобновляет операцию с того места, где она была прервана.
- Один и тот же загруженный файл можно использовать несколько раз, при этом конечному пользователю не придется загружать один и тот же файл каждый раз, когда он понадобится вашему приложению (например, в новом мультимодальном запросе).
Вы можете ограничить доступ конечных пользователей к файлам, хранящимся в Cloud Storage for Firebase с помощью Firebase Security Rules , которые позволяют только авторизованному пользователю загружать, скачивать или удалять файлы.
Вы можете получить доступ к файлам в своем сегменте из Firebase или из Google Cloud , что дает вам возможность выполнять обработку на стороне сервера, например фильтрацию изображений или перекодирование видео, с помощью API-интерфейсов Google Cloud Storage .
Какие типы файлов и URL-адресов поддерживаются?
Ниже приведены требования к файлам и URL-адресам, если вы хотите использовать Cloud Storage for Firebase с Vertex AI in Firebase SDK:
Файл должен соответствовать требованиям входных файлов для мультимодальных запросов при использовании Vertex AI in Firebase SDK. Сюда входят такие требования, как тип MIME и размер файла.
Файл должен храниться в корзине Cloud Storage for Firebase (это означает, что корзина доступна для служб Firebase, таких как Firebase Security Rules ). Если вы можете просмотреть свой сегмент в консоли Firebase , то это сегмент Cloud Storage for Firebase .
Корзина Cloud Storage for Firebase должна находиться в том же проекте Firebase, в котором вы зарегистрировали свое приложение.
URL-адрес файла Cloud Storage for Firebase должен начинаться с
gs://
. Именно так создаются все URL-адреса Google Cloud Storage .URL-адрес файла не может быть URL-адресом «браузера» (например, URL-адресом изображения, которое вы найдете в Интернете).
Кроме того, Firebase Security Rules для вашего сегмента должны разрешать соответствующий доступ к файлу. Например:
Если у вас есть общедоступные правила , то любой пользователь или клиент может получить доступ к файлу и предоставить его URL-адрес при вызове с помощью Vertex AI in Firebase SDK. Эти типы правил следует использовать только для начала работы и на ранних стадиях прототипирования (если только файлы на самом деле не должны быть полностью общедоступными).
Если у вас есть надежные правила (настоятельно рекомендуется) , Firebase проверит, имеет ли вошедший в систему пользователь или клиент достаточный доступ к файлу, прежде чем разрешить вызов с использованием предоставленного URL-адреса.
Используйте Cloud Storage for Firebase с Vertex AI in Firebase
Шаг 1. Настройте Cloud Storage for Firebase
Подробные инструкции по настройке и использованию Cloud Storage for Firebase вы можете найти в руководстве по началу работы .
Перейдите к руководству по началу работы Cloud Storage for Firebase
Вот задачи высокого уровня, которые вам нужно будет выполнить:
Создайте корзину Cloud Storage for Firebase в своем проекте Firebase.
Если в вашем проекте Google Cloud уже есть сегмент Cloud Storage , который вы хотите использовать с Vertex AI in Firebase , вы можете сделать его доступным для сервисов Firebase (включая Vertex AI in Firebase ), «импортировав» сегмент в Firebase .
Примените Firebase Security Rules к этому сегменту. Firebase Security Rules помогают защитить ваши файлы, ограничивая доступ авторизованным конечным пользователям.
Добавьте клиентскую библиотеку Cloud Storage for Firebase в свое приложение.
Обратите внимание, что вы можете пропустить эту задачу, но тогда вы всегда должны явно включать значения URL-адреса MIME-типа и Cloud Storage for Firebase в свои мультимодальные запросы .
Шаг 2. Загрузите файл в корзину.
В документации Cloud Storage for Firebase вы можете узнать обо всех различных способах загрузки файлов в корзину Cloud Storage for Firebase . Например, вы можете загружать локальные файлы с устройства конечного пользователя, например фотографии и видео с камеры.
Когда вы загружаете файл в корзину, Cloud Storage автоматически применяет к файлу следующие две части информации. Вам нужно будет включить эти значения в мультимодальный запрос (как показано на следующем шаге этого руководства).
MIME-тип : это тип носителя файла (например,
image/png
). Cloud Storage for Firebase автоматически попытается определить тип MIME во время загрузки и применить эти метаданные к объекту в корзине. Однако вы можете при желании указать тип MIME во время загрузки.URL-адрес Cloud Storage for Firebase : это уникальный идентификатор файла. URL-адрес должен начинаться с
gs://
.
Шаг 3. Включите MIME-тип и URL-адрес файла в мультимодальный запрос.
Если у вас есть файл, хранящийся в корзине Cloud Storage for Firebase , вы можете включить его MIME-тип и URL-адрес Cloud Storage for Firebase в мультимодальный запрос. Обратите внимание, что в этих примерах показан запрос generateContent
без потоковой передачи, но вы также можете использовать URL-адреса Cloud Storage for Firebase с потоковой передачей и чатом.
Чтобы включить файл в запрос, вы можете использовать любой из следующих вариантов:
Вариант 1. Добавьте тип MIME и URL-адрес, используя ссылку на хранилище.
Вариант 2. Явно укажите тип MIME и URL-адрес.
Вариант 1. Добавьте тип MIME и URL-адрес, используя ссылку на хранилище.
Используйте этот вариант, если вы только что загрузили файл в корзину и хотите немедленно включить файл (через ссылку на хранилище) в мультимодальный запрос. Для вызова требуется как тип MIME, так и URL-адрес Cloud Storage for Firebase .
Kotlin+KTX
Для Kotlin методы в этом SDK являются функциями приостановки, и их необходимо вызывать из области Coroutine .// Upload an image file using Cloud Storage for Firebase.
val storageRef = Firebase.storage.reference.child("images/image.jpg")
val fileUri = Uri.fromFile(File("image.jpg"))
try {
val taskSnapshot = storageRef.putFile(fileUri).await()
// Get the MIME type and Cloud Storage for Firebase file path.
val mimeType = taskSnapshot.metadata?.contentType
val bucket = taskSnapshot.metadata?.bucket
val filePath = taskSnapshot.metadata?.path
if (mimeType != null && bucket != null) {
// Construct a URL in the required format.
val storageUrl = "gs://$bucket/$filePath"
// Construct a prompt that includes text, the MIME type, and the URL.
val prompt = content {
fileData(mimeType = mimeType, uri = storageUrl)
text("What's in this picture?")
}
// To generate text output, call generateContent with the prompt.
val response = generativeModel.generateContent(prompt)
println(response.text)
}
} catch (e: StorageException) {
// An error occurred while uploading the file.
} catch (e: GoogleGenerativeAIException) {
// An error occurred while generating text.
}
Java
Для Java методы этого SDK возвращаютListenableFuture
. // Upload an image file using Cloud Storage for Firebase.
StorageReference storage = FirebaseStorage.getInstance().getReference("images/image.jpg");
Uri fileUri = Uri.fromFile(new File("images/image.jpg"));
storage.putFile(fileUri).addOnSuccessListener(taskSnapshot -> {
// Get the MIME type and Cloud Storage for Firebase file path.
String mimeType = taskSnapshot.getMetadata().getContentType();
String bucket = taskSnapshot.getMetadata().getBucket();
String filePath = taskSnapshot.getMetadata().getPath();
if (mimeType != null && bucket != null) {
// Construct a URL in the required format.
String storageUrl = "gs://" + bucket + "/" + filePath;
// Create a prompt that includes text, the MIME type, and the URL.
Content prompt = new Content.Builder()
.addFileData(storageUrl, mimeType)
.addText("What's in this picture?")
.build();
// To generate text output, call generateContent with the prompt.
GenerativeModelFutures modelFutures = GenerativeModelFutures.from(model);
ListenableFuture<GenerateContentResponse> response = modelFutures.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<>() {
@Override
public void onSuccess(GenerateContentResponse result) {
String resultText = result.getText();
System.out.println(resultText);
}
@Override
public void onFailure(@NonNull Throwable t) {
t.printStackTrace();
}
}, executor);
}
}).addOnFailureListener(e -> {
// An error occurred while uploading the file.
e.printStackTrace();
});
Вариант 2. Явно укажите тип MIME и URL-адрес.
Используйте этот вариант, если вы знаете значения типа MIME и URL-адреса Cloud Storage for Firebase и хотите явно включить их в мультимодальный запрос. Для вызова требуется как тип MIME, так и URL-адрес.
Kotlin+KTX
Для Kotlin методы в этом SDK являются функциями приостановки, и их необходимо вызывать из области Coroutine .// Construct a prompt that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
val prompt = content {
fileData(mimeType = "image/jpeg", uri = "gs://bucket-name/path/image.jpg")
text("What's in this picture?")
}
// To generate text output, call generateContent with the prompt.
val response = generativeModel.generateContent(prompt)
println(response.text)
Java
Для Java методы этого SDK возвращаютListenableFuture
. // Construct a prompt that explicitly includes the MIME type and Cloud Storage for Firebase URL values.
Content prompt = new Content.Builder()
.addFilePart("gs://bucket-name/path/image.jpg", "image/jpeg")
.addText("What's in this picture?")
.build();
// To generate text output, call generateContent with the prompt
GenerativeModelFutures modelFutures = GenerativeModelFutures.from(model);
ListenableFuture<GenerateContentResponse> response = modelFutures.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<>() {
@Override
public void onSuccess(GenerateContentResponse result) {
String resultText = result.getText();
System.out.println(resultText);
}
@Override
public void onFailure(@NonNull Throwable t) {
t.printStackTrace();
}
}, executor);