在 AI 时代构建应用

1. 概览

在此实验中,您将使用 Google 的生成式 AI 产品,在 Gemini Cloud Assist 的帮助下在 Google Cloud 中构建基础架构,使用 Data Canvas 的自然语言到 SQL 功能查询 BigQuery 数据,在 Colab Enterprise Jupyter 笔记本和 Eclipse Theia (Visual Studio Code) 中借助 Gemini Code Assist 编写代码,并在 Vertex AI Agent Builder 中集成基于 Cloud Storage 和 BigQuery 基础来源构建的 AI 搜索和聊天功能。

我们的目标是创建一个名为“AI 食谱天堂”的食谱和烹饪网站。该网站将使用 Python 和 Streamlit 构建,包含两个主要页面。“烹饪建议”将托管一个聊天机器人,该聊天机器人将使用 Gemini 和 Vertex AI Agent Builder 创建,其接地源与一组食谱相关联,并且它将提供烹饪建议并回答与烹饪相关的问题。食谱搜索将是一个由 Gemini 提供支持的搜索引擎,这次它将基于 BigQuery 食谱数据库。

如果您在练习中遇到任何代码问题,可以在练习 GitHub Repo 的 solution 分支中找到所有代码文件的解决方案。

目标

在本实验中,您将学习如何执行以下任务:

  • 激活和使用 Gemini Cloud Assist
  • 在 Vertex AI Agent Builder 中为烹饪建议聊天机器人创建搜索应用
  • 在 Colab Enterprise 笔记本中加载和清理数据,并借助 Gemini Code Assist 的帮助
  • 在 Vertex AI Agent Builder 中为食谱生成器创建搜索应用
  • 在 Gemini 的帮助下,构建核心 Python 和 Streamlit Web 应用框架
  • 将 Web 应用部署到 Cloud Run
  • 将“烹饪建议”页面连接到我们的食谱搜索 Agent Builder 应用
  • (可选)将食谱搜索页面连接到食谱搜索 Agent Builder 应用
  • (可选)探索最终应用

2. 前提条件

  1. 如果您还没有 Google 账号,则必须先创建一个 Google 账号
    • 请改用个人账号,而非工作账号或学校账号。工作账号和学校账号可能存在限制,导致您无法启用本实验所需的 API。

3. 项目设置

  1. 登录 Google Cloud 控制台
  2. 在 Cloud 控制台中启用结算功能
    • 完成本实验的 Cloud 资源费用应低于 1 美元。
    • 您可以按照本实验末尾的步骤删除资源,以避免产生更多费用。
    • 新用户符合参与 $300 USD 免费试用计划的条件。
    • 要参加虚拟实操实验活动?您或许可以获得 5 美元抵用金
  3. 创建新项目或选择重复使用现有项目。
  4. 在 Cloud Billing 的我的项目中确认结算功能已启用
    • 如果新项目的 Billing account 列中显示 Billing is disabled,请执行以下操作:
      1. 点击 Actions 列中的三点状图标
      2. 点击更改结算信息
      3. 选择您要使用的结算账号
    • 如果您参加的是现场活动,则该账号的名称很可能是 Google Cloud Platform 试用结算账号

4. 激活和使用 Gemini Cloud Assist

在此任务中,我们将激活并使用 Gemini Cloud Assist。在 Google Cloud 控制台中工作时,Gemini Cloud Assist 可以提供建议,帮助您构建、配置和监控 Google Cloud 基础架构,甚至可以建议 gcloud 命令并编写 Terraform 脚本。

  1. 如需激活 Cloud Assist 以供使用,请点击 Cloud 控制台界面顶部的搜索框,然后选择向 Gemini 提问向 Gemini 提问(Cloud 控制台)
  2. 滚动到页面的“必需的 API”部分,然后启用 Gemini for Google Cloud API。
  3. 如果您没有立即看到聊天界面,请点击开始聊天。首先,让 Gemini 解释一下使用 Cloud Shell Editor 的一些好处。花几分钟时间探索生成的回答。
  4. 接下来,询问 Agent Builder 的优势以及它如何帮助生成接地气的回答。
  5. 最后,我们来看一下比较。在 Google Cloud 控制台的 Gemini 对话窗口中,提出以下问题:
    What are the major steps to creating a search app grounded in a GCS data source using Vertex AI Agent builder?
    

5. 在 Vertex AI Agent Builder 中为烹饪建议聊天机器人创建搜索应用

