Создайте контекстное рекомендательное приложение для поз йоги с помощью Firestore, Vector Search и Gemini 2.0 (Java-версия)!

1. Обзор

В мире приложений для здоровья и фитнеса ключевым моментом является предоставление пользователям насыщенного и увлекательного опыта. Для приложения по йоге это означает выход за рамки простых текстовых описаний поз и предоставление исчерпывающей информации, мультимедийного контента и интеллектуальных возможностей поиска. В этом блоге мы рассмотрим, как создать надежную базу данных поз йоги с помощью Google Cloud Firestore, использовать расширение Vector Search для контекстного сопоставления и интегрировать возможности Gemini 2.0 Flash (экспериментальная версия) для работы с мультимодальным контентом.

Почему именно Firestore?

Firestore, бессерверная документоориентированная NoSQL-база данных от Google Cloud, — отличный выбор для создания масштабируемых и динамичных приложений. Вот почему она идеально подходит для нашего приложения Yoga:

  • Масштабируемость и производительность: Firestore автоматически масштабируется для обработки миллионов пользователей и огромных массивов данных, обеспечивая бесперебойную работу вашего приложения даже по мере его роста.
  • Обновления в реальном времени: Встроенная синхронизация в реальном времени обеспечивает согласованность данных на всех подключенных устройствах, что идеально подходит для таких функций, как онлайн-занятия или совместная практика.
  • Гибкая модель данных: документоориентированная структура Firestore позволяет хранить различные типы данных, включая текст, изображения и даже векторные представления, что делает его идеальным для представления сложной информации о позах йоги.
  • Мощные возможности запросов: Firestore поддерживает сложные запросы, включая поиск по равенству, неравенству, а теперь, благодаря новому расширению, и поиск по сходству векторов .
  • Поддержка работы в автономном режиме: Firestore кэширует данные локально, позволяя вашему приложению функционировать даже тогда, когда пользователи находятся в автономном режиме.

Улучшение поиска с помощью расширения Firestore Vector Search.

Традиционный поиск по ключевым словам может быть ограниченным при работе со сложными понятиями, такими как позы йоги. Пользователь может искать позу, которая «раскрывает тазобедренные суставы» или «улучшает баланс», не зная конкретного названия позы. Вот тут-то и пригодится векторный поиск.

Функция векторного поиска с использованием Firestore позволяет:

  • Генерация векторных представлений: Преобразование текстовых описаний, а в будущем, возможно, и изображений и аудио, в числовые векторные представления (встраивания), отражающие их семантическое значение, с использованием моделей, подобных тем, что доступны в Vertex AI, или пользовательских моделей.
  • Сохранение встраиваемых данных: Сохраняйте эти встраиваемые данные непосредственно в документах Firestore.
  • Выполняйте поиск по сходству: выполняйте запросы к базе данных для поиска документов, семантически похожих на заданный вектор запроса, что позволяет осуществлять контекстное сопоставление.

Интеграция Gemini 2.0 Flash (экспериментальная версия)

Gemini 2.0 Flash — это передовая многомодальная модель искусственного интеллекта от Google. Хотя она пока находится на стадии эксперимента, она открывает захватывающие возможности для улучшения нашего приложения Yoga:

  • Генерация текста : Используйте Gemini 2.0 Flash для создания подробных описаний поз йоги, включая преимущества, модификации и противопоказания.
  • Генерация изображений (имитация) : Хотя прямая генерация изображений с помощью Gemini пока недоступна для публичного использования, я имитировал этот процесс, используя Google Imagen, создав изображения, которые визуально представляют позы.
  • Генерация аудио (имитация) : Аналогичным образом, мы можем использовать сервис преобразования текста в речь (TTS) для создания аудиоинструкций для каждой позы, направляя пользователей в процессе выполнения упражнения.

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

  • Многомодальный API для потоковой передачи в реальном времени : этот новый API помогает создавать приложения для потоковой передачи видео и аудио в реальном времени с помощью соответствующих инструментов.
  • Скорость и производительность : Gemini 2.0 Flash демонстрирует значительно улучшенное время до получения первого токена (TTFT) по сравнению с Gemini 1.5 Flash.
  • Улучшенная работа агентов : Gemini 2.0 обеспечивает улучшение понимания мультимодальных данных, программирования, выполнения сложных инструкций и вызова функций. Эти улучшения работают вместе, обеспечивая более качественную работу агентов.

