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. Требования
Ниже перечислены необходимые условия:
Создайте свой проект
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
- Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
Активировать Cloud Shell
- Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud и поставляемую с предустановленным пакетом bq :
В консоли Cloud Console нажмите кнопку «Активировать Cloud Shell» в правом верхнем углу: 
- После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и проект уже настроен на ваш идентификатор проекта. Для подтверждения аутентификации выполните следующую команду в Cloud Shell:
gcloud auth list
- Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте.
gcloud config list project
- Если ваш проект не задан, используйте следующую команду для его установки:
gcloud config set project <YOUR_PROJECT_ID>
Для получения информации о командах gcloud и их использовании обратитесь к документации .
4. Включение Gemini для Google Cloud и необходимых API.
Включить Gemini
- Чтобы включить API, перейдите в раздел Gemini for Google Cloud на Marketplace . Также можно использовать следующую команду:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Перейдите на страницу Gemini и нажмите «Начать чат».
Важно: выполните шаги 1 и 2 в этом практическом задании , чтобы начать работу с Gemini и включить Gemini в среде разработки Cloud Shell IDE соответственно.
Включите другие необходимые API.
Как бы мы это сделали? Давайте спросим об этом Близнецов, хорошо? Но прежде чем это сделать, помните:
LLM-ы являются недетерминированными. Поэтому, когда вы будете отвечать на эти вопросы, полученные ответы могут отличаться от тех, что показаны на моем скриншоте.
Перейдите в консоль чата Gemini, нажав на значок «Открыть Gemini» в правом верхнем углу рядом со строкой поиска в консоли Google Cloud.

Введите этот вопрос в поле "Введите подсказку здесь":
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 (я обычно предпочитаю открывать терминал и редактор в отдельных вкладках параллельно, чтобы мы могли писать код в одной, а выполнять сборку в другой).

После открытия редактора убедитесь, что логотип Gemini в правом нижнем углу консоли редактора активен (и не закрыт). Также убедитесь, что ваш проект Google Cloud в левом нижнем углу указывает на текущий активный проект, с которым вы хотите работать. Если они неактивны, щелкните по ним, авторизуйтесь, выберите проект Google Cloud, на который вы хотите указать, и активируйте их.
После активации обоих компонентов щелкните название проекта в левом нижнем углу, и во всплывающем списке под названием «Cloud Code» прокрутите вниз до пункта «New Application».

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

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

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

На данный момент вы можете развернуть функцию. Но мы начали не с этого. Давайте перейдем к реализации 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.
Я получил следующий результат:

<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).
Раздел зависимостей должен выглядеть следующим образом:

При необходимости обновите номера версий в соответствии с указанными выше. Обратите внимание, что я также добавил еще одну зависимость:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10</version>
</dependency>
7. Измените точку входа функции и имя класса.
- Перейдите к файлу "launch.json" в папке ".vscode". Измените имя функции с "function-hello-world" на "function-gemini-calling".
- Обновите значение entryPoint с "cloudcode.helloworld.HelloWorld" на cloudcode.bookshelf.Bookshelf.
- Теперь перейдите к файлу класса Java "HelloWorld.java". Измените имя пакета на package cloudcode.bookshelf; В появившемся сообщении об ошибке нажмите на желтый значок лампочки и выберите опцию "Переместить HelloWorld.java в пакет cloudcode.bookshelf";.

- Измените имя класса на 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 на левой панели, чтобы объяснить код. Также вы можете выделить весь код, щелкнуть желтый значок лампочки в верхнем левом углу выделения и выбрать опцию «Объяснить это».

9. Развертывание облачных функций
Теперь, когда облачная функция готова, давайте спросим у Gemini, как её развернуть. Перейдите в чат Gemini в редакторе кода Cloud Code и введите следующее:
How to deploy this Cloud Function with a gcloud command?
Я получил следующий ответ:

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

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

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

Теперь давайте развернем функцию, выполнив команду 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?
Я получил следующий результат: (Возможно, вы увидите не совсем такой же ответ, можете поэкспериментировать с подсказкой и посмотреть, как изменится результат).

Задавайте в чате конкретные вопросы об альтернативных способах вызова развернутой функции, использовании команды gcloud и т.д. Я отправил следующее сообщение:
how to call the deployed cloud function using gcloud
Я получил следующий ответ: 
Вы можете использовать этот ответ (команда "gcloud functions call") из терминала, внеся в него некоторые изменения, чтобы он работал в нашем сценарии (или попробуйте передать параметры непосредственно в командной строке и посмотрите, сможете ли вы получить подробный ответ о вызове функций gcloud):
gcloud functions call bookshelf --region=us-central1 --gen2 --data '{"calls":[["Hello! This is my test prompt."]]}'
Вот мой результат:

11. Уборка
Вы можете удалить созданные ранее облачные функции, нажав кнопку «УДАЛИТЬ» на странице с подробной информацией об облачных функциях.
12. Поздравляем!
Вы успешно создали, развернули и протестировали Java Cloud Functions для вызова Gemini 1.0 Pro с помощью Gemini! Это приложение принимает на вход запрос, связанный с рекомендациями книг, включая их краткое содержание и тематику.