1. インスピレーション

アイデアの発想

先日、冷蔵庫を開けると、スーパーの特売日に買った野菜が古くなった状態で残っていて、もったいない気持ちになりました。
「冷蔵庫にある食材を無駄なく使い切りたい」、「毎日メニューを考えるのが大変だ」、「毎週料理がワンパターンで飽きた」という日常の悩みから、このアイデアを思いつきました。
Google CloudのGeminiが提供する生成AI機能を活用し、食材からレシピを自動生成することで、料理のレパートリーを増やし、より手軽に、そして楽しく料理を作れるようなサービスを目指しました。

ターゲットユーザー

  • 自炊中、あるいは、自炊を始める一人暮らしの人
  • 忙しいワーキングマザー(ファザー)
  • 料理初心者の人
  • 毎日の献立を考えるのが大変な主婦・主夫や手軽に料理を楽しみたい人

解決したい課題

  • 今の冷蔵庫の食材を把握し、献立を考えるのは難しい
  • 新しいレシピを探したいが、時間がかかる
  • 料理のレバートリーを増やしたい

2. 学んだこと

技術的な学び

  • Geminiの活用方法
    → Geminiを様々な用途で利用できることを実感しました。ユースケースに応じて適宜、画像認識、テキスト解析、回答文生成の用途で使い分けています。
  • Function Callingの使用方法
    → ユーザーの意図と開発者の意図を上手く融合させられることに驚きました。これまでは特定のテキストによってフローを分岐させていましたが、Function Callingによって、文脈によってフローを選択できるようになったことで、開発効率や柔軟性が大幅に向上しました。
  • Cloud Run Functionsを用いたサーバレス環境でのアプリケーション開発
    → なるべくシンプルなアーキテクチャでやりたいことを実現したかったため、Cloud Run Functionsを利用してアプリケーションを開発しました。コードをデプロイするだけで実行できるため、開発に集中することができました。
  • LINE Messaging APIを用いたチャットボット開発
    → 多くのユーザーにとっての使いやすさを考えた結果、UIにはLINEを活用することにしました。Messaging APIによって、Cloud Run Functionsをはじめとする様々な機能と連携でき、リッチメニューやボタンテンプレートなど細かい機能も活用することで、限られた期間内でもユーザビリティにも配慮することができました。

プロジェクトマネジメント

  • 期間内の開発スケジュール管理
    → チームメンバーは社内のコミュニティで集まった業務もバックグラウンドも異なるメンバーで同期できる時間も限られていましたが、スプリント開発の手法とMiroなどのコミュニケーションツールを活用して非同期で連携することで、限られた期間でプロダクトを作り上げ改善することができました。
  • GitLabを用いたバージョン管理とチームでの共同開発
    → 開発経験のあるメンバー主導でGitLabの使い方からメンバーにレクチャして全員で開発しました。
  • チームメンバーとの連携
    → 毎日メンバーそれぞれの進捗と課題を共有し、その日の作業を決めていきました。それぞれの得意分野を生かす形で役割分担ができ、誰一人欠けてはならないチームだったことに後から気づかされました。

3. アーキテクチャ

システム構成

  • フロントエンド
    • LINE Bot(Messaging API)
  • バックエンド
    • Google Cloud(Cloud Run Functions, Cloud Firestore, Vertex AI Search)
  • AIモデル
    • Gemini 1.5 Flash(画像認識、自然言語処理)

