Вершинный искусственный интеллект в Firebase

Чтобы получить доступ к API Gemini и семейству моделей Gemini непосредственно из вашего приложения, мы рекомендуем использовать Vertex AI в Firebase SDK для Android. Этот SDK является частью более крупной платформы Firebase , которая помогает создавать и запускать полнофункциональные приложения.

Vertex AI в архитектуре интеграции Firebase
Рисунок 1. Vertex AI в архитектуре интеграции Firebase.

Переход с клиентского SDK Google AI

Vertex AI в Firebase SDK аналогичен клиентскому SDK Google AI , но Vertex AI в Firebase SDK предлагает важные параметры безопасности и другие функции для производственных сценариев использования . Например, при использовании Vertex AI в Firebase вы также можете использовать следующее:

  • Проверка приложений Firebase для защиты API Gemini от злоупотреблений со стороны неавторизованных клиентов.

  • Firebase Remote Config для динамической установки и изменения значений вашего приложения в облаке (например, названия моделей) без необходимости выпуска новой версии вашего приложения.

  • Облачное хранилище для Firebase для включения больших медиафайлов в ваш запрос к Gemini API.

Если вы уже интегрировали клиентский SDK Google AI в свое приложение, вы можете перейти на Vertex AI в Firebase .

Начиная

Прежде чем взаимодействовать с Gemini API непосредственно из вашего приложения, вам необходимо сначала сделать несколько вещей, в том числе ознакомиться с подсказками, а также настроить Firebase и ваше приложение для использования SDK.

Экспериментируйте с подсказками

Поэкспериментировать с подсказками можно в Vertex AI Studio . Vertex AI Studio — это IDE для быстрого проектирования и прототипирования. Он позволяет загружать файлы для тестирования подсказок с текстом и изображениями и сохранять подсказки, чтобы вернуться к ним позже.

Создание подсказки, подходящей для вашего случая использования, — это скорее искусство, чем наука, поэтому экспериментирование имеет решающее значение. Подробнее о подсказках можно узнать в документации Firebase .

Настройте проект Firebase и подключите свое приложение к Firebase.

Когда вы будете готовы вызвать Gemini API из своего приложения, следуйте инструкциям в руководстве по началу работы с Vertex AI в Firebase , чтобы настроить Firebase и SDK в своем приложении. Руководство по началу работы поможет вам выполнить все следующие задачи, описанные в этом руководстве.

  1. Настройте новый или существующий проект Firebase, включая использование тарифного плана Blaze с оплатой по мере использования и включение необходимых API.

  2. Подключите свое приложение к Firebase, включая регистрацию вашего приложения и добавление файла конфигурации Firebase ( google-services.json ) в ваше приложение.

Добавьте зависимость Gradle

Добавьте следующую зависимость Gradle в модуль вашего приложения:

Котлин

dependencies {
  ...
  implementation("com.google.firebase:firebase-vertexai:16.0.2")
}

Ява

dependencies {

   [...]

   implementation("com.google.firebase:firebase-vertexai:16.0.2")

   // Required to use `ListenableFuture` from Guava Android for one-shot generation
   implementation("com.google.guava:guava:31.0.1-android")

   // Required to use `Publisher` from Reactive Streams for streaming operations
   implementation("org.reactivestreams:reactive-streams:1.0.4")
}

Инициализируйте сервис Vertex AI и генеративную модель.

Начните с создания экземпляра GenerativeModel и указания имени модели:

Котлин

val generativeModel = Firebase.vertexAI.generativeModel("gemini-1.5-flash")

Ява

GenerativeModel gm = FirebaseVertexAI.getInstance().generativeModel("gemini-1.5-flash");

В документации Firebase вы можете узнать больше о доступных моделях для использования с Vertex AI в Firebase. Вы также можете узнать о настройке параметров модели .

Взаимодействуйте с API Gemini из вашего приложения.

Теперь, когда вы настроили Firebase и свое приложение для использования SDK, вы готовы взаимодействовать с API Gemini из своего приложения.

Создать текст

Чтобы сгенерировать текстовый ответ, вызовите generateContent() с приглашением.

Котлин

// Note: `generateContent()` is a `suspend` function, which integrates well
// with existing Kotlin code.

