Конструктор книжных полок: используйте Gemini для создания облачной функции Java для приложения Gemini.

1. Введение

Вы любите копаться в книгах, но вас ошеломляет огромный выбор? Представьте себе, что у вас есть приложение на базе искусственного интеллекта, которое не только рекомендует идеальное чтение, но и предлагает краткое изложение, основанное на выбранном вами жанре, что дает вам представление о сути книги. В этой лабораторной работе я покажу вам, как создать такое приложение с помощью BigQuery и облачных функций на базе Gemini.

Обзор проекта

Наш вариант использования сосредоточен вокруг этих 4 ключевых компонентов:

  • База данных книг. Обширный общедоступный набор данных интернет-архивов книг BigQuery будет служить нашим всеобъемлющим каталогом книг.
  • Механизм суммирования AI: Google Cloud Functions, оснащенный языковой моделью Gemini-Pro, будет генерировать подробные сводки, адаптированные к запросам пользователей.
  • Интеграция BigQuery: удаленная функция в BigQuery, которая вызывает нашу облачную функцию для предоставления по запросу аннотаций книг и тем.
  • Пользовательский интерфейс: веб-приложение, размещенное в Cloud Run, которое предлагает пользователям веб-приложение для просмотра результатов.

Мы разделим реализацию на 3 кодовых лаборатории:

Codelab 1: используйте Gemini для создания облачной функции Java для приложения Gemini.

Codelab 2: используйте Gemini для создания приложений генеративного искусственного интеллекта только на SQL с помощью BigQuery.

Codelab 3: используйте Gemini для создания веб-приложения Java Spring Boot, которое взаимодействует с BigQuery.

2. Используйте Gemini для создания бессерверного приложения генеративного искусственного интеллекта в облачной функции Java.

Что ты построишь

Вы создадите

  • Приложение Java Cloud Functions, реализующее Gemini 1.0 Pro, принимает определенное приглашение в качестве входных данных в форме массива JSON и возвращает ответ (значение Json, помеченное как «ответы»).
  • Вы выполните этапы сборки и развертывания с помощью Gemini.

3. Требования

  • Браузер, например Chrome или Firefox.
  • Проект Google Cloud с включенной оплатой

Ниже приведены предварительные условия:

Создайте свой проект

  1. В Google Cloud Console на странице выбора проекта выберите или создайте проект Google Cloud.
  2. Убедитесь, что для вашего облачного проекта включена оплата. Узнайте, как проверить, включена ли оплата в проекте .

Активировать Cloud Shell

  1. Вы будете использовать Cloud Shell , среду командной строки, работающую в Google Cloud, в которую предварительно загружен bq :

В Cloud Console нажмите «Активировать Cloud Shell» в правом верхнем углу: 6757b2fb50ddcc2d.png

  1. После подключения к Cloud Shell вы увидите, что вы уже прошли аутентификацию и что для проекта уже установлен идентификатор вашего проекта. Выполните следующую команду в Cloud Shell, чтобы подтвердить, что вы прошли аутентификацию:
gcloud auth list
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте.
gcloud config list project
  1. Если ваш проект не установлен, используйте следующую команду, чтобы установить его:
gcloud config set project <YOUR_PROJECT_ID>

Обратитесь к документации по командам и использованию gcloud.

4. Включение Gemini для Google Cloud и необходимых API.

Включить Близнецов

  1. Перейдите к Gemini для Google Cloud в Marketplace, чтобы включить API. Вы также можете использовать следующую команду:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. Посетите страницу Близнецов и нажмите «Начать общение».

Важно! Выполните шаги 1 и 2 в этой лаборатории кода , чтобы начать работу с Gemini и включить Gemini в Cloud Shell IDE соответственно.

Включите другие необходимые API

Как бы мы это сделали? Давайте спросим об этом Близнецов, ладно? Но перед этим запомни:

LLM недетерминированы. Поэтому, пока вы пробуете эти подсказки, полученный ответ может отличаться от показанного на моем снимке экрана.

Перейдите в консоль чата Gemini, щелкнув значок «Открыть Gemini» в правом верхнем углу рядом с панелью поиска в консоли Google Cloud.

26e1491322855614.png

Введите этот вопрос в разделе «Введите приглашение здесь»:

How do I enable the cloud functions api using a gcloud command? 

Вы должны получить ответ, похожий на:

gcloud services enable cloudfunctions.googleapis.com

Скопируйте его (вы можете использовать значок копирования в верхней части фрагмента команды) и запустите его в терминале Cloud Shell, чтобы включить функции облака. Сделайте то же самое для Cloud Run, так как нам нужно и то, и другое, чтобы создать и развернуть облачные функции:

gcloud services enable \
  cloudfunctions.googleapis.com \
  aiplatform.googleapis.com \
  run.googleapis.com \
  cloudbuild.googleapis.com

5. Подготовка шаблона облачных функций с помощью Gemini

На данный момент я предполагаю, что у вас уже включен Gemini в вашей Cloud Shell IDE.

