エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

サイトトップにAIを導入して売り上げに1億円貢献する

エンジニアリンググループ AI・機械学習チームの金山 (@tkanayama_)です。今回は、私が立ち上げ段階から主担当として推進しているプロジェクトである、サイトトップページのコンテンツを自動更新するシステムの開発について書きます。後のA/Bテストにより、このシステムは年間換算で1億円規模の売り上げ貢献をしていることを示すことができました。この記事では、こうしたインパクトの大きいプロジェクトがどのように進行したかを説明します。よく弊社のブログや勉強会などで語られる「エムスリーはROIを重視する風土がある」ことの一例だと思って読んでいただければと思います。

(なお、タイトルに「AI」や「1億円」という強い言葉を並べてしまったことをここに懺悔します。)

f:id:tepppei:20200928105244j:plain

プロジェクトの概要

エムスリーでは、医療従事者向け総合医療情報である「m3.com」というウェブサイトを運営しています。このウェブサイト上には、医療ニュース、医学文献検索、医師限定掲示板、求人募集・転職情報など様々なコンテンツが掲載されています。

実際の画面は下記のようになっています。

f:id:tepppei:20200927120410p:plain
m3.comトップページのイメージ。画像は弊社プレスリリースより。

今回は、このトップページの中でも特に目立つエリアである、医療系のニュース記事などを扱うエリア(画像中で赤枠で囲ったエリア)の改善を行いました。

このエリアの従来の運用は、「編集部がオススメ記事をピックアップし、記事管理画面を手動で操作する*1ことにより更新する」というものでした。システムを図にすると下記のようになります。

f:id:tepppei:20200928134010p:plain
プロジェクト開始前のシステム

この運用により生じる問題はいくつか考えられ、特に改善余地が大きそうな課題として下記の2つが挙げられます。

  1. 編集部がトップページの記事を手動更新するのに割ける工数が限られている。そのため、「1日に1, 2回しかトップページの記事を更新できない」「土日は更新できない」などの制約が生じてしまう。
  2. 編集部の経験と勘を頼りに掲載する記事を決めているため、「真にユーザーから人気がある記事」を取りこぼしてしまう可能性がある*2

そこで、それぞれの課題に対する解決策として、下記を実現すればトップページの魅力を大幅に向上できるのではないかと考えました。

  1. 表示記事の更新を自動化することにより、更新頻度を大幅に向上する。
  2. 探索活用アルゴリズムなどを利用して、ユーザーの反応が良かった記事を優先的に表示できるようにする。

チャレンジングな点

このプロジェクトの難しい点は、ユーザーへの影響が非常に大きいことです。今回対象にしているのはエムスリーの主力サービスであるm3.comのトップページ最上部のエリアですから、万が一障害など起こした場合はユーザーへの悪影響は自ずと大きくなります。そのためこのプロジェクトは特に慎重に行う必要がありますが、慎重になるがゆえに無闇にたくさん工数を使って良いわけではありません。なぜなら、現段階での拠り所は「改善余地が大きそう」という直感だけであり、具体的にどれだけの効果になりそうかはまだ分からないからです。効果が分からない施策に初めから大きな工数を投じるのはリスクが大きいです。

そこでこのプロジェクトの最大のポイントとして、「できるだけ少ない工数で効果を確認しながら少しずつゴールに近づいていく」ということを心がけました。

やったこと

Step0. システムに全く手を加えない方法を試す

開発コストを最小限に抑えて効果を検証する方法は、システムに全く手を加えないことです。先ほど「運用工数の関係で手動で更新頻度をこれ以上増やすことは難しい」ということに触れましたが、短期的に試すだけであれば不可能ではありません*3。そこで、手動の運用により「トップページの記事の更新頻度を2時間おきにするとCTRがどのように変化するか?」の実験を行いました。そして実験結果に基づき、次のステップのためにどれくらい工数をかけても元が取れそうかを算出し、次のステップに進みました。

Step1. システムに最小限の開発を施す

Step0により、ある程度の工数の範囲内であればROIに適いそうだということが分かりました。しかしながら、Step0での検証には2つの問題があります。

  1. 人手で頑張って実験したので検証期間が限定的であり、効果見積もりのブレが大きい
  2. 更新頻度向上効果しか検証できておらず、「ユーザーの反応が良かった記事を優先的に表示できるようにする」施策の検証ができていない

そこで、

  1. 記事の更新を自動化してより長期的に効果を測定する
  2. 探索活用アルゴリズムを導入し、複数の候補記事から表示記事を推薦する

を、現状のシステムに最小限の変更を加えることが次の目標になります。この、「最小限の変更を加える」という点がこのステップでのポイントになります。なぜなら、Step0での効果見積もりの段階では効果の下振れも十分起こりうるので、大きな工数は投下できないからです。これらを踏まえて具体的なシステムに落とし込んだ結果、最終的に下記のようなシステムを採用しました*4

f:id:tepppei:20200928134034p:plain
Step1で実現するシステム

このシステムのポイントは下記の2点です。

  • 記事管理DBのスキーマを全く変更せずにそのまま使ったこと

