俺、サービス売って家買うんだ

Swift, Kotlin, Vue.js, 統計, GCP / このペースで作ってればいつか2-3億で売れるのがポっと出来るんじゃなかろうか

Facebookボットを作った話

f:id:ie-kau:20160612005759p:plain:w400


さてさて、このブログでちょくちょく記事を書いていたので、購読されている方は知ってると思うのですが、GWから密かにFacebook Messenger Platformを利用してBotを作っていました。

実はGW明けにはほぼ出来上がっていたのですが、Facebook側のレビューがなかなか通らず、こうしてブログで紹介するまでに結局1ヶ月かかってしまいました。

もくじ

  1. 作ったもの
  2. 企画ポイント
  3. アーキテクチャ
  4. Botを作ってみた振り返り
  5. レビューとの戦い
  6. まとめ

1. 作ったもの

作ったBotは、その名も

AI執事 アルフレッド
f:id:ie-kau:20160612011719p:plain:w300

アルフレッドの紹介

ロボ執事 :アルフレッド(純日本人)

アルフレッドは、元ファッションデザイナーの男性。年齢は不詳だが確実に20代ではない30後半〜60後半くらいまで見える不思議な存在。

ファッションデザイナー時代はパリに住んでいて、かなり有名だったが、ある時を境に一切服を作らなくなり、現在はその経験を活かして執事をしている。

執事で、いい年齢なのに発言は軽めで、何故かタメ語を使ってくる。選んでいるものや着ているものにはかなりのこだわりがあり、表面的なデザインだけでなく、人のぬくもりや使い勝手、長く使えるものを重視している。「品格と教養は必要。 でも、精神はガキのままでいた方がいい。」なんて名言も。

耳がちょっと悪い。趣味は陶芸というがめっちゃ下手くそ(やっているのもみたことがない)。恐らくモテるだろうが、あまり女性の影は見えず、そこがリリー・フランキーとの違い。

ロボだから持っているデータ量には凄いものがあるが、その反面「ぬくもり」を重視す流刑項もあるため、ロジカルには少し弱い。作られて長いこと立つため、ネジやつぎはぎに多少無理が来ているが、本人はそれも味だと思っている。

85%人間, 15%ロボといったところで、ぱっと見では人間に見えなくもない。好きな映画はベイマックスと007。

このBotはどういう課題を解決してくれるのか?

このBotは、Botらしく私生活において僕達の判断を助けてくれるものになっています。

僕自身、年を経るに連れて交友関係が広がったり親兄弟も新しいライフステージに突入して、様々な祝い事が発生するのでその度にプレゼント選んで渡す機会が増えています。

直近で言うと、GWに弟の結婚式があったので何かしら結婚祝いを考える必要がありました。
しかし、如何せんイケてるプレゼントを考えるような人生を送ってきてない結果か、圧倒的にプレゼント選びのセンスがありません。そのため、何を渡すべきか、それをどこで買うべきか等調べるのにとても時間がかかってしまいます。

その時間をぐっと圧縮してくれるのがこのBot です。
つまるところ、

「人付き合いは大切だと知っている」、「しかし、記念日などのプレゼント選びが面倒」そんな人の代わりに、イケてるプレゼントを選んでくれる

それがアルフレッドです。
使い方はいたってシンプルで、Facebook Messengerごしに、

  • プレゼントの目的
  • プレゼント対象の人と自分との関係
  • プレゼント対象の人の性別 ※任意
  • プレゼント対象の人の年齢 ※任意

をアルフレッドに伝えるだけです。

一例
f:id:ie-kau:20160612013324p:plain

企画ポイント

今回のプロダクトの肝となる部分は、やはりプレゼントの商品です。
実はこの冬にアルフレッドのプロトタイプのプロトタイプになるBotを僕らが普段利用しているSlack上に作っていました。
その時は、商品データをショッピングサイトで検索して適当に拾ってきてDBに登録したり、キュレーションメディアからスクレイピングして登録していました。しかしながらどうしても、面白みが無かったり、プレゼント目的や、相手の性別にそぐったプレゼントを提示できるようなしろもにはなりませんでした。

というわけで今回は、

  • クラウドワークスを利用してGoogle Form経由でプレゼントを集める

という手法をとりました。 これに僕らの思いもよらないプレゼント情報を、ある程度正規化された状態で収集することができました。 ※当然、変なものがないか目を通していますがw

Google Formはこんな感じ
f:id:ie-kau:20160612014704p:plain:w400

アーキテクチャ

せっかく技術ブログなのでざっくりですが、全体のアーキテクチャを紹介します。

f:id:ie-kau:20160612020832p:plain

値段は今のところ

Hobby Dyno $7.00 / m
Heroku Postgres :: Database free
Redis To Go free
Heroku Schedule free

というところですね。
Heroku Postgresに「別の商品」を探せる機能用に検索条件をセッション毎に保存しているのですが、Hobbyプランだと10000レコードしか保存できないので今のところ夜間バッチでパージするようにしています。(暇だったらログ基盤も作ってみたところ)

Botを作ってみた振り返り

この手のBotを作ったのは僕も一緒に実装しているhayato君も初めてだったので、GW中だけではありますが何度も作りなおしています。

日程

日程はこんな具合になりました。

f:id:ie-kau:20160629101648p:plain

