使用 Firestore、Vector Search 和 Gemini 2.0 建構瑜珈姿勢推薦應用程式!

使用 Firestore、Vector Search 和 Gemini 2.0 建構瑜珈姿勢推薦應用程式!

程式碼研究室簡介

subject上次更新時間:2月 10, 2025
account_circle作者:Author: Abirami Sukumaran

1. 總覽

在健身與健康應用程式領域,提供豐富且引人入勝的體驗至關重要。以瑜珈應用程式為例,除了提供簡單的體位文字說明,還應提供完整資訊、多媒體內容和智慧搜尋功能。在本篇文章中,我們將探討如何使用 Google Cloud 的 Firestore 建立健全的瑜珈姿勢資料庫、運用 Vector Search 擴充功能進行內容比對,以及整合 Gemini 2.0 Flash (實驗功能) 的強大功能,以便處理多模態內容。

Firestore 是 Google Cloud 的無伺服器 NoSQL 文件資料庫,是建構可擴充且具動態功能的應用程式時的絕佳選擇。以下是 Yoga 應用程式適合使用這項功能的原因:

  • 擴充性和效能:Firestore 會自動擴充,以便處理數百萬名使用者和龐大資料集,確保應用程式即使在成長過程中也能保持回應速度。
  • 即時更新:內建即時同步處理功能可讓所有已連結的用戶端保持資料一致,非常適合用於即時課程或協作練習等功能。
  • 彈性資料模型:Firestore 以文件為基礎的結構可讓您儲存各種資料類型,包括文字、圖片,甚至是嵌入內容,非常適合用於呈現複雜的瑜珈姿勢資訊。
  • 強大的查詢功能:Firestore 支援複雜查詢,包括相等、不相等,現在還支援向量相似度搜尋這項全新擴充功能。
  • 離線支援:Firestore 會在本機快取資料,讓應用程式在使用者離線時也能運作。

使用 Firestore Vector Search Extension 提升搜尋功能

傳統的關鍵字搜尋在處理瑜珈姿勢等複雜概念時,可能會受到限制。使用者可能會搜尋「打開臀部」或「改善平衡」的姿勢,但不知道具體的姿勢名稱。這時就需要向量搜尋的協助。

搭配使用 Firestore 的 Vector Search 可讓您:

  • 產生嵌入:將文字說明 (未來可能會是圖片和音訊) 轉換為數值向量表示法 (嵌入),藉由 Vertex AI 或自訂模型等模型擷取其語意意義。
  • 儲存嵌入:直接將這些嵌入儲存在 Firestore 文件中。
  • 執行相似度搜尋:查詢資料庫,找出與指定查詢向量語意相似的文件,以便進行內容比對。

整合 Gemini 2.0 Flash (實驗功能)

Gemini 2.0 Flash 是 Google 最先進的多模態 AI 模型。雖然這項技術仍處於實驗階段,但它為豐富 Yoga 應用程式帶來了令人期待的可能性:

  • 文字產生:使用 Gemini 2.0 Flash 產生瑜珈姿勢的詳細說明,包括益處、調整方式和禁忌。
  • 圖像生成 (模擬):雖然 Gemini 尚未提供直接生成圖像的功能,但我已使用 Google 的 Imagen 模擬這項功能,生成可視覺化呈現姿勢的圖像。
  • 音訊產生 (模仿):同樣地,我們可以使用文字轉語音 (TTS) 服務,為每個姿勢建立音訊指示,引導使用者練習。

我認為,建議整合這項功能,可讓應用程式使用模型的下列功能:

  • Multimodal Live API:這個新的 API 可協助您使用工具,建立即時視覺和音訊串流應用程式。
  • 速度和效能:Gemini 2.0 Flash 的首次符號回應時間 (TTFT) 大幅改善,優於 Gemini 1.5 Flash。
  • 改善代理體驗:Gemini 2.0 改善了多模態理解、程式設計、遵循複雜指令和呼叫函式的功能。這些改善措施可相互搭配,提供更優質的代理人體驗。

詳情請參閱這份說明文件的頁面%20over%20Gemini%201.5%20Flash)。