我们将构建的网站会包含一个烹饪建议页面,其中包含一个聊天机器人,旨在帮助用户找到与烹饪相关的问题的答案。该应用将由 Gemini 提供支持,并以包含 70 本公共领域食谱的来源为基础。食谱将作为 Gemini 回答问题时使用的可信来源。

  1. 使用 Cloud 控制台搜索框前往 Vertex AI。在信息中心内,点击启用所有推荐的 API。这可能需要几分钟的时间。如果您看到一个弹出式框,提示 Vertex AI API 本身需要启用,请也启用它。启用 API 后,您可以继续执行下一步。
  2. 使用搜索功能前往 Agent Builder,然后点击继续并激活 API
  3. 正如 Gemini 在我们之前的建议征求中所建议的那样,在 Agent Builder 中创建搜索应用的第一步是创建权威数据源。当用户进行搜索时,Gemini 会理解问题以及如何撰写智能回答,但它会从接地来源中查找回答中使用的信息,而不是从其固有的知识中提取信息。在左侧菜单中,依次前往数据存储区创建数据存储区
  4. 我们用于为烹饪建议页面提供依据的公共领域食谱目前位于外部项目中的 Cloud Storage 存储分区中。选择 Cloud Storage 来源类型。
  5. 检查但不更改与我们导入的信息类型相关的默认选项。将导入类型设置为文件夹,并使用以下存储分区路径:labs.roitraining.com/labs/old-cookbooks,然后点击继续
  6. 为数据存储区命名:old-cookbooks。点击 EDIT,将 ID 更改为 old-cookbooks-id,然后创建数据存储区。

Vertex AI Agent Builder 支持多种应用类型,而数据存储区是每种应用类型的可靠来源。搜索应用非常适合一般用途和搜索。聊天应用适用于 Dataflow 驱动的聊天机器人/语音聊天机器人应用中的生成式流程。推荐应用有助于创建更好的推荐引擎。而 Agent 应用则用于创建由生成式 AI 驱动的智能体。最终,Agent 可能会在我们需要完成的任务中发挥最佳作用,但由于该产品目前处于预览状态,我们将继续使用“搜索”应用类型。

  1. 使用左侧菜单导航到 Apps(应用),然后点击 Create A New App(创建新应用)。
  2. 搜索您的网站卡片上,点击创建。将应用命名为 cookbook-search。点击修改,然后将应用 ID 设置为 cookbook-search-id。将公司设置为 Google,然后点击继续
  3. 选中您在几个步骤前创建的 old-cookbooks 数据存储区,然后创建搜索应用。

如果您查看活动标签页,可能会看到食谱仍在导入和编入索引。Agent Builder 需要 5 分钟以上的时间来为我们提供给它的 70 本食谱中的数千个页面编制索引。在等待期间,我们来加载并清理一些食谱数据库数据,以供食谱生成器使用。

6. 在 Colab Enterprise 笔记本中加载和清理数据,并借助 Gemini Code Assist 完成此任务

Google Cloud 提供了多种主要方式来处理 Jupyter 笔记本。我们将使用 Google 的最新产品 Colab Enterprise。您当中有些人可能熟悉 Google 的 Colab 产品,个人和组织通常会使用该产品在免费环境中试用 Jupyter 笔记本。Colab Enterprise 是一项商业 Google Cloud 产品,可与 Google 的其他云产品完全集成,并充分利用 GCP 环境的安全性和合规性功能。

