# 打ち手2: LLM濃度判定（visual_density）プロンプト改善案

> ⚠️ **【撤回】この提案は前提誤りのため撤回（2026-06-19）。**
> 「visual_densityがBrixと96%一致＝バグ」と捉えたが、これは**設計どおり**だった。
> 濃度はLLMではなく**濃度推定AI/実測**が判定し、LLMには濃度を参考入力として渡すのが正しい設計（リークではない）。
> よって「Brixを切り離す」本案は不適切。詳細は `reports/精度改善レポート_20260619.md` §9.2。
> 以下は検討の記録として残すが、**実施しないこと**。

作成日: 2026-06-19 / ステータス: **撤回（前提誤り）**

---

## 1. 真因（データで特定）

大外しの42%を占める「LLM評価ミス」を調べた結果、現行プロンプトの境界説明は十分詳しいのに過大評価が止まらない理由が判明した。

**LLMが視覚ではなく、別入力のBrix値に visual_density を合わせている（アンカリング）。**

### 証拠（評価可能368件）

| 事実 | 数値 |
|---|---:|
| visual_density の値が Brix と**完全一致** | **354件 / 96%** |
| 理由文に「計測ラベル」等への明示的言及 | 75件 / 20% |

### 具体例（大外し）

| sid | brix | LLM visual_density | LLM理由（抜粋） | 人間 |
|---|---:|---:|---|---:|
| 805 | 13 | 13 | 「**別途入力された計測ラベルが13のため13と判定した**」（実画像は仕込み中の生肉が表面を占有） | 40 |
| 501 | 12 | 12 | 「…**別入力の計測ラベルが12である**」 | 70(soup80) |
| 790 | 13 | 13 | 白ベージュで濃い、と記述（実態は具材・泡主体） | 70 |

→ visual_density は実質「Brixの転記」になっており、**画像が濃度を表していないケース（生肉占有・泡/脂膜主体・非代表フレーム）を一切検出できない**。
これが805型の大外し（brix高いのに人間は低評価）の正体。

### なぜ現行プロンプトで防げないか

- プロンプトは「Brixは画像から推定しない」「泡・脂膜で濃度を上げない」と明記している。
- しかし実装（`local_batch_api/batch_process.py:216`）で **`【別入力】スープ濃度(計測/人手ラベル): 13` とBrix数値そのものをLLMへ渡している**。
- 数値を見せられたLLMは、視覚判断より「正解ラベル」を優先してしまう（典型的なアンカリング）。

---

## 2. 改善の方針

**visual_density を、画像の液体本体だけから判定する真に独立した視覚信号に戻す。**
Brix情報は失わない（後段モデルは別特徴量 `brix` として従来通り利用）。
visual_density から Brix汚染を除くことで、画像が濃度を表していないケースを検出可能にする。

### 改善案A（推奨・最も確実）: LLMへBrix数値を渡さない

画像評価の呼び出しから `【別入力】スープ濃度(計測/人手ラベル): N` の**数値行を除去**する。
（濃度の有無による可読性レイヤーの分岐は残してよいが、具体的な数値は渡さない。）
- 長所: アンカリングを物理的に断てる。最も効果が見込める。
- 変更箇所: `batch_process.py: density_input_note()`（数値を出力しない／伏せる）。

### 改善案B（軽量・指示のみ）: 数値は渡すが使用禁止を明記

数値は渡したまま、プロンプトに「**別入力濃度は visual_density 判定に使用禁止**」を強い文言で追加。
- 長所: 実装変更が小さい（プロンプト文のみ）。
- 短所: アンカリングが完全に消えない可能性（モデル次第）。

> 推奨は **A**。確実にアンカリングを断てる。Bは保険的に併用してもよい。

---

## 3. プロンプト改訂ドラフト（visual_density 方針への追記・改訂）

現行 `## visual_density 方針` に以下を**追記/改訂**する（原本未適用）。

```text
【最重要・濃度の独立性】
- 別入力のスープ濃度(計測/人手ラベル)・Brix値は、visual_density の判定に一切使用しない。
- visual_density は必ず「この画像の液体本体の見た目」だけから判定する。
- 理由文(reason)に計測ラベル・別入力・Brix値への言及を含めてはならない。
  （例: 「計測ラベルが13のため13」のような記述は禁止）

【画像が濃度を表していない場合の扱い】
次のいずれかで液体本体が十分に見えない場合、ラベル値に合わせず必ず以下とする:
- 具材・肉（網脂巻き等）が表面の大部分を占め、液体本体がほとんど見えない
- 泡・湯気・脂膜・白い膜が表面を覆い、泡のない液体部分を複数箇所で確認できない
- 仕込み途中など、スープ表面が代表的な状態でない
→ visual_density = 判定不可、confidence = 低 とし、reason に「液体本体が確認できない」旨を書く。
  （ラベル値を転記して高い濃度を付けない）

【判定の自己チェック】
- もし自分の visual_density が、画像の液体本体ではなく別入力の数値に一致していないか確認する。
- 別入力が無かったら同じ値を付けるか？ No なら画像のみで付け直す。
```

加えて、共通ルールの「Brixは別入力として扱う」を次へ強化:
```text
- Brix・計測濃度は後段処理専用の参考値であり、画像評価AIの visual_density 判定には使わない。
```

---

## 4. 適用時に同期するファイル（適用は承認後）

| ファイル | 変更内容 |
|---|---|
| `APIテスト/豚山スープ画像評価プロンプト方針.md` | 上記ドラフトを反映（固定ソース） |
| `APIテスト/index.html` | 同期（プロンプト本体） |
| `local_batch_api/batch_process.py` | 改善案A採用時: `density_input_note()` でBrix数値を渡さない |

※ いずれも本提案では**未変更**。適用するとLLM再出力（追加コスト）が発生する。

---

## 5. 安価な検証プラン（本実行の前に）

全データ再出力の前に、**少数サンプルで効果を確認**してから本実行を判断する。

1. 対象: 大外し「LLM評価ミス」21件 ＋ 正常な対照5件（計~26件）。
2. 改善案A（Brix数値を渡さない）で **その26件だけLLM再評価**（コスト数十円規模）。
3. 確認: 805などで visual_density が13→より低い値/判定不可に変わるか。Brixとの完全一致率が96%から下がるか。
4. 効果が確認できたら全データ再出力 → 後段モデルを再学習・再比較。

---

## 6. リスクと留意点

- visual_density を独立化すると、Brixとの相関が下がる（＝現行の後段モデルが効かせていた信号が変わる）。
  **後段モデルは必ず再学習が必要**。最終的な精度効果は再出力後の比較で確定する。
- 期待効果: 805型（画像が濃度を表していない）の大外しを検出できるようになり、
  scored対象の信頼性が上がる。ただし定量効果は要実測（§本実行後）。
- Brix情報自体は後段の `brix` 特徴量として残るため、濃度の予測力は失われない。

---

## 7. まとめ

- 大外しの主因は「プロンプトの説明不足」ではなく「**LLMにBrix数値を見せて視覚濃度をそれに合わせさせていた**」こと（visual_densityの96%がBrixと一致）。
- 改善は「境界説明の追加」より「**Brix数値をvisual_density判定から切り離す**」ことが本質（推奨案A）。
- 適用はLLM再実行コストを伴うため、まず26件の安価検証 → 効果確認 → 本実行、の順を推奨。