GW前半で作ったもの

元の実装

  • すべてのユーザー入力は自由入力
  • 細分化されたプレゼントの目的
    • 結婚, 誕生日, 昇進祝い, 記念日, 出産, クリスマス, 銀婚式

この状態で、最初にユーザーレビューをしてもらいました。

GW中盤のユーザーレビュー

以下、何人かに遊んでもらった結果、大きく出てきた問題はこんなところです。

  1. 最初にアルフレッドと会話が始まった際に何を言っていいかわからない
  2. 目的が細分化されすぎていて、提示されるプレゼントのパターンが少ない

GW後半の作り直し分

というわけでGW後半はその作り直しとUX向上に力を入れました。

1. 最初にアルフレッドと会話が始まった際に何を言っていいかわからない問題

siriみたいにめっちゃ頭がいいAIじゃないので、自由入力だと下記画像みたいなやり取りは避けられません。

f:id:ie-kau:20160612015639p:plain

この問題に対応するため、会話の始まりにプレゼントの目的を聞く選択肢を提示することで会話の流れを絞ることにしました。
最初にでる質問ですね。

f:id:ie-kau:20160612015801p:plain

こうすることで、目的 → 関係 → 性別 → 年齢とスムーズに質問をつなげていくことが可能になりました。

2. 目的が細分化されすぎていて、提示されるプレゼントのパターンが少ない

プレゼントの内容を決定する条件の優先順位を以下の様に決めていたので、ある目的を条件とした時に他の目的の条件に合致するプレゼントを提示するということは許されませんでした。

プレゼントの決定要因の優先順位

目的 > 関係 > 性別 > 年齢

例えば、とある検索条件においてプレゼントが見つからなかった場合の対応として、上記の優先順位の場合の仕様は

  • 「結婚」のプレゼントで「20歳」向けという商品が見つからなかった時「30歳」向けのプレゼントを提示するのはOK
  • 「結婚」のプレゼントで「20歳」向けという商品が見つからなかった時「誕生日」向けのプレゼントを提示するのはNG

となります。それ故に目的が細分化されすぎるとその条件に紐づくプレゼントの数が減ってしまい、加えて他の条件もあったりするのでどんどん提示できる商品が少なくなり、商品が見つからない状態や、何度検索しても同じ商品が出てしまうというつまらない状態になってしまいました。

この問題に関しては、議論を重ねたり何度も条件を変えて試した結果、今の3種類に落ち着いています。

結婚, 誕生日, 昇進祝い, 記念日, 出産, クリスマス, 銀婚式

記念日(誕生日など)、結婚祝い、出産祝い

考えてみると、記念日が複数あれど特殊なもの上げる必要があるのって、「母の日のカーネーションぐらいじゃない?」みたいな会話が出たような記憶があります。

また、この時に条件を書き換えまくってバグだらけになったのでその対応策の副産物が以前のテストの記事になります。

mocha + should.jsでNode.jsのテストを書く - 俺、サービス売って家買うんだ

レビューとの戦い

申請には、Screencast(動画)、Botの説明などが必要になります。

developers.facebook.com

作成したScreencast

youtu.be

ってなわけで、項目を埋めて申請していたのですがだいたい1週間半かかるレビューに何度も落とされてしまいリリースが6月半ばになってしまいました。せっかくなので、レビューに落ちた理由を幾つか上げておきます。

  1. 微妙にバグを踏まれる

セッション周りにバグがあり会話がスムーズにならず「関係」を入力したのに再度「関係」を聞かれるバグを踏まれてしまいました。
二度目の入力でプレゼント情報は返せていたもの、レビュアーの入力に対して有用な情報が返ってこないということで落とされてしまいました。

リジェクトメッセージ
f:id:ie-kau:20160612010913p:plain

  1. 説明不足

Botのレビューを受ける際には以下の項目を入れる必要があります。
2度目の申請では割りと丁寧な説明を英語で入れたはずなのに、再度説明してという理由でリジェクトされてしまいました。

Describe how you're using the Send/Receive API (pages_messaging) to communicate with people. Please include all expected use cases.

リジェクトメッセージ
f:id:ie-kau:20160612010919p:plain

で3回目に日本語で会話の流れを書いて送信したところ無事に受理されました。 出たばかりの機能ということもあり今後もレビューの厳しさや流れはもうしばらくは変化し続けそうですね。

まとめ

レビューはレビューで面倒だったのですが、結局のところBotの使い勝手をあげるところが一番大変でした。

Aを聞いたらBをしてくれるような一問一答のBotと異なり、一連の会話の流れを持っているBotになってくるとユーザーにその流れに乗ってもらう様につくるところが一苦労でした。(未だに意図的ではなく予想外の入力をされてしまいますが。)

作ってるだけだとその使い勝手やユーザーがどういう入力をするかが絶対にわからないので、そこそこできたところで使ってもらうことが一番ですね。今回も、途中で見ていただいた人にはホント感謝です。

あ、あと負け惜しみなんですがホントは日本で一番最初にFacebook Messenger Platformを使ってBotをリリースしてやろうと思ったんですが、負けちゃいましたね。
実はめっちゃ悔しいです 笑

結局、弟の結婚式のプレゼントは?

※再現

f:id:ie-kau:20160612011001p:plain

ルンバは高いのでやめました。