Apigee、BigQuery ML、Spanner を使用してお客様の購入傾向を予測するスマート API を構築する

Last reviewed 2023-06-20 UTC

このドキュメントでは、Apigee、BigQuery ML、Spanner を使用して、顧客の購入傾向を予測するスマート API で説明するるアーキテクチャを構築する方法について説明します。このアーキテクチャでは、これらのプロダクトを使用して、お客様が購入を行う可能性を予測できる API をデプロイします。

この手順は、オムニチャネルや e コマースのプラットフォームを通じてよりパーソナライズされたエクスペリエンスを提供することで収益の向上を目指す、API デベロッパーとデータ スペシャリストを対象としています。対象読者が Apigee、BigQuery ML、Spanner、Google Cloud CLI、Apache Maven に精通していることを前提としています。

アーキテクチャ

次の図は、このソリューションで使用されるアーキテクチャとプロセスを示しています。

お客様の購入傾向を予測するための API のアーキテクチャ。

詳細については、Apigee、BigQuery ML、Spanner を使用してお客様の購入傾向を予測するスマート API をご覧ください。

目標

  • BigQuery で顧客の購入傾向データセットを作成します。
  • プロダクト カタログのデータを Spanner データベースにインポートします。
  • Apigee API プロキシをインポートしてデプロイします。
  • BigQuery から取得したお客様の購入傾向データと、Spanner データベースのプロダクト カタログおよび価格情報を統合します。
  • プロダクトのレコメンデーションの集計ビューを作成します。

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

  • BigQuery と BigQuery ML Flex Slots のスロット
  • Spanner
  • Apigee

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. AI Platform Training & Prediction, BigQuery, BigQuery Reservation, BigQuery Storage, Cloud Spanner, Cloud Storage, Cloud Storage API, Dataflow, Google Cloud, Cloud Storage JSON, Service Management, Service Usage API を有効にします。

    API を有効にする

  4. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  5. Google アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。

    • roles/apigee.admin
    • roles/bigquery.user
    • roles/bigquery.dataViewer
    • roles/spanner.admin
    • roles/spanner.databaseAdmin
    • roles/resourcemanager.projectIamAdmin
    • roles/serviceusage.serviceUsageConsumer

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • PROJECT_ID は、実際のプロジェクト ID に置き換えます。
    • EMAIL_ADDRESS は実際のメールアドレスに置き換えます。
    • ROLE は、個々のロールに置き換えます。
  6. Apigee アカウントをまだお持ちでない場合は、Apigee を設定して Apigee インスタンスをプロビジョニングします。プロビジョニングには 1 時間ほどかかることがあります。
  7. 外部アクセスを許可するように Apigee 組織を構成します。

この手順の完了後にデプロイを維持しないことにした場合は、作成したリソースを削除すれば、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

BigQuery ML を使用して e コマース レコメンデーション データセットを作成する

このセクションでは、BigQuery ML で標準 SQL クエリを使用して ML モデルを作成し、BigQuery の顧客データでトレーニングを行ってからデプロイします。

使用する顧客データは、BigQuery で一般公開されている Google アナリティクス サンプル データセットからのものです。このデータセットは、Google ブランドの商品を販売する実在の e コマースストア、Google Merchandise Store の 12 か月間(2016 年 8 月から 2017 年 8 月)の難読化されたアナリティクス 360 データを提供します。

データのエクスポート、モデルのトレーニング、デプロイのパイプラインの作成などは必要ありません。BigQuery は、必要なコンピューティング リソースを処理するように自動スケーリングします。

このソリューション用に作成する ML モデルでは、行列分解を使用します。これは、ユーザーの好みのデータに基づいてレコメンデーション システムを作成する場合の、一般的で効果的な方法です。

サンプルデータの処理

行列分解を使用する場合は、明示的または暗黙的なユーザー フィードバックを評価し、お客様の好みを判断します。明示的なフィードバックを使用するには、データセットに 1~5 の評価など、商品に対するユーザーの好みに関するデータが含まれている必要があります。明示的なフィードバックがない場合は、他の行動指標を使用して、お客様の好みを推測します。たとえば、ユーザーが商品の詳細ページを閲覧した合計時間を調べます。このソリューションでは、セッション継続時間データを使用してお客様の好みを推測します。

