MOB-LOG

モブおじの記録 (Programming, 統計・機械学習)

コーヒードリップレシピのパラメータ最適化 Human in the Coffee Loop (HitCL) モバイルアプリ(開発中)

TL; DL

Optunaハンドドリップ・コーヒー抽出のパラメータ最適化(Human in the Cofee Loop)をSlackBotとGoogleFormで回していたが、Flutter/Firebaseのプロジェクトを作りスマホアプリにした。

以下の記事の続きである。

moblog.hatenablog.jp moblog.hatenablog.jp

やりたいこと

アプリの要件(Android

  • コーヒーレシピのリクエスト、表示、評価を行う。
  • 蓄積したレシピのデータによってコーヒー豆ごとにおいしいレシピを提案する。

デモ

とりあえず出来上がっているものの、雑なデモ(2023/11/22: タッチした場所が描画されておらず、わかり難いため動画を差替え)。

システム概要・要素技術

モバイルアプリのシステム構成:コーヒードリップレシピのパラメータ最適化(HitCL)

システム構成要素

  • サーバー(自家製):レシピのリクエストに応じてOptunaによるパラメータチューニングを行うAPIを提供 (過去の評価データやらはクライアント側がAPIで送信するので、サーバは問い合わせない)
  • データベース(Firebase):生成されたレシピや、ユーザーが評価したスコアを保存
  • ヒト:Optuna君に従いコーヒーを作り続ける。レシピに忠実にコーヒーをドリップして評価する。

要素技術 (package等)

  • Python: ローカルサーバ上でAPIを提供する
    • optuna: レシピを探索する
    • Flask: サーバーとしてリクエストを受け付ける
    • venv, dotenv: 仮想環境管理
  • Google Cloud Platform (GCL):
    • Firebase: データベースの操作APIを提供してくれる
  • ngrok: レシピリクエスAPIを提供するLocalhostのFlaskサーバをトネリングして公開する

レシピリクエスAPIの実装 (Coding)

動作は単純で以下を担当する。

  1. JSONでレシピとその評価を受け取る
  2. JSON→pandas.DataFrameの レシピ数 x (パラメータ+評価) の表に成形、
  3. OptunaにAsk-and-Tellして新しいレシピを生成、
  4. 生成したレシピを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)でもおいしいものが出てきた感動した。個人営業(?)の焙煎ショップの高い豆も試してみたい(ただでさえおいしいのに、最適化したらどうなちゃうの?)。