はじめまして
機械学習エンジニアリングチームのsugasugaと申します。
今回は、自分が直近で行っていた全社横断のレコメンドAPIの開発について紹介します。
既存の仕組み
ピクシブ株式会社は、イラストコミュニケーションサービス「pixiv」を中心にクリエイターを支援する様々なサービスを提供しています。
レコメンドという観点では、未導入サービスがまだ残っています。また、各サービスのチームにこの分野に長けたメンバーがいるとは限らないので、導入まで時間がかかってしまうことが予想されます。
また、レコメンド導入済みのサービスについても、
・レコメンドをバッチで計算しBigQuery(以下BQ)に保存する。その後BQから、
サービス側のDBに同期してもらいレコメンドを提供してもらう
という、方式が主流でした。
既存の仕組みの問題点
大量のユーザーがいるサービスにおいてレコメンドが提供できないのは機会損失になります。
また、BQを介したレコメンドの提供にも明確なデメリットがあります。
ABテストがしにくい問題
ABテストをするために、機械学習チームが各サービスのコードを変更するか、依頼を行う必要があります。また、ABテストの仕組みがない場合、実装のコストがかかります。
機械学習チームによるレコメンドの拡張が非常に難しい問題
バッチで計算されたデータを使って、リアルタイムに計算を行うレコメンドや、複数のレコメンドを組み合わせるものなどは、各サービス側にロジックが実装されることになります。 しかし、各サービスごとに言語や仕様が異なるため、実装や変更は容易ではありません。
サービスによってはBQからDBに同期する仕組みを作る必要がある問題
一部のサービスはAWSを使用していたり、オンプレだったり、共通していないので、BQからDBに同期する仕組みを各サービスに作る必要があります。工数がかかります。
サービスによってはBQからDBにロードする処理に時間がかかる問題
サービスごとにDBの処理能力が異なり、一部のサービスではBQからDBへの同期が規定時間内に終わらないなどの問題が実際に発生していました。
どのように解決したか
上記を解決するために、全社横断のレコメンドAPIを開発しました。 このAPIは社内の内部APIとして、各サービスのバックエンドからコールされる想定です。
各サービスはレコメンドロジックの内容を知ることなく、APIを通してレコメンドを取得できます。
ABテストがしにくい問題の解決
レコメンドAPIでABテストが実装されるため、各サービスはABテストの仕組みを実装する必要がありません。 また、他チームの工数をかけずに新たにABテストを行うことも容易となりました。
機械学習チームによるレコメンドの拡張が非常に難しい問題の解決
機械学習チームが管理するレコメンドAPIに変更を加えれば良いので、実装や変更が容易になりました。
サービスによってはBQからDBに同期する仕組みを作る必要がある問題の解決
各サービスに上記の仕組みを作っていただく必要がなくなりました。
サービスによってはBQからDBにロードする処理に時間がかかるの問題の解決
特定のDBに同期されるため、ロードに時間がかかりすぎる問題やロード失敗のリスクが減りました。
一つ注意点するべき点があります。それは、プライバシーの観点から、ユーザーAがユーザーBのレコメンドが取得できてしまうのを防がなければいけないということです。
pixivアカウントによる認証が行うサービスでは、ユーザーがそのユーザー以外のレコメンドを取得しようとした場合は、処理を失敗させるなどで上記の問題を回避できます。しかし、サービスによっては、pixivアカウントを使用しておらず、対応できません。
そのため、暗号化処理を各サービスに行っていただき、レコメンドAPI側で復号した上で、レコメンドを返すという仕組みにしています。こちらの仕組みは暗号化が認可(authorization)を兼ねています。(多層防御の観点から、社内ネットワークまたは一部サービスのクラウドの特定IPのみを許可する制限も加えています)
おわりに
レコメンドAPIの導入の結果、各サービスでのレコメンド提供が楽になりました。 また、各サービス側のチームの工数を割かずに、ABテストが可能となったため、さらなる改善を行える準備が整いました。
今後も、機械学習を使いサービス改善を行っていきます。
機械学習チームでは自然言語処理、画像処理、テーブルデータなどの様々なデータとタスクがあり、インターン・アルバイト・新卒採用・中途採用問わず、採用を行っています。
もしご興味のある方は下記をご参照ください
アルバイト
新卒採用
中途採用
https://recruit.jobcan.jp/pixiv/show/b001/290971recruit.jobcan.jp