🙇‍♂️

Difyで始めるダイエット【第1話】

2024/10/24に公開

はじめに

こんにちは!
突然ですがみなさん、自炊、してますか?
毎日の献立を考えることは多くの家庭で頭を悩ませる問題です。私の家では、最近は野菜、きのこ類、豆腐を切って全てお鍋に突っ込んで、気分で味付けしたものを自炊と称していただいています。
でも、やっぱり毎日これだと飽きる!焼き魚が食べたい!(個人的な意見)となることが多いのが我が家の現状です。
今回の記事ではDifyとOpenAI APIを活用することで、時間を節約しながら健康的でバラエティに富んだメニューを生成し、そんでもって減量もできてしまう魔法(誇大広告)のツールを作るのが目標です。

使用するもの

  • Dify: ノーコードのLLMツールで、複雑な作業をシンプルなワークフローとして構築できます。
  • OpenAI API : OpenAIのGPTをAPIで呼び出します。今回はGPT-4oを使用しています。

ワークフローの作成

指定できる変数

今回は以下の入力をもとに献立を作成するワークフローを作ってみます。指定できる変数群は以下のようにしてみました。

  • meal_plan_days: 献立を作成する日数。1週間分の食材を一気に買いだめしたかったりするので、この機能があると便利かなと思いました。
  • food_preference: 食材や料理の嗜好。
  • food_restrictions: アレルギーや食べられない食材の指定。因みに私はクリーム、チーズ系が基本食べられません。
  • target_calories: 1食あたりの目標カロリー。ダイエット中の方(私も!)に特に役立ちます。

ということで、以下のように入力変数を開始ノードに定義します。これらの入力変数を開始ノードで定義し、ワークフロー全体で使用します。

実装例

以下は、具体的なノードの定義例です。

LLMノード

LLMを使って献立を作成します。先ほど定義した変数をプロンプトに組み込み、多様な料理を生成します。温度は高めに設定しており、バリエーション豊かな献立を期待してみます。

LLMに渡したプロンプト
<instructions>
今週の夜ご飯の献立を作成するにあたって、以下の手順に従ってください。

