arrow_back

AI Applications を使用して AI エージェントを Flutter アプリに統合する

ログイン 参加
700 以上のラボとコースにアクセス

AI Applications を使用して AI エージェントを Flutter アプリに統合する

ラボ 2時間 universal_currency_alt クレジット: 5 show_chart 入門
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

概要

このラボでは、AI エージェントを Flutter アプリに統合します。Flutter はクライアント アプリ フレームワークとして使用され、Vertex AI Search はベクトル DB として使用されます。また、Reasoning Engine は、Vertex AI で LangChain を使用してエージェントを構築およびデプロイするために使用されます。エージェントは、高度な機能を備えた大規模言語モデル(LLM)ファミリーである Gemini を使用して、テキストと画像のプロンプトに対する AI 回答を生成します。

このラボには、Flutter アプリを実行するために必要な Flutter と Dart の拡張機能に加え、code-server を介して IDE として VSCode が事前にプロビジョニングされています。さらに、このラボには fwr も含まれています。これは、ブラウザを使用してアクセスするウェブ アプリケーションとして Flutter アプリを提供するために使用するツールです。

このラボは、クラウド アプリケーションの開発にはあまり詳しくない、アプリケーションの構築に携わるあらゆるレベルの開発者を対象としています。Python を利用した経験があり、Flutter フレームワークに慣れているほうが内容を理解しやすいでしょう。このラボのタスクを実行する際に Flutter の知識は必要ありません。ただし、Flutter アプリのコードの一部を確認する、アプリの機能をテストするといった作業は行います。

目標

このラボでは、次のタスクを行います。

  • Google Cloud コンソールで AI Applications を使用して検索データストアと検索アプリを作成する。

  • Vertex AI Workbench を使用して Reasoning Engine エージェントをデプロイする。

  • Vertex AI Search と Reasoning Engine エージェントが統合された Python アプリを使用する。

  • アプリを Cloud Run にデプロイし、Flutter アプリのバックエンドとして使用する。

  • Firebase プロジェクトを設定し、Flutter アプリに接続する。

    このラボで使用する各種コンポーネントの概要は次のとおりです。

