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

1. Введение

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

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

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

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

Мы разделим реализацию на 3 практических занятия:

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

Практическое занятие 2: Используйте Gemini для создания генеративных приложений искусственного интеллекта, работающих исключительно с SQL, с помощью BigQuery.

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

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

Что вы построите

Вы создадите

  • Приложение Java Cloud Functions, использующее Gemini 1.0 Pro, принимает на вход определенный запрос в виде JSON-массива и возвращает ответ (JSON-значение с меткой "replies").
  • Шаги сборки и развертывания вы выполните с помощью Gemini.

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

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

Ниже перечислены необходимые условия:

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

  1. В консоли Google Cloud на странице выбора проекта выберите или создайте проект 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.

Включить Gemini

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

Важно: выполните шаги 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 Functions. Сделайте то же самое для Cloud Run, поскольку нам нужны оба инструмента для сборки и развертывания Cloud Functions:

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» прокрутите вниз до пункта «New Application».

ca08602b576ebd57.png

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

ac2b44245949da68.png

В появившемся списке вместо helloworld введите название проекта "duetai-gemini-calling" и нажмите OK.

bf9cfe86e35cdced.png

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

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

d56e410fb76f183f.png

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

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

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

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

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, непосредственно перед тегом </dependencies> . Замените version на 0.1.0 (вы можете удалить тег <version>, если используете Spring Cloud GCP BOM для управления номерами версий 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. Обновите значение entryPoint с "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>> {"replies": ["response"]}

Воспользуйтесь функцией чата 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

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

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

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

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

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

How to call the deployed cloud function?

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

1d2242715571fe6f.png

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

how to call the deployed cloud function using gcloud

Я получил следующий ответ: e7b29b2cfb57782c.png

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

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

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

6f396d915251db78.png

11. Уборка

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

12. Поздравляем!

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