使用 Firestore、Vector Search 和 Gemini 2.0 构建上下文感知型瑜伽姿势推荐应用!

1. 概览

在健康与健身应用领域,为用户提供丰富且富有吸引力的体验至关重要。对于瑜伽应用,这意味着不仅要提供简单的体式文本说明,还要提供全面的信息、多媒体内容和智能搜索功能。在本博文中,我们将探讨如何使用 Google Cloud 的 Firestore 构建强大的瑜伽姿势数据库,利用其向量搜索扩展程序进行情境匹配,并集成 Gemini 2.0 Flash(实验性)的强大功能来处理多模式内容。

为何选择 Firestore?

Firestore 是 Google Cloud 的无服务器 NoSQL 文档数据库,是构建可扩缩且动态的应用的绝佳之选。以下是它非常适合我们的瑜伽应用的原因:

  • 可伸缩性和性能:Firestore 会自动扩容,以处理数百万用户和庞大的数据集,确保您的应用即使在不断发展壮大时也能保持响应迅速。
  • 实时更新:内置的实时同步功能可确保所有已连接的客户端中的数据保持一致,非常适合直播课程或协作练习等功能。
  • 灵活的数据模型:借助 Firestore 基于文档的结构,您可以存储各种数据类型,包括文本、图片,甚至嵌入,非常适合表示复杂的瑜伽姿势信息。
  • 强大的查询功能:Firestore 支持复杂查询,包括等式、不等式,现在,借助新扩展程序,还支持向量相似度搜索
  • 离线支持:Firestore 会在本地缓存数据,让您的应用即使在用户离线时也能正常运行。

使用 Firestore 向量搜索扩展程序增强搜索功能

在处理瑜伽姿势等复杂概念时,传统的基于关键字的搜索可能会受到限制。用户可能不知道具体的体式名称,但会搜索“打开髋部”或“改善平衡”等体式。这正是 Vector Search 的用武之地。

借助 Firestore 的向量搜索功能,您可以:

  • 生成嵌入:使用 Vertex AI 中提供的模型或自定义模型,将文本说明(未来可能还包括图片和音频)转换为数字向量表示法(嵌入),以捕获其语义含义。
  • 存储嵌入:直接将这些嵌入存储在 Firestore 文档中。
  • 执行相似度搜索:查询数据库以查找与给定查询矢量在语义上相似的文档,从而实现情境匹配。

集成 Gemini 2.0 Flash(实验性)

Gemini 2.0 Flash 是 Google 的尖端多模态 AI 模型。虽然这项功能仍处于实验阶段,但它为丰富我们的瑜伽应用提供了令人兴奋的可能性:

  • 文本生成:使用 Gemini 2.0 Flash 生成瑜伽姿势的详细说明,包括益处、修改方式和禁忌。
  • 图片生成(模仿):虽然使用 Gemini 直接生成图片的功能尚未面向公众提供,但我使用 Google 的 Imagen 模拟了此功能,生成了可直观呈现各种姿势的图片。
  • 音频生成(模仿):同样,我们可以使用文本转语音 (TTS) 服务为每个姿势创建音频说明,引导用户完成练习。

我可能会建议进行集成,以增强应用使用模型的功能:

  • Multimodal Live API:此新 API 可帮助您使用工具构建实时视觉和音频流式传输应用。
  • 速度和性能:与 Gemini 1.5 Flash 相比,Gemini 2.0 Flash 的第一个令牌到达时间 (TTFT) 显著缩短。
  • 改进了智能体体验:Gemini 2.0 改进了多模态理解、编码、复杂指令遵循和函数调用。这些改进相辅相成,可提供更出色的代理体验。

如需了解详情,请参阅此文档的 %20over%20Gemini%201.5%20Flash) 页面。