Colab Enterprise 提供的一项功能是与 Google 的 Gemini Code Assist 集成。Code Assist 可在多种不同的代码编辑器中使用,并且可以在您编码时提供建议以及无缝的内嵌建议。在整理食谱数据时,我们将利用此生成式助理。

  1. 使用搜索功能前往 Colab Enterprise,然后点击创建笔记本。如果您收到试用新 Colab 功能的邀请,请将其关闭。如需启动笔记本背后的计算能力(即运行时),请点击新笔记本右上角的连接交流
  2. 点击文件 > 重命名,将笔记本重命名为 Data Wrangling三点状菜单重命名
  3. 点击 + 文字创建新文本框,然后使用向上箭头将其移动到页面上的第一个单元格。+ 文字和向上箭头
  4. 修改文本框并输入:
    # Data Wrangling
    
    Import the Pandas library
    
  5. 在您刚刚创建的文本块下方的代码块中,开始输入 imp,Gemini Code Assist 应该会以灰色建议其余的导入内容。按 Tab 键可接受建议。
    import pandas as pd
    
  6. 在导入代码框下方,创建另一个文本框,然后输入:
    Create a Pandas DataFrame from: gs://labs.roitraining.com/labs/recipes/recipe_dataset.csv. View the first few records.
    
  7. 创建和修改另一个代码块。再次开始输入 df =,然后检查 Gemini Code Assistant 生成的代码。如果您在生成的建议上方看到 Python 关键字的自动补全下拉列表,请按 Esc 键以查看浅灰色的建议代码。再次按 Tab 键接受建议。如果建议中不包含 head() 函数调用,请添加该调用。
    df = pd.read_csv('gs://labs.roitraining.com/labs/recipes/recipe_dataset.csv')
    df.head()
    
  8. 点击第一个代码单元格(您在其中导入了 Pandas),然后使用命令菜单或键盘运行所选单元格。在键盘上,按 Shift+Enter 会运行单元格并将焦点移至下一个单元格,并在需要时创建一个单元格。等待相应单元格执行完毕后再继续操作。注意:如果某个单元格尚未执行,您会在其左侧看到 [ ]。当某个单元格正在执行时,您会看到一个旋转的动画,表示该单元格正在运行。单元格完成后,系统会显示一个数字,例如 [13]。
  9. 执行将 CSV 加载到 DataFrame 中的单元格。等待文件加载完毕,然后检查前五行数据。这是我们将加载到 BigQuery 中的食谱数据,最终我们将使用它来为食谱生成器提供依据。
  10. 创建一个新的代码块,然后输入以下注释。输入注释后,移动到下一行代码,您应该会收到建议 df.columns。接受该代码,然后运行相应单元格。
    # List the current DataFrame column names
    
    我们刚刚演示了在 Jupyter 笔记本中从 Gemini Code Assist 获取帮助的两种方式:代码单元格上方的文本单元格,或代码单元格本身内的注释。代码单元格中的注释在 Jupyter 笔记本中效果很好,但此方法也适用于支持 Google 的 Gemini Code Assist 的任何其他 IDE。
  11. 我们来清理一下列。将列 Unnamed: 0 重命名为 id,并将 link 重命名为 uri。使用您选择的提示 > 代码技术来创建代码,然后在满意时运行该单元格。
    # Rename the column 'Unnamed: 0' to 'id' and 'link' to 'uri'
    df.rename(columns={'Unnamed: 0': 'id', 'link': 'uri'}, inplace=True)
    
  12. 移除 sourceNER 列,并使用 head() 查看前几行。再次让 Gemini 帮忙。运行最后两行代码并检查结果。
    # Remove the source and NER columns
    df.drop(columns=['source', 'NER'], inplace=True)
    df.head()
    
  13. 我们来看看数据集中有多少条记录。同样,先选择一种提示技巧,看看能否让 Gemini 帮助您生成代码。
    # Count the records in the DataFrame
    df.shape # count() will also work
    
  14. 230 万条记录可能比我们有时间烹饪的食谱还要多。在 Agent Builder 中建立索引的过程可能需要太长时间,不适合我们今天的练习。作为一种折中方案,我们对 15 万个食谱进行抽样,然后使用这些食谱。使用提示 > 代码方法获取该样本,并将其存储在名为 dfs(s 表示小)的新 DataFrame 中。
    # Sample out 150,000 records into a DataFrame named dfs
    dfs = df.sample(n=150000)
    
  15. 我们的食谱源数据已准备好加载到 BigQuery 中。在加载之前,我们先前往 BigQuery 并准备一个用于存放表的数据库。在 Google Cloud 控制台中,使用搜索框前往 BigQuery。您可以右键点击 BigQuery,然后在新的浏览器标签页中打开它。
  16. 如果 Gemini AI Chat 面板尚未显示,请使用 Cloud 控制台右上角的 Gemini 徽标将其打开。如果系统要求您再次启用该 API,请按“启用”或刷新页面。运行提示:What is a dataset used for in BigQuery?在探索回答后,How can I create a dataset named recipe_data using the Cloud Console?将结果与以下几个步骤进行比较。打开 Gemini Cloud Assist
  17. 在 BigQuery 探索器窗格中,点击项目 ID 旁边的三点状查看操作菜单。然后选择创建数据集探索视图操作
  18. 提供数据集和 ID recipe_data。将位置类型保留为 US,然后点击创建数据集。如果您收到数据集已存在的错误,只需继续操作即可。在 BigQuery 中创建数据集后,我们切换回笔记本并执行插入操作。
  19. 切换回 Colab Enterprise 中的“数据整理”笔记本。在新的代码单元中,创建一个名为 project_id 的变量,并使用该变量来存放当前项目 ID。在这些说明的左上角,即“结束实验”按钮下方,您会找到当前项目 ID。您也可以在 Cloud 控制台首页上找到它。将值分配给 project_id 变量,然后运行该单元格。
    # Create a variable to hold the current project_id
    project_id='YOUR_PROJECT_ID'
    
  20. 使用提示 > 代码方法创建一个代码块,该代码块会将 DataFrame dfs 插入到我们刚刚创建的数据集 recipe_data 中名为 recipes 的表中。运行该单元。
    dfs.to_gbq(destination_table='recipe_data.recipes', project_id=project_id, if_exists='replace')
    

7. 在 Vertex AI Agent Builder 中为食谱生成器创建搜索应用

太棒了,我们已经创建了食谱数据表,接下来将使用它为食谱生成器构建一个有事实依据的数据源。我们将采用与烹饪聊天机器人类似的方法。我们将使用 Vertex AI Agent Builder 创建数据存储区,然后将其用作搜索应用的可靠来源。

