Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

プロジェクトTakumi 〜レコメンデーション設定への挑戦者たち〜

327 views

Published on

Pycon mini Osakaの発表資料です。
2018.05.19

Published in: Software
  • Be the first to comment

  • Be the first to like this

プロジェクトTakumi 〜レコメンデーション設定への挑戦者たち〜

  1. 1. プロジェクトTakumi ∼レコメンデーション設定への挑戦者たち∼ Silver Egg Technology 株式会社 本田裕昭
  2. 2. 自己紹介 本田 裕昭 (ほんだ ひろあき) • シルバエッグ・テクノロジー所属エンジニア • レコメンドエンジンの顧客サイトへの導入・チューニング・運用を主に担当 • Pycon mini Osaka カメラ係
  3. 3. SILVER EGG TECHNOLOGY AI技術を用いたパーソナライゼーションを実現する企業 レコメンデーションエンジンを中心とした製品群を提供 https://www.silveregg.co.jp/
  4. 4. アイジェント・レコメンダーについて SaaS型レコメンドエンジンで国内売上高1位 https://www.silveregg.co.jp/archives/news/1216
  5. 5. アイジェント・レコメンダーについて リアルタイム ● サイトにおけるユーザ行動をリアルタイムに分析、アイテム同士の関連性を計算 (ベイジアン協調フィルタリング) ● 今日追加された商品でも相関に基づいておすすめできる パスディペンデンシー ● 行動履歴に基づいて嗜好に合わせたアイテムをレコメンド レコメンドレシピ ● ページ(レコメンド枠)毎に設定されたレシピに基づいて最適なレコメンドを 提供
  6. 6. レコメンドレシピのイメージ TOP ページ 検索結果 ページ 商品詳細 ページ カート ページ 決済完了 ページ 各ページの特性に合わせてレコメンドをデザイン 「その商品を見た人が 興味を持ちそうな商品」や 「より高価格帯の商品」 をおすすめ 「検索結果に対して 関連性が高い商品」 をおすすめ 「購入された商品の後で 買われる頻度が高い商品」 をおすすめ 「カート内の商品と一緒に 買われる頻度が高い商品」 をおすすめ
  7. 7. レコメンドレシピ設定 - 設定項目1 レコメンドタイプ 相関 - アイテム同士の関連性 ○ BB(閲覧閲覧相関): このアイテムを見た人は、こんなアイテムも見ています ○ OO(同時購買相関): このアイテムを買った人は、こんなアイテムも一緒に買っています ○ BO(閲覧購買相関): このアイテムを見た人は、こんなアイテムを買っています ○ PO(過去購買相関): このアイテムを買った人は、過去にこんなアイテムを買っています ○ CB(カテゴリ閲覧相関): このカテゴリを見た人は、こんなアイテムを見ています ○ KB(キーワード閲覧相関): このキーワードで検索した人は、こんなアイテムを見ています ランキング ○ 閲覧ランキング ○ 購入ランキング Footprint(あしあと)
  8. 8. レコメンドレシピ設定 - 設定項目2 レコメンドのキー 閲覧中アイテム カートに入れられたアイテム 行動履歴 ○ 閲覧履歴 ○ 購入履歴 ○ カート履歴 フィルタリング カテゴリフィルタ 価格フィルタ 行動によるフィルタ ○ 閲覧中 ○ 閲覧済み ○ 購入済み
  9. 9. レコメンドレシピ設定 - 設定項目3 ロジック ● Pythonコードによりエンジンに指示を 出すためのもの ディスプレイ ● 商品情報表示のためのJavaScriptコード その他 ● マーチャント(顧客)コード ● クラスタ トラッキング ● 閲覧 ● カート投入 Backfill ※相関で要求数を満たせない場合の 補填方法
  10. 10. レコメンドレシピ設定 ● 実体はCouch DB上のドキュメント(JSON) ● 1顧客サイトにつき1ドキュメント ● 1つのレコメンド枠に対して1SPEC ● SPEC: レコメンド設定一式をまとめたもの ● 1サイトにつき10∼100個以上のSPECを設定 ● 手で修正できる規模ではないのでPythonスクリプトにより生成(従来方式)
  11. 11. アイジェント・レコメンダー構成 Load Balancer AP Server AP Server CouchDB レコメンドレシピ設定 デプロイ レコメンド要求 エンドユーザ または顧客サイトサーバ シルバーエッグ エンジニア Couch DBから レシピ設定をロードし、 枠に応じたレコメンドを返す
  12. 12. 従来のワークフロー(導入時) 1. 仕様書作成(コンサル) 2. 仕様書レビュー(コンサル+エンジニア) 3. コンフィグ作成(エンジニア主担当) ○ レコメンドレシピ設定のためのPythonスクリプト 4. コンフィグレビュー(エンジニアサブ担当) 5. ステージング反映 6. 顧客側テスト 7. 本番反映 8. 顧客側リリース(利用開始) ※コンサル:営業とエンジニアの中間的な立ち位置で、顧客と直接やりとりして仕様を決める役割の人
  13. 13. 従来方式の問題 1つ1つ手作りのPythonコード ● エンジニアでないといじれない ● 人手中心 ○ ミスを防ぐためのレビュー、ダブルチェックでさらに手間が ○ 導入、チューニングのリードタイムがどうしてもかかる ● マニアックな設定になると1人の人しか理解できない ○ ○○(とある顧客)のコンフィグは○○さんしか触れない
  14. 14. あれ??全然AI企業っぽくない・・・
  15. 15. ビジネス要求 ● 運用開始までの期間をもっと短くしたい ○ トラッキングを早期に開始する方が有利 ● 導入後のPDCAサイクルをもっと早く回したい ○ もっと頻繁にA/Bテストを ○ 顧客サイトの成長に合わせて最適なレコメンドを提供したい → 従来のやり方ではすぐ限界になる
  16. 16. Takumi(匠) レコメンドレシピ生成・管理システム ● 1つ1つスクリプトを書くのではなく、Web画面上で設定できるように ● エンジニアでなくとも設定できるようにする
  17. 17. レシピ入力 システムイメージ Takumi Web Git リポジトリ コンサル エンジニア Couch DB AP Server レコメンダー ステージング環境 Couch DB AP Server レコメンダー 本番環境 レシピをチェックアウト 必要に応じて修正&保存 デプロイ Takumi CLI デプロイ 保存 デプロイ
  18. 18. 詳細画面で指定する項目 • レコメンドタイプ • 要求数(いつく返すか) • カテゴリフィルタ • 価格フィルタ(○○円∼○○円) • レコメンドのキー • 何をキーにするか • 個数 • Backfill(相関で要求数を満たせない場合の補 填) • ランキング(閲覧 or 購入) • 組み込みコードの指定 など
  19. 19. Takumiの技術要素 ● Webアプリ ○ Pyramid + Chameleon + colander + deform + bootstrap ● YAML ○ 機械でハンドリングできる,かつ人間も読み書き可能 ● libgit2, pygit2 ● Jinja2
  20. 20. Web Framework ● Pyramid ○ 採用に特に深い理由なし、強いて言えば社内的に実績があったから ● colander ○ schema定義+validation ● deform ○ colanderでschemaを書くとフォームを自動生成してくれる ● chameleon ○ xml型template engine ○ deformが標準で用意しているwidgetがchameleonなので
  21. 21. libgit2, pygit2 ● libgit2 ○ gitリポジトリを操作するためのAPI(Cによる実装) ○ Bindingsが豊富 ■ https://github.com/libgit2/libgit2#language-bindings ○ Thread Safe & Reentlancy ● pygit2 ○ libgit2のPython binding ○ http://www.pygit2.org/ 変更があれば社内リポジトリにpush 社内リポジトリから1分おきにfetch いちいち作業ファイルを作らずにリポジトリのデータを読み書きできる
  22. 22. pygit2の例1 リポジトリからのファイル取り出し
  23. 23. pygit2の例2 ファイルのコミット
  24. 24. pygit2の例2 ファイルのコミット(実行結果)
  25. 25. 組み込みコード 問題 • プログラムコード(Python, JavaScript)をYAML内に書くのはつらい 解決策 • Jinja2テンプレートで記述してリポジトリに置く • YAMLから名前で参照
  26. 26. 組み込みコードの例 {% custom_logic 'mylogic', '閲覧中・閲覧履歴から計n件除外', ('n',) %} .... xplen = {= n =} spec[Spec.EXCL_PRODS] = prods + browses_list[:xplen] {% end_custom_logic %} mylogic.py.jinja2 merchant: silveregg spec01: ... custom_logic: {name: mylogic, params:{n: 10}} ... config.yml 名前 説明 引数の定義 引数の値に置換される部分
  27. 27. 組み込みコードの指定例 候補から使用したいコードを選択 コードに渡すパラメータを指定
  28. 28. 導入後の変化 ● 非エンジニアでもレシピの作成ができるようになった! ● エンジニアが1からスクリプトを書く必要はなくなった → 工数の縮小 ● Pythonの書き間違いによるミスが激減(なくなったわけではない) ● リードタイムの縮小 ○ 簡単な変更であれば依頼から最短1時間程度で本番反映
  29. 29. Before • 仕様書作成 • 仕様書レビュー • 生成スクリプトの作成 • コードレビュー • ステージング反映 • 顧客側テスト • 本番反映 導入後の変化 - 導入時ワークフロー After • 仕様書作成 • 仕様書レビュー • Takumi入力 • ステージング反映(画面から) • 顧客側テスト • 本番反映 Near Future • Takumi入力 • ステージング反映(画面から) • 顧客側テスト • 本番反映 仕様書も廃止していく予定
  30. 30. 難しかった点、問題 ● レシピの設定項目が膨大→カバーするのが大変 ○ 未だに100%は網羅できていない ○ 使用率の高い項目から対応 ● Takumiで導入した後、未対応の機能を使うことに・・・ ○ そのサイトだけのパッチを当てて当座をしのぐ ○ 旧方式に戻す ● 入力ミスが結構多い ○ 入力後のチェックに稼働を取られる ■ チェック機能の強化(予定) ■ 設定内容を一覧化 → 自分で確認しやすく
  31. 31. まとめ • アイジェントレコメンダーの運用ではレコメンドレシピの設定が必須 • 従来:1つ1つPythonスクリプトで生成 • 今後:Takumi • レシピ作成・管理の省力化 • 非エンジニアでもレシピの作成・修正ができるようになった • 旧方式から順次移行中
  32. 32. まとめ AIというとスマートなイメージだけど 蓋を開けてみると実際の現場は泥臭い作業の連続だったり・・・ ● AIに食わせるデータのメンテナンス ● AIのパラメータチューニング ● AIのインシデント管理 ● AIの・・・ こういった作業こそ自動化していくべき
  33. 33. 共感していただける方はぜひ、仲間になりましょう! シルバーエッグテクノロジー エンジニア募集中! https://www.silveregg.co.jp/recruit/recruit01.html
  34. 34. ご清聴ありがとうございました。

×