為提升可信度並提供更多資源,我們可以整合 Google 搜尋,以此建立應用程式提供資訊的基準。這表示:

  • 內容比對搜尋:當管理員使用者輸入姿勢詳細資料時,我們可以使用姿勢名稱執行 Google 搜尋。
  • 網址擷取:我們可以從搜尋結果中擷取相關網址,例如文章、影片或信譽良好的瑜珈網站,並在應用程式中顯示這些網址。

建構項目

本實驗室的學習內容如下:

  1. 建立 Firestore 集合並載入 Yoga 文件
  2. 瞭解如何使用 Firestore 建立 CRUD 應用程式
  3. 使用 Gemini 2.0 Flash 產生瑜珈姿勢說明
  4. 啟用 Firebase Vector Search 與 Firestore 整合
  5. 根據瑜珈說明產生嵌入
  6. 針對使用者搜尋文字執行相似度搜尋

需求條件

  • ChromeFirefox 等瀏覽器
  • 已啟用計費功能的 Google Cloud 專案。

2. 事前準備

建立專案

  1. Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案
  2. 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能
  3. 您將使用 Cloud Shell,這是在 Google Cloud 中執行的指令列環境,並預先載入 bq。按一下 Google Cloud 控制台頂端的「啟用 Cloud Shell」。

「啟用 Cloud Shell」按鈕圖片

  1. 連線至 Cloud Shell 後,請使用下列指令確認您已通過驗證,且專案已設為您的專案 ID:
gcloud auth list
  1. 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案。
gcloud config list project
  1. 如果未設定專案,請使用下列指令進行設定:
gcloud config set project <YOUR_PROJECT_ID>
  1. 啟用必要的 API。
gcloud services enable firestore.googleapis.com \
                       compute
.googleapis.com \
                       cloudresourcemanager
.googleapis.com \
                       servicenetworking
.googleapis.com \
                       run
.googleapis.com \
                       cloudbuild
.googleapis.com \
                       cloudfunctions
.googleapis.com \
                       aiplatform
.googleapis.com \
                       storage
.googleapis.com \
                       secretmanager
.googleapis.com \
                       texttospeech
.googleapis.com

您可以透過主控台搜尋每項產品,或使用這個連結,來取代 gcloud 指令。

如果遺漏任何 API,您隨時可以在實作期間啟用。

如要瞭解 gcloud 指令和用法,請參閱說明文件

3. 資料庫設定

說明文件提供更完整的步驟,說明如何設定 Firestore 執行個體。大致來說,我會按照以下步驟開始:

1 前往 Firestore 檢視器,然後在「選取資料庫服務」畫面中,選擇原生模式的 Firestore

  1. 選取 Firestore 的位置
  2. 按一下「Create Database」(建立資料庫) (如果是首次建立,請將資料庫設為「(預設)」)

建立 Firestore 專案時,也會在 Cloud API Manager 中啟用 API

  1. 重要事項:請選擇「測試」(而非「正式版」) 版本的安全性規則,以便存取資料
  2. 設定完成後,您應該會在 Native 模式中看到 Firestore 資料庫、集合和文件檢視畫面,如下圖所示:

f7136d53253c59a.png

  1. 請先不要執行這個步驟,但為了方便您瞭解操作方式,您可以按一下「開始收集」並建立新的集合。將集合 ID 設為「poses」。按一下「儲存」按鈕。

a26eb470aa9bfda9.png

實際應用的專家訣竅:

  1. 定案後,您可以透過 Firebase 介面建立、編輯及監控安全性規則,並指定哪些使用者可以存取不同類型的文件。您可以透過以下連結存取安全性規則:https://console.firebase.google.com/u/0/project/<<your_project_id>>/firestore/rules
  2. 請務必在從開發階段部署 / 推出專案前,編輯、監控及測試安全性規則,因為這通常是導致應用程式運作方式不同的隱藏原因 :)

在本示範中,我們會在測試模式下使用它。

4. Firestore REST API

  1. REST API 可用於下列用途:在資源受限的環境中存取 Firestore,因為無法執行完整的用戶端程式庫。自動化資料庫管理或擷取詳細資料庫中繼資料
  2. 使用 Firestore 最簡單的方法是使用其中一個原生用戶端程式庫,在某些情況下,直接呼叫 REST API 會很有幫助
  3. 在本部落格文章中,您將看到 Firestore REST API 的用法和示範,而非原生用戶端程式庫
  4. 針對驗證,Firestore REST API 會接受 Firebase 驗證 ID 權杖或 Google Identity OAuth 2.0 權杖。如要進一步瞭解驗證和授權主題,請參閱說明文件
  5. 所有 REST API 端點都位於 https://firestore.googleapis.com/v1/ 這個基礎網址底下。