設定

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. Qwiklabs にシークレット ウィンドウでログインします。

  2. ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
    一時停止機能はありません。必要な場合はやり直せますが、最初からになります。

  3. 準備ができたら、[ラボを開始] をクリックします。

  4. ラボの認証情報(ユーザー名パスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。

  5. [Google Console を開く] をクリックします。

  6. [別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
    他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。

  7. 利用規約に同意し、再設定用のリソースページをスキップします。

タスク 1. 検索データストアと検索アプリを作成する

このタスクでは、Google Cloud コンソールで AI Applications を使用して検索データストアと検索アプリを作成することにより、Flutter アプリに検索機能を実装します。

検索データストアを作成する

  1. Cloud コンソールで、[すべてのプロダクトを表示] をクリックします。[すべてのプロダクト] ページで [AI] セクションまでスクロールし、[AI Applications] をクリックします。

  2. [続行して API を有効化] をクリックします。

  3. 左側のペインで [データストア] をクリックし、[データストア] ページで [データストアを作成] をクリックします。

    このページでは、検索結果に使用するデータソースを構成します。このラボには、Google Merchandise Store のアイテムに関するデータを含む .csv ファイルが格納された Cloud Storage バケットが事前にプロビジョニングされています。

  4. データソースとして Cloud Storage を選択するには、[Cloud Storage] で [選択] をクリックします。

  5. インポートするデータの種類として、[チャット アプリケーション用のよくある質問の構造化データ(CSV)] を選択します。

  6. インポートするフォルダまたはファイルを選択するには、[ファイル] をクリックします。

  7. CSV ファイルの Cloud Storage URL を指定するには、[参照] をクリックします。

  8. Cloud Storage バケット をクリックして、内容を表示します。

  9. goog_merch.csv ファイルを選択し、[選択] をクリックします。

    フォルダの gs:// URI が取り込まれます。

  10. [続行] をクリックします。

  11. データストア名に「goog-merch-ds」と入力します。

  12. [作成] をクリックします。

    データストアが作成され、CSV ファイルからのデータの取り込みが開始されます。

  13. [データストア] ページで、新しく作成したデータストアの名前をクリックします。

  14. [ドキュメント] タブに、インポートしたドキュメントのリストが表示されます。ドキュメントに関連付けられたデータを表示するには、[ドキュメントを表示] をクリックします。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Vertex AI Search データストアを作成する

検索アプリを作成する

検索データストアを使用するには、Vertex AI Agent Builder で検索アプリに接続します。

  1. Cloud コンソールで [AI Applications] をクリックし、[アプリ] をクリックします。

  2. [アプリを作成] をクリックします。

  3. [アプリを作成する] ページの [ウェブサイト検索] で [作成] をクリックします。

  4. [アプリの構成の検索] ページで、以下の設定を使用してウェブサイト検索アプリを構成します。残りの設定は、デフォルトのままにします。

    プロパティ 値(入力または選択)
    Enterprise エディションの機能 無効にする
    アプリ名 gms-search-app
    会社名または組織名 gms-company
    アプリのロケーション global(グローバル)
  5. [続行] をクリックします。

  6. 既存のデータストアのリストが表示されます。前のサブタスクで作成した goog_merch_ds データストアを選択します。

  7. 検索アプリを作成するには、[作成] をクリックします。

    検索アプリが作成され、データストアがアプリに接続されます。

  8. 検索アプリをテストするには、AI Applications のナビゲーション メニューで [プレビュー] をクリックします。

  9. [検索] フィールドに「dino」と入力します。

    データストアにインポートされたドキュメントから、関連する検索結果のリストが表示されます。

    注: [検索プレビューの準備がまだできていません] というエラーが表示された場合、数分待ってから再試行してください。待たずにラボの次のタスクに進むこともできます。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Vertex AI Search アプリを作成する

タスク 2. バックエンドをビルドしてデプロイする

Flutter アプリのバックエンドは、Google Cloud で Cloud Run サービスとして実行されます。バックエンド サービスは、商品ショップのデータから検索レスポンスを生成するために、前の手順で作成した検索アプリと統合されます。バックエンドは、Reasoning Engine エージェントとも統合され、Gemini にアクセスすることで、Flutter アプリからのクエリに応答して生成 AI コンテンツを取得します。

このタスクでは、バックエンド Python アプリをビルドして Cloud Run にデプロイします。

バックエンド アプリをビルドして確認する

  1. このラボ用に VSCode ベースの IDE が事前プロビジョニングされています。IDE にアクセスするには、ラボの Qwiklabs 認証情報パネルから IDE サービス URL をコピーして、新しいシークレット モード ブラウザ ウィンドウに貼り付けます。

    注: IDE サービスの URL は、このラボ用に事前プロビジョニングされた Cloud Run サービスのエンドポイントであり、code-server VM へのリクエストをプロキシします。この IDE は code-server を使用して構築されており、Flutter、Dart、Vim の拡張機能が含まれています。

  2. IDE でターミナルを開きます。IDE のナビゲーション メニュー()で、[ターミナル] > [新しいターミナル] をクリックします。

    注: 以下の手順のコマンドは、IDE のターミナル ウィンドウで実行します。
  3. バックエンド アプリの初期バージョンと関連ファイルは、ラボ用に事前プロビジョニングされています。バックエンド アプリの初期バージョンのフォルダとその内容を Cloud Storage からコピーします。

    gcloud storage cp -r gs://cloud-training/OCBL453/photo-discovery/ag-web ~ 注: プロンプトが表示された場合、[許可] をクリックしてクリップボードからテキストと画像を貼り付け、Enter キーを押します。
  4. フォルダの内容を一覧表示するには、IDE のターミナル ウィンドウで次のコマンドを実行します。

    ls ~/ag-web/app

    ag-web/app フォルダには、アプリケーションのソースコードと、バックエンド アプリをビルドして Cloud Run にデプロイするために必要な他のファイルが含まれています。

  5. アプリの PROJECT_ID、LOCATION、STAGING_BUCKET の構成を設定します。

    sed -i 's/GCP_PROJECT_ID/{{{project_0.project_id|set at lab start}}}/' ~/ag-web/app/app.py sed -i 's/GCP_REGION/{{{project_0.default_region|set at lab start}}}/' ~/ag-web/app/app.py sed -i 's/GCS_BUCKET/{{{project_0.startup_script.lab_bucket_name|set at lab start}}}/' ~/ag-web/app/app.py
  6. 先ほど作成した検索データストアを使用するようバックエンド アプリを構成します。

    次のコマンドで、文字列 {YOUR_SEARCH_DATA_STORE_ID} を検索データストア ID の値に置き換えます。

    sed コマンドの中括弧は必ず削除してください。

    注: 検索データストア ID の値を取得するには、Cloud コンソールで [AI Applications] > [データストア] に移動し、先ほど作成した検索データストアの名前をクリックします。データストア ID の値をコピーします。これは検索エンジン ID と同じです。 sed -i 's/SEARCH_ENGINE_ID/{YOUR_SEARCH_DATA_STORE_ID}/' ~/ag-web/app/app.py

  7. IDE でコードを表示するには、IDE のナビゲーション メニューで をクリックし、[フォルダを開く] をクリックします。

  8. リストから IDE-DEV/ag-web/ フォルダを選択し、[OK] をクリックします。

  9. コードの作成者を信頼する場合、[はい、この作成者を信用します] をクリックします。

  10. [エクスプローラ] ペインで、app フォルダを開き、app.py をクリックして、ファイルをエディタで開きます。

    バックエンド アプリのコードにより実行される処理は、次のとおりです。

    • ラボの Google Cloud プロジェクト ID、リージョン、Cloud Storage バケットを使用して Vertex AI を初期化します。
    • search_gms() 関数は、discoveryengine.googleapis.com API データストア エンドポイントを使用して検索リクエストを開始します。先ほど作成したデータストア ID が URL で使用されます。
    • この関数は、ユーザーが指定した検索クエリを使用してデータストアのコンテンツを検索し、結果を JSON の回答としてフォーマットします。
    • アプリは、個々の関数への呼び出しをルーティングするために flask を使用します。/ エンドポイントは、アプリが正常に読み込まれたことを確認するために使用されるデフォルトのページです。一方、/ask_gms エンドポイントは、Vertex AI Search を使用する search_gms() 関数を呼び出します。

アプリをビルドして Cloud Run にデプロイする

デプロイ スクリプトを使用すると、バックエンド アプリをビルドして Cloud Run にデプロイできます。

  1. IDE でターミナル ウィンドウを開き、バックエンド アプリのフォルダに移動します。

    cd ~/ag-web/app
  2. gcloud CLI から Google Cloud に対して認証を行います。

    gcloud auth login
  3. 続行するには、「Y」と入力します

  4. ログインフローを立ち上げるには、Ctrl キー(Windows および Linux の場合)または Command キー(macOS の場合)を押して、ターミナルのリンクをクリックします。

  5. 外部ウェブサイトを開くかどうかを確認するメッセージが表示されたら、[開く] をクリックします。

  6. ラボ受講者用のメールアドレスをクリックします。

  7. 続行するかどうかを確認するメッセージが表示されたら、[続行] をクリックします。

  8. Google Cloud SDK に Google アカウントへのアクセスを許可し、利用規約に同意するには、[許可] をクリックします。

    確認コードがブラウザタブに表示されます。

  9. [コピー] をクリックします。

  10. IDE のターミナル ウィンドウに戻り、[認証コードを入力してください] と表示されている場所にコードを貼り付けて、Enter キーを押します。

    これで Google Cloud にログインできました。

  11. deploy.sh スクリプトを実行可能にし、スクリプトを実行して、指定した Cloud Run リージョンにアプリをデプロイします。

    chmod a+x deploy.sh; ./deploy.sh {{{project_0.project_id|set at lab start}}} {{{project_0.default_region|set at lab start}}}

    アプリのビルドと Cloud Run へのデプロイが正常に完了すると、スクリプトの出力の末尾にアプリのエンドポイント URL が表示されます。この URL は、スクリプトで実行された gcloud run deploy コマンドによって生成されたものです。

    注: このコマンドの実行には時間がかかります。完了するまで待ってから次のタスクに進んでください。

バックエンド アプリをテストする

アプリの機能は、そのアプリの Cloud Run エンドポイントにアクセスしてテストします。

  1. 前の手順で生成したアプリのエンドポイント URL をコピーし、新しいブラウザタブでその URL に移動します。

  2. アプリが読み込まれると、ホームページに [Welcome to the ag-web backend app] と表示されます。

  3. ブラウザの URL バーで、次のパスを URL の末尾に追加します。

    /ask_gms?query=dino
  4. アプリで先ほど作成した検索データストアからの結果が返されることを確認します。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 バックエンド アプリを作成する

タスク 3. Firebase を構成する

フロントエンド Flutter アプリは Vertex AI for Firebase Dart SDK を使用して Gemini API を呼び出します。この SDK は、Dart および Flutter アプリの公式パッケージ リポジトリである pub.dev から firebase_vertexai パッケージとして入手できます。

Firebase は、Google が提供するバックエンド アプリ開発プラットフォームであり、Android、iOS など、さまざまなプラットフォーム向けのサービスが用意されています。

このタスクでは、Firebase を設定して Firebase CLI にログインします。後で、Flutter アプリを Firebase に接続します。

Firebase を設定する

SDK を使用するには、まず Firebase プロジェクトを設定します。

  1. シークレット ウィンドウ タブで、https://console.firebase.google.com を指定して Firebase コンソールにアクセスします。

  2. [プロジェクトを作成] をクリックします。

  3. ラボの既存の Google Cloud プロジェクトに Firebase を追加するには、ページの下部にある [Google Cloud プロジェクトに Firebase を追加する] をクリックします。

  4. [Google Cloud プロジェクトを選択する] をクリックし、リストからラボ プロジェクトを選択します。

  5. 利用規約に同意し、[続行] をクリックします。

  6. デフォルトの料金プランを使用するには、[プランを確認] をクリックします。

  7. [続行] をクリックします。

  8. このプロジェクトの Google アナリティクスを無効にしてから、[Firebase を追加] をクリックします。

  9. Firebase プロジェクトの準備ができるまで待ち、[続行] をクリックします。

    これで、ラボの Google Cloud プロジェクトで Firebase を使用できるようになりました。

Firebase にログインする

  1. IDE のターミナル ウィンドウで、Firebase CLI にログインします。

    firebase login --no-localhost
  2. CLI とエミュレータの報告情報の収集を Firebase に許可するには、Y と入力して Enter キーを押します。

  3. セッション ID をメモし、手順に沿ってログインフローを開始します。Ctrl キー(Windows および Linux の場合)または Command キー(macOS の場合)を押しながら、ターミナル内の URL をクリックします。

  4. 外部ウェブサイトを開くかどうかを確認するメッセージが表示されたら、[開く] をクリックします。

  5. ラボ受講者用のメール ID をクリックします。

  6. [続行] をクリックします。

  7. 関連する権限を Firebase CLI に付与するには、[許可] をクリックします。

  8. [はい、今このコマンドを実行しました] をクリックします。

  9. セッション ID を確認して、[はい、これは私のセッション ID です] をクリックします。

  10. 認証コードをコピーするには、[コピー] をクリックします。

  11. IDE のターミナル ウィンドウで、求められた場所に認証コードを貼り付けて、Enter キーを押します。

    これで Firebase CLI にログインできました。

タスク 4. Reasoning Engine AI エージェントを作成する

AI エージェントは、目標を達成するために、大規模言語モデル(LLM)の機能を利用して推論を行い、外部ツールとのオーケストレーションを行うアプリケーションです。Vertex AI Agent Builder は、AI エージェントを信頼できるデータソースに接続して構築するのに役立つ、Google のプロダクトとツールのスイートです。

Vertex AI Reasoning Engine(LangChain on Vertex AI とも呼ばれます)は、Vertex AI Agent Builder を使用して推論エージェントを構築およびデプロイするのに役立ちます。LangChain は、チャットボットや RAG システムの構築に使用される人気の OSS ツールです。

Reasoning Engine では、デベロッパーが関数呼び出しを使用して、LLM(Gemini)からの出力を Python 関数にマッピングできます。Reasoning Engine は、Vertex AI に用意された Gemini モデル用の Python SDK と緊密に統合されており、LangChain や他の Python フレームワークと互換性があります。

このタスクでは、Vertex AI Workbench と Jupyter ノートブックを使用し、Python 関数を備えた Reasoning Engine エージェントをデプロイします。このエージェントは、このラボの次のタスクにおいて生成 AI バックエンド アプリケーションで使用します。

Vertex AI Workbench インスタンスを作成する

Vertex AI Workbench は、データ サイエンスと ML のワークフロー全体に対応する Jupyter ノートブックベースの開発環境です。Vertex AI や他の Google Cloud サービスを Vertex AI Workbench インスタンスの Jupyter ノートブック内から操作できます。たとえば、Vertex AI Workbench では、BigQuery と Cloud Storage とのインテグレーションを使用して、Jupyter ノートブック内からデータにアクセスして探索できます。

Vertex AI Workbench インスタンスには、ディープ ラーニング パッケージのスイート(TensorFlow と PyTorch のフレームワークへの対応を含む)がプリインストールされています。

Vertex AI Workbench ノートブックは、Google Cloud で ML モデルを開発およびデプロイするための柔軟でスケーラブルなソリューションです。

  1. Workbench インスタンスを作成するには、Google Cloud コンソールでナビゲーション メニュー)をクリックし、[Vertex AI] > [Workbench] を選択します。

  2. Cloud コンソールにプロンプトが表示されたら、[Notebooks API] をクリックして有効にします。

  3. [インスタンス] タブで [インスタンス] が選択されていることを確認し、[新規作成] をクリックします。

  4. [新しいインスタンス] ページで、[名前] に「my-instance」と入力します。

  5. 残りの設定はデフォルトのままにして、[作成] をクリックします。

    新しいインスタンスがインスタンス セクションでスピンアップされます。インスタンスが作成されるまで待ってから次の手順に進みます。

    注: インスタンスが使用可能な状態になると、インスタンスの横に緑色のチェックマークが表示されます。
  6. インスタンスの準備ができたら、[Jupyterlab を開く] をクリックします。

  7. Python 3 Jupyter ノートブックを起動するには、[Python 3] ノートブックをクリックします。

ノートブック ファイルをコピーする

このラボには、Reasoning Engine エージェントをビルドおよびデプロイするノートブックが事前プロビジョニングされています。

  1. ノートブックを JupyterLab インスタンスにコピーするには、新しいノートブックの最初のセルに次のコードをコピーします。

    !gcloud storage cp gs://cloud-training/OCBL453/photo-discovery/ag-web/ag_setup_re.ipynb .

  2. セルを選択し、セルメニューの [実行] をクリックして実行します。

    このコマンドは、Cloud Storage から JupyterLab インスタンスにノートブックをコピーします。コマンドが完了すると、ノートブック ファイルが最上位のルートフォルダに表示されます。

  3. ノートブックを開くには、フォルダリストでノートブック ファイルをダブルクリックします。ノートブックのコンテンツが新しいタブで開きます。

Reasoning Engine エージェントをビルドしてデプロイする

  1. ノートブックのすべてのコードセルを最初から順番に実行します。セルを実行するには、セル内の任意の場所をクリックして選択し、セルメニューまたはノートブックの上部メニューで [実行] をクリックします。

    注: セルでコマンドを実行したときは、コマンドが完了するまで待ってから次のセルに進んでください。コマンドの実行が完了すると、セル番号フィールドのアスタリスク(*)がセル番号に置き換えられます。 注: セルを実行する前に、以下のメモでセル固有の指示や手順を確認してください。そのような指示には、CELL INSTR 接頭辞が付いています。

    a. [CELL INSTR] 現在のランタイムを再起動する

    プロンプトが表示されたら、[カーネルを再起動します] ダイアログで [OK] をクリックします。

    b. [CELL INSTR] Google Cloud プロジェクト情報を設定し、Vertex AI SDK を初期化する:

    このセルを実行して Vertex AI SDK を初期化する前に、ラボの project_id、ロケーション、ステージング バケットの構成値を更新します。

    PROJECT_ID = "{{{project_0.project_id|set at lab start}}}" LOCATION = "{{{project_0.default_region|set at lab start}}}" STAGING_BUCKET = "gs://{{{project_0.startup_script.lab_bucket_name}}}"

    サンプル構成設定で更新されたセル:

    c. [CELL INSTR] Vertex AI Search のツール関数を定義する:

    このセルを実行する前に、GOOGLE_SHOP_VERTEXAI_SEARCH_URL の値を、バックエンド アプリの Cloud Run エンドポイント URL に置き換えます。

    エンドポイント URL を取得するには、Cloud コンソールで Cloud Run に移動し、バックエンド アプリの名前である ag-web をクリックします。エンドポイント URL の値をコピーして、セル内の値と置き換えます。

    バックエンド アプリのサンプル Cloud Run エンドポイント URL で更新されたセル:

    注: ノートブックのメニューバーで [実行] をクリックしてセルを実行することもできます。
  2. セル「エージェントを Reasoning Engine ランタイムにデプロイする」を実行したら、コマンドが完了して Reasoning Engine エージェントが作成されるまで待ちます。次に、Reasoning Engine ID をコピーします。

    この ID は、次のタスクでバックエンド アプリを構成して再デプロイする際に使用します。

    注: このセルが完了するまで最大 10 分かかることがあります。Reasoning Engine が作成されたことを示す最終出力が表示されるまで待ってから、次の手順に進んでください。
  3. Reasoning Engine エージェントが正常に動作することをテストするには、次の 2 つのセルを実行し、出力を確認します。

    Reasoning Engine エージェントは、クエリ入力と Gemini モデルからの出力に基づいて、Wikipedia または Vertex AI Search データストアを正常に呼び出しました。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Reasoning Engine エージェントをデプロイする

タスク 5. バックエンド アプリを拡張する

バックエンド アプリを拡張し、前のタスクでデプロイした Reasoning Engine エージェントを呼び出すようにしましょう。

バックエンド アプリの最初のバージョンでは、Vertex AI Search から直接結果を取得するだけでした。新しいバージョンでは、アプリが Reasoning Engine エージェントを呼び出し、Gemini からの出力とエージェントのツールを使用して、入力プロンプトに基づいて Vertex AI Search または Wikipedia から回答を生成するようにします。

このタスクでは、バックエンド アプリのコードを更新し、リクエスト クエリで Reasoning Engine エージェントを呼び出してエージェントの回答を返すエントリ ポイントを追加します。

バックエンド アプリを更新する

  1. IDE のターミナル ウィンドウで、次のコマンドを実行して、app.py ファイルに新しいエントリ ポイントコードを追加します。

    cat << EOF >> ~/ag-web/app/app.py # # Reasoning Engine # NB_R_ENGINE_ID = "REASONING_ENGINE_ID" from vertexai.preview import reasoning_engines remote_agent = reasoning_engines.ReasoningEngine( f"projects/{PROJECT_ID}/locations/{LOCATION}/reasoningEngines/{NB_R_ENGINE_ID}" ) # エージェントを呼び出す Flask アプリのエンドポイント @app.route("/ask_gemini", methods=["GET"]) def ask_gemini(): query = request.args.get("query") log.info("[ask_gemini] query: " + query) retries = 0 resp = None while retries < MAX_RETRIES: try: retries += 1 resp = remote_agent.query(input=query) if (resp == None) or (len(resp["output"].strip()) == 0): raise ValueError("Empty response.") break except Exception as e: log.error("[ask_gemini] error: " + str(e)) if (resp == None) or (len(resp["output"].strip()) == 0): raise ValueError("Too many retries.") return "No response received from Reasoning Engine." else: return resp["output"] EOF
  2. 先ほど作成した Reasoning Engine エージェントを使用するようバックエンド アプリを構成します。

    次のコマンドの文字列 {YOUR_REASONING_ENGINE_ID} を、前のタスクでノートブック セルからコピーした Reasoning Engine ID の値に置き換え、IDE のターミナル ウィンドウで次のコマンドを実行します。

    sed コマンドの中括弧は必ず削除してください。

    sed -i 's/REASONING_ENGINE_ID/{YOUR_REASONING_ENGINE_ID}/' ~/ag-web/app/app.py
  3. IDE でコードを表示するには、IDE のナビゲーション メニューで をクリックし、IDE-DEV/ag-web/app/app.py ファイルを選択します。

    拡張バージョンのバックエンド アプリで、次の処理が行われます。

    • 前のタスクで作成したエージェントの REASONING_ENGINE_ID を使用して、Reasoning Engine ランタイムから remote_agent のハンドルが取得されます。
    • `ask_gemini() 関数を定義する新しい /ask_gemini エンドポイントが定義されます。
    • この関数は、ユーザー提供の query パラメータをリクエストから Reasoning Engine(remote_agent)に渡し、エージェントからの回答を返します。

バックエンド アプリをビルドして Cloud Run に再デプロイする

  1. バックエンド アプリのフォルダに移動します。

    cd ~/ag-web/app
  2. スクリプトを実行し、指定した Cloud Run リージョンにアプリを再デプロイします。

    ./deploy.sh {{{project_0.project_id|set at lab start}}} {{{project_0.default_region|set at lab start}}}

バックエンド アプリをテストする

アプリの機能は、そのアプリの Cloud Run エンドポイントにアクセスしてテストします。

  1. 前の手順で生成したアプリのエンドポイント URL をコピーし、新しいブラウザタブでその URL に移動します。

  2. アプリが読み込まれると、ホームページに [Welcome to the ag-web backend app] と表示されます。

  3. ブラウザの URL バーで、次のパスを URL の末尾に追加します。

    /ask_gemini?query=where can I buy the dino pin

    アプリは、エージェントが先ほど作成した Vertex AI Search データストアから取得した結果で応答します。

    Chrome Dino Enamel Pin is a product sold at Google Merch Shop. The price is 7.00 USD. You can buy the product at their web site: https://shop.merch.google/product/chrome-dino-enamel-pin-ggoegcbb203299/. (Chrome Dino エナメルピンは、Google Merch Store で販売されている商品です。価格は 7.00 米ドルです。商品は、ウェブサイト https://shop.merch.google/product/chrome-dino-enamel-pin-ggoegcbb203299/ で購入できます。)
  4. ブラウザの URL バーで、パスを以下に置き換えます。

    /ask_gemini?query=what is fallingwater

    アプリは、エージェントがノートブックで構成した Wikipedia API から取得した結果で応答します。

    Fallingwater was designed by architect Frank Lloyd Wright in 1935. It is located in southwest Pennsylvania, about 70 miles southeast of Pittsburgh. The house is famous because it was built partly over a waterfall. (落水荘は、建築家フランク ロイド ライトが 1935 年に設計しました。ペンシルバニア州南西部、ピッツバーグから南東に約 110 km の場所にあります。この建物は、その一部が滝の上に建てられていることで有名です。)

タスク 6. Gemini 2.0 Flash をテスト運用する

バックエンド アプリ、Vertex AI Search コンポーネント、Reasoning Engine エージェントを開発してデプロイしたので、Flutter フロントエンドの設計と構築を始めることができます。

Flutter アプリでは、アプリにアップロードした写真に関する詳細情報をユーザーが確認できます。このアプリは Gemini と統合されており、写真に関する回答を生成します。また、AI エージェントを使用することにより、チャット インターフェースで回答を提供します。

フロントエンド アプリを開発する前に、Gemini 2.0 Flash モデルから返される回答の構造を定義する必要があります。このモデルは、このラボで先ほどデプロイした AI エージェントによって使用されます。

このタスクでは、Gemini 2.0 Flash モデルにプロンプトを送信し、モデルの回答を JSON 形式で表示します。

  1. Gemini 2.0 Flash は、Cloud コンソールの Vertex AI Studio で利用できます。Vertex AI Studio にアクセスするには、ナビゲーション メニュー()をクリックし、[Vertex AI] > [プロンプトを作成](Vertex AI Studio の下)を選択します。

  2. Vertex AI Studio の使用に必要な API を有効にするには、[同意して続行] をクリックします。

    注: Vertex AI Studio は、Google Cloud コンソールのツールです。アプリケーションで生成 AI モデルの機能を活用するために、モデルを迅速にテストしてプロトタイプを作成できます。
  3. [プロンプト] で [メディアを挿入] をクリックし、[Cloud Storage からインポート] を選択します。

  4. ラボバケット の名前の横にある [>] をクリックします。

  5. 画像ファイル fallingwater.jpg を選択し、[選択] をクリックします。

    画像がプロンプト ボックスにアップロードされます。

  6. モデルにプロンプトで指示するには、画像の下にあるプロンプト ボックスに「これは何ですか?」と入力し、[送信]()をクリックします。

    モデルが、画像内のオブジェクトを正しく説明する簡潔な回答を生成します。

  7. モデルから詳細情報を JSON 形式で取得するには、テキスト プロンプトを変更します。

    What is this? Provide the name and description of the object, and be as specific as possible. Also include a list of 3 follow-up questions that I can ask for more information about this object. Generate the response in JSON format with the keys "name", "description", and "suggestedQuestions".
  8. [送信]()をクリックします。

  9. モデルによって生成された JSON レスポンスを表示します。

    { "name": "Fallingwater", "description": "This is Fallingwater, a house designed by renowned architect Frank Lloyd Wright. It's built over a waterfall on Bear Run in rural southwestern Pennsylvania, and is considered a masterpiece of organic architecture, seamlessly blending with its natural surroundings.", "suggestedQuestions": [ "Who commissioned Frank Lloyd Wright to design Fallingwater?", "What are some of the key architectural features of Fallingwater?", "Is Fallingwater open to the public, and if so, how can I visit?" ] }

    これで、プロンプトとモデルの回答が JSON 形式で得られ、Flutter アプリのビルドに使用できます。

    注: モデルから返される回答は、上記の回答と異なる場合があります。

タスク 7. Flutter フロントエンド アプリをデプロイする

モデルから返されるデータの構造が決まったので、フロントエンド アプリを構築することができます。

Flutter は、オープンソースのマルチプラットフォーム アプリ開発フレームワークです。Android、iOS、web、macOS、Windows、Linux で動作する 1 つのコードベースを作成できます。Flutter アプリは、Dart プログラミング言語で開発されています。

このラボでは、Flutter アプリをウェブ アプリケーションとしてデプロイし、ブラウザを使用してアクセスできるようにするため、ターゲット プラットフォームとして web を使用します。

このタスクでは、Flutter アプリのコードを確認し、アプリをウェブ アプリケーションとしてビルドおよび実行します。

Flutter アプリのコードベースを確認する

このアプリの機能の一つとして、ユーザーが観光名所の写真をアップロードし、Gemini にクエリを実行してその写真に関する情報を取得する機能があります。このラボでは、Flutter アプリは開発され、Cloud Storage で利用できるようになっています。

  1. IDE のターミナルで、Flutter アプリのコードをダウンロードします。

    gcloud storage cp -r gs://cloud-training/OCBL453/photo-discovery/app ~
  2. アプリ プロジェクトの依存関係を取得するには、IDE のターミナル ウィンドウで次のコマンドを実行します。

    cd ~/app; flutter pub get
  3. IDE でコードを表示するには、そのナビゲーション メニュー()で [File] をクリックし、[Open Folder] を選択します。

  4. リストから /home/ide-dev/app/ を選択し、[OK] をクリックします。

  5. フォルダ内のファイルの作成者を信頼するには、[はい、この作成者を信用します] をクリックします。

    app フォルダの内容の概要は次のとおりです。

    フォルダ / ファイル 説明
    app Flutter アプリを構成するサブフォルダとファイルが格納されたプロジェクトのルートフォルダ。
    android/ios/linux/macos/web/windows サポートされている各プラットフォームで Flutter アプリを実行するために必要なプラットフォーム固有のファイルが保存されています。
    lib 機能、ルーティング、データモデル、ユーザー インターフェースを含む、アプリケーションの中核となる Dart ファイルが保存されています。
    test アプリのウィジェットをテストするために使用される Dart テストが保存されています。
    pubspec.yaml アプリの依存関係、Flutter のバージョン、他の構成設定が保存されています。
    analysis_options.yaml アプリの静的解析の構成設定が保存されています。

    これらのフォルダにあるファイルの一部を見てみましょう。

  6. [エクスプローラ] メニューで /app/lib/models フォルダをクリックし、metadata.dart ファイルをクリックして開きます。

    metadata.dart ファイルには、Flutter アプリで使用されるデータモデルが保存されています。

    class Metadata { String name = ''; String description = ''; List suggestedQuestions = []; // 以下略 ... }

    メタデータ オブジェクトの属性は、Gemini API からの回答で返される JSON 属性にマッピングされます。fromJson メソッドは、呼び出されたときにオブジェクト属性を初期化します。

  7. [エクスプローラ] メニューで、/app/lib/main.dart ファイルをクリックして開きます。

    これは Flutter アプリのアプリケーション エントリ ポイントです。このファイル内のコードは、初期化タスクの実行後、マテリアル コンポーネントを使用してアプリの UI をビルドし、アプリのタイトル、テーマ、ルーティング構成を設定します。

    注: Material アプリにまず表示されるのは MaterialApp ウィジェットです。このウィジェットは、アプリ内のさまざまな画面へのルーティングを管理する Navigator など、多くの便利なウィジェットをアプリのルートにビルドします。
  8. アプリのルーティング構成を表示するには、[エクスプローラ] メニューで /app/lib/functionality/routing.dart ファイルをクリックして開きます。

    このファイルのコードは、アプリの //chat/settings のルートを定義します。

    Flutter では、アプリのビルドに使用される宣言型クラスであるウィジェットというコンセプトが使用されます。Flutter では、ウィジェットを構成してより複雑なウィジェットをビルドし、ウィジェットツリーを形成することでレイアウトを作成します。Flutter での UI のビルドについて詳しくは、こちらのドキュメントをご覧ください。

  9. アプリの UI 画面と機能の一部を担うコードを見てみましょう。[エクスプローラ] メニューで、/app/lib/ui/screens/quick_id.dart ファイルをクリックして開きます。

    このファイルには、アプリのウィジェットをビルドするクラスが保存されています。アプリのメインページをビルドするクラス GenerateMetadataScreen が含まれており、routing.dart ファイルで定義された / パスから呼び出されます。この UI では、ユーザーはパソコンやモバイル デバイスから画像をアップロードしたり、デバイスのカメラで写真を撮影したりすることができます。

    アプリで使用される他の UI 画面は、設定とチャットページ用であり、app/lib/ui/screens/ フォルダの settings.dart ファイルと chat.dart ファイルに実装されています。

    アプリの初期化時、アプリにより使用される Gemini 生成 AI モデルのインスタンスを取得するために Vertex AI for Firebase Dart SDK が使用されます。これは _GenerateMetadataScreenState クラスで実装されています。

    void initState() { super.initState(); model = FirebaseVertexAI.instance.generativeModel( model: geminiModel, generationConfig: GenerationConfig( temperature: 0, responseMimeType: 'application/json', ), ); }

    ユーザーが画像を選択すると、アプリは画像とテキスト プロンプトを使用して Vertex AI Gemini API を呼び出します。使用されるテキスト プロンプトは、前述のタスクで Gemini 2.0 Flash モデルをテスト運用したときにテストしたものと同じです。

    _sendVertexMessage() メソッドには、プロンプトを送信するコードが含まれています。メソッドのコードの一部を以下に示します。

    Future _sendVertexMessage() async { ... final messageContents = Content.multi( [ TextPart( 'What is the subject in this photo? Provide the name of the photo subject, and description as specific as possible, and 3 suggested questions that I can ask for more information about this object. Answer in JSON format with the keys "name", "description" and "suggestedQuestions".'), DataPart('image/jpeg', _image!), ], ); var response = await model.generateContent([messageContents]); var text = response.text; if (text == null) { _showError('No response from API.'); return; } else { var jsonMap = json.decode(text); if (mounted) { context.read().updateMetadata(Metadata.fromJson(jsonMap)); } } ... }

    モデルから生成される JSON の回答はデコードされ、namedescriptionsuggestedQuestions が抽出されます。抽出された内容はローカルに保存され、アプリ UI に表示されます。

Flutter アプリを Firebase に接続する

  1. app ルート プロジェクト フォルダに移動し、flutterfire_cli パッケージを有効にします。

    dart pub global activate flutterfire_cli
  2. Flutter アプリを Firebase に登録するには、次のコマンドを実行します。

    flutterfire configure --project={{{project_0.project_id|set at lab start}}}

    コマンドを実行すると、firebase_options.dart 構成ファイルが Flutter プロジェクトの lib フォルダに追加されます。

  3. サポートされるプラットフォームをアプリ用に構成するには、Space キーを押して、web 以外のすべてのプラットフォームの選択を解除します。矢印キーを使用してプラットフォームをスクロールします。Enter キーを押します。

    Flutter ウェブアプリが登録されて、Firebase で使用できるようになりました。

Flutter アプリのチャット機能を構成する

Flutter アプリにはチャット機能があり、ユーザーがアプリにアップロードした画像の詳細情報を確認したり、より最新の情報を持っている可能性のある他の外部データソースからの情報をリクエストしたりできます。そのためには、Gemini モデルをそれらのデータソースに接続(ground)する方法が必要です。

この機能を実装するため、Flutter アプリは、先ほどデプロイした Reasoning Engine エージェントと統合されます。統合は、ビルドして Cloud Run にデプロイしたバックエンド アプリのエンドポイントに Flutter アプリを接続することにより実現します。

  1. まず、バックエンド アプリの Cloud Run エンドポイントのホスト名を取得し、その値を環境変数に格納します。IDE のターミナル ウィンドウで、次のコマンドを実行します。

    BACKEND_APP_HOST=$(gcloud run services describe ag-web --region {{{project_0.default_region|set at lab start}}} --format 'value(status.url)' | cut -d'/' -f3); echo $BACKEND_APP_HOST
  2. Flutter アプリの場合、バックエンド アプリのエンドポイントは ~/app/lib/config.dart ファイルで構成されています。ファイル内の構成エントリを更新します。

    sed -i "s/cloudRunHost = .*/cloudRunHost = '$BACKEND_APP_HOST';/" ~/app/lib/config.dart
  3. 変更を確認するには、IDE の [エクスプローラ] メニューで IDE-DEV/app/lib/config.dart ファイルをクリックして開きます。以下のサンプルに従って、cloudRunHost 構成エントリの値が更新されたことを確認します。

    注: この値は、前の手順で設定した `BACKEND_APP_HOST` 環境変数の値と一致している必要があります。

チャット機能のコードを確認する

チャット機能を実装する Flutter アプリのコードを見てみましょう。

  1. IDE の [エクスプローラ] メニューで、/app/lib/ui/screens/chat.dart ファイルをクリックして開きます。

    ChatPage クラスは、UI のチャットページ用の Flutter ウィジェットをビルドします。このページは、[詳細を表示] ボタンを押すと UI に表示されます。

    チャット UI をビルドするため、このアプリでは flutter_chat_ui_package を使用します。これで、カスタマイズ可能なチャットのボイラープレート コードのほとんどが実装されます。build() メソッドは、Chat クラスを使用してウィジェットをビルドします。

    Widget build(BuildContext context) { ... Chat( typingIndicatorOptions: TypingIndicatorOptions( typingUsers: typingUsers, ), listBottomWidget: suggestionsWidget, messages: _messages, onSendPressed: _handleSendPressed, showUserAvatars: true, showUserNames: true, user: _user, theme: DefaultChatTheme( receivedMessageBodyTextStyle: TextStyle( color: Theme.of(context).colorScheme.onSurface, ), sentMessageBodyTextStyle: TextStyle( color: Theme.of(context).colorScheme.onSecondary, ), userAvatarNameColors: [ Theme.of(context).colorScheme.primary, ], backgroundColor: Theme.of(context).colorScheme.surfaceContainerHigh, primaryColor: Theme.of(context).colorScheme.primary, secondaryColor: Theme.of(context).colorScheme.surface, ), ), ... }

    listBottomWidget は、前の Gemini 呼び出しからの回答で返される質問の候補のリストを表示するために使用され、ユーザーはチャット メッセージとして質問を選択できます。

    _handleSendPressed() コールバック メソッドは、ユーザーがチャット ウィンドウで [送信] をクリックしたときに呼び出されます。このメソッドは、新しいメッセージを構築して、そのメッセージをメッセージ リストに追加し、askAgent() メソッドを使用してメッセージをバックエンドに送信します。

  2. コードをスクロールして、askAgent() メソッドを見つけます。

    Reasoning Engine エージェントを使用して Gemini を呼び出すには、askAgent() メソッドで、バックエンド アプリの Cloud Run エンドポイントにある /ask_gemini URL にリクエストを送信します。リクエストのクエリ パラメータには、Gemini への前回の呼び出しで返された画像の namedescription、およびユーザーのメッセージが含まれています。

    Future askAgent( String name, String description, String question) async { var query = 'The photo is $name. $description. $question.'; var endpoint = Uri.https(cloudRunHost, '/ask_gemini', {'query': query}); var response = await http.get(endpoint); if (response.statusCode == 200) { var responseText = convert.utf8.decode(response.bodyBytes); return responseText.replaceAll(RegExp(r'\*'), ''); } return 'Sorry I can\'t answer that.'; }

    その後、関数 _sendMessageToAgent() を呼び出すことにより、バックエンドからの回答がチャット ウィンドウのメッセージのリストに追加されます。

Flutter アプリをデプロイする

Flutter アプリの構成が完了したので、アプリをビルドしてデプロイできます。このラボでは、アプリをウェブ アプリケーションとして実行するため、Flutter ウェブ用の開発サーバーである Fwr を使用します。

  1. Flutter アプリのフォルダ内にいることを確認します。IDE のターミナル ウィンドウで、次のコマンドを実行します。

    cd ~/app
  2. アプリ プロジェクトの依存関係を取得するには、次のコマンドを実行します。

    flutter pub get
  3. プロジェクトを構築してウェブサーバーを起動するには、次のコマンドを実行します。

    fwr

    サーバーが起動して Flutter アプリにサービスを提供するまで待ちます。起動すると、コマンドの出力は次のようになります。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Firebase プロジェクトと Flutter アプリを構成する

タスク 8. Flutter アプリをテストする

Flutter アプリの機能をテストしましょう。

テスト画像をダウンロードする

  1. アプリをテストするには、まず画像をダウンロードしてパソコンに保存します。URL をコピーして、別個のブラウザタブで画像を表示します。

    落水荘の画像

  2. 画像を右クリックして、パソコンに保存します。

  3. 同様に、以下の URL から Google Chrome Dino ピンの画像をダウンロードします。

    Google Chrome Dino ピンの画像

アプリをテストする

  1. Flutter アプリにアクセスするには、Qwiklabs の認証情報パネルからライブサーバーの URL をコピーし、新しいブラウザタブに貼り付けます。

  2. アプリが読み込まれるまで数秒待ちます。次に、[ライブラリから選択] をクリックして落水荘の画像をアップロードします。

    画像をアップロードすると、アプリが Vertex AI Gemini API を呼び出して、アプリの UI に表示される画像の名前と説明を含む回答を生成します。

    アプリ UI の名前フィールドと説明フィールドに Gemini モデルの回答が反映されるまで数秒かかる場合があります。

    注: 権限拒否エラーが表示された場合、それを無視し、[OK] ボタンをクリックして続行します。[画像を削除] をクリックしてから、画像をもう一度アップロードします。
  3. [詳細を表示] をクリックします。

    チャット ページが読み込まれ、前回の Gemini API 呼び出しで回答に含まれていた質問の候補が表示されます。

    注: 質問の提案が表示されない場合、ページを更新してから、前の 2 つの手順を繰り返して画像をアップロードします。
  4. 質問の提案のいずれかをクリックして、チャット エージェントからの回答を表示します。

    エージェントがバックエンド アプリの Cloud Run エンドポイントに HTTPS 呼び出しを行った後、バックエンド アプリが Reasoning Engine エージェントを呼び出します。このエージェントは、Gemini を使用して Wikipedia から回答を返します。

商品データでアプリをテストする

  1. チャット UI で [画像を削除] をクリックします。

  2. [ライブラリから選択] をクリックして、先ほど保存した Google Chrome Dino ピンの画像をアップロードします。

    画像をアップロードすると、アプリが Vertex AI Gemini API を呼び出して、アプリの UI に表示される画像の名前と説明を含む回答を生成します。

  3. [詳細を表示] をクリックします。

  4. チャット メッセージ ボックスに、次のように入力します。

    このピンはどこで購入できますか?

    エージェントがバックエンド アプリの Cloud Run エンドポイントに HTTPS 呼び出しを行った後、バックエンド アプリが Reasoning Engine エージェントを呼び出します。このエージェントは、Gemini を使用して Vertex AI Search データストアから回答を返します。

  5. (省略可)Flutter アプリがモバイル レイアウトに収まることを確認するため、ブラウザ ウィンドウのサイズをモバイル デバイスと同程度のサイズに変更します。

    これは、Flutter アプリが画面サイズやウィンドウ サイズに応じて表示を変化できることを示しています。Flutter のウィジェットとパッケージは、デバイス設定に基づいてアプリをレスポンシブにし、適応させるのに役立ちます。

ラボを終了する

ラボでの学習が完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Qwiklabs から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバック、ご提案、修正が必要な箇所については、[サポート] タブからお知らせください。

お疲れさまでした

このラボでは、次のことを行いました。

  • Google Cloud コンソールで Vertex AI Agent Builder を使用して検索データストアと検索アプリを作成する。
  • Vertex AI Workbench を使用して Reasoning Engine エージェントをデプロイする。
  • Vertex AI Search と Reasoning Engine エージェントと統合する Python アプリを構築する。
  • アプリを Cloud Run にデプロイし、Flutter アプリのバックエンドとして使用する。
  • Firebase プロジェクトを設定し、Flutter アプリに接続する。
  • Flutter アプリのコードを確認して、機能の一部について理解する。
  • Flutter アプリを実行してテストする。

次のステップと詳細情報

Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。