記事管理DBのスキーマを変更したり新たにDBを用意したりすると、m3.comに記事を表示するためのモジュールにも手を加える必要が出てきてしまいます。そこで、記事管理DBはそのまま使い回し、記事管理DBを操作するためのAPIを新たに立てることによって対応しました。

  • 新たな記事管理画面としてGoogle Sheetsを採用したこと

今回は探索活用アルゴリズムを導入するために、複数の表示候補記事を登録しておく必要があります。しかしながら、従来の記事管理画面は単純に入力された記事をそのまま表示することを目的としているため、候補記事を複数登録することはできません。さらに、管理画面に求められるもう1つの要件として「複数の編集担当者が同時に編集する可能性がある」という要件が存在します。この要件を満たすように新たに管理画面を作り直そうとすると、どうしても工数がかかってしまいます。そこで、共同編集の面で非常に優れているGoogle Sheetsをそのまま仮の管理画面として採用することにより、新たな開発工数をかけることなく要件を満たした管理画面を実現しました。このプロジェクトの効果が検証できたあとで、改めて定常運用用の管理画面を作成することにします。

このようなシステム構成で開発を行うことにより、少ない工数でStep1の目的を達成できました。このシステムを用いて、Step0に比べてより最終ゴールに近く、なおかつより長期的な効果測定を実施しました。その結果、本格的なシステム開発を行うのに値する利益が見込めることがわかったので、次の段階に進みました。

Step2. 将来を見据えたシステム開発を実施する

Step1で構築したシステムには1つ重大な欠点があります。それは、「ユーザーごとに表示記事を出し分けることができない」という点です。この理由は、記事管理DBが「ユーザーID」のようなカラムを持っておらず、全ユーザーに対して同じ記事を表示することが前提となっているDBだからです。こうしたシステムが引き起こす問題点として、以下が挙げられます。

  • ユーザーをコントロール群・テスト群に分けてA/Bテストを実施できない
    • 大幅な性能改善の場合は、A/Bテストせずとも一定期間を比較することにより効果があることを示すことができる場合もありますが、今後細かいPDCAサイクルを回していく上でA/Bテストできることは重要だと考えらる
  • パーソナライズができない
    • ユーザー属性ごとの記事の出し分けや、さらに進んだパーソナライズアルゴリズムなども、現状のシステムでは実現できない

そこで、Step2では既存の記事管理DBを経由せずに、m3.comが直接記事推薦システムを参照できるよう、記事推薦システムがAPIを提供するシステムを考えます。具体的にシステム構成を図にすると下記のようになります。

f:id:tepppei:20200928134056p:plain
Step2で実現するシステム

記事管理APIが障害により停止した場合に備えて、Step1で作った部分も活用している点も特筆に値します。このシステムの構築にはm3.comを表示する部分の改修も必要になるため、Step1に比べて大きな工数が必要になりますが、すでにStep1で大きな利益が見込まれているので問題になりません。

このシステムを用いて、A/Bテストにより記事推薦システムの最終的な効果を検証したところ、年間利益貢献額にして1億円規模の貢献額*5であることを明らかにできました。

次なるステップ

ここまで来れば、任意のユーザーに対して任意の記事を推薦することがシステム上可能になったため、あとはA/Bテストを繰り返して記事推薦システムのアルゴリズムを改善していくのみです。具体的な改善余地として、

  • あるユーザーが一度読んだ記事は次から表示しないようにする処理
  • あるユーザーに何度か表示しても反応がなかった記事を表示しないようにする処理
  • 推薦アルゴリズムを用いたパーソナライズ

をはじめとして、数多くの案があります。機械学習が活躍しそうな施策も多いです。

まとめ

この記事では、段階的に見込み利益を見積もりながら、リスクを抑えつつ少しずつゴールに近づけていく開発の事例をご紹介しました。今回は運良く上手くいった事例でしたが、仮に途中の段階で仮説と異なる結果が出た場合は、いつでも撤退して施策を練り直すことを視野に入れていました。

We are hiring!

ここまでの語り口では全てを私一人で成し遂げたように聞こえると思いますが、実際には特にビジネス担当の青山さん・AIチームリーダーの笹川さん・編集部のみなさんをはじめとする多くの方々と協力して進めていきました。こうした協力のもと、私のような若手でも総合力の問われるインパクトの大きいプロジェクトを主導させてもらえるのは、少人数で多くのサービスをサポートするエムスリーならではだと思います。若手の方々も是非ご応募ください!

エンジニアリンググループ 募集一覧

jobs.m3.com

*1:一部、RPAによる自動化が入っています

*2:「経験と勘」とは言っても、編集部の目利き力は凄まじく、高確率で人気記事を言い当てることができていたことがのちのA/Bテストで分かりました。このあたりの検証も近々記事にしたいです。

*3:と、口で言うのは簡単ですが、実際に決断して実行に移すのは容易ではありません。本件はビジネス側主担当の青山さんが体を張って運用してくださいました。プロジェクトを前に進めていくためなら泥臭い方法をも厭わない姿勢を見習っていきたいです。

*4:システムを検討するにあたり、AIチーム リーダー笹川さんから多くのアドバイスをもらいました

*5:効果検証の具体的な方法についてはこの記事で触れることができませんでしたが、今後別の記事にしていきたいです。