

縦書きラベルのOCR精度改善にFew-shotで画像3枚+正解JSONを渡してみた
この記事は、構成と文章の整理に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だけで解消するものではない