LLMは日本食品の栄養素をどこまで推測できるか — ゼロショット推論ベンチマーク
背景
栄養管理アプリを開発する中で、自然な疑問が浮かんだ。
LLMは食品名だけを与えられたとき、100gあたりの栄養素(kcal・たんぱく質・脂質・炭水化物)をどれくらい正確に推測できるのか?
文部科学省が公開している 日本食品標準成分表 2020年版(以下 MEXT DB)には2538件の食品データが収録されている。これをグラウンドトゥルースとして使い、ゼロショット推論の精度を定量的に測定した。
実験設計
データ分割
MEXT DB 2538件を food_no 順にソートし、5件ごとに1件をevalセットに割り当てた(決定論的な 80/20 分割)。
| セット | 件数 |
|---|---|
| train | 2,030 |
| eval | 508 |
プロンプト(ゼロショット)
以下の食品について、それぞれ100gあたりの栄養素を推測してください。
JSONの配列のみで回答してください(説明・コードブロック不要)。
食品:
1. ○○
2. ○○
...
回答形式(N要素):
[{"kcal":数値,"protein":数値,"fat":数値,"carbs":数値},...]
10件ずつバッチ処理し、合計51回のAPIコールで全件を評価する。
評価指標
- MAE(平均絶対誤差): 予測値と正解値の絶対差の平均
- MAPE(平均絶対パーセント誤差): 正解値に対する相対誤差の平均
- RMSE(二乗平均平方根誤差)
- 失敗ライン: MAPE > 30% の件数・割合
結果(Claude Haiku、50件サンプル)
栄養素別メトリクス
| 栄養素 | MAE | MAPE | RMSE |
|---|---|---|---|
| kcal | 35.6 kcal | 19.9% | 62.9 kcal |
| たんぱく質 | 2.5 g | 45.0% | 9.6 g |
| 脂質 | 1.1 g | 61.3% | 1.9 g |
| 炭水化物 | 5.5 g | 15.3% | 10.3 g |
kcal 誤差の分布
| パーセンタイル | 絶対誤差 | MAPE |
|---|---|---|
| p50 | 14.0 kcal | 6.0% |
| p75 | 45.8 kcal | 18.3% |
| p90 | 87.9 kcal | 51.5% |
| p95 | 121.4 kcal | 72.3% |
kcal MAPE > 30% の失敗件数: 9 / 50(18.0%)
失敗例(MAPE上位)
| 食品名 | 正解 | 予測 | MAPE |
|---|---|---|---|
| こむぎ 小麦たんぱく 粒状 | 101 kcal | 365 kcal | 261% |
| こめ 精白米 インディカ米 | 347 kcal | 130 kcal | 62% |
| そば 生 | 271 kcal | 132 kcal | 51% |
| こむぎ パン粉 生 | 277 kcal | 373 kcal | 35% |
| こむぎ 干し中華めん ゆで | 131 kcal | 173 kcal | 32% |
考察
できていること
- 中央値レベル(p50)のkcal推定は良好: MAPE 中央値 6.0% は実用的な精度
- 炭水化物の相対精度が高い: MAPE 15.3% はkcalと並んで最も精度が高い
- 一般的な食品は概ね正確: ご飯・野菜・肉類など日常的な食品は誤差が小さい傾向
できていないこと
- 高度加工食品の推定が不安定: 「小麦たんぱく 粒状」(101 kcal)を 365 kcal と推定——加工工程でカロリーが大きく変わる食品の知識が不足
- 脂質の相対誤差が大きい(MAPE 61%): MAE は 1.1g と小さいが、低脂質食品(0.1〜0.5g)では相対的に大きな誤差になりやすい
- たんぱく質 MAPE 45%: 肉類・大豆製品で推定値が実際の組成と乖離するケースが見られた
実用上の判断基準
ウェルネス用途(栄養コーチングアプリ等)での目安として:
- kcal MAPE < 20% ならログの参考値として許容範囲内(本結果: 19.9% ✅)
- 30%超え失敗が 20% 未満 であれば大多数のユーザー体験に影響しない(本結果: 18.0% ✅)
- ただし臨床・医療用途には別途の精度基準が必要
今後の課題
- ベースライン比較: 訓練セット平均値・グループ別平均値で予測した場合との比較が未実施。LLMを使うことの優位性をまだ示せていない
- Few-shot の効果検証: 訓練セットから10件(広いカロリー分布をカバー)を例示するfew-shotプロンプトの実装済み。効果測定は次回
- モデル間比較: Haiku vs Sonnet vs Opus での精度とコストのトレードオフ
- 分布外データへの頑健性: MEXT DB にない外食・加工食品への汎化能力は未測定
実験コード
実験コードは以下で管理している:
experiments/
pyproject.toml # uv プロジェクト
01-nutrition-predict-bench/
run.py # ベンチマーク本体
results/ # 実行結果 JSON
cd experiments
uv sync
ANTHROPIC_API_KEY=sk-ant-... uv run python 01-nutrition-predict-bench/run.py --limit 50
# few-shot モード
ANTHROPIC_API_KEY=sk-ant-... uv run python 01-nutrition-predict-bench/run.py --limit 50 --training few-shot
実行コスト: 50件で 約 $0.033(5円)、全508件で 約 $0.35(50円)。