TL; DL
Optunaハンドドリップ・コーヒー抽出のパラメータ最適化(Human in the Cofee Loop)をSlackBotとGoogleFormで回していたが、Flutter/Firebaseのプロジェクトを作りスマホアプリにした。
以下の記事の続きである。
moblog.hatenablog.jp moblog.hatenablog.jp
やりたいこと
アプリの要件(Android)
- コーヒーレシピのリクエスト、表示、評価を行う。
- 蓄積したレシピのデータによってコーヒー豆ごとにおいしいレシピを提案する。
デモ
とりあえず出来上がっているものの、雑なデモ(2023/11/22: タッチした場所が描画されておらず、わかり難いため動画を差替え)。
システム概要・要素技術
システム構成要素
- サーバー(自家製):レシピのリクエストに応じてOptunaによるパラメータチューニングを行うAPIを提供 (過去の評価データやらはクライアント側がAPIで送信するので、サーバは問い合わせない)
- データベース(Firebase):生成されたレシピや、ユーザーが評価したスコアを保存
- ヒト:Optuna君に従いコーヒーを作り続ける。レシピに忠実にコーヒーをドリップして評価する。
要素技術 (package等)
- Python: ローカルサーバ上でAPIを提供する
optuna
: レシピを探索するFlask
: サーバーとしてリクエストを受け付けるvenv
,dotenv
: 仮想環境管理
- Google Cloud Platform (GCL):
- Firebase: データベースの操作APIを提供してくれる
ngrok
: レシピリクエストAPIを提供するLocalhostのFlaskサーバをトネリングして公開する
レシピリクエストAPIの実装 (Coding)
動作は単純で以下を担当する。
- JSONでレシピとその評価を受け取る
- JSON→pandas.DataFrameの レシピ数 x (パラメータ+評価) の表に成形、
- OptunaにAsk-and-Tellして新しいレシピを生成、
- 生成したレシピをJSON形式にして送り返す。
Ask-and-Tellの内容は前回のSlackBotに示しているものとほぼ変わらないため(はず)、そちらを参照: Optunaを用いたコーヒーのハンドドリップ最適化のSlackBot (Human in the Coffee Loop) - MOB-LOG
リクエストのJSONに過去のレシピとその評価が含まれているので、API側ではFirebaseにデータを問い合わせたりはしない。
サーバー起動+リクエスト待ち
SlackBotの際と同じく、venv環境でpythonをnohupで起動してバックグラウンドで実行する。
そして、FlaskサーバがLocalhostで適当なポートで起動するので(指定もできる)、ngrokでトネリングしてもらう(実際はこちらもnohup)。
$ ngrok http 5000 &
Flutter/Firebase
コードが膨大なので特に詳細は載せないが、用意した画面は以下の通り。
- ログイン画面(+ユーザ登録)
- レシピのデータテーブル:
- データベース中のユーザのレシピが、パラメータと評価が表示される(豆ごとにグループ分け)。
- レシピの評価、新しいレシピのリクエスト、豆管理画面に遷移できる。
- 新しいレシピのリクエスト:
- 指定した豆のレシピをAPIに問い合わせる(過去のレシピのパラメータと評価も一緒に送る)。
- ユーザーは返ってきたレシピをRetake/Acceptできる。→Retakeの場合はもう一度レシピを問い合わせ、Acceptであればデータベースに登録。
- レシピの評価画面:
- レシピに関して、7段階でうま味、酸味、苦味、香り、えぐみと、メモ(テキスト)を記録する。
- レシピの詳細画面:
- 特定のレシピの全データを雑に表示する。
TODO, ほしい機能, 欠点
SlackBotの頃からいろいろ改善したが、いまだ多くの欠点が残る。
システム面
- 井崎式にしか対応していない (TODO: 他のレシピ, eg. 他のハンドドリップの流派、フレンチプレスとかに対応させる)
- 特に現状は注ぎ量400g固定なので(およそ2杯分)、せめて 200g/400g/600gくらいの選択肢があった方がいい(条件によってレシピの評価が変わるのかなどは実験したい)
レシピ通りに作るのが難しい(RinseやSpinningを忘れる)
- テキストベースのレシピではなく、図や動画のようなものを提示したい
- それでも当然間違えることはあるので、
- ユーザーが任意にレシピを修正する機能
- 動画を撮影して実際に入れた際のパラメータを抽出して、提案レシピと大きく乖離していれば新しいレシピとして登録する、
など
ページの遷移が若干適当なので(特に豆追加・管理の画面への導線が不適切)、要改善
- レシピの評価の統計とパラメータの関係の可視化
- 個人的には気になるけど、ユーザには必要か?と感じるので後回し
最適化面
- 個人の嗜好に最適化される (万人の好みではない、体調や気分に依存。特に人工甘味料入り飲料やら辛い物を食べたらコーヒーの味がわからなくなることを実感している)。
- 初めの数回はランダムサーチ (t=10に設定しているが多いかもなのでt=5くらいでいい?←実験的にやってみるべき)。
アプリの公開(現状未公開)
現状身内間でのα版状態(クローズドで未実装機能が多々あり)。もう少し時間はかかるが、年内に公開できればうれしい(2023年)。
と思っているけど、こういうのを書いててもっとあの機能必要だな、実装したいなというのが湧いてきて遠ざかっていく(ユーザーフィードバック画面とかレシピのお気に入り機能とか)。
おわりに
早く公開できるくらいの機能を揃えたい(Minimumなプロダクトをとりあえず作ろうと思っても、細かいバグやらレイアウトの調整やらに気を取られてしまう)。
そしておいしいコーヒーが出てくるので、個人的に現状で満足してしまっている。フィンランドでも様々なパックが売られているので(安くて旨い)、いろいろな豆ブランドで試してみたい。浅煎りでえぐみも出やすい NewYork (Paulig)でもおいしいものが出てきた感動した。個人営業(?)の焙煎ショップの高い豆も試してみたい(ただでさえおいしいのに、最適化したらどうなちゃうの?)。