为了提高可信度并提供更多资源,我们可以集成 Google 搜索,以便为应用提供的信息提供依据。这意味着:

  • 内容相关搜索:当管理员用户输入某个姿势的详细信息时,我们可以使用该姿势名称执行 Google 搜索。
  • 网址提取:我们可以从搜索结果中提取相关网址(例如文章、视频或声誉良好的瑜伽网站),并在应用中显示这些网址。

构建内容

在本实验中,您将执行以下操作:

  1. 创建 Firestore 集合并加载瑜伽文档
  2. 了解如何使用 Firestore 创建 CRUD 应用
  3. 使用 Gemini 2.0 Flash 生成瑜伽姿势说明
  4. 启用 Firebase 矢量搜索与 Firestore 集成
  5. 根据瑜伽说明生成嵌入
  6. 针对用户搜索文本执行相似度搜索

要求

  • 一个浏览器,例如 ChromeFirefox
  • 启用了结算功能的 Google Cloud 项目。

2. 准备工作

创建项目

  1. Google Cloud Console 的项目选择器页面上,选择或创建一个 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. 点击“创建数据库”(如果这是首次创建,请将其保留为“(default)”数据库)

您在创建 Firestore 项目时,也会在 Cloud API 管理器中启用 API

  1. 重要提示:选择安全规则的测试版(而非生产版),以便访问数据
  2. 设置完毕后,您应该会看到原生模式下的 Firestore 数据库、集合和文档视图,如下图所示:

f7136d53253c59a.png

  1. 暂时不要执行此步骤,但请记下:您可以点击“开始收集”并创建一个新集合。将合集 ID 设置为“poses”。点击保存按钮。

a26eb470aa9bfda9.png

有关正式版应用的专业提示

  1. 确定数据模型并确定哪些用户应有权访问不同类型的文档后,您就可以通过 Firebase 界面创建、修改和监控安全规则了。您可以通过以下链接访问安全规则:https://console.firebase.google.com/u/0/project/<<your_project_id>>/firestore/rules
  2. 在从开发阶段部署 / 发布项目之前,请务必修改、监控和测试安全规则,因为安全规则通常是导致应用运行方式不同的罪魁祸首 :)

在本演示中,我们将在 TEST 模式下使用它。

4. Firestore REST API

  1. REST API 在以下使用情形中会很有帮助:从资源受限的环境(无法运行完整客户端库)访问 Firestore。自动执行数据库管理,或检索详细的数据库元数据
  2. 虽然 Firestore 最简单的用法是使用某个原生客户端库,但在有些情况下,直接调用 REST API 会很有用
  3. 在本博文中,您将看到 Firestore REST API 的使用和演示,而不是原生客户端库
  4. Firestore REST API 接受使用 Firebase Authentication 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 中的 src 文件和模板文件添加到相应文件夹中的新项目中(因为当前的 GitHub 代码库项目默认未设置为 Cloud Run 部署配置)。在这种情况下,请按以下步骤操作(而不是克隆现有代码库):
  2. 前往 Cloud Shell Editor(确保打开的是 Editor,而不是终端),点击状态栏左侧的 Google Cloud 项目名称图标(下图中已屏蔽的部分)

d3f0de417094237d.png

  1. 从选项列表中依次选择“新建应用”->“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. 您需要在相应文件中进行更改,将 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 项目 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 控制台,然后点击左侧导航菜单中的导入/导出

选择“导入”,然后选择您刚刚创建的 Cloud Storage 路径,接着浏览到您可以选择“yoga_poses.overall_export_metadata”文件的位置:

f5c1d16df7d5a64a.png

  1. 点击“导入”。

导入过程需要几秒钟的时间,完成后,您可以访问 https://console.cloud.google.com/firestore/databases,选择default 数据库和 poses 集合,以验证 Firestore 数据库和集合,如下所示:

  1. 另一种方法是,在部署后,您还可以使用“创建新姿势”操作通过应用手动创建记录。

6. Vector Search

启用 Firestore 矢量搜索扩展程序