Для получения более подробной информации обратитесь к этой странице документации (%20over%20Gemini%201.5%20Flash).

Для повышения доверия и предоставления дополнительных ресурсов мы можем интегрировать поиск Google, чтобы подкрепить информацию, предоставляемую нашим приложением. Это означает:

  • Контекстный поиск: Когда администратор вводит данные о позе, мы можем использовать название позы для выполнения поиска в Google.
  • Извлечение URL-адресов: Из результатов поиска мы можем извлечь релевантные URL-адреса, такие как ссылки на статьи, видео или авторитетные веб-сайты о йоге, и отобразить их в приложении.

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

В рамках этой лабораторной работы вы:

  1. Создайте коллекцию Firestore и загрузите в неё документы Yoga.
  2. Узнайте, как создавать CRUD-приложения с помощью Firestore.
  3. Создайте описание позы йоги с помощью Gemini 2.0 Flash.
  4. Включите интеграцию Firebase Vector Search с Firestore.
  5. Сгенерировать векторные представления на основе описания йоги.
  6. Выполните поиск сходства по поисковому запросу пользователя.

Требования

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

2. Прежде чем начать

Создать проект

  1. В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
  2. Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
  3. Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud и поставляемую с предустановленным bq. Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.

Изображение кнопки «Активировать Cloud Shell»

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

Если какой-либо API отсутствует, вы всегда можете включить его в процессе реализации.

Для получения информации о командах gcloud и их использовании обратитесь к документации .

3. Настройка базы данных

В документации описаны более подробные шаги по настройке экземпляра Firestore. Для начала я выполню следующие действия:

1. Перейдите в Firestore Viewer и на экране «Выберите службу базы данных» выберите Firestore в собственном режиме.

  1. Выберите местоположение для вашего Firestore (обязательно выберите us-central1 и следуйте этому руководству при выборе региона/местоположения на протяжении всего этого практического занятия).
  2. Нажмите «Создать базу данных» (если вы делаете это впервые, оставьте значение «(база данных по умолчанию)»).

При создании проекта Firestore также активируется API в Cloud API Manager.

  1. ВАЖНО: Выберите тестовую (а не производственную) версию правил безопасности, чтобы данные были доступны.
  2. После завершения настройки вы должны увидеть базу данных Firestore, коллекции и документы в нативном режиме, как показано на изображении ниже:

f7136d53253c59a.png

  1. Пока не выполняйте этот шаг, но на всякий случай — вы можете нажать «Начать коллекцию» и создать новую коллекцию. Установите идентификатор коллекции как «позы». Нажмите кнопку «Сохранить ».

a26eb470aa9bfda9.png

Полезные советы для применения в производстве:

  1. После завершения разработки модели данных и определения того, кто должен иметь доступ к различным типам документов, вы можете создавать, редактировать и отслеживать правила безопасности из интерфейса Firebase. Доступ к правилам безопасности можно получить по этой ссылке: https://console.firebase.google.com/u/0/project/ <<ваш_идентификатор_проекта>>/firestore/rules
  2. Обязательно отредактируйте, отслеживайте и тестируйте правила безопасности перед развертыванием/внедрением проекта из стадии разработки, поскольку именно они часто являются скрытой причиной некорректной работы вашего приложения :)

Для этой демонстрации мы будем использовать его в тестовом режиме.

4. REST API Firestore

  1. REST API может быть полезен в следующих случаях: a. Доступ к Firestore из среды с ограниченными ресурсами, где запуск полной клиентской библиотеки невозможен; b. Автоматизация администрирования базы данных или получение подробных метаданных базы данных.
  2. Самый простой способ использовать Firestore — это воспользоваться одной из нативных клиентских библиотек, однако в некоторых ситуациях полезно напрямую обращаться к REST API.
  3. В рамках этой статьи вы увидите использование и демонстрацию REST API Firestore, а не нативных клиентских библиотек.
  4. Для аутентификации REST API Firestore принимает либо токен Firebase Authentication ID, либо токен Google Identity OAuth 2.0. Более подробную информацию по теме аутентификации и авторизации см. в документации .
  5. Все конечные точки REST API находятся по базовому URL-адресу https://firestore.googleapis.com/v1/ .

Spring Boot и Firestore API

Данное решение на основе фреймворка Spring Boot демонстрирует клиентское приложение, использующее API Firestore для сбора и изменения данных о позах йоги и дыхании, обеспечивая при этом интерактивный пользовательский интерфейс.