行列分解モデルをトレーニングするには、お客様、評価対象のアイテム、暗黙的な評価を識別する列を含むテーブルが必要です。このセクションでは、useriditemIdsession_duration 列を使用してそのようなテーブルを作成します。session_duration 列には、該当アイテムの商品ページで費やされたユーザーのセッション継続時間が含まれます。

Analytics サンプル データセットのデータを使用してテーブルを作成する手順は次のとおりです。

  1. Google Cloud Marketplace で、アナリティクス サンプルページに移動します。

    アナリティクス サンプルに移動

  2. [データセットを表示] をクリックします。BigQuery SQL ワークスペース ページが開き、アナリティクス サンプル データセットが選択された状態で表示されます。

  3. [エクスプローラ] セクションで、プロジェクトの横にある [アクションを表示] をクリックし、[データセットを作成] をクリックします。

  4. 表示された [データセットを作成] ダイアログで、次の操作を行います。

    1. [データセット ID] フィールドに「bqml」と入力します。
    2. [データロケータ] リストで、[us(米国の複数のリージョン)] を選択します。
    3. [データセットを作成] をクリックします。
  5. [データセットに移動] をクリックし、[クエリを新規作成] をクリックします。

  6. Query Editor で、次の SQL ステートメントを実行して、トレーニング データを含むテーブルを作成します。

    CREATE OR REPLACE TABLE bqml.aggregate_web_stats AS (
      WITH
        durations AS (
          --calculate pageview durations
          SELECT
            CONCAT(fullVisitorId,'-',
                 CAST(visitNumber AS STRING),'-',
                 CAST(hitNumber AS STRING) ) AS visitorId_session_hit,
            LEAD(time, 1) OVER (
              PARTITION BY CONCAT(fullVisitorId,'-',CAST(visitNumber AS STRING))
              ORDER BY
              time ASC ) - time AS pageview_duration
          FROM
            `bigquery-public-data.google_analytics_sample.ga_sessions_2017*`,
            UNNEST(hits) AS hit
        ),
        prodview_durations AS (
          --filter for product detail pages only
         SELECT
            CONCAT(fullVisitorId,'-',CAST(visitNumber AS STRING)) AS userId,
            productSKU AS itemId,
            IFNULL(dur.pageview_duration,
             1) AS pageview_duration,
          FROM
            `bigquery-public-data.google_analytics_sample.ga_sessions_2017*` t,
            UNNEST(hits) AS hits,
            UNNEST(hits.product) AS hits_product
          JOIN
            durations dur
          ON
            CONCAT(fullVisitorId,'-',
                   CAST(visitNumber AS STRING),'-',
                   CAST(hitNumber AS STRING)) = dur.visitorId_session_hit
          WHERE
          eCommerceAction.action_type = "2"
        ),
        aggregate_web_stats AS(
          --sum pageview durations by userId, itemId
          SELECT
            userId,
            itemId,
            SUM(pageview_duration) AS session_duration
          FROM
            prodview_durations
          GROUP BY
            userId,
            itemId )
        SELECT
        *
       FROM
          aggregate_web_stats
    );
    

    bqml.aggregate_web_stats テーブルが作成され、トレーニング データが入力されます。

  7. データのサンプルを表示するには、Query Editor で次の SQL ステートメントを実行します。

    SELECT
    *
    FROM
      bqml.aggregate_web_stats
    LIMIT
      10;
    

出力には、ユーザー ID ごとに行があり、ユーザーが閲覧したアイテムの ID とセッション継続時間が含まれるテーブルが表示されます。出力は次のようになります。

userId itemId session_duration
1 6703373209489429228-1 GGOEAXXX0808 19523
2 868731560082458910-1 GGOEAXXX0808 8312
3 4805474958539278422-1 GGOEAXXX0808 62892
4 8353360074725418910-3 GGOEAXXX0808 4883
5 8253742246691621007-2 GGOEAXXX0808 10
6 7211254729136975568-1 GGOEAXXX0808 96090
7 66777488032155805-1 GGOEAXXX0808 3893
8 0804312527321649470-1 GGOEAXXX0808 7539
9 2965429397557124425-1 GGOEAXXX0808 21776
10 8459600677575627508-1 GGOEAXXX0808 6265