如果您愿意,可以随时在 Google Cloud 控制台中问问 Gemini,让其提醒您创建 Agent Builder 搜索应用的步骤,也可以按照下面列出的步骤操作。

  1. 使用搜索功能前往 Agent Builder。打开数据存储区创建数据存储区。这次,选择 BigQuery 数据存储区类型。
  2. 在表格选择单元格中,按浏览并搜索 recipes。选择表格旁边的单选按钮。如果您看到来自其他 qwiklabs-gcp-... 项目的配方,请务必选择属于您的配方。注意:如果您点击 recipes 而不是选择旁边的单选按钮,系统会在浏览器中打开一个新标签页,并将您带到 BigQuery 中的表格概览页面。只需关闭浏览器标签页,然后在 Agent Builder 中选择相应单选按钮即可。
  3. 检查但不更改其余的默认选项,然后点击继续
  4. 在架构审核页面中,检查初始默认配置,但不要更改任何内容。继续
  5. 将数据存储区命名为 recipe-data。修改数据存储区 ID,将其设置为 recipe-data-id创建数据存储区。
  6. 使用左侧导航菜单前往应用,然后创建新应用
  7. 搜索您的网站卡片上,点击创建。将应用命名为 recipe-search,然后点击修改将 ID 设置为 recipe-search-id。将公司名称设置为 Google,然后点击继续
  8. 这次,请检查 recipe-data 数据源。创建应用。

我们的数据库表需要一段时间才能完成索引编制。在等待的同时,我们来试用一下 BigQuery 的新功能“数据画布”,看看能否找到一两道有趣的食谱。

  1. 使用搜索框前往 BigQuery。在 BigQuery Studio 顶部,点击最右侧标签页旁边的下拉箭头,然后选择数据画布。将区域设置为 us-central1打开数据画布
  2. 点击搜索数据。在数据画布搜索框中,搜索 recipes,按 Enter/Return 进行搜索,然后点击表格名称旁边的添加到画布按钮。
  3. 系统会将食谱表的直观表示形式加载到 BigQuery 数据画布中。您可以浏览表的架构、预览表中的数据,以及查看其他详细信息。在表格表示形式下方,点击查询
  4. 画布将加载一个或多或少典型的 BigQuery 查询对话框,但会添加一个功能:在查询窗口上方有一个文本框,您可以使用该文本框提示 Gemini 提供帮助。我们来看看能否在示例中找到一些蛋糕食谱。运行以下提示(通过输入文本并按 Enter/Return 触发 SQL 生成):
    Please select the title and ingredients for all the recipes with a title that contains the word cake.
    
  5. 查看生成的 SQL。对结果满意后,运行查询。
  6. 还不错!在继续之前,您可以随意尝试其他提示和查询。在实验时,您可以尝试使用不太具体的提示,看看哪些提示有效,哪些提示无效。例如,以下提示:
    Do I have any chili recipes?
    
    (别忘了运行新查询)返回了辣椒食谱列表,但未包含食材,直到我将其修改为:
    Do I have any chili recipes?  Please include their title and ingredients.
    
    (是的,我在提示时会说“请”。我妈妈一定会非常自豪。)我注意到,其中一个辣椒食谱包含蘑菇,谁会在辣椒中放蘑菇呢?我让 Gemini 帮我排除这些食谱。
    Do I have any chili recipes?  Please include their title and ingredients, and ignore any recipes with mushrooms as an ingredient.
    

8. 打开 Cloud Shell Editor

  1. 前往 Cloud Shell 编辑器
  2. 如果终端未显示在屏幕底部,请打开它:
    • 点击汉堡式菜单 汉堡式菜单图标
    • 点击终端
    • 点击 New Terminal在 Cloud Shell 编辑器中打开新终端
  3. 在终端中,使用以下命令设置项目:
    • 格式:
      gcloud config set project [PROJECT_ID]
      
    • 示例:
      gcloud config set project lab-project-id-example
      
    • 如果您不记得项目 ID,请执行以下操作:
      • 您可以使用以下命令列出所有项目 ID:
        gcloud projects list | awk '/PROJECT_ID/{print $2}'
        
      在 Cloud Shell 编辑器终端中设置项目 ID
  4. 如果系统提示您进行授权,请点击授权以继续。点击以授权 Cloud Shell
  5. 您应会看到以下消息:
    Updated property [core/project].
    
    如果您看到 WARNING 并被问到 Do you want to continue (Y/N)?,则很可能是您输入的项目 ID 有误。按 N,按 Enter,然后尝试再次运行 gcloud config set project 命令。

9. 启用 API

在终端中,启用以下 API:

gcloud services enable \
  compute.googleapis.com \
  sqladmin.googleapis.com \
  run.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  networkconnectivity.googleapis.com \
  servicenetworking.googleapis.com \
  cloudaicompanion.googleapis.com

如果系统提示您进行授权,请点击授权以继续。点击以授权 Cloud Shell

此命令可能需要几分钟时间才能完成,但最终应会生成类似如下所示的成功消息:

Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.

10. 在 Gemini 的帮助下,构建核心 Python 和 Streamlit Web 应用

