こんにちは。LIFULL でネイティブアプリのスペシャリストをしている菊地です。 普段は LIFULL HOME'S アプリ(iOS, Android)の開発チームで Tech Lead をしています。
2020年12月3日(木)、4日(金)に開催された Google Developers ML Summit に BigQuery で実現するユーザーの傾向に合わせたレコメンドシステムというセッションで登壇させていただきました。
当日はまさかのトップバッターということもあり、ライブ Q&A でどういった質問が来るか?そもそも質問くるのか!?という緊張感が凄かったです。
ここでは時間の都合でセッションの中で回答できなかったことや、もう少し詳しいお話を書かせていただければと思います。
Google Developers ML Summit とは
Google Developers ML Summit は年に一度、Google Cloud 主催で ML(Machine Learning) に関する技術・事例の紹介などを行うために様々な開発者が一同に集まるイベントになります。
データサイエンティスト、アプリケーション開発者向けに、最新の Google Cloud AI や、機械学習サービスの活用例の紹介。 TensorFlow、Cloud AI などの活用事例、機械学習モデルの開発や利用、データサイエンティスト/機械学習エンジニアを繋げるプラットフォーム「Kaggle」の紹介
公式サイトより
講演資料はこちらで公開されています
セッション内容
今回、登壇させていただいたセッションは、BigQuery で実現するユーザーの傾向に合わせたレコメンドシステムになります。
内容としては、LIFULL HOME'S の Android アプリに実装した「お気に入り傾向が似ているほかのユーザーがお気に入りに入れている物件をレコメンドする」機能について、開発のきっかけや、どのようなものを比較・検討したうえで実現したか?というものを発表しております。
※ こちらもチェック!好みが近い人が閲覧した物件と表示されている部分が今回実装したものになります。
開発する際の課題と解決
開発する際に課題として上がってきた項目は主に下記の3つになります。
1. レコメンドに必要な学習データをどう集めるか?
レコメンドを行うためには学習データとしてユーザーの行動を集める必要があります。 今回は、Firebase Analytics を既に導入していたため、「物件をお気に入りに追加した」というイベントを計測し、Firebase にある BigQuery Export を利用することで実現しました。
2. レコメンドエンジンをどのように構築するか?
レコメンドエンジンの実現には、GCP では様々な方法で実現することができます。
検討した方法
- Recommendations AI
- BigQuery ML
- Cloud Data Proc
- AI Platform
選択したもの
元々の選択肢にはなかった BigQuery による協調フィルタリング を選択しました。 ※ 詳細についてはぜひセッションまたはスライドをご覧いただければと思います。
3. レコメンド結果をアプリからどうやって利用するか?
レコメンドエンジンが抽出したレコメンド結果をアプリから利用するためにどこに置くか?について検討する必要がありました。
アプリから呼び出せる API を作って BigQuery を直接読み取る、別で DB を用意するなど様々なものが考えられます。
今回は、Firestore にユーザー毎の Document が存在していたことから Document 配下に直接書き込む事で、アプリからの直接参照も行えるなどメリットがあったため、Firestore を選択することにしました。
構成図
今回、最終的に構築されたレコメンドシステムのアーキテクチャはこちらの図のようになります。
レコメンドシステム全体の処理としては下記のような3つで構成されております。
- アプリから「物件をお気に入りに追加した」というイベントを Firebase Analytics で取得し、BigQuery Export を用いて BigQuery にデータをためる
- Cloud Scheduler で毎日一度起動する Cloud Functions(Pub/Sub 経由) が BigQuery に対してクエリで協調フィルタリングを行い、抽出結果を Firestore に格納する
- アプリから Firestore に対して、ユーザー毎の Document にアクセスし、3 で生成された抽出結果(レコメンド結果)を取得する
開発秘話(裏話)
開発のきっかけ
LIFULL HOME'S アプリの開発チームでは、普段からこういう機能を提供できないか?こんなことをしたら楽しんでもらえないか?という話をかなりの頻度で話しています。 これはそういうことを話す時間を設けているわけではなく、ただの雑談でそういう話をすることがあり、雑談が盛り上がってそのまま開発までしてしまうことがあります。
今回の不動産物件レコメンドシステムについては、アプリ内でユーザーの行動に合わせたレコメンドって少ないよね?好みとかに合わせたものってないかも?というところから始まり、ECなどでよく見る "この商品をお気に入りに入れた人はこちらもお気に入りに入れています" みたいなのが提供できるといいかも!と盛り上がっていったことがきっかけになります。
盛り上がった後には、ちゃんと既に提供しているレコメンドとの違いや、このレコメンドで提供できる価値があるか?というところも話した上で検討が始まりました。
開発までにかかった日数
今回、調査や検討にはかなりの時間がかかりました。
というのも雑談から始まったプロジェクトであること、最初はチーム全体ではなく数名で盛り上がって調べていた、ということが挙げられます。
設計や調査に時間をかけたこともあり、一番時間がかかったのはアプリでどう見せるか?という企画面になります。 全体を通しては実際に開発することが決まってからリリースまでには一ヶ月もかからず開発することができました。
iOS アプリとの相性
今回、LIFULL HOME'S の Android アプリで開発を行いましたが、開発したレコメンドシステムは、すべてバックエンド側のため iOS アプリでも利用が可能です。
いつ頃リリースされるか?まったく同じ内容でリリースされるか?ということは決まっておりませんが、それぞれのプラットフォームのユーザーの特性やアプリの体験に合わせた形で再利用して活用できればと考えています。
AWS や Azure ではなく GCP で開発した理由
LIFULL HOME'S アプリでは、以前から Firebase を導入しています。またマイクロサービスとして AWS、GCP の両方を使い分けています。 そのため、AWS か GCP のどちらかでの開発を行うというのが決まった状態でスタートしました。
最終的には、レコメンドエンジンの中核となる BigQuery に合わせたというのがありますが、Cloud Functions のトリガーによる Firebase の拡張が豊富なこと、既に構築しているアプリ向けプッシュ通知のシステムを GCP で構築していたため、より手軽に開発ができるということで GCP を選択しました。
予算のお話
セッション中に何度も「費用感が・・・」といった形で何度も予算の話を出しておりました。 今回のプロジェクトは元々予算がなく、他のプロジェクトの予算を削減してこちらに回すという形で捻出しました。 費用をかければもっと手軽にレコメンドシステムを実現することは可能ですが、それぞれの構成案の費用間やメリット・デメリットを知っておくことは今後のためにもなると考え、徹底的に費用に拘ってレコメンドを実現する手段を探すことにしました。
人件費なども考えると普通に BigQuery ML などで構築した方が・・・という場合もありますが、同じようなことを検討されている方々でそれぞれの環境に合わせてどうやって実現していくか?ということを考える際の参考になれば幸いです。
データサイエンティストとの関わり方
今回は、レコメンドエンジンの核となる BigQuery で協調フィルタリングを行う部分について、データサイエンティストに相談に乗っていただきました。
BigQuery で協調フィルタリングでがきることはわかっていましたが、実際にクエリを書くとなるとアプリチームのスキルだけでは時間がかかってしまいます。 そのため、普段から BigQuery なども使いこなしているプロに相談しようとなり、弊社のデータサイエンティストにこういうことをやりたいんですけどと相談したところ、数時間後には試験的なクエリを提供していただき開発を一気に進めることができました。
まとめ
今回、Google Developers ML Summit で発表させていただいた BigQuery で実現するユーザーの傾向に合わせたレコメンドシステムについてご紹介させていただきました。 こちらで紹介させていただいたレコメンドは、LIFULL HOME'S Android アプリ内にてご利用いただけます!!
※ レビューいただいたコメントは中の人が見て返信してますので、ぜひアプリの使い勝手やご意見などを気軽にコメントいただけると嬉しいです!いただいたコメントはアプリの改善にも活かしていきます!
セッションの中でも触れましたが、個人的には BigQuery ML を試したいという思いはあったのですが、お金という現実と向き合って"やりたいことをどう実現するか?"と"費用という問題とどう戦っていくか?"というところについてこだわって進めたプロジェクトになります。 今回の内容がレコメンドを作ってみたいと考えている方の参考になれば幸いです。それぞれの構成の詳細についてはセッションスライドに記載があるので、ぜひご覧ください。
LIFULLではメンバーを募集しております! カジュアル面談もありますのでご興味ある方は是非ご参加ください!