Откройте редактор Cloud Shell, щелкнув значок «Открыть редактор» в правом верхнем углу терминала Cloud Shell (обычно я предпочитаю открывать терминал и редактор на отдельных вкладках параллельно, чтобы мы могли писать код в одной и встраивать в другую).

edd258384bc74f1f.png

Открыв редактор, убедитесь, что логотип Gemini в правом нижнем углу консоли редактора активен (и не погашен). Также убедитесь, что ваш проект Google Cloud в левом нижнем углу указывает на текущий активный проект, с которым вы хотите работать. Если они неактивны, щелкните их, авторизируйтесь, выберите проект Google Cloud, на который вы хотите, чтобы он указывал, и активируйте их.

Как только оба будут активны, щелкните имя проекта в левом нижнем углу и в открывшемся всплывающем списке под названием «Cloud Code» прокрутите вниз до «Новое приложение».

ca08602b576ebd57.png

В этом списке выберите приложение Cloud Functions. В появившемся списке выберите Java:

ac2b44245949da68.png

В появившемся списке введите имя проекта «duetai-gemini-calling» вместо helloworld и нажмите «ОК».

bf9cfe86e35cdced.png

Ура! Вы загрузили свое простое приложение Java Cloud Functions с помощью Gemini и ничего не сделали, кроме включения и активации конфигураций, согласны?

Вот структуру проекта, которую вы должны увидеть:

d56e410fb76f183f.png

Прямо сейчас вы готовы развернуть функцию. Но мы начали это не поэтому. Давайте продолжим и создадим реализацию API Gemini Pro в этой облачной функции с использованием Java SDK.

Теперь давайте создадим функциональность для нашего варианта использования, который вызывает модель Gemini Pro в этой облачной функции. Для этого вы можете добавлять дополнительные запросы и постепенно разрабатывать свой код с помощью Gemini или написать логику самостоятельно. Я собираюсь сделать смесь того и другого.

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

В консоли чата Gemini (в редакторе Cloud Code на левой панели) введите следующую строку:

what is the maven dependency for com.google.cloud.vertexai library

Причина, по которой я прошу конкретно пакет com.google.cloud.vertexai, заключается в том, что именно его я использую в своем исходном коде, где реализую код вызова Gemini.

Я получил такой результат:

62c4295b9b4654e9.png

 <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-vertexai</artifactId>
      <version>0.1.0</version>
    </dependency>

Скопируйте это и вставьте в файл pom.xml прямо перед тегом </dependent> . Замените версию на 0.1.0 (вы можете удалить тег <version>, если используете спецификацию Spring Cloud GCP для управления номерами версий Spring-cloud-gcp).

Раздел зависимостей должен выглядеть следующим образом:

1800f10af9331210.png

При необходимости обязательно обновите номера версий, чтобы они соответствовали указанным выше. Если вы заметили, я также включил в него еще одну зависимость:

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.10</version>
    </dependency>

7. Измените точку входа функции и имя класса.

  1. Перейдите к файлу «launch.json» в папке «.vscode». Измените имя функции с «function-hello-world» на «function-gemini-calling».
  2. Обновите значение inputPoint с «cloudcode.helloworld.HelloWorld» на Cloudcode.bookshelf.Bookshelf.
  3. Теперь перейдите к файлу класса Java «HelloWorld.java». Измените имя пакета на package cloudcode.bookshelf; В появившемся сообщении об ошибке щелкните желтую лампочку и выберите параметр «Переместить HelloWorld.java» в пакет cloudcode.bookshelf;.

38d721978bddc8a8.png

  1. Обновите имя класса на Bookshelf и в появившемся сообщении об ошибке щелкните маленькую желтую лампочку и выберите «Переименовать файл в Bookshelf.java». Выберите это.

8. Создайте метод, вызывающий Gemini Pro.

Давайте реализуем эту функциональность в классе Bookshelf.java. Замените Bookshelf.java приведенным ниже кодом:

package cloudcode.bookshelf;
import java.io.BufferedWriter;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.api.GenerationConfig;
import com.google.cloud.vertexai.generativeai.preview.GenerativeModel;
import com.google.cloud.vertexai.generativeai.preview.ResponseHandler;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.util.Map;
import java.util.LinkedHashMap;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonArray;

public class Bookshelf implements HttpFunction {
  private static final Gson gson = new Gson();

 @Override
  public void service(HttpRequest request, HttpResponse response) throws Exception {
    BufferedWriter writer = response.getWriter();

 // Get the request body as a JSON object.
 JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
 JsonArray calls_array = requestJson.getAsJsonArray("calls");
 JsonArray calls = (JsonArray) calls_array.get(0);
 String context = calls.get(0).toString().replace("\"", "");

 //Invoke Gemini model
  String raw_result = callGemini(context);
  raw_result = raw_result.replace("\n","");
  String trimmed = raw_result.trim();
  List<String> result_list = Arrays.asList(trimmed);
  Map<String, List<String>> stringMap = new LinkedHashMap<>();
  stringMap.put("replies", result_list);
 
  // Serialization
  String return_value = gson.toJson(stringMap);
  writer.write(return_value);
    }
  public String callGemini(String context) throws IOException{
      String res = "";
        try (VertexAI vertexAi = new VertexAI("REPLACE_WITH_YOUR_PROJECT_ID", "us-central1"); ) {
          GenerationConfig generationConfig =
              GenerationConfig.newBuilder()
                  .setMaxOutputTokens(2048)
                  .setTemperature(0.4F)
                  .setTopK(32)
                  .setTopP(1)
                  .build();  
        GenerativeModel model = new GenerativeModel("gemini-pro", generationConfig, vertexAi);
        GenerateContentResponse response = model.generateContent(context);
        res = ResponseHandler.getText(response);
      }catch(Exception e){
        System.out.println(e);
        }
        return res;
    }
}