在我们的两个 Vertex AI Agent Builder 数据存储区都完成索引编制,并且我们的搜索应用即将准备就绪后,我们开始构建 Web 应用。

我们将在工作时利用 Gemini Code Assist。如需详细了解如何在 Visual Studio Code 中使用 Gemini Code Assist,请点击此处查看相关文档

  1. 在 Cloud Shell 编辑器终端中,运行以下命令以克隆食谱应用代码库。
    git clone https://github.com/haggman/recipe-app
    
  2. 运行此命令可在 Cloud Shell 编辑器中打开应用文件夹。
    cloudshell open-workspace recipe-app/
    
  3. 在探索克隆的文件夹并开始处理 Web 应用之前,我们需要让编辑器的 Cloud Code 插件登录 Google Cloud,并启用 Gemini。现在我们就开始吧。在编辑器左下角,点击 Cloud Code - Sign in(Cloud Code - 登录)。如果您没有看到该链接,请稍等片刻,然后再次检查。Cloud Code - 登录
  4. 终端窗口将显示一个长网址。在浏览器中打开该网址,然后按照步骤向 Cloud Code 授予对您的 Google Cloud 环境的访问权限。在最终对话框中,复制验证码,然后将其粘贴回 Cloud Shell Editor 浏览器标签页中等待的终端窗口。
  5. 片刻之后,编辑器左下角的 Cloud Code 链接将变为 Cloud Code - 无项目。点击新链接以选择项目。命令面板应在编辑器顶部打开。点击选择 Google Cloud 项目,然后选择您的项目。片刻之后,编辑器左下角的链接会更新为显示您的项目 ID。这表示 Cloud Code 已成功附加到您的工作项目。
  6. 将 Cloud Code 连接到项目后,您现在可以激活 Gemini Code Assist。在编辑器界面的右下角,点击带有删除线的 Gemini 徽标。Gemini Chat 窗格将在编辑器左侧打开。点击选择 Google Cloud 项目。当命令调色板打开时,选择您的项目。如果您已正确执行这些步骤(并且 Google 没有更改任何内容),那么您现在应该会看到一个活跃的 Gemini 对话窗口。已停用 Gemini
  7. 太棒了!现在,我们的终端、Gemini 对话 和 Cloud Code 配置都已设置完毕,请打开探索器标签页,花几分钟时间探索当前项目中的文件。探索器
  8. 在探索器中打开 requirements.txt 文件进行修改。切换到 Gemini 对话窗格,然后提出以下问题:
    From the dependencies specified in the requirements.txt file, what type of application are we building?
    
  9. 因此,我们将使用 Python 和 Streamlit 构建一个与 Vertex AI 和 Discovery Engine 交互的交互式 Web 应用。目前,我们先重点介绍 Web 应用组件。正如 Gemini 所说,Streamlit 是一个用于在 Python 中构建数据驱动型 Web 应用的框架。现在,请询问:
    Does the current project's folder structure seem appropriate for a Streamlit app?
    
    Gemini 往往会在这一步遇到问题。Gemini 可以访问您当前在编辑器中打开的文件,但无法实际查看整个项目。试试这样问:
    Given the below, does the current project's file and folder structure seem appropriate for a Streamlit app?
    - build.sh
    - Home.py
    - requirements.txt
    - pages
    -- Cooking_Advice.py
    -- Recipe_Search.py
    
    获得更优质的回答?
  10. 让我们来详细了解一下 Streamlit:
    What can you tell me about Streamlit?
    
    很好,我们可以看到 Gemini 为我们提供了一个不错的概览,包括优点和缺点。
  11. 如果您想了解缺点,可以问:
    What are the major downsides or shortcomings?
    
    请注意,我们不必说“Streamlit 的”,因为 Gemini 对话是对话式(多轮)的。由于我们处于聊天会话中,因此 Gemini 知道我们一直在讨论什么。如果您想随时彻底清除 Gemini 对话记录,请使用 Gemini 代码对话窗口顶部的回收站图标。

11. 将 Web 应用部署到 Cloud Run