1. 献立を考える:多様な料理を期待します。
2. カロリー制限を守る:1食あたり{{#1728734606520.target_calories#}}kcal程度で作成します。カロリー計算を行います。食材のカロリーを調べ、適切な分量を調整してください。その食事で指定されたkcalになるように作成してください。
3. 栄養バランスを考える: 必要な栄養素を摂取できるよう、バランスの良い献立を作成します。炭水化物、タンパク質、脂質、ビタミン、ミネラルなどを考慮し、様々な食材を使用しましょう。主食、主菜、副菜を組み合わせ、偏りのない献立を目指します。
4. 具体的なレシピを提示する:材料を具体的に記述します。分量は人数分ではなく、1人分を想定してください。
5. **カロリーを明記する:** 各献立のカロリーを明記してください。
6. **XMLタグを使用しない:** 出力にはXMLタグを含めないでください。


予測日数は{{#1728734606520.meal_plan_days#}}です。
好きな食べ物は{{#1728734606520.food_preferences#}}です。
除外食材は{{#1728734606520.food_restrictions#}}です。

</instructions>

<example>
入力:なし

出力:

i日目:鮭の塩焼き(250kcal)、ほうれん草のおひたし(50kcal)、豆腐とわかめの味噌汁(100kcal)、ご飯100g(150kcal) 合計:550kcal

材料:生鮭一切れ、塩少々、ほうれん草1束、だし汁、醤油、みりん、豆腐1/2丁、乾燥わかめ適量、味噌、ご飯100g

i+1日目:鶏むね肉のソリル焼き(200kcal)、グリーンサラダ(100kcal)、きのこのスープ(100kcal)、ご飯100g(150kcal) 合計:550kcal

材料:鶏むね肉1枚、塩、こしょう、オリーブオイル、レタス、きゅうり、トマト、ドレッシング、きのこ類、コンソメ、ご飯100g

LLM2ノード

前段のLLMの出力を纏めるようにもう一段LLMを追加し、1人分の食材とその分量、カロリーを計算して表示します。

以下が渡しているプロンプトになります。

LLM2に渡したプロンプト
<instructions>
与えられた献立名は1人分です。そこから、1人分の料理を作るための食材を列挙してください。グラム数や、個数も全て合算し、明確な単位を付けてください。どの献立にどれだけの量を使うのかも明記してください。kcalは1人分を計算し、表示してください。出力にxmlタグを含めないでください。

手順:
1. 献立を一つずつ確認します。
2. 各献立に必要な食材とその分量(グラム、個数など単位を明記)を1人分洗い出します。
3. 1人分の食材量を計算します。
4. 各献立の1人分のkcalを計算します。
5. 全ての献立について、上記1〜4を繰り返します。
6. 最終的に、各献立名と1人分のkcal、そしてその献立に必要な1人分の食材一覧を分かりやすく出力します。

献立情報は{{#1728734610572.text#}}

出力形式は以下の例を参考にしてください。献立名、kcal、食材名は適宜変更してください。

</instructions>

<example>
入力:
1日目:鶏むね肉のグリル(200kcal)、ブロッコリーの蒸し物(50kcal)、トマトときゅうりのサラダ(100kcal)、ご飯100g(150kcal) 合計:500kcal\n\n材料:鶏むね肉150g、塩、こしょう、オリーブオイル少々、ブロッコリー1/2株、トマト1個、きゅうり1本、レモン汁少々、ご飯100g

出力:

1日目

鶏むね肉のグリル: 200kcal
- 鶏むね肉: 150g
- 塩: 少々
- こしょう: 少々
- オリーブオイル: 少々

ブロッコリーの蒸し物: 50kcal
- ブロッコリー: 約100g

トマトときゅうりのサラダ: 100kcal
- トマト: 1個 (約150g)
- きゅうり: 1本 (約100g)
- レモン汁: 少々

ご飯(白米): 150kcal
- ご飯(白米): 100g

味噌汁: 50kcal
- 味噌: 30g
- 豆腐: 1/2丁
- わかめ: 5g
- だし汁: 400ml

</example>

終了ノード

最終的にLLM2が吐き出した出力を受け取って、テキストで表示するようにしてます。

出力結果

実行画面はこんな感じになりました。

簡単な動作確認として、3日分の献立を600kcalを目安に作ってもらいます。
栄養価とカロリー計算の精度はどうなんですかね。気が向いたときに追記しようと思います。

出力結果

1日目

鶏の照り焼き: 300kcal

  • 鶏もも肉: 1枚 (約200g)
  • 醤油: 大さじ1
  • みりん: 大さじ1
  • 砂糖: 小さじ1

キャベツの千切りサラダ: 50kcal

  • キャベツ: 1/4個 (約200g)
  • 人参: 少々 (約10g)
  • ごまドレッシング: 大さじ1

わかめと豆腐の味噌汁: 100kcal

  • 乾燥わかめ: 適量 (約5g)
  • 豆腐: 1/2丁 (約150g)
  • 味噌: 大さじ1
  • 水: 400ml

ご飯(白米): 150kcal

  • ご飯(白米): 100g

2日目

サバの味噌煮: 250kcal

  • サバ切り身: 1切れ (約100g)
  • 味噌: 大さじ1
  • 砂糖: 小さじ1
  • 生姜: 少々 (約5g)

ほうれん草のおひたし: 50kcal

  • ほうれん草: 1束 (約100g)

大根と人参の味噌汁: 100kcal

  • 大根: 約5cm (約50g)
  • 人参: 約1/3本 (約30g)
  • 味噌: 大さじ1
  • だし汁: 400ml

ご飯(白米): 150kcal

  • ご飯(白米):100g

3日目

豚しゃぶサラダ: 300kcal

  • 豚薄切り肉:80g
  • 水菜:適量(約50g)
  • 大根おろし:少々(約20g)
  • ごまポン酢ドレッシング:大さじ2

ひじき煮:50kcal

  • 乾燥ひじき:適量(約10g)
  • 人参:少々(約20g)

お麩とねぎの味噌汁:100kcal

  • お麩:数個(約10g)
  • 小ねぎ:適量(約10g)
  • 味噌:大さじ1.5

ご飯(白米):150kcal

  • ご飯(白米):100g

まとめ

Difyで献立をつくってもらうワークフローを組んでみました。コードも書かずに簡単に動くものを作れちゃうので、あらためてすごい時代になったんだなあ、と思いました。
栄養価の集計や、冷蔵庫の食材リストから買い足す必要があるものをサジェストする機能とか、欲しいですね。いつかやってみようと思います。また第2話目で会いましょう。

みんな、ダイエットしようぜ!

Goals Tech Blog

Discussion