Этот класс ожидает ввода в структуре JSON, как показано ниже:

{ "звонки": [["ВАШ_ПРОМПТ_ЗДЕСЬ"]] }

Он возвращает ответ, как показано ниже:

(Json) Map<String, List<String>> {"ответы": ["ответ"]}

Попробуйте воспользоваться функцией чата Gemini в редакторе Cloud Shell на левой панели, чтобы объяснить код. Альтернативно вы можете выделить весь код, щелкнуть желтую лампочку в верхнем левом углу выделения и выбрать опцию «Объяснить это».

66fb67507793e368.png

9. Развертывание облачной функции

Теперь, когда облачная функция готова, давайте спросим Gemini, как ее развернуть. Зайдите в чат Gemini в редакторе Cloud Code и введите следующее:

   How to deploy this Cloud Function with a gcloud command?

Я получил ответ ниже:

9f9db98933841864.png

Теперь мне хотелось исследовать это дальше. Поэтому я пошел дальше и попросил Gemini дать мне полную команду развертывания функций gcloud. Ответ такой, как показано ниже:

b77701c00dc3eaf1.png

Сейчас я не могу сказать, получите ли вы такой же ответ, но мне было весьма интересно увидеть, что, к моему удивлению, он дополняется еще несколькими деталями, как показано на изображении ниже:

Формат тела запроса:

82bf20304143a374.png

и

Формат ответа:

ade55b3de5d823a6.png

Теперь давайте продолжим и развернем эту функцию, выполнив команду gcloud, которую нам дал Gemini. Для этого нам нужно открыть терминал Cloud Shell. Вы можете открыть его на новой вкладке https://console.cloud.google.com и убедиться, что выбран правильный проект. Откройте терминал Cloud Shell, щелкнув значок «Активировать Cloud Shell» в правом верхнем углу консоли, и убедитесь, что вы находитесь в правильной папке проекта, используя следующую команду:

cd duetai-gemini-calling

Далее следует следующая команда:

gcloud functions deploy bookshelf --runtime java17 --trigger-http --entry-point cloudcode.bookshelf.Bookshelf --allow-unauthenticated

Вас спросят: «Разрешить неаутентифицированный вызов новой функции [книжная полка]?» Скажите «y» и нажмите Enter. После этого задайте несколько вопросов, если применимо, и ваша бессерверная облачная функция будет развернута с развернутым URL-адресом: https://us-central1-*******.cloudfunctions.net/bookshelf.

Теперь давайте вызовем развернутые облачные функции и протестируем их!

Примечание. Если вы случайно пропустили вопрос «Разрешить неаутентифицированные вызовы» или выбрали «N», вы не сможете получить доступ к результатам облачных функций и увидите «ошибку разрешений» без предоставления дополнительных настроек IAM. Так что обратите на это внимание.

10. Вызов развернутой облачной функции.

Давайте спросим об этом у Близнецов? Я ввел подсказку

How to call the deployed cloud function?

Я получил следующий результат: (Вы можете увидеть или не увидеть один и тот же ответ, не стесняйтесь поиграть с подсказкой и увидеть разницу в ответах).

1d2242715571fe6f.png

Задайте в чате конкретные вопросы об альтернативных способах вызова развернутой функции, вызова с помощью команды gcloud и т. д. Я отправил приглашение ниже:

how to call the deployed cloud function using gcloud

Я получил ответ ниже: e7b29b2cfb57782c.png

Вы можете использовать этот ответ (команда «вызов функций gcloud») из терминала с некоторыми изменениями, чтобы он работал в нашем сценарии (в качестве альтернативы попробуйте передать параметры в самом приглашении и посмотрите, сможете ли вы получить подробный вызов функций gcloud в ответ):

gcloud functions call bookshelf --region=us-central1 --gen2 --data '{"calls":[["Hello! This is my test prompt."]]}'

Вот мой результат:

6f396d915251db78.png

11. Очистка

Вы можете удалить созданные ранее облачные функции, нажав кнопку «УДАЛИТЬ» на странице сведений об облачных функциях.

12. Поздравления

Вы успешно создали, развернули и протестировали облачные функции Java для вызова Gemini 1.0 Pro с помощью Gemini! Это приложение принимает приглашение для ввода, связанное с рекомендацией книги, с кратким описанием и темой книг.