很好,我们已经设置了核心应用结构,但它能否正常运行呢?更重要的是,我们应该在 Google Cloud 中将其托管在哪里?

  1. 在 Gemini 对话窗口中,提出以下问题:
    If I containerize this application, what compute technologies in Google Cloud would be best for hosting it?
    
  2. 请注意,如果您之前未在 IDE 中工作,也可以向 Google Cloud Assist 提问。打开 Google Cloud 控制台,然后打开 Gemini Cloud Assist 并提出以下问题:
    If I have a containerized web application, where would be the best place to run it in Google Cloud?
    
    这两组建议是否相同?您是否同意/不同意任何建议?请注意,Gemini 是一款生成式 AI 助理,与人类助理一样,您可能并不总是赞同它所说的一切。不过,在 Google Cloud 和代码编辑器中工作时,始终有这样一位助手在您身边,可以大大提高您的效率。
  3. 对于无状态的短期容器化 Web 应用,Cloud Run 是一个不错的选择。在代码编辑器的 Gemini 对话窗口中,尝试以下提示:
    What steps would be required to run this application in Cloud Run?
    
  4. 我们首先需要创建一个 Dockerfile。使用编辑器在项目文件夹的根目录中创建一个名为 Dockerfile 的文件。请确保您没有意外将其放置在 pages 文件夹中。打开文件进行修改。
  5. 我们来使用侧边栏中的 Gemini 对话框创建 Dockerfile。使用如下所示的提示。当聊天中显示结果时,使用建议的 Dockerfile 上方复制图标旁边的 + 将建议的代码插入到 Dockerfile 中。
    Create a Dockerfile for the application in the current folder. The dependencies are defined in requirements.txt and I want you to use the Python 3 slim bookworm base image.
    
    Gemini 不一定每次都会针对同一提示返回相同的回答。我第一次让 Gemini 提供 Dockerfile 时,它给出的文件正是我要建议您使用的文件。我刚刚收到的建议是:
    # Base image
    FROM python:3-bookworm-slim
    
    # Set working directory
    WORKDIR /app
    
    # Install dependencies
    RUN apt-get update && apt-get install -y \
        build-essential \
        libpq-dev \
        gcc \
        python3-dev \
        && rm -rf /var/lib/apt/lists/*
    
    # Install pip and virtualenv
    RUN pip install --upgrade pip virtualenv
    
    # Create virtual environment
    RUN python3 -m venv venv
    
    # Activate virtual environment
    WORKDIR /app/venv/bin
    RUN . activate
    
    # Install Streamlit and libraries from requirements.txt
    RUN pip install -r requirements.txt
    
    # Copy application files
    COPY . /app
    
    # Expose port 8501 for Streamlit
    EXPOSE 8501
    
    # Start Streamlit app
    CMD ["streamlit", "run", "main.py"]
    
    这真是个了不起的 Dockerfile。我会稍微简化一下。我们不需要 apt-get 部分,因为 Python 所需的一切内容都已包含在我们的基础映像中。此外,在 Python 容器中使用虚拟环境会浪费空间,因此我会移除该环境。虽然 expose 命令并非严格必需,但使用也没问题。此外,它还尝试启动我没有的 main.py。
  6. recipe-app 文件夹中,创建一个名为 Dockerfile 的文件,并粘贴以下内容:
    FROM python:3.11-slim-bookworm
    
    WORKDIR /app
    
    COPY requirements.txt .
    RUN pip install --no-cache-dir --upgrade pip && \
        pip install --no-cache-dir -r requirements.txt
    
    COPY . .
    
    CMD ["streamlit", "run", "Home.py"]
    
  7. Gemini 可以通过聊天窗口运行,但也可以直接在代码文件中使用注释(就像我们在数据整理笔记本中所做的那样)运行,还可以通过在 Windows 上按 Control+i 或在 Mac 上按 Command+i 来调用。点击 Dockerfile 中的任意位置,然后使用相应的 Command+i / Control+i 命令激活 Gemini。
  8. 在提示符处输入以下内容。检查并接受更改。
    Please comment the current file.
    
    是不是很棒?!您是否曾不得不使用他人的代码,但却浪费了大量时间来初步了解对方没有注释的代码,然后才能开始进行更改?Gemini 来助你脱困!
  9. 现在,问问 Gemini 如何使用 Cloud Run 从当前文件夹中的 Dockerfile 构建并部署名为 recipe-web-app 的新映像。
    How could I use gcloud to build a new Cloud Run service named recipe-web-app from the current directory?
    
  10. 我们来构建并部署应用。在终端窗口中执行 gcloud run deploy 命令
    gcloud run deploy recipe-web-app \
        --allow-unauthenticated \
        --source=. \
        --region=us-central1 \
        --port=8501
    
    如果系统提示您创建 Artifact Registry 代码库,请按 enter/return
    Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository
    named cloud-run-source-deploy in region us-central1 will be created.
    
    Do you want to continue (Y/n)?
    
  11. 如果您观看构建流程,会发现它首先构建 Artifact Registry Docker 代码库。然后,它使用 Cloud Build 根据本地文件夹中的 Dockerfile 创建容器映像。最后,Docker 映像将部署到新的 Cloud Run 服务中。脚本结束时,您将获得一个可供使用的 Cloud Run 测试网址。

在浏览器的新标签页中打开返回的链接。花点时间了解一下应用的结构和页面。很好,现在我们需要将生成式 AI 功能挂接到我们的应用中。

12. 将“烹饪建议”页面连接到我们的食谱搜索 Agent Builder 应用

我们已经让 Web 应用框架正常运行,但需要将两个工作页面连接到两个 Vertex AI Agent Builder 搜索应用。我们先从烹饪建议开始。

  1. 将 Cloud Shell 编辑器标签页保持打开状态。在 Google Cloud 控制台中,使用搜索功能前往 Vertex AI 中的聊天
  2. 在右侧的设置页面窗格中,将模型设置为 gemini-1.5-flash-002。将输出 token 上限滑动到最大值,以便模型在需要时返回更长的答案。打开安全过滤条件设置。将“仇恨言论”“露骨色情内容”和“骚扰内容”设置为屏蔽部分。将“危险内容”设置为屏蔽少部分,然后点击保存。我们将“危险内容”的设置调低了一些,因为 Gemini 可能会将有关刀具和切割的内容误解为暴力内容。
  3. 滑动切换开关以启用接地,然后点击自定义。将接地源设置为 Vertex AI Search,并使用以下数据存储区路径。将 YOUR_PROJECT_ID 更改为这些说明中“结束实验”按钮附近显示的项目 ID,然后保存基础知识设置
    projects/YOUR_PROJECT_ID/locations/global/collections/default_collection/dataStores/old-cookbooks-id
    
    注意:如果您收到错误消息,则可能是因为您未将项目 ID 更改为实际的项目 ID,也可能是因为您错过了更改旧版 cookbook 代理构建器数据存储区 ID 的步骤。前往“代理构建器”>“数据存储区”>“old-cookbooks”,查看其实际的数据存储区 ID。
  4. 测试几条聊天消息。不妨从以下内容开始。您也可以尝试其他几个。
    How can I tell if a tomato is ripe?
    
  5. 模型可以正常运行,现在我们来尝试使用代码。点击清空对话,以免我们的对话成为代码的一部分,然后点击获取代码清除对话并获取代码
  6. 在代码窗口顶部,按 Open Notebook(打开笔记本),以便我们在 Colab Enterprise 中实验并完善代码,然后再将其集成到我们的应用中。
  7. 请花几分钟时间熟悉一下代码。我们来做一些更改,使其符合我们的需求。在开始之前,请运行第一个代码单元以连接到计算资源并安装 AI Platform SDK。运行代码块后,系统会提示您重启会话。按照提示操作即可。
  8. 移至我们从 Vertex AI Studio 中提取的代码。将方法 multiturn_generate_content 的名称更改为 start_chat_session
  9. 滚动到 model = GenerativeModel( 方法调用。现有代码定义了 generation_configsafety_settings,但实际上并未使用它们。修改 GenerativeModel 的创建,使其类似于:
    model = GenerativeModel(
        "gemini-1.5-flash-002",
        tools=tools,
        generation_config=generation_config,
        safety_settings=safety_settings,
    )
    
  10. 最后,在 chat = model.start_chat() 下方为该方法添加最后一行代码,以便该函数返回 chat 对象。完成后的函数应如下所示。注意:请勿将此代码复制到笔记本中。它仅用于健全性检查。
    def start_chat_session():
        vertexai.init(project="qwiklabs-gcp-02-9a7298ceaaec", location="us-central1")
        tools = [
            Tool.from_retrieval(
                retrieval=grounding.Retrieval(
                    source=grounding.VertexAISearch(datastore="projects/qwiklabs-gcp-02-9a7298ceaaec/locations/global/collections/default_collection/dataStores/old-cookbooks-id"),
                )
            ),
        ]
        model = GenerativeModel(
            "gemini-1.5-flash-002",
            tools=tools,
            generation_config=generation_config,
            safety_settings=safety_settings,
        )
        chat = model.start_chat()
        return chat
    
  11. 滚动到代码单元格底部,更改调用旧函数的最后一行,使其调用新函数名称并将返回的对象存储在变量 chat 中。如果您对所做的更改感到满意,请运行相应单元格。
    chat = start_chat_session()
    
  12. 创建一个新的代码单元,并添加注释 # Use chat to invoke Gemini and print out the response。移至下一行,输入 resp,Gemini 应该会自动为您补全代码块。将提示更新为 How can I tell if a tomato is ripe?。运行单元格
    response = chat.send_message("How can I tell if a tomato is ripe?")
    print(response)
    
  13. 这是正确的响应,但我们真正想要的是嵌套的 text 字段。修改代码块,使其仅打印该部分,如下所示:
    response = chat.send_message("How can I tell if a tomato is ripe?")
    print(response.candidates[0].content.parts[0].text)
    
  14. 很好,现在我们有了可用的聊天代码,接下来将其集成到我们的 Web 应用中。复制用于创建 start_chat_session 函数的代码单元格的所有内容(我们不需要测试单元格)。如果您点击相应单元格,可以点击右上角的三点状菜单,然后从那里进行复制复制单元格
  15. 切换到 Cloud Shell 编辑器标签页,然后打开 pages\Cooking_Advice.py 以进行编辑。
  16. 找到相应评论:
    #
    # Add the code you copied from your notebook below this message
    #
    
  17. 将复制的代码粘贴到 Add the code 注释的正下方。很好,现在我们有了通过接地调用 Gemini 来驱动聊天引擎的部分。现在,我们将其集成到 Streamlit 中。
  18. 找到紧随注释下方的注释掉的代码部分:
    #
    # Here's the code to setup your session variables
    # Uncomment this block when instructed
    #
    
  19. 取消注释此部分代码(直到下一个 Setup done, let's build the page UI 部分),并探索它。它会创建或检索聊天和历史记录会话变量。
  20. 接下来,我们需要将历史记录和聊天功能集成到界面中。在代码中滚动,直到找到以下注释。
    #
    # Here's the code to create the chat interface
    # Uncomment the below code when instructed
    #
    
  21. 取消注释该注释下方的其余代码,并花点时间探索一下。如果您愿意,可以突出显示该代码,让 Gemini 解释其功能。
  22. 很好,现在我们来构建应用并部署它。当网址返回时,启动应用并试用烹饪顾问页面。也许可以问问它有关成熟番茄的问题,或者让它提供一种烹制球芽甘蓝的好方法。
    gcloud run deploy recipe-web-app \
        --allow-unauthenticated \
        --source=. \
        --region=us-central1 \
        --port=8501
    

这样是不是很厉害?您的专属 AI 烹饪顾问 :-)

13. (可选)将食谱搜索页面与食谱搜索 Agent Builder 应用相关联

我们将“烹饪建议”页面与其接地来源相关联时,直接使用了 Gemini API。对于“食谱搜索”,我们直接连接到 Vertex AI Agent Builder 搜索应用。

  1. 在 Cloud Shell 编辑器中,打开 pages/Recipe_Search.py 页面以进行修改。调查网页的结构。
  2. 在文件顶部附近,设置您的项目 ID。
  3. 检查 search_sample 函数。此代码或多或少直接来自 Discovery Engine 文档(请参阅此处)。您可以在此笔记本中找到可正常运行的副本。我所做的唯一更改是返回 response.results 而不是仅返回结果。如果没有此参数,返回值类型将是一个旨在分页显示结果的对象,而这对于我们的基本应用来说是不需要的。
  4. 滚动到文件的最末尾,然后取消注释 Here are the first 5 recipes I found 下面的整个部分。
  5. 突出显示您刚刚取消注释的整个部分,然后打开 Gemini Code 对话。询问 Explain the highlighted code。如果您未选择任何内容,Gemini 可以解释整个文件。如果您突出显示某个部分并问问 Gemini 解释、评论或改进该部分,Gemini 会执行相应操作。请花点时间阅读相关说明。值得一提的是,在将 Gemini API 集成到应用之前,使用 Colab Enterprise 笔记本探索这些 API 是一个绝佳的方式。在探索一些可能未得到充分记录的新 API 时,此功能尤其有用。
  6. 在编辑器终端窗口中,运行 build.sh 以部署最终应用。等待新版本部署完毕,然后再继续执行下一步。

14. (可选)探索最终应用

花几分钟时间探索一下最终的应用。

  1. 在 Google Cloud 控制台中,使用搜索功能前往 Cloud Run,然后点击进入 recipe-web-app
  2. 找到应用测试网址(位于顶部附近),然后在新的浏览器标签页中打开该网址。
  3. 系统应显示应用首页。请注意 Streamlit 提供的基本布局和导航,其中 pages 文件夹中的 Python 文件显示为导航选项,而 Home.py 则作为首页加载。前往烹饪建议页面。
  4. 片刻之后,聊天界面就会显示出来。再次提醒,请注意 Streamlit 提供的出色核心布局。
  5. 尝试提出几个与烹饪相关的问题,看看聊天机器人的功能。例如:
    Do you have any advice for preparing broccoli?
    
    How about a classic chicken soup recipe?
    
    Tell me about meringue.
    
  6. 现在,我们来找一两个食谱。前往“食谱搜索”页面,尝试进行几次搜索。例如:
    Chili con carne
    
    Chili, corn, rice
    
    Lemon Meringue Pie
    
    A dessert containing strawberries
    

15. 恭喜!

您已创建利用 Vertex AI Agent Builder 应用的应用。在此过程中,您探索了 Gemini Cloud Assist、Gemini Code Assist 以及 BigQuery 数据画布的自然语言到 SQL 功能。真了不起!

清理

Cloud SQL 没有免费层级,如果您继续使用,则需要付费。您可以删除 Cloud 项目,以避免产生额外费用。

虽然 Cloud Run 不会对未在使用中的服务计费,但您可能仍然需要支付将容器映像存储在 Artifact Registry 中而产生的相关费用。删除 Cloud 项目后,系统即会停止对该项目中使用的所有资源计费。

如果您愿意,可以删除项目:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

您可能还希望从 Cloud Shell 磁盘中删除不必要的资源。您可以:

  1. 删除 Codelab 项目目录:
    rm -rf ~/task-app
    
  2. 警告!接下来执行的操作无法撤消!如果您想删除 Cloud Shell 中的所有内容以释放空间,可以删除整个主目录。请务必将要保留的所有内容保存到其他位置。
    sudo rm -rf $HOME