Spring Boot 和 Firestore API

這個 Spring Boot 架構中的解決方案,是為了展示使用者互動體驗的用戶端應用程式,該應用程式會使用 Firestore API 收集及修改瑜珈姿勢和呼吸詳細資料。

如要進一步瞭解瑜珈姿勢應用程式的 Firestore CRUD 解決方案,請參閱這篇部落格文章,瞭解詳細的逐步說明。

如要專注於目前的解決方案,並隨時瞭解 CRUD 部分,請從 Cloud Shell 終端機中複製本部落格文章所關注的整個解決方案,並取得程式碼集的副本。

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

注意事項:

  1. 複製這個存放區後,您只需針對專案 ID、API 等進行一些變更,即可啟動應用程式。後續章節將說明應用程式的各個元件。以下列出變更項目:
  2. src/main/java/com/example/demo/GenerateImageSample.java 檔案中,將「<<YOUR_PROJECT_ID>>」替換為您的專案 ID
  3. src/main/java/com/example/demo/GenerateEmbeddings.java 檔案中,將「<<YOUR_PROJECT_ID>>」替換為您的專案 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]」替換為 Gemini 2.0 Flash 的 API 金鑰。您可以從 AI Studio 取得這項資訊。
  6. 如要本機測試,請在 Cloud Shell 終端機的專案資料夾中執行下列指令:
mvn package

mvn spring-boot:run

目前,您可以按一下 Cloud Shell 終端機中的「網頁預覽」選項,查看應用程式執行狀況。我們尚未準備好執行測試及嘗試應用程式。

  1. 選用步驟:如果您想在 Cloud Run 中部署應用程式,必須透過 Cloud Shell 編輯器從頭開始啟動全新的 Java Cloud Run 應用程式,並將 repo 中的來源檔案和範本檔案新增至相應資料夾中的新專案 (因為目前的 GitHub 存放區專案並未預設為 Cloud Run 部署設定)。在這種情況下,請按照下列步驟操作 (而非複製現有存放區):
  2. 前往 Cloud Shell 編輯器 (請務必開啟編輯器,而非終端機),按一下狀態列左側的 Google Cloud 專案名稱圖示 (下圖中遮蓋的部分)

d3f0de417094237d.png

  1. 從選項清單中依序選取「New application」(新應用程式) ->「Cloud Run Application」(Cloud Run 應用程式) ->「Java: Cloud Run」(Java:Cloud Run),並將其命名為「firestore-poserecommender」。