Подробное пошаговое объяснение решения Firestore CRUD в приложении для поз йоги можно найти по ссылке в блоге .

Чтобы сосредоточиться на текущем решении и изучить часть, связанную с CRUD, в процессе работы, клонируйте все решение, описанное в этом блоге, из репозитория ниже в вашем терминале Cloud Shell и получите копию исходного кода.

git clone https://github.com/AbiramiSukumaran/firestore-poserecommender

Пожалуйста, обрати внимание:

  1. После клонирования этого репозитория вам потребуется внести лишь несколько изменений в идентификатор проекта, API и т. д. Никаких других изменений для запуска приложения не требуется. Каждый компонент приложения описан в следующих разделах. Вот список необходимых изменений:
  2. В файле src/main/java/com/example/demo/GenerateImageSample.java замените "<<YOUR_PROJECT_ID>>" на идентификатор вашего проекта.
  3. В файле src/main/java/com/example/demo/GenerateEmbeddings.java замените "<<YOUR_PROJECT_ID>>" на идентификатор вашего проекта.
  4. В src/main/java/com/example/demo/PoseController.java замените все вхождения " <<YOUR_PROJECT_ID>>" и имя базы данных , в данном случае "(default)", соответствующими значениями из вашей конфигурации:
  5. В src/main/java/com/example/demo/PoseController.java замените " [YOUR_API_KEY] " на свой API-ключ для Gemini 2.0 Flash. Его можно получить в AI Studio .
  6. Для локального тестирования выполните следующие команды из папки проекта в терминале Cloud Shell:
mvn package

mvn spring-boot:run

В настоящий момент вы можете посмотреть, как работает ваше приложение, нажав на опцию «предварительный просмотр веб-страницы» в терминале Cloud Shell. Мы пока не готовы проводить тестирование и проверять работу приложения.

  1. Необязательно: Если вы хотите развернуть приложение в Cloud Run, вам потребуется создать с нуля новое Java-приложение Cloud Run с помощью редактора Cloud Shell и добавить исходные файлы и файлы шаблонов из репозитория в соответствующие папки вашего нового проекта (поскольку текущий проект репозитория GitHub по умолчанию не настроен для развертывания в Cloud Run). В этом случае (вместо клонирования существующего репозитория) необходимо выполнить следующие шаги:
  2. Перейдите в редактор Cloud Shell (убедитесь, что открыт редактор, а не терминал), щелкните значок имени проекта Google Cloud в левой части строки состояния (затемненная часть на скриншоте ниже).

d3f0de417094237d.png

  1. Выберите из списка вариантов «Новое приложение» -> «Приложение для облачного запуска» -> «Java: Облачный запуск» и назовите его «firestore-poserecommender».

d5ef8b4ca8bf3f85.png

  1. Теперь вы должны увидеть шаблон полного стека для Java Cloud Run Application, предварительно настроенный и готовый к работе.
  2. Удалите существующий класс Controller и скопируйте следующие файлы в соответствующие папки в структуре проекта:

firestore-poserecommender/src/main/java/com/example/demo/

  1. FirestoreSampleApplication.java
  2. GenerateEmbeddings.java
  3. GenerateImageSample.java
  4. Pose.java
  5. PoseController.java
  6. ServletInitializer.java
             firestore-poserecommender/src/main/resources/static/
    
  7. Index.html

firestore-poserecommender/src/main/resources/templates/

  1. contextsearch.html
  2. createpose.html
  3. errmessage.html
  4. pose.html
  5. ryoq.html
  6. searchpose.html
  7. showmessage.html

firestore-poserecommender/

  1. Dockerfile
  2. Вам необходимо внести изменения в соответствующие файлы, заменив PROJECT ID и API KEY на ваши значения (шаги 1 a, b, c и d, описанные выше).

5. Ввод данных

Данные для приложения доступны в файле data.json: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json

Если вы хотите начать с предварительно заданных данных, вы можете скопировать JSON-файл и заменить все вхождения "<<YOUR_PROJECT_ID>>" на ваше значение.

  • Перейдите в Firestore Studio
  • Убедитесь, что вы создали коллекцию с именем "poses".
  • Добавляйте документы из указанного выше файла репозитория по одному вручную.

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

  1. Перейдите в терминал Cloud Shell и убедитесь, что ваш активный проект Google Cloud настроен и у вас есть необходимые права доступа. Создайте корзину в вашем проекте с помощью приведенной ниже команды gsutil . Замените переменную <PROJECT_ID> в приведенной ниже команде на идентификатор вашего проекта Google Cloud:

gsutil mb -l us gs:// <PROJECT_ID> -yoga-poses-bucket

  1. Теперь, когда бакет создан, нам нужно скопировать подготовленный экспорт базы данных в этот бакет, прежде чем мы сможем импортировать его в базу данных Firebase. Используйте приведенную ниже команду:

gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs:// <PROJECT_ID> -yoga-poses-bucket

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

  1. Теперь перейдите в консоль Firestore и в меню навигации слева нажмите «Импорт/Экспорт» .

Выберите «Импорт», укажите путь к созданному вами облачному хранилищу и пройдите по ссылкам, пока не сможете выбрать файл «yoga_poses.overall_export_metadata»:

f5c1d16df7d5a64a.png

  1. Нажмите «Импорт».

Импорт займет несколько секунд, и как только он будет готов, вы сможете проверить свою базу данных Firestore и коллекцию, перейдя по ссылке https://console.cloud.google.com/firestore/databases , выбрав базу данных по умолчанию и коллекцию поз , как показано ниже:

  1. Другой способ — это создание записей вручную через приложение после его развертывания с помощью действия «Создать новую позу».

6. Векторный поиск

Включить расширение поиска векторов Firestore

Используйте это расширение для автоматического встраивания и поиска по документам Firestore с помощью новой функции векторного поиска! Это переведет вас в Центр расширений Firebase.

При установке расширения Vector Search вы указываете коллекцию и имя поля документа. Добавление или обновление документа с этим полем запускает процесс вычисления векторного представления для документа. Это векторное представление записывается обратно в тот же документ, и документ индексируется в векторном хранилище, готовый к запросам.

Давайте рассмотрим шаги:

Установите расширение:

Установите расширение "Vector Search with Firestore" из магазина расширений Firebase, нажав кнопку "Установить в консоли Firebase".

ВАЖНЫЙ:

При первом переходе на страницу расширений вам необходимо выбрать тот же проект, над которым вы работаете в консоли Google Cloud, указанный в консоли Firebase.

715426b97c732649.png

Если вашего проекта нет в списке, добавьте его в Firebase ( выберите из списка существующий проект Google Cloud ).

Настройте расширение:

Укажите коллекцию ("poses"), поле, содержащее текст для встраивания ("posture"), и другие параметры, такие как размеры встраивания.

Если на этом шаге необходимо включить какие-либо API, страница конфигурации позволит вам это сделать; следуйте инструкциям.

Если страница некоторое время не отвечает после включения API, просто обновите страницу, и вы увидите, что API включены.

5ba59b45710c567b.png

На одном из следующих шагов вам будет предоставлена ​​возможность использовать LLM по вашему выбору для генерации эмбеддингов. Выберите "Vertex AI".

bb528a04ebb5f976.png

Следующие несколько настроек относятся к вашей коллекции и полю, которое вы хотите встроить:

Магистр права: Vertex AI

Путь к коллекции: позы

Ограничение на количество запросов по умолчанию: 3

Мера расстояния: косинус

Название поля ввода: осанка

Название выходного поля: embedding

Название поля статуса: статус

Встраивание существующих документов: Да

Обновить существующие эмбеддинги: Да

Расположение Cloud Functions: us-central1

Включить события: Не отмечено

fb8cdf1163fac7cb.png

После завершения всех настроек нажмите кнопку «Установить расширение». Это займет 3-5 минут.

Сгенерировать векторные представления:

При добавлении или обновлении документов в коллекции "позы" расширение автоматически генерирует эмбеддинги, используя предварительно обученную модель или модель по вашему выбору через конечную точку API. В данном случае мы выбрали Vertex AI в конфигурации расширения.

Создание индекса

Это потребует создания индекса для поля встраивания в момент его использования в приложении.

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

  1. Перейдите в терминал Cloud Shell.
  2. Выполните следующую команду:
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"

Подробнее об этом можно прочитать здесь .

После создания векторного индекса вы можете выполнить поиск ближайшего соседа с использованием ваших векторных представлений.

Важное примечание:

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

