縦書きラベルのOCR精度改善にFew-shotで画像3枚+正解JSONを渡してみた

  • Bedrock
  • OCR
  • Few-shot
  • Prompt Engineering

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

何が起きたか

製品仕様書・工場ラベル系の画像をBedrock Vision(Claude経由、Converse API)でOCRさせているが、縦書きラベルで誤読がちょいちょい出る。「工」を「エ」と読んだり、濁点まわりがおかしくなったりするパターンがある。

やったこと

精度を上げる方向性の一つとしてFew-shot promptingを試した。やり方は、正解が分かっている画像を3枚ほど用意して、それぞれに対応する構造化JSON(正解データ)をペアでプロンプトに含める。画像はConverse APIのs3Locationで参照する形にした。

画像3枚の選定は以下の組み合わせにした。

  • 縦書き・文字密度が高いもの
  • 縦書き・文字密度が低いもの
  • 横書きのもの

縦書きの中でも密度違いを入れているのがポイントで、横書きも1枚混ぜてバリエーションを持たせた。

構成イメージはこんな感じ。

flowchart TD
    A[Few-shot例1: 画像1 + 正解JSON1] --> D[プロンプト]
    B[Few-shot例2: 画像2 + 正解JSON2] --> D
    C[Few-shot例3: 画像3 + 正解JSON3] --> D
    E[読み出したい本番画像] --> D
    D --> F[推論結果のJSON]

inferenceConfigは元々temperature=0、maxTokensを明示(Claude Sonnet 4.6なのでtopPはそもそも指定不可)にチューニング済みで、そこにFew-shot例を足した形。

効果

正解率は上がった。LLMなので毎回完全に同じ結果が返ってくるわけではないが、不正解率は劇的に下がった。

気になっている点・未確認

  • 例の枚数(3枚)や、この密度・縦横の組み合わせが最適かどうかまでは検証していない
  • VLMの非決定性(同じ入力でも出力がブレること)自体はFew-shotだけで解消するものではない