d5ef8b4ca8bf3f85.png

  1. 您現在應該會看到 Java Cloud Run 應用程式的完整堆疊範本,並已預先設定好,隨時可以開始使用
  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. 您需要在對應的檔案中進行變更,將專案 ID 和 API 金鑰分別替換為對應的值。(上述步驟 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 專案 ID:

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 控制台,然後按一下左側導覽選單中的「Import/Export」

選取「匯入」,然後選擇剛剛建立的 Cloud Storage 路徑,並瀏覽檔案,直到您可以選取「yoga_poses.overall_export_metadata」檔案為止:

f5c1d16df7d5a64a.png

  1. 按一下 [匯入]。

匯入作業需要幾秒鐘的時間,完成後,您可以前往 https://console.cloud.google.com/firestore/databases 選取「預設」資料庫和「姿勢」集合,如以下所示:

  1. 另一種方法是,您也可以在使用「Create a New Pose」動作部署後,透過應用程式手動建立記錄。

6. Vector Search

啟用 Firestore Vector Search 擴充功能

使用這個擴充功能,即可透過新的向量搜尋功能自動嵌入及查詢 Firestore 文件!系統會將您導向 Firebase Extensions Hub。

安裝向量搜尋擴充功能時,請指定集合和文件欄位名稱。使用這個欄位新增或更新文件時,這個擴充功能會觸發計算文件的向量嵌入。向量嵌入會寫回相同的文件,並在向量儲存庫中建立索引,以便進行查詢。

我們來看看具體步驟:

安裝擴充功能:

按一下「在 Firebase 主控台中安裝」,從 Firebase 擴充功能市集安裝「Vector Search with Firestore」擴充功能。

重要事項:

首次前往這個擴充功能頁面時,請選取 Firebase 控制台列出的 Google Cloud 控制台中,您正在使用的專案。

715426b97c732649.png

如果清單中沒有您的專案,請在 Firebase 中新增專案 (在清單中選擇現有的 Google Cloud 專案)。

設定擴充功能:

指定集合 (「姿勢」)、包含要嵌入文字的欄位 (「姿勢」),以及其他參數,例如嵌入維度。

如果這個步驟列出需要啟用的 API,設定頁面會讓您啟用這些 API,請按照步驟操作。

如果啟用 API 一段時間後,頁面仍未回應,請重新整理頁面,即可看到已啟用的 API。

5ba59b45710c567b.png

在下列步驟之一中,您可以使用所選 LLM 產生嵌入資料。選擇「Vertex AI」。

bb528a04ebb5f976.png

接下來幾項設定與您的集合和要嵌入的欄位有關:

LLM:Vertex AI

集合路徑:poses

預設查詢限制:3

距離度量:餘弦

輸入欄位名稱:posture

輸出欄位名稱:embedding

狀態欄位名稱:status

嵌入現有文件:是

更新現有的嵌入:是

Cloud Functions 位置:us-central1

Enable Events (啟用事件):未勾選

fb8cdf1163fac7cb.png

完成所有設定後,請按一下「Install Extension」按鈕。這項作業需要 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"

詳情請參閱這篇文章

建立向量索引後,您就能使用向量嵌入執行最鄰近搜尋。

重要注意事項:

從這裡開始,您不必對來源進行任何變更。只要按照步驟操作,即可瞭解應用程式執行的作業。

讓我們來看看新建應用程式如何處理向量搜尋。儲存嵌入項目後,您可以使用 Firestore Java SDK 的 VectorQuery 類別執行 Vector Search,並取得最鄰近搜尋結果:

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);

a. 模擬圖像和音訊產生功能

Gemini 2.0 Flash Experimental 可產生多模態結果,但我尚未註冊早期測試資格,因此我分別使用 Imagen 和 TTS API 模擬圖像和音訊輸出內容。只要透過一個 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";
        }
}

b. 以 Google 搜尋建立基準:

如果您在步驟 6 中查看 Gemini 叫用程式碼,就會發現下列程式碼片段,可為 LLM 回應啟用 Google 搜尋的「建立基準」功能:

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

這麼做是為了確保我們:

  • 將模型與實際搜尋結果連結
  • 擷取搜尋內容中提及的相關網址

8. 執行應用程式

讓我們透過簡單的 Thymeleaf 網頁介面,瞭解新建 Java Spring Boot 應用程式的所有功能:

  1. Firestore CRUD 作業 (建立、讀取、更新、刪除)
  2. 關鍵字搜尋
  3. 以生成式 AI 為基礎的內容建立
  4. 內容比對搜尋 (向量搜尋)
  5. 與搜尋相關的多模態輸出內容
  6. 執行自己的查詢 (以結構化查詢格式輸入的查詢)

示例:{"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. 在對話方塊中輸入專案 ID,然後按一下「Shut down」(關閉) 即可刪除專案。

10. 恭喜

恭喜!您已成功使用 Firestore 建立健全且智慧的瑜珈姿勢管理應用程式。我們結合了 Firestore、向量搜尋擴充功能和 Gemini 2.0 Flash (可模擬圖像和音訊產生) 的強大功能,打造出真正引人入勝且富含資訊的 Yoga 應用程式,用於執行 CRUD 作業、執行以關鍵字為基礎的搜尋、內容向量搜尋,以及產生多媒體內容。

這項做法不限於瑜珈應用程式。隨著 Gemini 等 AI 模型持續進化,我們將有更多機會打造更沉浸式且個人化的使用者體驗。請務必隨時掌握 Google Cloud 和 Firebase 的最新進展和說明文件,充分發揮這些技術的潛力。

如果要擴充這個應用程式,我會嘗試使用 Gemini 2.0 Flash 執行以下兩項操作:

  1. 為使用情境建立即時視訊和音訊串流,以便使用 Multimodal Live API。
  2. 啟用思考模式,為回覆內容產生背後的想法,以便與即時資料互動,打造更逼真的體驗。

歡迎試試看,並提交合併要求 :>D!!!