Давайте посмотрим, как ваше недавно созданное приложение использует векторный поиск. После сохранения векторных представлений вы можете использовать класс VectorQuery из Firestore Java SDK для выполнения векторного поиска и получения результатов поиска ближайших соседей:

CollectionReference coll = firestore.collection("poses");
    VectorQuery vectorQuery = coll.findNearest(
        "embedding",
        userSearchTextEmbedding, 
        /* limit */ 3,
        VectorQuery.DistanceMeasure.EUCLIDEAN,
        VectorQueryOptions.newBuilder().setDistanceResultField("vector_distance")
         .setDistanceThreshold(2.0)
          .build());
ApiFuture<VectorQuerySnapshot> future = vectorQuery.get();
VectorQuerySnapshot vectorQuerySnapshot = future.get();
List<Pose> posesList = new ArrayList<Pose>();
// Get the ID of the closest document (assuming results are sorted by distance)
String closestDocumentId = vectorQuerySnapshot.getDocuments().get(0).getId();

Этот фрагмент кода сравнивает векторное представление текста пользовательского поиска с векторными представлениями документов в Firestore и извлекает наиболее близкое по контексту представление.

7. Gemini 2.0 Flash

Интеграция Gemini 2.0 Flash (для генерации описания)

Давайте посмотрим, как ваше недавно созданное приложение обрабатывает интеграцию Gemini 2.0 Flash для генерации описаний.

Предположим, администратор/инструктор по йоге хочет ввести данные о позах с помощью Gemini 2.0 Flash, а затем выполнить поиск для получения наиболее подходящих совпадений. В результате будут извлечены данные о соответствующих позах, а также мультимодальные объекты, подтверждающие результаты.

String apiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent?key=[YOUR_API_KEY]";
Map<String, Object> requestBody = new HashMap<>();
List<Map<String, Object>> contents = new ArrayList<>();
List<Map<String, Object>> tools = new ArrayList<>();
Map<String, Object> content = new HashMap<>();
List<Map<String, Object>> parts = new ArrayList<>();
Map<String, Object> part = new HashMap<>();
part.put("text", prompt);
parts.add(part);
content.put("parts", parts);
contents.add(content);
requestBody.put("contents", contents);
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, String.class);
System.out.println("Generated response: " + response);
String responseBody = response.getBody();
JSONObject jsonObject = new JSONObject(responseBody);
JSONArray candidates = jsonObject.getJSONArray("candidates");
JSONObject candidate = candidates.getJSONObject(0);
JSONObject contentResponse = candidate.getJSONObject("content");
JSONArray partsResponse = contentResponse.getJSONArray("parts");
JSONObject partResponse = partsResponse.getJSONObject(0);
String generatedText = partResponse.getString("text");
System.out.println("Generated Text: " + generatedText);

а. Имитация генерации изображений и звука

Экспериментальная версия Gemini 2.0 Flash способна генерировать мультимодальные результаты, однако я ещё не зарегистрировался для раннего доступа, поэтому я имитировал вывод изображений и звука с помощью API Imagen и TTS соответственно. Представьте, как здорово было бы получать всё это с помощью одного вызова API Gemini 2.0 Flash!!

try (PredictionServiceClient predictionServiceClient =
          PredictionServiceClient.create(predictionServiceSettings)) {
  
        final EndpointName endpointName =
            EndpointName.ofProjectLocationPublisherModelName(
                projectId, location, "google", "imagen-3.0-generate-001");
  
        Map<String, Object> instancesMap = new HashMap<>();
        instancesMap.put("prompt", prompt);
        Value instances = mapToValue(instancesMap);
  
        Map<String, Object> paramsMap = new HashMap<>();
        paramsMap.put("sampleCount", 1);
        paramsMap.put("aspectRatio", "1:1");
        paramsMap.put("safetyFilterLevel", "block_few");
        paramsMap.put("personGeneration", "allow_adult");
        Value parameters = mapToValue(paramsMap);
  
        PredictResponse predictResponse =
            predictionServiceClient.predict(
                endpointName, Collections.singletonList(instances), parameters);
  
        for (Value prediction : predictResponse.getPredictionsList()) {
          Map<String, Value> fieldsMap = prediction.getStructValue().getFieldsMap();
          if (fieldsMap.containsKey("bytesBase64Encoded")) {
            bytesBase64Encoded = fieldsMap.get("bytesBase64Encoded").getStringValue();
       }
      }
      return bytesBase64Encoded;
    }
 try {
            // Create a Text-to-Speech client
            try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
                // Set the text input to be synthesized
                SynthesisInput input = SynthesisInput.newBuilder().setText(postureString).build();

                // Build the voice request, select the language code ("en-US") and the ssml
                // voice gender
                // ("neutral")
                VoiceSelectionParams voice =
                        VoiceSelectionParams.newBuilder()
                                .setLanguageCode("en-US")
                                .setSsmlGender(SsmlVoiceGender.NEUTRAL)
                                .build();

                // Select the type of audio file you want returned
                AudioConfig audioConfig =
                        AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build();

                // Perform the text-to-speech request on the text input with the selected voice
                // parameters and audio file type
                SynthesizeSpeechResponse response =
                        textToSpeechClient.synthesizeSpeech(input, voice, audioConfig);

                // Get the audio contents from the response
                ByteString audioContents = response.getAudioContent();

                // Convert to Base64 string
                String base64Audio = Base64.getEncoder().encodeToString(audioContents.toByteArray());

                // Add the Base64 encoded audio to the Pose object
               return base64Audio;
            }

        } catch (Exception e) {
            e.printStackTrace(); // Handle exceptions appropriately. For a real app, log and provide user feedback.
            return "Error in Audio Generation";
        }
}