scope.launch {
  val response = model.generateContent("Write a story about the green robot")
}

Ява

// In Java, create a `GenerativeModelFutures` from the `GenerativeModel`.
// Note that `generateContent()` returns a `ListenableFuture`. Learn more:
// https://developer.android.com/develop/background-work/background-tasks/asynchronous/listenablefuture

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Content prompt = new Content.Builder()
    .addText("Write a story about a green robot.")
    .build();

ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

Генерация текста из изображений и других медиафайлов

Вы также можете генерировать текст из приглашения, включающего текст, изображения или другие медиафайлы. Когда вы вызываете generateContent() , вы можете передавать медиафайлы как встроенные данные (как показано в примере ниже). Кроме того, вы можете включить в запрос большие медиафайлы , используя URL-адреса Cloud Storage for Firebase.

Котлин

scope.launch {
  val response = model.generateContent(
    content {
      image(bitmap)
      text("what is the object in the picture?")
    }
  )
}

Ява

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sparky);

Content prompt = new Content.Builder()
        .addImage(bitmap)
        .addText("What developer tool is this mascot from?")
        .build();

ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

Многоходовой чат

Вы также можете поддерживать многоходовые разговоры. Инициализируйте чат с помощью функции startChat() . При желании вы можете предоставить историю сообщений. Затем вызовите функцию sendMessage() для отправки сообщений чата.

Котлин

val chat = generativeModel.startChat(
    history = listOf(
        content(role = "user") { text("Hello, I have 2 dogs in my house.") },
        content(role = "model") { text("Great to meet you. What would you like to know?") }
    )
)

scope.launch {
   val response = chat.sendMessage("How many paws are in my house?")
}

Ява

// (Optional) create message history
Content.Builder userContentBuilder = new Content.Builder();
userContentBuilder.setRole("user");
userContentBuilder.addText("Hello, I have 2 dogs in my house.");
Content userContent = userContentBuilder.build();

Content.Builder modelContentBuilder = new Content.Builder();
modelContentBuilder.setRole("model");
modelContentBuilder.addText("Great to meet you. What would you like to know?");
Content modelContent = userContentBuilder.build();

List<Content> history = Arrays.asList(userContent, modelContent);

// Initialize the chat
ChatFutures chat = model.startChat(history);

// Create a new user message
Content.Builder messageBuilder = new Content.Builder();
messageBuilder.setRole("user");
messageBuilder.addText("How many paws are in my house?");

Content message = messageBuilder.build();

Publisher<GenerateContentResponse> streamingResponse =
        chat.sendMessageStream(message);

StringBuilder outputContent = new StringBuilder();

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        outputContent.append(chunk);
    }

    @Override
    public void onComplete() {
        // ...
    }

    @Override
    public void onError(Throwable t) {
        t.printStackTrace();
    }

    @Override
    public void onSubscribe(Subscription s) {
        s.request(Long.MAX_VALUE);
    }

});

Трансляция ответа

Вы можете добиться более быстрого взаимодействия, не дожидаясь получения всего результата от создания модели, а вместо этого используйте потоковую передачу для обработки частичных результатов. Используйте generateContentStream() для потоковой передачи ответа.

Котлин

scope.launch {
  var outputContent = ""

  generativeModel.generateContentStream(inputContent)
          .collect { response ->
            outputContent += response.text
          }
}

Ява

// Note that in Java the method `generateContentStream()` returns a
// Publisher from the Reactive Streams library.
// https://www.reactive-streams.org/

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

// Provide a prompt that contains text
Content prompt = new Content.Builder()
        .addText("Write a story about a green robot.")
        .build();

Publisher<GenerateContentResponse> streamingResponse =
    model.generateContentStream(prompt);

StringBuilder outputContent = new StringBuilder();
streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
  @Override
  public void onNext(GenerateContentResponse generateContentResponse) {
    String chunk = generateContentResponse.getText();
    outputContent.append(chunk);
  }

  @Override
  public void onComplete() {
    // ...
  }

  @Override
  public void onError(Throwable t) {
    t.printStackTrace();
  }

  @Override
  public void onSubscribe(Subscription s) {
    s.request(Long.MAX_VALUE);
  }
});

Следующие шаги