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. Требования
Ниже приведены предварительные условия:
Создайте свой проект
- В Google Cloud Console на странице выбора проекта выберите или создайте проект 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 для Google Cloud в Marketplace, чтобы включить API. Вы также можете использовать следующую команду:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- Посетите страницу Близнецов и нажмите «Начать общение».
Важно! Выполните шаги 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 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 (обычно я предпочитаю открывать терминал и редактор на отдельных вкладках параллельно, чтобы мы могли писать код в одной и встраивать в другую).
Открыв редактор, убедитесь, что логотип Gemini в правом нижнем углу консоли редактора активен (и не погашен). Также убедитесь, что ваш проект Google Cloud в левом нижнем углу указывает на текущий активный проект, с которым вы хотите работать. Если они неактивны, щелкните их, авторизируйтесь, выберите проект Google Cloud, на который вы хотите, чтобы он указывал, и активируйте их.
Как только оба будут активны, щелкните имя проекта в левом нижнем углу и в открывшемся всплывающем списке под названием «Cloud Code» прокрутите вниз до «Новое приложение».
В этом списке выберите приложение Cloud Functions. В появившемся списке выберите Java:
В появившемся списке введите имя проекта «duetai-gemini-calling» вместо helloworld и нажмите «ОК».
Ура! Вы загрузили свое простое приложение Java Cloud Functions с помощью Gemini и ничего не сделали, кроме включения и активации конфигураций, согласны?
Вот структуру проекта, которую вы должны увидеть:
Прямо сейчас вы готовы развернуть функцию. Но мы начали это не поэтому. Давайте продолжим и создадим реализацию 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.
Я получил такой результат:
<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).
Раздел зависимостей должен выглядеть следующим образом:
При необходимости обязательно обновите номера версий, чтобы они соответствовали указанным выше. Если вы заметили, я также включил в него еще одну зависимость:
<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».
- Обновите значение inputPoint с «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>> {"ответы": ["ответ"]}
Попробуйте воспользоваться функцией чата 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
Вас спросят: «Разрешить неаутентифицированный вызов новой функции [книжная полка]?» Скажите «y» и нажмите Enter. После этого задайте несколько вопросов, если применимо, и ваша бессерверная облачная функция будет развернута с развернутым URL-адресом: https://us-central1-*******.cloudfunctions.net/bookshelf.
Теперь давайте вызовем развернутые облачные функции и протестируем их!
Примечание. Если вы случайно пропустили вопрос «Разрешить неаутентифицированные вызовы» или выбрали «N», вы не сможете получить доступ к результатам облачных функций и увидите «ошибку разрешений» без предоставления дополнительных настроек IAM. Так что обратите на это внимание.
10. Вызов развернутой облачной функции.
Давайте спросим об этом у Близнецов? Я ввел подсказку
How to call the deployed cloud function?
Я получил следующий результат: (Вы можете увидеть или не увидеть один и тот же ответ, не стесняйтесь поиграть с подсказкой и увидеть разницу в ответах).
Задайте в чате конкретные вопросы об альтернативных способах вызова развернутой функции, вызова с помощью команды gcloud и т. д. Я отправил приглашение ниже:
how to call the deployed cloud function using gcloud
Я получил ответ ниже:
Вы можете использовать этот ответ (команда «вызов функций gcloud») из терминала с некоторыми изменениями, чтобы он работал в нашем сценарии (в качестве альтернативы попробуйте передать параметры в самом приглашении и посмотрите, сможете ли вы получить подробный вызов функций gcloud в ответ):
gcloud functions call bookshelf --region=us-central1 --gen2 --data '{"calls":[["Hello! This is my test prompt."]]}'
Вот мой результат:
11. Очистка
Вы можете удалить созданные ранее облачные функции, нажав кнопку «УДАЛИТЬ» на странице сведений об облачных функциях.
12. Поздравления
Вы успешно создали, развернули и протестировали облачные функции Java для вызова Gemini 1.0 Pro с помощью Gemini! Это приложение принимает приглашение для ввода, связанное с рекомендацией книги, с кратким описанием и темой книг.