とにかく僕は実績がほしかったんだ
素人ながらも、なんとなく勉強し、ちょっとしたアプリを作ってると自信がでてくる。
なので世でも力になれるかと思ったら、そうじゃない。
私には実績がなかった。
とにかく実績がほしかった。
そんなときに見つけたアプリコンテスト
そんなときに**Salesforce AI アプリコンテスト 2018**なるものを見つけた。
ちょうど機械学習を勉強していたし、Salesforceはなかなかのネームバリューだし、賞金100万円だし、
アイデアはなかったが、応募してみた。
開発の日々
- アイデアを提出して、Salesforceの方がGoogleHangoutsでいろいろ相談してくれたり、
- 仕事くそ忙しくて睡眠時間削ってコード書いたり、
- 提出期限直前、本番デプロイして、バグ見つけて、仕事中まじ焦ったり、、
ほんとこのときは、本気で100万+優勝の肩書めざして頑張って、楽しい時間だった。。。
最終的に下記のような機能のアプリを提出した。
- Gmailから上司のメールを取得
- 取得したメールを「danger」と「safe」にラベリングし学習
- 学習後はそのモデルを用いて、いつでも上司からのdangerと予測されるメールをslackに通知できる
というアプリだ。
この時は、本当に1位取れるんじゃないかとおもっていた。。
結果
ファイナリスト発表は2018/5/25(金)だけど何時ころに通知されるかは不明。
仕事中、メールばっかみてた。
そしてメールが来た。
この中に自分の作品はなかった。
たしかにファイナリストの作品は、自分のより楽しそうで、使ってみたくて、夢がある。
私は負けたのだ。
ぎりぎりじゃなく、圧倒的に負けた。
賞金でMacbookProとiphoneとダイソンコードレス掃除機を買おうと決めていたが、
とりあえず、この日の夜は同僚と立ち飲み居酒屋に行って、現実逃避し、眠りについた。。。
予選落ち確定の翌朝(つまり執筆している今日)思ったこと
落ちたけど、無理やり有意義なものにしないといけない。
今後もコンテストに参加したいからだ。
そのため、このコンテストの過程で得たものを公開する。
得たものその1 WEBサービスは見せ方が異常に大事
おそらく、私のアプリは技術的にはファイナリストたちと大差はない。(と信じたい)
大きな差があるのは見せ方。
- タイトルで引き付けられる
- タイトルでなんとなくアプリのイメージが沸く
- そもそもアプリの操作が簡単
一方、私の作品は、
- タイトルからどんなアプリか想像しにくい
- 初期設定が若干面倒(slackのwebhookURLを入力とかは特に面倒)
- AIのパーソナライズ機能を実装したが、学習に1時間かかったりする
私のアプリを改善するとしたら、
- 多少精度は犠牲にし、AIモデルはこちらで準備
- 「メールで職場のストレスチェック!」みたいな感じで、一般的な指標(こちらで準備したモデル)でストレス度を測れる
みたいな感じにすれば、上位に食い込めたかもしれない。。
(てか、これやってやろうかなとちっと今思った)
得たものその2 AIサービスって使うの結構カンタン
今回のコンテストはEinsteinという「SalesForceが開発したAI」を利用してアプリを作るというものだった。
なんかAIというと頭いいひとが使うイメージだったが、
- 学習データをcsvにして、curlでpostする
- するとレスポンスで数字が帰ってくる。データを学習したモデルを識別する番号だ。
- このモデル番号と判別したいデータを、curlでpostする
- 結果が返ってくる
ほんとこれだけなのである。
curlの先にあるAPIサーバを作るのは激しく難しいだろうが、使うだけであればカンタンだ。
コンテストの過程でIBMのAIであるWatsonも検証したが、これも簡単だった。
つまり、AIサービスは思っていた以上に簡単に使える、
つまり、AIサービスを提供できる側になると、かっこいい。
得たものその3 コンテストは最高級にテンションがあがる
アプリコンテストは初参加だった。
そして、期間中、モチベーションの高さが異常であった。
いままではなんか勉強とか、会社で使えそうなツールつくるとか、
大したドキドキもなかった。
でもコンテストはやばい。
- 高額の賞金、お金を使うときの妄想
- 迫りくる締め切り期限
- グランプリを取ったときのインタビューの妄想
- 仕事との両立で、睡眠効率の最大化、目ギンギン
- 提出ボタンを押すときの1クリックにかかる重み
最高だった。また参加する。ぜったい。
得たものその4 Herokuのタイムアウトを非同期処理で解決
AIサービスの利用窓口となるEinsteinへのリクエスト機能の実装はカンタンだった。
ちなみにこのサイトを多用した。
curl-to-ruby
しかしAIはが学習したりするので処理に時間がかかる。
基盤としてHerokuを使うことにしていたが、本番デプロイ時、Herokuがタイムアウト。
コントローラにこんな感じの処理がかいてあったため、routingに時間がかかりすぎたためである。
def new
sleep(300) # ←これは時間のかかる処理をsleepメソッドで表現しています
redirect_to root_path
end
解決策は時間がかかる処理を非同期で実装すること。
railsで制作していたのでdelayed_job_active_recordというGEMを使って実装した。
チュートリアルに沿っていけば難なく実装できるが、以下のポイントは注意が必要。
- Windows環境で作成していると、'bin/delayed_job'に実行権限が付与されないケースがある。
- 非同期JOBの中にredirect処理は組み込めない
- JOB失敗時のエラー検知
これらに注意すれば、時間のかかるAI処理でもUXを損なわずに実装できる。
さいごに
まだ悲しさが残っているし、
まだ脱力感はぬぐえない。
素人なりにも、久々に頑張ったからだ。
いろいろと思ったことを書いたが、やっぱり技術的成長よりマインド的成長の方が大きかった。(はず)
悲しみの最中、この記事をかいたが、すっきりしてきた。(と思いたい)
やるべきことは、またなんか考えて作っていくことだと思う!
補足
技術的にはGmailAPI実装が激むずだったので、それも追って分かりやすく記事書きます。