【要約】手書き日本語メモのOCR、Gemini構造化出力に落ち着くまで(年推測バグの話つき) [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者がメモアプリに手書きOCR機能を実装する際、日本語の認識精度やデータの整合性、システム運用の安定性において複数の課題に直面した。具体的には以下の問題が発生した。
- ・手書き日本語に対する既存モデル(Claude)の誤読。
- ・LLMが「年」のない日付を学習データに基づき誤推測する問題。
- ・バッチ処理時のAPIレート制限(429エラー)の発生。
- ・高解像度画像の転送による通信負荷とEXIF回転の問題。
- ・並列処理によるメモIDの衝突とデータ消失のリスク。
// Approach
開発者は、タスクごとに最適なモデルを使い分け、プロンプトとシステム設計の両面から課題を解決した。具体的には以下の手法を導入した。
- ・OCRにGemini Flash-Liteを採用し、依存関係を1関数に隔離。
- ・
responseSchemaとtemperature: 0を用いてJSON出力を強制。 - ・指数バックオフを用いたリトライ処理の実装。
- ・プロンプトに「今日の日付」を渡し、日付解釈の厳格なルールを明文化。
- ・クライアント側での画像縮小とEXIF回転の制御。
- ・副作用のあるメモ作成処理を直列化し、ID衝突を回避。
// Result
実装の結果、手書きメモの正確な構造化取り込みと、安定したシステム運用を実現した。これにより、以下の成果が得られた。
- ・JSONパース失敗の激減による、データ整合性の確保。
- ・日付の誤推測問題の解消による、正しい作成日の保持。
- ・リトライ処理による、バッチ取り込み時のユーザー体験向上。
- ・画像軽量化による、通信量とストレージ負荷の最適化。
Senior Engineer Insight
> 実践的なマルチモデル戦略と防御的設計が光る。OCRに特化したモデルを最小限のコードで隔離する手法は、運用コストを抑えつつ精度を最大化する賢明な判断だ。また、LLMの「推論」を制御するために、コンテキスト(今日の日付)の提供と厳格なルール定義を組み合わせるアプローチは、非決定的な出力を扱う際の定石と言える。副作用の有無による並列・直列の切り分けも、スケーラビリティを考慮した堅実な設計である。