はじめに
前回VertexAI Automlのチュートリアルをやってみて、機械学習やAiに軽く触れて色々学びになったので今回はRetail APIのRecommendations AIをNode.jsからテストAPIを叩いてみたいと思います!
Why Retail API? Recommendations AI?
Retail APIとは
GCP(GoogleCloud)が提供しているレコメンド&検索サービスで、小売向けの主にECサイトに導入できるサービスを提供しています。
提供しているサービスは二つで商品検索サービスのRetail Searchと商品レコメンドサービスのRecommendations AIがあります。
その中で今回はRecommendations AIにフォーカスを当てて解説していきます。
Recommendations AIとは
簡単に言うと超高機能なレコメンドサービスで、ページを訪れたユーザーの情報を解析してユーザー一人一人にあった商品やサービスを提供してくれるサービスになります。全体の流れ
Recommendations AIをローカルのNode.jsでテスト的にAPIを叩くに当たって、最低限必要な要素は下記3つになります。
- 1)商品カタログ情報
- 2)ユーザーイベント情報
- 3)モデルの作成
一つずつ解説していくと、まず「商品カタログ情報」と言うのはその名の通り商品の情報になりまして、この後APIを叩いて取ってくるデータになります。
「ユーザーイベント情報」と言うのはユーザーがどう言うアクションを起こしたかまとめたデータで、例えば「商品を買い物かごに入れる」だったり「商品詳細ページを閲覧する」等のデータがjson形式でまとめられたデータになります。
「モデル」と言うのはそれらデータに対してどう言ったレコメンド(推薦)行うかを決める要素になりまして、例えば「関連商品のおすすめ」だったり「あなたへのおすすめ」と言ったものが該当します。
これらの要素を使用し、今回の手順をまとめると以下になります。
※モデルはデフォルトで作成されている物があるのでそちらを使用します。
- 1)Retail APIのAPIを有効にする
- 2)商品カタログ情報をCloudStorageにインポートする
- 3)CloudStorageの商品カタログ情報をRetail APIのカタログにインポートする
- 4)ユーザーイベント情報をCloudStorageにインポートする
- 5)CloudStorageのユーザーイベント情報をRetail APIのイベントにインポートする
- 6)モデルを作成する
- 7)Node.jsでAPIを叩いてデータを取得する
ではまずは1)からやっていきましょう!
1)Retail APIのAPIを有効にする
GCPのプロジェクトを開いてプロジェクトを選んでください。(無料枠だとこちらのAPIは使用できません。)
※プロジェクト作成がまだな方はこちらから作成してください。
選べましたら左上のハンバーガーメニューを開き、一番下の「その他のプロダクト」のプルダウンを開き下にスクロールすると人工知能の欄に「Recommendations AI」があるのでそちらを選びます。
※右のピンアイコンをクリックすると上部に固定できますので便利です。
最初は「APIを有効にする」と言うボタンが出てくるかと思いますので有効にしてください。
するとこのRecommendations AIのメイン画面に遷移すると思われます。
ここまで出来たら次のステップに移ります。
2)商品カタログ情報をCloudStorageにインポートする
ここからのステップにはgcloud CLIが必要になるため、
まだインストールされていない場合はこちらから行ってください。
コードをcloneする
gcloud cliがインストールできたらまず自分のローカル環境にこちらのGitHubからコードをcloneしてきます。
git clone https://github.com/googleapis/nodejs-retail.git
cloneが出来たらGCPのサイドバーから、「IAMと管理」→「IAM」で自分の権限をオーナーにしておいてください。
設定スクリプトを実行する
こちらのcloneしてきたプロジェクトを開き、下記のコマンドでサービスアカウントの作成とjson形式のキーファイルをダウンロードします。
bash \
samples/interactive-tutorials/user_environment_setup.sh \
<PROJECT-ID>
export \
GOOGLE_APPLICATION_CREDENTIALS=~/key.json
<PROJECT-ID>
の部分にはGCPコンソールのヘッダーのプルダウンから確認したプロジェクトIDを入れてください。
下記の様なエラーが出た場合はgcloud auth login
コマンドでgcloud cli上からGCPにログインしてください。
ERROR: (gcloud.config.set) There was a problem refreshing your current auth tokens: ('invalid_grant: Invalid grant: account not found', {'error': 'invalid_grant', 'error_description': 'Invalid grant: account not found'})
Please run:
$ gcloud auth login
to obtain new credentials.
If you have already logged in with a different account:
$ gcloud config set account ACCOUNT
to select an already authenticated account to use.
=========================================
The Google Cloud setup was not completed.
Please fix the errors above!
=========================================
ログインしコマンドを実行してこの様な表示がコンソールに出れば成功です。
To address all issues (including breaking changes), run:
npm audit fix --force
Run `npm audit` for details.
=========================================
The Google Cloud setup is completed.
Please proceed with the Tutorial steps
=========================================
一応確認しておきましょう。
GCPコンソールを開きサイドバーから「IAMと管理」→「サービスアカウント」を開きます。
そこにこのような表示がされていたら正常にサービスアカウントが作成されています。
「サービスアカウント」とはアプリケーションや仮想マシン(VM)に属している特別な Google アカウントです。
今回であればRecommendations AIがサービスアカウントに当たります。
こちらのサービスアカウントを使用する上で必要なキーがkey.json
ファイルとしてご自分のローカル環境に落ちてきている
はずなのでそちらも確認してください。
大体はホーム画面にあります。
Google Cloud Retail ライブラリをインストールする
次は必要なライブラリのインポートを行います。
samplesディレクトリに移動してnpm install
を実行します。
これで作業環境の構築は完了です。
カタログデータをCloudStorageにアップロードする
下記のコマンドでCloudStorageにバケットを作成して商品カタログのJSONファイルをアップロードします。
ディレクトリはsamples
ディレクトリのまま実行してください。
node interactive-tutorials/setup/create-gcs-bucket.js
このようにコンソールに出力されれば成功です
Bucket バケット名 created.
File products.json uploaded to バケット名
File products_some_invalid.json uploaded to バケット名
確認しておきます。GCPコンソール画面からサイドバー「CloudStorage」→「バケット」を選択してください。
このように出ていれば正常にCloudStorageにバケットが作成され商品カタログのJSONファイルがアップロードされています。
確認出来ましたらバケット名をコピーして、exportコマンドで一時的に環境変数を変更しておきます。
export BUCKET_NAME=<PROJECT-ID>_<TIMESTAMP>
3)CloudStorageの商品カタログ情報をRetail APIのカタログにインポートする
最後にCloud Storageソースから商品をインポートします。
node samples/interactive-tutorials/product/import-products-gcs.js
下記の様にターミナルに出力されていたら成功です。
Number of successfully imported products: 316
Number of failures during the importing: 0
Operation result: [{...}]
Import products finished
GCPコンソールでも確認してみます。
サイドバーから「Recommendations AI」→「データ」→「カタログ」でこのような画面が表示されていたらOKです。
これで商品カタログデータの登録は完了です。
4)ユーザーイベント情報をCloudStorageにインポートする
次はユーザーイベントをやっていきますが、ほぼ同じ手順になります。
作業環境の構築は上記で完了していると思いますので、CloudStorageにユーザーイベントをアップロードします。
CloudStorageにユーザーイベントをアップロードする
下記のコマンドをcd samples/interactive-tutorials
でinteractive-tutorialsディレクトリに移動してから実行します。
node samples/interactive-tutorials/setup/events-create-gcs-bucket.js
省略しますが確認したい方はカタログインポート時と同じ方法でGCPのコンソール画面から確認してみてください。
環境変数を通します。
export EVENTS_BUCKET_NAME=<PROJECT-ID>_events_<TIMESTAMP>
5)CloudStorageのユーザーイベント情報をRetail APIのイベントにインポートする
ディレクトリはinteractive-tutorialsディレクトリのままで下記を実行します。
node events/import-user-events-gcs.js
下記の様にターミナルに出力されていたら成功です。
Number of successfully imported events: 4
Number of failures during the importing: 0
Operation result: [{...}]
Events import finished
GCPコンソールでも確認してみます。
サイドバーから「Recommendations AI」→「データ」→「イベント」でこのような画面が表示されていたらOKです。
これでユーザーイベントデータの登録は完了です。
6)モデルを作成する
モデルの作成ですが、デフォルトで作成されているモデルがあるので今回はそれを使います。
GCPコンソールからサイドバー「Recommendations AI」→「モデル」を表示してください。
このような画面になってるかと思います。
こちらがデフォルトで作成されているモデルで「モデルタイプ」は「最近表示したもの」になっています。
これは指定したuserIdまたはvisitorIdのユーザーが閲覧したアイテムの履歴を返してくれるモデルで、
最大で75個まで返してくれます。
他にもいろんなモデルがあるのですが、膨大な量のデータが必要だったりトレーニングに十分なユーザーイベントデータを提供する必要があったりと、テストで叩くにはかなり大掛かりになってしまうのと料金も結構かかるので今回はこちらを使用します。
ちなみにモデルのトレーニングとは、データやイベントから予測をリクエスト(レコメンド)してくれる機能になります。
7)Node.jsでAPIを叩いてデータを取得する
下準備が完了したのでAPIを叩いていきます。
まずsamplesディレクトリへ移動し、dotenvとrequestモジュールをimportします。
・dotenvのimport
npm i dotenv
・requestのimport
npm install request
samplesディレクトリ配下にtest.js
(ファイル名はなんでも良い)を作成し、下記コードを書きます。
urlのプロジェクト名のところにはプロジェクトIDを入れてください。
const request = require('request');
require("dotenv").config();
try {
request.post(
{
url: 'https://retail.googleapis.com/v2/projects/プロジェクト名/locations/global/catalogs/default_catalog/servingConfigs/recently_viewed_default:predict',
headers: {
'Authorization': `Bearer ${process.env.TOKEN}`,
'Content-Type': 'application/json; charset=utf-8',
},
json: {
validateOnly: true,
userEvent: {
eventType: 'detail-page-view',
visitorId: 'bjbs_group1_visitor1',
productDetails: [
{
product: {
id: 'GGCOGAEC100616',
},
},
],
},
},
},
(err, res, data) => {
console.log(data);
}
);
} catch (error) {
console.log(error);
}
ターミナルでgcloud auth application-default print-access-token
コマンドを実行し、アクセストークンを取得します。
samplesディレクトリ配下で.env
ファイルを作成します。
そこに取得したアクセストークンを入れます。
TOKEN=ya29.c.b0AT7lpjDOioKqtJpozPwpX3WsP1zhw6aUE81aHhjAuyRjF....
samplesディレクトリでnode test.js
を実行します(testの所は任意のファイル名になります。)
下記のようなデータが取れていたら成功です。
{
results: [
{ id: 'GGPRGALB100815' },
{ id: 'GGPRGAEL101415' },
{ id: 'GGPRGADC107915' },
{ id: 'GGPRGADC107914' },
{ id: 'GGPRGAAB100718' },
{ id: 'GGPRGAAB100714' },
{ id: 'GGPRGAAB100712' },
{ id: 'GGPRAHPL107110' },
...
],
attributionToken: 'ChQxMTUzNzQ3NTkyMjU2NDY5MjY3MxACGgJSViICUlYoAA',
validateOnly: true
レスポンスで返ってきているattributionToken
は予測を行うと発行され、ユーザーの操作と結果を相互に関連付けより精度の高い予測を行うのに使用されます。
validateOnly: true
はテストでAPiを呼ぶときに使用します。これがfalseだとエラーになるのでtrueにしておいてください。
上記のレスポンスのデータはCloudStorageのカタログデータの中から来ています。
CloudStorageのユーザーイベントデータの中身は下記のようになっており、
test.jsのbodyで指定したeventTypeとvisitorIdがこのユーザーイベントのデータを指定して、
モデルでこのユーザーが閲覧したアイテムを取得する指示を出しているのでAPIを叩くとそのデータが表示されるようになっています。
{"eventType":"detail-page-view","visitorId":"bjbs_group1_visitor1", ...}
以上になります。お疲れ様でした。
おわりに
Retail APIはECサイトはもちろん色んな用途に使えそうな高機能なAIサービスです。
実務で使う場合はもっと膨大なカタログデータとユーザーデータを使ってやる必要がありますが、
テストでAPIを呼び出してみることで全体像は掴めたかなと思います。
また機会があればGCP色々いじってみたいですね。
参考