Flex Slots のスロットの購入

BigQuery のオンデマンド料金をご利用の場合、行列分解モデルをトレーニングするには、Flex Slots のスロットを購入してから、予約と割り当てを作成する必要があります。BigQuery で定額料金を利用している場合は、このセクションをスキップして、モデルの作成、トレーニング、デプロイに進むことができます

Flex Slots のスロットを購入するには、bigquery.reservations.create 権限を含む IAM ロールが必要です。この権限はプロジェクト オーナーに付与され、BigQuery 管理者(roles/bigquery.admin)と BigQuery リソース管理者(roles/bigquery.resourceAdmin)の IAM ロールに含まれています。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [容量管理] をクリックし、[予約] をクリックします。

  3. API を有効にするために BigQuery Reservation API ページにリダイレクトされた場合は、[有効にする] をクリックします。それ以外の場合は、次のステップに進みます。

  4. [予約] タブで [スロットの購入] をクリックします。

  5. [スロットの購入] ページで、次の操作を行います。

    1. [コミット期間] リストで [Flex] を選択します。
    2. [ロケーション] リストで、[us(米国の複数のリージョン)] を選択します。
    3. [スロット数] リストで、[500] を選択します。
    4. [次へ] をクリックします。
    5. [注文確認] フィールドに「CONFIRM」と入力し、[購入] をクリックします。

  6. [スロット コミットメントを表示] をクリックします。

    容量がプロビジョニングされるまでに、最大で 20 分間かかります。容量がプロビジョニングされると、スロット コミットメントの [ステータス] 列に と表示されます。

  7. [予約を作成] をクリックして、次のオプションを設定します。

    1. [予約名] に「model」と入力します。
    2. [ロケーション] リストで、[us(米国の複数のリージョン)] を選択します。
    3. [スロット数] に「500」と入力します。
    4. [保存] をクリックします。[予約] ページに戻ります。
  8. model 予約の横にある [アクション] 列で、[割り当てを作成] を選択します。

  9. [組織、フォルダ、プロジェクトを選択] で、[参照] をクリックします。

  10. このソリューションに使用したプロジェクトの名前を入力するか、リストから選択します。

  11. [選択]、[作成] の順にクリックします。

モデルの作成、トレーニング、デプロイ