б. Основы работы с поиском Google:

Если вы проверите код вызова Gemini на шаге 6, вы заметите следующий фрагмент кода, который включает привязку Google Search к ответу LLM:

 /**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);

Это необходимо для того, чтобы мы:

  • Привяжите нашу модель к реальным результатам поиска.
  • Извлеките релевантные URL-адреса, указанные в поисковом запросе.

8. Запустите приложение.

Давайте рассмотрим все возможности вашего недавно созданного Java Spring Boot приложения с простым веб-интерфейсом Thymeleaf:

  1. Операции CRUD в Firestore (создание, чтение, обновление, удаление)
  2. Поиск по ключевым словам
  3. Создание контекста на основе генеративного ИИ
  4. Контекстный поиск (векторный поиск)
  5. Мультимодальный вывод, связанный с поиском.
  6. Выполните собственный запрос (запросы в формате structuredQuery)

Пример: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}

Все описанные выше функции являются частью приложения, которое вы только что создали из репозитория: https://github.com/AbiramiSukumaran/firestore-poserecommender

Для сборки, запуска и развертывания выполните следующие команды в терминале Cloud Shell:

mvn package

mvn spring-boot:run

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

Pose Recommender с Firestore, Vector Search и Gemini 2.0 Flash

Необязательный шаг:

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

gcloud run deploy --source .

Укажите название приложения, код региона (выберите регион us-central1 ) и выберите «Y» для неаутентифицированного вызова, как будет предложено. После успешного развертывания вы должны увидеть конечную точку вашего приложения в терминале.

9. Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, использованные в этой статье, выполните следующие действия:

  1. В консоли Google Cloud перейдите на страницу «Управление ресурсами» .
  2. В списке проектов выберите проект, который хотите удалить, и нажмите кнопку «Удалить» .
  3. В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить» , чтобы удалить проект.

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

Поздравляем! Вы успешно использовали Firestore для создания надежного и интеллектуального приложения для управления позами йоги. Объединив возможности Firestore, расширения Vector Search и функционала Gemini 2.0 Flash (с имитацией генерации изображений и звука), мы создали действительно увлекательное и информативное приложение для йоги, реализующее операции CRUD, выполняющее поиск по ключевым словам, контекстный векторный поиск и генерирующее мультимедийный контент.

Этот подход не ограничивается приложениями для йоги. По мере развития моделей искусственного интеллекта, таких как Gemini, возможности создания еще более захватывающих и персонализированных пользовательских интерфейсов будут только расти. Не забывайте следить за последними разработками и документацией от Google Cloud и Firebase, чтобы в полной мере использовать потенциал этих технологий.

Если бы я расширял функциональность этого приложения, я бы попытался сделать две вещи с помощью Gemini 2.0 Flash :

  1. Воспользуйтесь API Multimodal Live , чтобы создать потоковую передачу видео и звука в реальном времени для решения поставленной задачи.
  2. Включите режим «Мышление» , чтобы генерировать мысли, лежащие в основе ответов на вопросы взаимодействия, используя данные в реальном времени, что сделает процесс более реалистичным.

Не стесняйтесь попробовать и отправить запрос на слияние :>D!!!