レシピAI — AI献立提案システム
課題
毎日の献立は、栄養バランス・変化・見た目・実用性を同時に満たす複雑な最適化問題。プロの栄養士が何年もかけて習得するスキルを、毎日の食事作りで求められるのは大変な負担です。
解決策
栄養ベクトルのコサイン類似度によるレシピ検索、LSTMによる時系列献立予測、そしてChatGPT APIによるレシピ簡易化を組み合わせた多角的なMLシステムを構築しました。
成果
約2万件のレシピと栄養データを処理し、栄養的に等価な代替レシピの検索や、飽きの来ない週間献立の予測が可能なパイプラインを実現しました。
![]()
課題:献立は「隠れた最適化問題」
「今日の晩ごはん、何にしよう?」— 毎日の食事を担う人なら誰もが直面する、終わりのない問いです。
プロの栄養士は、栄養バランス・食材の多様性・旬・見た目・調理時間・コストを同時に考慮します。何年もかけて身につけるスキルです。しかし、普通の家庭料理人がこれを毎日求められるのは、本当に消耗します。
このプロジェクトは10年以上前 — 現在のAIブームのはるか以前に、この普遍的な台所の悩みを当時使えるツール(古典的な機械学習)で解決しようとした試みとして始まりました。
アプローチ:3つのML技術で1つの問題を解く
1つのモデルですべてを解決するのではなく、献立問題を3つの部分問題に分解し、それぞれに最適なML技術を適用しました。
| 部分問題 | 技術 | 解決すること |
|---|---|---|
| 「同じ栄養、違う料理」 | コサイン類似度 | 栄養的に等価な代替レシピの発見 |
| 「同じ料理の繰り返しを避ける」 | LSTMニューラルネットワーク | 直近の履歴に基づく多様な献立予測 |
| 「レシピが複雑すぎる」 | ChatGPT API | 本格レシピを平日向けに自動簡略化 |
各アプローチが、他の手法では解決できない部分を担当しています。
データ基盤
システムの基盤は、3つの別々のデータソースを統合した統一データセットです。
| データセット | レコード数 | 内容 |
|---|---|---|
| レシピ | 19,902件 | 料理名、カテゴリ、人数、調理手順 |
| 食材 | 196,126件 | 各レシピに紐づく材料名・分量・単位 |
| 栄養素 | — | レシピごとの栄養成分詳細(カロリー、たんぱく質、ビタミン、ミネラル) |
欠損IDの除去、文字コードの修正、不整合の解消を経て recipe_id で結合。最終的なマスターデータセットは19,312件のレシピ(22カラム)となり、各レシピがメタデータ・食材リスト・13種類以上の栄養素情報を持つリッチなデータポイントとなりました。
技術1:栄養類似度検索(コサイン類似度)
なぜコサイン類似度か?
栄養素でレシピを比較する素朴な方法はユークリッド距離です。しかしこれは絶対値のスケールに支配されます。カロリーの100の差がビタミンB2の0.1mgの差を完全に覆い隠してしまう — 栄養学的にはどちらも同等に重要かもしれないのに。
コサイン類似度はベクトルの大きさではなく方向を比較します。栄養素の比率が似ていれば、分量に関係なく高いスコアになります。
実装
各レシピを19次元の栄養ベクトルとして表現。StandardScalerで正規化(各栄養素を平均0、標準偏差1に変換)後、18,174件のレシピ間でコサイン類似度を計算します。
from sklearn.preprocessing import StandardScaler
from sklearn.metrics.pairwise import cosine_similarity
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # (18174, 19)
similarity_matrix = cosine_similarity(X_scaled) # (18174, 18174)
任意の料理に対して栄養プロファイルが最も近い上位30レシピを返します。鶏の炒め物を検索すると、豚と野菜の煮物、豆腐のキャセロール、魚と根菜の料理などがヒット — 栄養的には等価だけれど、味も調理法もまったく違う料理です。
献立レベルへの拡張
これを献立全体の比較にも拡張しました(1,526件の献立を27次元の栄養ベクトルで比較)。「先週の火曜日の夕食は栄養バランスが良かった。同じ栄養を満たす別の献立は?」という問いに答えられます。
技術2:時系列献立予測(LSTM)
核心的な気づき
コサイン類似度には「記憶」がありません。昨日何を食べたか知らないので、月・火・水と同じグリルチキンを提案するかもしれない。栄養的には問題なくても、3日連続は勘弁です。
そこで気づいたのが、献立予測はテキスト生成と構造的に同一だということです。
| テキスト生成 | 献立予測 |
|---|---|
| 語彙 = 単語 | 語彙 = 献立ID |
| 文 = 単語の系列 | 週 = 日々の献立の系列 |
| 次の単語を予測 | 翌日の献立を予測 |
| 繰り返しを避ける = 良い文章 | 繰り返しを避ける = 飽きない食事 |
この類推がそのまま実装を決定しました。テキストを生成するのとまったく同じアーキテクチャで献立を生成します。
アーキテクチャ
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
model = Sequential([
LSTM(128, input_shape=(7, vocab_size)), # 過去7日間
Dropout(0.2),
Dense(vocab_size, activation="softmax") # 翌日の献立を予測
])
7日間のスライディングウィンドウで学習データを生成。「この7日間の食事の後に、何が来たか?」をLSTMが学習し、週のリズム・連続回避・季節パターンを獲得します。
![]()
温度パラメータ:多様性のダイヤル
テキスト生成から直接借用した温度パラメータで、提案の保守性と冒険性を制御します。
| 温度 | 動作 |
|---|---|
| 0.3 | 安全圏 — よく食べる定番メニュー |
| 0.7 | 最適バランス — 馴染みがありつつ変化あり |
| 1.0 | 標準的な確率分布そのまま |
| 1.5 | 冒険的 — 珍しい組み合わせも探索 |
GPTの出力を「創造的」にも「堅実」にもする、あの仕組みと同じです。
技術3:レシピ簡易化(ChatGPT API)
MLでは解決できなかった問題
データベースにはプロの料理本由来の約2万件のレシピがあり、多くは15種類以上の材料・複雑な工程・専門的な技法を必要とします。コサイン類似度で代替を見つけ、LSTMで変化をつけても、毎回90分かかる料理を提案しては日常の問題は解決しません。
レシピの簡略化には言語の理解が必要です。どの材料が本質的でどれが省略可能か、技法をどう代替するか、風味を保ちつつ複雑さを削るか。数値的なMLではこれは不可能です。
LLMによる変換
ChatGPT APIが利用可能になったタイミングで、明確な制約条件つきの簡略化レイヤーを追加しました。
- 材料は10個以内(元の15〜20個から削減)
- 工程は5ステップ以内(元の8〜12ステップから短縮)
- 調理時間30分が目標
- コアとなる栄養を維持(たんぱく源、野菜の成分)
- キャッチーな料理名を生成、JSON形式で出力
具体例
16種類の材料・8工程の「さばの味噌煮 根菜添え」が、8種類の材料・5工程の「クイック味噌さばどんぶり」(調理時間25分)に変換 — たんぱく質とオメガ3は維持されています。
約2万件のレシピをバッチ処理するコストは、GPT-3.5 Turboで約$40(約6,000円)でした。
技術スタック
| レイヤー | 技術 | 役割 |
|---|---|---|
| データパイプライン | Python / pandas | 3つのデータソースのクレンジング・結合・構造化 |
| 栄養類似度検索 | scikit-learn (StandardScaler, cosine_similarity) | 18,174件のレシピを19次元で類似検索 |
| 献立予測 | Keras / TensorFlow (LSTM) | 時系列の食事シーケンス予測と温度サンプリング |
| レシピ簡易化 | OpenAI API (GPT-3.5 / GPT-4) | 自然言語によるレシピ変換 |
| データ形式 | CSV, JSON | 統一マスターデータセットとLLM出力の構造化 |
10年の進化
このプロジェクトは、応用AIの進化そのものを辿っています。
| フェーズ | 時代 | ツール | 得られた能力 |
|---|---|---|---|
| 1. 古典的データサイエンス | 2010年代 | pandas, scikit-learn | 精密な数値比較、説明可能な結果 |
| 2. ディープラーニング | 2010年代中盤 | Keras, LSTM | 時間的パターンの学習、シーケンス生成 |
| 3. 大規模言語モデル | 2020年代 | OpenAI API | 自然言語の理解と変換 |
各フェーズは前のものを置き換えたのではなく、互いに補完しています。コサイン類似度は最速の栄養マッチングを提供し、LSTMは時間的なシーケンシングを担い、ChatGPTはどちらにもできなかった自然言語レシピの理解と書き換えを実現します。
学んだこと
データの質がすべてを決める
2万件のレシピを10年にわたって扱った中で、最も一貫した教訓:どんなアルゴリズムも、データ品質の低さは補えない。 データパイプラインのクレンジングと検証に費やした時間は、その後のすべてのステップで配当を生みました。
古典的MLにはまだ居場所がある
LLMの時代でも、よく構造化された数値データに対するコサイン類似度は、LLMにレシピ比較を依頼するより高速・低コスト・説明可能です。適切なツールは、流行ではなく問題に応じて決まります。
始めるべき最良の時期は10年前だった
解決すべき問題は変わっていません。ツールが劇的に良くなっただけです。コサイン類似度が栄養マッチングになぜ有効か、温度サンプリングが多様な出力をなぜ生むかを理解していることは、現代のLLMを使う際にもエンジニアとしての基盤になります。
開発プロセスの詳細
本プロジェクトの技術的な詳細を、全4回の連載記事で解説しています。
| 回 | テーマ |
|---|---|
| 第1回 | データパイプラインの構築 — 2万件のレシピを整備する |
| 第2回 | 「同じ栄養、違う料理」をコサイン類似度で見つける |
| 第3回 | LSTMで「飽きない献立」を時系列予測する |
| 第4回 | ChatGPTで2万件のレシピを変換する |