LLMは日本食品の栄養素をどこまで推測できるか — ゼロショット推論ベンチマーク


背景

栄養管理アプリを開発する中で、自然な疑問が浮かんだ。

LLMは食品名だけを与えられたとき、100gあたりの栄養素(kcal・たんぱく質・脂質・炭水化物)をどれくらい正確に推測できるのか?

文部科学省が公開している 日本食品標準成分表 2020年版(以下 MEXT DB)には2538件の食品データが収録されている。これをグラウンドトゥルースとして使い、ゼロショット推論の精度を定量的に測定した。


実験設計

データ分割

MEXT DB 2538件を food_no 順にソートし、5件ごとに1件をevalセットに割り当てた(決定論的な 80/20 分割)。

セット件数
train2,030
eval508

プロンプト(ゼロショット)

以下の食品について、それぞれ100gあたりの栄養素を推測してください。
JSONの配列のみで回答してください(説明・コードブロック不要)。

食品:
1. ○○
2. ○○
...

回答形式(N要素):
[{"kcal":数値,"protein":数値,"fat":数値,"carbs":数値},...]

10件ずつバッチ処理し、合計51回のAPIコールで全件を評価する。

評価指標

  • MAE(平均絶対誤差): 予測値と正解値の絶対差の平均
  • MAPE(平均絶対パーセント誤差): 正解値に対する相対誤差の平均
  • RMSE(二乗平均平方根誤差)
  • 失敗ライン: MAPE > 30% の件数・割合

結果(Claude Haiku、50件サンプル)

栄養素別メトリクス

栄養素MAEMAPERMSE
kcal35.6 kcal19.9%62.9 kcal
たんぱく質2.5 g45.0%9.6 g
脂質1.1 g61.3%1.9 g
炭水化物5.5 g15.3%10.3 g

kcal 誤差の分布

パーセンタイル絶対誤差MAPE
p5014.0 kcal6.0%
p7545.8 kcal18.3%
p9087.9 kcal51.5%
p95121.4 kcal72.3%

kcal MAPE > 30% の失敗件数: 9 / 50(18.0%)

失敗例(MAPE上位)

食品名正解予測MAPE
こむぎ 小麦たんぱく 粒状101 kcal365 kcal261%
こめ 精白米 インディカ米347 kcal130 kcal62%
そば 生271 kcal132 kcal51%
こむぎ パン粉 生277 kcal373 kcal35%
こむぎ 干し中華めん ゆで131 kcal173 kcal32%

考察

できていること

  • 中央値レベル(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% ✅)
  • ただし臨床・医療用途には別途の精度基準が必要

今後の課題

  1. ベースライン比較: 訓練セット平均値・グループ別平均値で予測した場合との比較が未実施。LLMを使うことの優位性をまだ示せていない
  2. Few-shot の効果検証: 訓練セットから10件(広いカロリー分布をカバー)を例示するfew-shotプロンプトの実装済み。効果測定は次回
  3. モデル間比較: Haiku vs Sonnet vs Opus での精度とコストのトレードオフ
  4. 分布外データへの頑健性: 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円)