ユースケース

  • ユースケース1:画像を基にレシピを回答

    1. スマートフォンで冷蔵庫の中身や食材の画像を撮り、LINE Botに送信
    2. Gemini の 画像認識により食材を認識
    3. 認識した食材から Vertex AI Searchにより、作れるレシピを検索
    4. レシピ候補の回答
  • ユースケース2:メッセージを基にレシピを回答

    1. 「〇〇と△△を使って料理したい」などのメッセージを送信
    2. Function Callingでユーザーの意図を理解し、食材を抽出
    3. 認識した食材から Vertex AI Searchにより、作れるレシピを検索
    4. レシピ候補の回答
  • ユースケース3:作ったレシピを記憶する

    1. レシピを検索後、検索内容(番号、タイトル、URL)を一時的にFirestoreに保存
    2. ボタンテンプレート(LINEの機能)から採用したレシピをユーザーが選択
    3. 一時的にFirestoreに保存したレシピを参照し、採用したレシピとしてFirestoreに再登録
      (一時的に保存したレシピは削除)
    4. 応答メッセージを回答
  • ユースケース4:過去のレシピを返す

    1. 「過去のレシピを見たい」などのメッセージを送信
    2. Function Callingでユーザーの意図を理解し、過去のレシピ取得用のフローをトリガー
    3. Firestoreに保存された過去のレシピデータから、レシピタイトル、URLなどを取得
    4. 過去レシピを回答

4. 直面した課題と解決策

  • 期間が限られていて、チームビルディングに十分な時間がかけられなかった
    各メンバの調査結果のシェアの時間確保、スキル共有、ブランチ戦略などの開発標準の決めるタイミングの決定など
    →手順メモを残したり、その都度チャット等でコミュニケーションを取ることで解決を図りました。

  • 本業との両立 緊急な仕事の割込みなどで予定通りにいかない
    → みんなの情熱と思いやりでカバー
     毎朝朝会を実施し、時間帯が合わない場合は、チャットで時間差で進捗を同期しました。誰かが課題に直面した場合は、他のメンバーにバトンパスして一人一人ができることをやりました。

  • フロントエンドの調査に思ったより時間がかかったこと
    → みんなの努力でカバー。まずはやってみる!
     よく分からなかったら、とにかく試してみて、ダメならすぐに割り切って色々なことを試行錯誤しながら前進させました。

  • Function Calling のサンプルが少なくて、正しい利用法かどうか不安になった
    → GitHubのソースコードを読み込んだり、第三者のブログなどを参考にして、実際に試して試行錯することで理解を深めました。Function Callingが期待通りのフローを選択してくれないことで苦労しましたが、関数の説明文を修正したり名前を分かりやすくすることで、おおよそ期待通りの動作ができるようになりました。

  • 信頼できるレシピをどのように入手したらよいか困った
    → RAGなしのGeminiの回答はそれっぽいが到底美味しそうな料理が想像できる回答ではなかったため、RAGの構成を検討していました。当初はデータソースにレシピサイトをクローリングして得たデータからベクトルDBを構築しようと目論んでいましたが、データ量が膨大で時間もコストもかかることや、そもそもドメイン認証が必要で権限がないことで困りました。そこで、Vertex AI Searchで都度ユーザーの入力に応じて適切なキーワードで検索してレシピを入手することで諸々の課題を解決できました。

5. 今後の展望

  • 動画での食材入力
    Project Astraのデモ動画で衝撃を受けたように、Gemini Liveを導入してGeminiとインタラクティブなコミュニケーションの中で食材を認識しレシピを提案できるようにしたいです。

  • 健康面を考えたメニューを提案(カロリーなど)
    → 現在はまだ過去のレシピを参照するだけで、過去レシピをレシピ提案に活用できていません。Geminiが、検索時のキーワードを健康面に考慮した形にしたり、過去レシピの傾向と検索結果から健康に配慮したレシピを選定できるように改善したいです。

  • 栄養バランスの分析と可視化
    → 過去レシピを基にレシピに利用されている材料から栄養バランスを数値化し、ユーザーの食生活についてアドバイスをできるようにしたいです。

  • 個人のスキルに合ったレシピを提案(料理の難易度)
    → 疲れた日にはとにかく簡単で時短レシピが重宝されがちですが、時には料理のスキルアップができる少し手の込んだレシピを選びたくなるかもしれません。過去のレシピから、ユーザーのスキルを推定して、スキルアップできるちょっと難易度の高いレシピをユーザーの気分に合わせて提案できるようにしたいです。

Built With

  • cloud-run-functions
  • cloudrunfunctions
  • firestore
  • line-bot(messaging-api)
  • python
  • vertex-ai
  • vertex-ai-gemini-1.5-flash
  • vertex-ai-search
Share this project:

Updates