使用此扩展程序,通过新的向量搜索功能自动嵌入和查询 Firestore 文档!系统会将您转到 Firebase Extensions Hub。

安装“矢量搜索”扩展程序时,您需要指定一个集合和一个文档字段名称。添加或更新包含此字段的文档会触发此扩展程序计算文档的向量嵌入。此向量嵌入会写回同一文档,并在向量存储中为该文档编入索引,以便进行查询。

我们来了解一下具体步骤:

安装扩展程序

从 Firebase Extensions Marketplace 中安装“使用 Firestore 的向量搜索”扩展程序,方法是点击“在 Firebase 控制台中安装”。

重要提示

首次前往此扩展程序页面时,您需要选择 Firebase 控制台中列出的 Google Cloud 控制台中正在处理的项目。

715426b97c732649.png

如果您的项目未列出,请继续在 Firebase 中添加该项目(从列表中选择现有的 Google Cloud 项目)。

配置扩展程序

指定集合(“poses”)、包含要嵌入的文本的字段(“posture”)以及嵌入维度等其他参数。

如果此步骤中列出了需要启用的 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

完成所有设置后,点击“安装扩展程序”按钮。此过程需要 3 到 5 分钟。

生成嵌入

当您在“poses”集合中添加或更新文档时,该扩展程序将通过 API 端点使用预训练模型或您选择的模型自动生成嵌入。在本例中,我们在扩展程序配置中选择了 Vertex AI。

索引创建

它会强制在应用中使用嵌入时在嵌入字段上创建索引。

Firestore 会自动为基本查询创建索引;不过,您也可以通过运行没有索引的查询,让 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"

如需了解详情,请点击此处

创建向量索引后,您就可以使用向量嵌入执行最近邻搜索。

重要提示

从此时起,您无需对源代码进行任何更改。只需跟随操作即可了解应用在执行什么操作。

我们来看看新构建的应用如何使用 Vector Search。存储嵌入后,您可以使用 Firestore Java SDK 的 VectorQuery 类执行向量搜索并获取最近邻结果:

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 实验版能够生成多模态结果,但我尚未注册抢先体验,因此我分别使用 Imagen 和 TTS API 模拟了图片和音频输出。想象一下,只需对 Gemini 2.0 Flash 进行一次 API 调用,即可生成所有这些内容,这有多棒!

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. 运行您的应用

我们来看看新构建的 Java Spring Boot 应用(具有简单的 Thymeleaf Web 界面)的所有功能:

  1. Firestore CRUD 操作(创建、读取、更新、删除)
  2. 关键字搜索
  3. 基于生成式 AI 的情境创建
  4. 内容相关搜索 (Vector Search)
  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

您应该会看到结果,并能够试用应用功能。请观看以下视频,了解输出结果的演示:

结合使用 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,然后点击关停以删除项目。

10. 恭喜

恭喜!您已成功利用 Firestore 创建了一个强大且智能的瑜伽姿势管理应用。通过结合使用 Firestore、Vector Search Extension 和 Gemini 2.0 Flash(可生成模拟图片和音频)的强大功能,我们打造了一款真正富有吸引力且信息丰富的瑜伽应用,可实现 CRUD 操作、执行基于关键字的搜索、情境向量搜索,以及生成多媒体内容。

这种方法不仅适用于瑜伽应用。随着 Gemini 等 AI 模型的不断发展,我们将有更多机会打造更加沉浸式和个性化的用户体验。请务必及时了解 Google Cloud 和 Firebase 的最新动态和文档,充分利用这些技术的潜力。

如果我要扩展此应用,我会尝试使用 Gemini 2.0 Flash 执行以下两项操作:

  1. 为用例创建实时视觉和音频流式传输,以便使用 Multimodal Live API。
  2. 启用思考模式,让系统生成与实时数据互动时背后的想法,从而打造更逼真的体验。

欢迎随时试用并发送拉取请求 :>D!!!