行列分解モデルを作成、トレーニング、デプロイする手順は、次のとおりです。

  1. Google Cloud コンソールの BigQuery ページで、 [クエリを新規作成] をクリックします。
  2. CREATE MODEL SQL ステートメントを実行します。

    CREATE OR REPLACE MODEL bqml.retail_recommender`
      OPTIONS(model_type='matrix_factorization',
            user_col='userId',
            item_col='itemId',
            rating_col='session_duration',
            feedback_type='implicit'
            )
      AS
      SELECT * FROM bqml.aggregate_web_stats;
    

トレーニングが完了すると、トレーニング済みのモデルが bqml.retail_recommender モデルとしてデプロイされます。

トレーニング済みモデルを使用して予測を行う

このセクションでは、デプロイされた bqml.retail_recommender モデルから予測を取得するために ML.RECOMMEND SQL 関数を使用します。

  1. Google Cloud コンソールの BigQuery ページでクエリを作成し、指定された userId の上位 5 件のレコメンデーションを表す予測を取得します。

    DECLARE MY_USERID STRING DEFAULT "0824461277962362623-1";
    
    SELECT
     *
    FROM
      ML.RECOMMEND(MODEL `bqml.retail_recommender`,
      (SELECT MY_USERID as userID)
                  )
    ORDER BY predicted_session_duration_confidence DESC
    LIMIT 5;
    

    出力には、予測されたセッション継続時間の信頼度(高いほど望ましい)、関連するユーザー ID、ユーザーが閲覧したアイテムの ID の行が表示されます。出力は次のようになります。

    predicted_session_duration_confidence userId itemId
    1 29011.10454702254 0824461277962362623-1 GGOEGAAX0574
    2 28212.99840462358 0824461277962362623-1 GGOEGDHQ015399
    3 28126.79442866013 0824461277962362623-1 GGOEGETR014599
    4 27303.60852083874 0824461277962362623-1 GGOEGAAX0338
    5 25692.370609851147 0824461277962362623-1 GGOEGEFR024199
  2. すべてのユーザーについて上位 5 件の予測を取得するには、次の SQL ステートメントを実行します。このステートメントは多数の行を生成するため、出力がテーブルに書き込まれます。その後、最初の 10 件のレコードが取得されるので、データの例を確認できます。

    -- Create output table of top 5 predictions
    CREATE OR REPLACE TABLE bqml.prod_recommendations AS (
    WITH predictions AS (
        SELECT
          userId,
          ARRAY_AGG(STRUCT(itemId,
                           predicted_session_duration_confidence)
                    ORDER BY
                      predicted_session_duration_confidence DESC
                    LIMIT 5) as recommended
        FROM ML.RECOMMEND(MODEL bqml.retail_recommender)
        GROUP BY userId
    )
    SELECT
      userId,
      itemId,
      predicted_session_duration_confidence
    FROM
      predictions p,
      UNNEST(recommended)
    );
    -- Show table
    SELECT
    *
    FROM
      bqml.prod_recommendations
    ORDER BY
      userId
    LIMIT
      10;
    

    出力には、複数のユーザー ID、ユーザーが閲覧した商品アイテム ID、予測されるセッション継続時間の信頼度が表示されます。出力は次のようになります。

    userId itemId predicted_session_duration_confidence
    1 000170187170673177-6 GGOEGDHQ015399 15931.156936770309
    2 000170187170673177-6 GGOEGAAX0574 20178.608474922632
    3 000170187170673177-6 GGOEGAAX0338 20247.337545389437
    4 000170187170673177-6 GGOEGETR014599 15524.355852692066
    5 000170187170673177-6 GGOEGEFR024199 16443.307099088597
    6 000338059556124978-1 GGOEGAAX0338 18143.067737280064
    7 000338059556124978-1 GGOEGAAX0279 16531.718889063464
    8 000338059556124978-1 GGOEGAAX0574 20916.672241880347
    9 000338059556124978-1 GGOEGETR014599 16155.674211782945
    10 000338059556124978-1 GGOEGEFR024199 18417.17554202264

Spanner データを設定する

以降のセクションでは、gcloud CLIMaven を使用します。両方のツールのコマンドを Cloud Shell から実行します。これらのツールを使用するためにインストールは必要ありません。

  1. Cloud Shell で、Spanner データベースにデータを設定するためのプロダクト レコメンデーション API プロキシ バンドルとスクリプトを含むプロダクト レコメンデーション GitHub リポジトリのクローンを作成します。

    git clone https://github.com/apigee/devrel/tree/main/references/product-recommendations
    cd product-recommendations-v1
    
  2. datareader サービス アカウントを作成し、IAM ロールを割り当てます。サービス アカウントは、API プロキシから BigQuery と Spanner データベースのデータにアクセスするために使用されます。

    gcloud iam service-accounts create datareader --display-name="Data reader for BigQuery and Spanner Demo"
    gcloud iam service-accounts list | grep datareader
    gcloud iam service-accounts create datareader --display-name="Data reader for Apigee, BigQuery, and Spanner Demo"
    gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SA" --role="roles/spanner.databaseUser" --quiet
    gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SA" --role="roles/spanner.databaseReader" --quiet
    gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SA" --role="roles/bigquery.dataViewer" --quiet
    gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SA" --role="roles/bigquery.user" --quiet
    
  3. 環境変数を設定します。

    # For Apigee
    export PROJECT_ID=APIGEE_PROJECT
    export ORG=$PROJECT_ID
    export ENV=eval
    export ENVGROUP_HOSTNAME=API_DOMAIN_NAME
    export SA=datareader@$PROJECT_ID.iam.gserviceaccount.com
    
    # For Cloud Spanner
    export SPANNER_INSTANCE=product-catalog
    export SPANNER_DATABASE=product-catalog-v1
    export REGION=regional-us-east1
    

    次のように置き換えます。

    • APIGEE_PROJECT: Apigee プロジェクトの名前。
    • API_DOMAIN_NAME: Apigee UI の [Admin] > [Environments] > [Groups] ページで構成したホスト名。
  4. Google Cloud コンソールの BigQuery ページで prod_recommendations テーブルを選択し、[プレビュー] タブをクリックして結果を表示します。

    1. userId の任意の値をコピーします。
    2. Cloud Shell で環境変数を設定します。

      export CUSTOMER_USERID=USER_ID
      

      USER_ID は、前のステップでコピーした userId 値に置き換えます。

  5. Cloud Shell で、指定された CUSTOMER_USERID 値に対してオーダーされた商品のレコメンデーションの結果を表示します。

    bq query --nouse_legacy_sql \
        "SELECT * FROM \`$PROJECT_ID.bqml.prod_recommendations\` AS A where A.userid = \"$CUSTOMER_USERID\"" \
        ORDER BY A.predicted_session_duration_confidence DESC
    

    出力には、個々のユーザー ID、ユーザーが閲覧した商品アイテム ID、予測されるセッション継続時間の信頼度が表示されます。出力は次のようになります。

    +-----------------------+----------------+--------------------------------------------+
    |        userId         |     itemId     |      predicted_session_duration_confidence |
    +-----------------------+----------------+--------------------------------------------+
    | 6929470170340317899-1 | GGOEGAAX0037   |                          40161.10446942589 |
    | 6929470170340317899-1 | GGOEYDHJ056099 |                          27642.28480729123 |
    | 6929470170340317899-1 | GGOEGAAX0351   |                         27204.111219270915 |
    | 6929470170340317899-1 | GGOEGDWC020199 |                         25863.861349754334 |
    | 6929470170340317899-1 | GGOEGAAX0318   |                         24585.509088154067 |
    +-----------------------+----------------+--------------------------------------------+
    

Spanner のデータベースを作成し、プロダクト カタログデータをインポートする

  1. Cloud Shell で、指定されたリージョンに Spanner インスタンスを作成してプロダクト カタログ データベースを作成し、データをインポートします。

    ./setup_spanner.sh
    

    このスクリプトは、CUSTOMER_USERID 環境変数を使用して、作成されたエントリを表示します。

    Spanner プロダクト カタログには、特定のユーザーの BigQuery トレーニング ステップで使用したアイテムのみが含まれています。そのため、Spanner データベースにプロダクト カタログデータを作成した後に CUSTOMER_USERID 環境変数を変更した場合は、setup_spanner.sh シェル スクリプトを再実行してデータを再設定する必要があります。

  2. Spanner データベースのデータを確認します。

    gcloud spanner databases execute-sql $SPANNER_DATABASE --sql='SELECT * FROM products'
    

    出力には、プロダクト ID と、Spanner プロダクト カタログの説明情報(価格や画像パスなど)が表示されます。出力は次のようになります。

    productid       name                description                price  discount  image
    GGOEGAAX0037    Aviator Sunglasses  The ultimate sunglasses    42.42  0         products_Images/sunglasses.jpg
    GGOEGAAX0318    Bamboo glass jar    Bamboo glass jar           19.99  0         products_Images/bamboo-glass-jar.jpg
    GGOEGAAX0351    Loafers             Most comfortable loafers   38.99  0         products_Images/loafers.jpg
    GGOEGDWC020199  Hair dryer          Hottest hair dryer         84.99  0         products_Images/hairdryer.jpg
    GGOEYDHJ056099  Coffee Mug          Best Coffee Mug            4.2    0         products_Images/mug.jpg
    

Apigee プロキシをデプロイする

このセクションでは、Maven コマンドを実行して次のリソースを作成します。

  • product-recommendations-v1 という名前のプロキシ
  • product-recommendations-v1-$ENV という名前の API プロダクト
  • demo@any.com という名前のアプリ デベロッパー ユーザー
  • product-recommendations-v1-app-$ENV という名前のアプリ

Maven は、GitHub リポジトリの pom.xml ファイルを使用してリソースを作成します。このファイルには、インストール手順が含まれています。

pom.xml ファイルの profile セクションには、apigee.orgapigee.envapi.northbound.domaingcp.projectidgoogletoken.emailapi.userid の値が含まれています。これらの値はプロジェクトによって異なり、コマンドラインを使用して設定できます。次の例は、これらの値を含む pom.xml ファイルのセクションを示しています。

<profile>
  <id>eval</id>
  <properties>
    <apigee.profile>eval</apigee.profile>
    <apigee.org>${apigeeOrg}</apigee.org>
    <apigee.env>${apigeeEnv}</apigee.env>
    <api.northbound.domain>${envGroupHostname}</api.northbound.domain>
    <gcp.projectid>${gcpProjectId}</gcp.projectid>
<apigee.googletoken.email>${googleTokenEmail}</apigee.googletoken.email>
    <api.userid>${customerUserId}</api.userid>
  </properties>
</profile>

これらの値は、早い段階で、Spanner データを設定するときに設定します。

プロキシをデプロイするには、次の操作を行います。

  • Cloud Shell で、プロキシとその関連アーティファクトをインストールしてから、API をテストします。

    mvn -P eval clean install -Dbearer=$(gcloud auth print-access-token) \
        -DapigeeOrg=$ORG \
        -DapigeeEnv=$ENV \
        -DenvGroupHostname=$ENVGROUP_HOSTNAME \
        -DgcpProjectId=$PROJECT_ID \
        -DgoogleTokenEmail=$SA \
        -DcustomerUserId=$CUSTOMER_USERID
    

    出力には、インストール手順の実行と、インテグレーション テスト API 呼び出しの結果が表示されます。/openapi エンドポイントに対する呼び出しと /products エンドポイントに対する呼び出しが 1 つずつあります。テスト結果では、API プロキシがインストールされ、デプロイされ、動作可能であることが確認されます。出力には、以降の API テスト呼び出しに使用できるアプリの認証情報も表示されます。

Recommendations API をテストする

  1. Cloud Shell で、Apigee API に対して curl 呼び出しを実行して、アプリの API キーの環境変数を設定します。

    APIKEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://apigee.googleapis.com/v1/organizations/$ORG/developers/demo@any.com/apps/product-recommendations-v1-app-$ENV \
        | jq -r .credentials[0].consumerKey)
    

    APIKEY の値をメモします。この情報は、後で AppSheet アプリを作成する(オプション)場合に必要です。

  2. API プロキシのインストール時に指定した CUSTOMER_USERID 値の結果を取得するため、テスト呼び出しを実行します。

    curl -s https://$ENVGROUP_HOSTNAME/v1/recommendations/products \
    -H "x-apikey:$APIKEY" | jq
    

OpenAPI 仕様(OAS)で定義されている API では、リクエストによって次のヘッダーを指定できます。

  • x-apikey: セキュリティ スキームのアプリ コンシューマ キー。
  • x-userid: リクエストを行っているユーザー ID。指定しない場合、この値はデフォルトで、プロキシで構成されている CUSTOMER_USERID 値になります。
  • cache-control: レスポンスをキャッシュに保存する時間。このヘッダーを使用すると、300 秒間レスポンスをキャッシュに保存するか、no-cache を指定してオーバーライドできます。

CUSTOMER_USERID 値の変更や、キャッシュ制御を行うには、次の呼び出し例のようにヘッダー値を設定します。

curl -s "https://$ENVGROUP_HOSTNAME/v1/recommendations/products" \
-H "x-apikey:$APIKEY" \
-H "x-userid:$CUSTOMER_USERID" \
-H "Cache-Control:no-cache" | jq

呼び出し例に対するレスポンスは次のようになります。

{
  "products": [
    {
      "productid": "GGOEGAAX0037",
      "name": "Aviator Sunglasses",
      "description": "The ultimate sunglasses",
      "price": "42.42",
      "image": "products_Images/sunglasses.jpg"
    },
    {
      "productid": "GGOEYDHJ056099",
      "name": "Coffee Mug",
      "description": "Best Coffee Mug",
      "price": "4.2",
      "image": "products_Images/mug.jpg"
    },
    {
      "productid": "GGOEGAAX0351",
      "name": "Loafers",
      "description": "Most comfortable loafers",
      "price": "38.99",
      "image": "products_Images/loafers.jpg"
    },
    {
      "productid": "GGOEGDWC020199",
      "name": "Hairdryer",
      "description": "Hotest hairdryer",
      "price": "84.99",
      "image": "products_Images/hairdryer.jpg"
    },
    {
      "productid": "GGOEGAAX0318",
      "name": "Bamboo glass jar",
      "description": "Bamboo glass jar",
      "price": "19.99",
      "image": "products_Images/bamboo-glass-jar.jpg"
    }
  ]
}

Apigee ポリシー

以降のセクションで説明する Apigee ポリシーは、API プロキシ バンドルで使用されます。

Pre-flow

SpikeArrest
バックエンド BigQuery サービスをトラフィックの急増から保護します。
Quota
コンシューマ アプリケーションとデベロッパーに基づいて API リクエストをスロットリングします。スロットル上限は API プロダクトで構成されます。
ResponseCache - uri
サービスからのレスポンスをキャッシュに保存することで、BigQuery データ ウェアハウスへのリクエストを減らします。

Products-flow

AssignMessage - クエリ リクエストの作成
SQL クエリを使用して、BigQuery データセットから商品のレコメンデーション リストを取得するための HTTP リクエストを設定します。
JavaScript ポリシーと ExtractVariable ポリシー
BigQuery サービスからのデータをフォーマットし、よりユーザー フレンドリーなレスポンス メッセージを作成します。
LookupCache - Spanner セッション
Apigee キャッシュから Spanner データベース セッション ID を検索します。
ServiceCallout - Spanner セッション
Apigee キャッシュにセッション ID がない場合や ID が期限切れの場合は、Spanner サービスに対してリクエストを行い、データベース セッションを作成します。
PopulateCache - Spanner セッション
Spanner セッション ID を Apigee キャッシュに入力します。
ServiceCallout - プロダクト カタログの検索
Spanner プロダクト カタログ データベースからプロダクトの詳細を取得します。
JavaScript - プロダクト データのフォーマット
商品カタログ データベースのデータをフォーマットして、OAS に準拠した API レスポンス メッセージを作成します。

OpenAPI-flow

AssignMessage - OAS JSON
API の OAS JSON レスポンスを設定します。

省略可: Apigee をデータソースとして使用して AppSheet アプリを作成する

e コマース ウェブサイトのエンドユーザーとビジネス ユーザーに対して商品のレコメンデーションを表示するには、このセクションで説明するように AppSheet アプリを作成します。

AppSheet アカウントを作成する

メールアドレスを使用して AppSheet アカウントを作成します。

データソースを作成する

AppSheet は、新しいアプリのデータソースとして API プロキシを使用します。データソースを作成する手順は次のとおりです。

  1. AppSheet にログインします。
  2. [My Account] ページで、[Sources] > [New Data Source] をクリックします。
  3. [Add a new data source] ダイアログで、プロキシの名前(product-recommendations-v1)を入力し、[Apigee] をクリックします。
  4. [Add Apigee API connection information] ダイアログで、次のオプションを設定します。

    1. [Manual] を選択します。
    2. [Apigee API Key] フィールドに、プロキシのテストに使用したアプリの API キーを入力します。API キーがない場合は、Cloud Shell で echo $APIKEY. を実行してキーを取得します。
    3. [Apigee API Base Path] フィールドに、次のように入力します。

      https://ENVGROUP_HOSTNAME/v1/recommendations
      

      ENVGROUP_HOSTNAME は、Apigee UI の [Admin] > [Environments] > [Groups] で構成されたホスト名に置き換えます。

    4. [API Resource Paths] フィールドに、パスの接尾辞「products」を入力します。

    5. [TEST] をクリックします。

    6. テストが正常に完了したら、[Authorize Access] をクリックします。

アクセスを承認すると、AppSheet コンソールに product-recommendations-v1 の新しいタイルが表示されます。

アプリを作成する

  1. AppSheet の products-template app ページに移動します。
  2. [Copy and Customize] をクリックします。[Clone your App] ダイアログが表示されます。
  3. [App name] フィールドにプロキシの名前(product-recommendations-v1)を入力して、[Copy app] をクリックします。アプリが作成されるまで待ちます。
  4. [Welcome to your app] ページで [Customize app] をクリックします。デフォルトでは、アプリは Google スプレッドシートのサンプル データソースを使用します。
  5. 先ほど作成した Apigee データソースと一致するようにデータソースを変更します。

    1. [+ New Table] をクリックし、[product recommendations v1] をクリックします。
    2. [Choose a Sheet/Table] ダイアログで [products] を選択します。
    3. [Create a new table] ダイアログで [Read-Only] をクリックしてから、[Add This Table] をクリックします。

    アプリが [products 2] タブと別のデータビューに表示されます。新しいデータビューでは、各アイテムの説明と価格の値が異なります。アイテムの順序は予測の順序と同じではありません。

  6. AppSheet のデフォルトの並べ替えを解除して、データソースから返されるアイテムの順序を変更します。

    1. サイド ナビゲーション メニューで [UX] を選択します。
    2. [Primary View] セクションで [products 2] を選択します。
    3. [View Options] セクションで、[Sort by] の横にある [name, Ascending] のエントリを削除します。AppSheet に表示される順序が API 呼び出しの結果と同じになり、レスポンスの最後のアイテムが一番下になったことを確認します。
  7. アプリを保存します。

オプションで、元の商品テーブルと UX を削除し、「products 2」のテーブルとビューの名前を「Product Recommendations」に変更することもできます。

クリーンアップ

この手順で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトを削除する

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

個々のリソースを削除する

繰り返し費用が発生しないようにするには、BigQuery Flex Slots のスロットの予約、BigQuery データセット、AI Platform モデルを削除します。

BigQuery Flex Slots のスロットの予約を削除する

  1. Google Cloud コンソールの BigQuery ページで [容量管理] を選択し、[予約] タブをクリックします。
  2. model エントリを開きます。
  3. [予約] の横にある [アクションを表示] をクリックして、[削除] をクリックします。
  4. [モデル] エントリの横にある [アクションを表示] をクリックして、[削除] をクリックします。
  5. Cloud Shell で、デプロイメント、プロキシ、関連アーティファクトを削除します。

    mvn -P eval process-resources -Dbearer=$(gcloud auth print-access-token) \
        -DapigeeOrg=$ORG -DapigeeEnv=$ENV -Dskip.integration=true \
        apigee-config:apps apigee-config:apiproducts apigee-config:developers -Dapigee.config.options=delete \
        apigee-enterprise:deploy -Dapigee.options=clean
    
  6. Spanner リソースを削除します。

    ./cleanup_spanner.sh
    

BigQuery データセットを削除する

  1. Google Cloud コンソールの [BigQuery] ページの [リソース] セクションで、このソリューションに使用したプロジェクトを展開します。
  2. bqml データセットを選択し、[データセットを削除] をクリックします。
  3. 上に重なったウィンドウで、「bqml」と入力して [削除] をクリックします。

AI Platform モデルを削除する

  1. Google Cloud コンソールで、[AI Platform モデル] ページに移動します。

    AI Platform モデルに移動

  2. モデルリストで、rpm_bqml_model をクリックします。

  3. [モデルの詳細] ページで、V_1(デフォルト)バージョンのチェックボックスをオンにします。

  4. [その他] をクリックして、[削除] クリックします。

  5. バージョンの削除が完了したら、[戻る] をクリックしてモデルの一覧に戻ります。

  6. rpm_bqml_model モデルのチェックボックスをオンにします。

  7. [その他] をクリックして、[削除] をクリックします。

  8. Cloud Shell でサービス アカウントを作成します。

    gcloud iam service-accounts delete $SA
    

次のステップ