ノウハウ

手書き訂正などが書き込まれた書類の、LLMを使った読み取り実験

ビジネスの現場において、行政文書は依然として紙で作成、提出、保管されていることが多いです。
また、記載すべき項目は法律で定められていますが、書類の様式や入力規則が事業所などにより異なっているほか、手書きによる修正や日付入りのハンコなどが含まれることもあります。


そのため、単純なOCR(光学式文字認識)やRPA(Robotic Process Automation)では、データを構造化するのが難しいという現状、且つ構造化したデータでないと分析
などが難しいため、蓄積した書類の情報があっても、それを活用した政策立案や新たなビジネス創出にはつなげづらかったという実情があります。

(上記引用元:https://xtech.nikkei.com/atcl/nxt/column/18/03251/062700007/

一般的・経験則的にはchatGPT/Claudeなどと比較すると、Geminiの文字起こし性能が良いという印象ですが、今回、過去検出が困難であった要素について、各最新のモデルがどの程度抽出できるかを検証してみました。 



目次


使用モデル

Gemini:Gemini-2.5-flash 

chatGPT:GPT-5(Auto) 

Claude:Sonnet 4

LINKS Vedaプロトタイプ開発レポートでは、Azure AI Document Intelligence (version 3.1)をOCR処理に利用

 

検証概要

LINKS Vedaプロトタイプ開発レポートにおいて、OCRによる正確な情報抽出が困難なケースとして報告されたものから情報が抽出できるか確認。


検証概要

1.申請書における選択肢の丸囲みや四⾓囲みの表現 

対象画像①   

対象画像②   

プロンプト   

選択された申請区分を抽出して 

 

結果 ① 

モデル 

LLM出力結果 

Gemini-2.5-flash 

抽出された申請区分は「地域DMO」です。 

GPT-5(Auto) 

画像から選択されている申請区分は 「地域DMO」 です。 

Sonnet 4 

画像を確認しました。選択された申請区分は「地域DMO」です。 

右端の「地域DMO」の項目が四角で囲まれており、これが選択されていることを示しています。 

 

結果 ② 

モデル 

LLM出力結果 

Gemini-2.5-flash 

抽出された申請区分は「利用」です。 

GPT-5(Auto) 

画像から赤丸で選択されている申請区分は 「利用」 です。 

Sonnet 4 

画像を確認しました。赤い円で囲まれている申請区分は「利用」です。 

 

2.⽮印などのオブジェクトが入った複雑な図

▍対象画像

▍プロンプト

画像は海上定期便ガイドです。運航スケジュールを抽出してください。  

▍結果 

LINKS Vedaプロトタイプ開発レポートでは、

「地理的関係や移動航路の表現に⽮印が使われており、⽮印が「東京から苫⼩牧への出港
スケジュール」という関係性を⽰しています。⼈間なら⽮印の⽅向から各地点間の発着関係を理解できるが、AI はこの視覚的な情報を理解するのが難しく、単なる線として認識して
しまう。」という課題が提起されていました。

最新のモデルでは、運航時刻の値が一部不正確であるが、関係を認識できています。 Claudeは「苫小牧」が「古小牧」となっていたり、日本語があまり得意でない傾向が出ています。 

 

モデル 

LLM出力結果 

Gemini-2.5-flash 

画像から抽出した海上定期便の運航スケジュールは以下の通りです。 

東京発 → 苫小牧行 
・月・火・水・金・土:21:00発 → 06:00着(翌日)
・土:21:00発 → 07:00着(翌日)

苫小牧発 → 釧路行
・月・火・水・金・土:07:30発 → 12:30着
・木:20:30発 → 02:00着(翌日)
・水・土:20:30発 → 03:00着(翌日)

――― 
釧路発 → 東京行 
・火・木・金:03:00発 → 07:00着(翌日)
・火・水・金:04:00発 → 07:00着(翌日)
――― 
なお、運航は毎日運航(日曜日を除く)と記載されています。 

GPT-5(Auto) 

画像から抽出した運航スケジュールは以下の通りです。  
東京 ⇔ 苫小牧 

●東京発 → 苫小牧着
月・火・水・土:21:00 発 → 翌日 06:00 着 
金:21:00 発 → 翌日 07:00 着 
(金のみ 04:00 発 便あり) 

●苫小牧発 → 東京着

月・日:07:30 発 
木:20:30 発 
火・水・金・土:17:30 発 
(苫小牧発 → 東京行き 鉄鋼専用便あり)  

苫小牧 ⇔ 釧路 
●苫小牧発 → 釧路着
火・金:03:00 発 → 07:00 着 
荷役・運貨に関しては「船社にお問い合わせください」と記載されています。 

Sonnet 4 

画像から海上定期便の運航スケジュールを抽出します: 

運航スケジュール 
古小牧 ⇔ 東京間 

便1 

出発時刻: 10時407分(6時050分) 
到着時刻: 12時6分(23時0分) 
運航船: RORo船 2018(H25).4 
乗車定員: 12台/ページ 172台、乗用車 95台 
冷凍倉庫: 220V 24、440V 32 

便2 

出発時刻: 10時620分(6時138分) 
到着時刻: 12時6分(23時0分) 
運航船: RORo船 2017(H29).9 
乗車定員: 12台/ページ 177台、乗用車 95台 
冷凍倉庫: 220V 65、440V 32 

便3 

出発時刻: 10時620分(6時138分) 
到着時刻: 12時6分(23時0分) 
運航船: シャーン 2017(H29).11 
乗車定員: 177台、乗用車 95台 
冷凍倉庫: 220V 65、440V 32 

注意: 運賃は船舶にお問い合わせください 
※時刻表記に一部不明瞭な部分があるため、正確な時刻については直接お問い合わせいただくことをお勧めします。 

 

3.訂正線や⼿書きによる修正などのイレギュラーな記載 

▍対象画像  


▍プロンプト 

画像は報告書です。手書きで数値を修正しています。この表の内容を訂正前後の値が分かるようにJSON化してください 

▍結果 

LINKS Vedaプロトタイプ開発レポートでは、 

「数値や⽂字に訂正線が引かれ、新しい値が記⼊されている場合、OCRは訂正前の値と訂正後の値を区別できず、誤った情報を抽出してしまう。訂正して別の数値などで上書きした場合、⼈間なら訂正線と新しい数値から正しい⾦額を読み取れるが、AIは両⽅の数値を検出し、どちらが有効な情報なのか判断できない。」 

という課題を提起していました。 

GeminiとGPTは数値に一部不正確であるが変更箇所(訂正の前後関係)を認識できており、項目名や数値も安定して抽出できる傾向にあります。 

Claudeはそもそもの修正箇所、項目名などの抽出が困難でした。モデルをOpus 4.1に変更
しても性能に大きな変わりはなかったため、日本語の表+手書き訂正はClaudeには難しい
分野であることが推測できます。 

 

モデル 

LLM出力結果 

Gemini-2.5-flash 

[
  {
  "row_id": 14,

  "項目": "非鉄金属",
   "修正前": {
   "値1": "210",
    "値2": "120,000",
     "値3": "4",
    "値4": "2,400",
    "値5": "12",
    "値6": "10,200",
      "値7": "197",
     "値8": "118,200"
 },
   "修正後": {
     "値1": "285",
               "値2": "165,000",
               "値3": null,
               "値4": null,
               "値5": "82",
               "値6": "45,200",
               "値7": null,
               "値8": null
         }
   },
   {
       "row_id": 25,
       "項目": "その他の化学工業品",
       "修正前": {
             "値1": "483",
             "値2": "120,750",
             "値3": "269",
            "値4": "67,250",
            "値5": "-230",
            "値6": "-59,500",
            "値7": "522",
            "値8": "130,500"
        },
       "修正後": {
            "値1": "394",
            "値2": "98,170",
            "値3": null,
            "値4": null,
            "値5": "141",
            "値6": "35,230",
            "値7": null,
            "値8": null
      }
   }
]

GPT-5(Auto)

{
  "項目": [
    {
   "番号": 14,
      "品目": "鉄鋼",
             "値": {}
           },
           {
             "番号": 15,
             "品目": "非鉄金属",
             "値": {
                 "訂正前": {"数量": 275, "金額": 120000},
                 "訂正後": {"数量": 275, "金額": 165000}
                 }
            },
            {
             "番号": 16,
             "品目": "金属製品",
             "値": {}
    },
           {
            "番号": 17,
            "品目": "電気機械",
            "値": {
               "訂正前": {"数量": 17, "金額": 10200},
               "訂正後": {"数量": 82, "金額": 49200}
                  }
             },
             {
              "番号": 18,
              "品目": "その他の機械",
              "値": {}
             },
            {
             "番号": 19,
             "品目": "紙・同製品",
             "値": {}
            },
           {
             "番号": 20,
             "品目": "その他の製品",
             "値": {}
           },
          {
             "番号": 21,
             "品目": "石油製品",
             "値": {}
          },
         {
            "番号": 22,
            "品目": "化学製品",
            "値": {}
         },
         {
           "番号": 23,
           "品目": "化学薬品",
           "値": {}
  },
     {
           "番号": 24,
           "品目": "染料・顔料",
           "値": {}
        },
        {
          "番号": 25,
          "品目": "肥料",
          "値": {}
        },
        {
          "番号": 26,
          "品目": "その他の化学工業品",
          "値": {
             "訂正前": {"数量": 488, "金額": 120780},
             "訂正後": {"数量": 394, "金額": 98700}
             }
         },
         {
           "番号": 27,
           "品目": "紙・パルプ",
           "値": {
              "訂正前": {"数量": 230, "金額": 39500},
              "訂正後": {"数量": 141, "金額": 35250}
             }
         },
         {

           "番号": 28,
           "品目": "化学繊維糸",
           "値": {}
         }
    ]
}

Sonnet 4 

{
    "report_data": {
    "corrections": [
        {
            "row_number": 14,
            "category": "外国人観光客",
            "original_value": "210千",
            "corrected_value": "163千",
            "column_position": 2
        },
        {
            "row_number": 14,
            "category": "外国人観光客", 
            "original_value": "82",
            "corrected_value": "47千",
            "column_position": 5
        },
        {
           "row_number": 25,
           "category": "くり返しの女子上級生",
           "original_value": "488千",
           "corrected_value": "279千",
           "column_position": 1
        },
        {
            "row_number": 25,
            "category": "くり返しの女子上級生",
            "original_value": "199千",
            "corrected_value": "195千", 
            "column_position": 2
       },
       {
            "row_number": 25,
            "category": "くり返しの女子上級生",
            "original_value": "699千",
            "corrected_value": "191千",
            "column_position": 5
       },
       {
            "row_number": 25,
            "category": "くり返しの女子上級生",
            "original_value": "97千",
            "corrected_value": "356千",
            "column_position": 6
       }
    ],
    "unchanged_values": [
       {
            "row_number": 14,
            "category": "外国人観光客",
            "value": "4",
            "column_position": 3
       },
       {
            "row_number": 14,
            "category": "外国人観光客",
            "value": "2,400",
            "column_position": 4
       },
       {

            "row_number": 14,
            "category": "外国人観光客",
            "value": "197",
            "column_position": 6
       },
       {

           "row_number": 14,
           "category": "外国人観光客",
           "value": "118,200",
           "column_position": 7
       },
       {

           "row_number": 25,
           "category": "くり返しの女子上級生",
           "value": "289",
           "column_position": 3
      },
      {

          "row_number": 25,
          "category": "くり返しの女子上級生",
          "value": "67,250",
          "column_position": 4
      },
      {

          "row_number": 25,
          "category": "くり返しの女子上級生",
          "value": "522",
          "column_position": 7
     },
     {

         "row_number": 25,
         "category": "くり返しの女子上級生",
         "value": "130,500",
         "column_position": 8
     } 
     ]
   }
}

 

 

結論

今回の検証から、従来OCRやRPAでは困難とされてきた 

● 選択肢の丸囲み・四角囲み

● 矢印を含む複雑な図の読み取り

● 訂正線や手書き修正を含む表の解釈

といったケースに対し、最新の大規模言語モデル(Gemini、GPT-5、Claude)は一定の改善を示しました。 
特に Gemini と GPT-5 は、修正前後の数値や矢印による関係性をある程度認識でき、安定した抽出結果を返す傾向が確認されました。一方で、Claudeは日本語の表記や手書き訂正の処理に弱みがあり、誤認識や項目抽出の欠落が多く見られました。 

ただし、いずれのモデルも完全な正確性には至らず、数値や時刻の一部に誤りが残るなど、実運用での単独利用にはリスクがあります。したがって、実際の行政文書処理やビジネス活用においては、 

〇 OCR+LLMのハイブリッド活用

〇 モデル出力に対する人間による最終確認

〇 日本語表記や特殊記号への追加チューニング

といった補助的仕組みを組み合わせることが有効と考えられます。 
総じて、最新LLMは従来困難であった手書き要素や複雑な図表を読み解く能力を着実に高めており、行政文書や業務書類のデジタル化に向けた実用可能性が広がっていると結論づけられます。

今回確認したすべてのモデルにおいて、訂正箇所を反映した画像に変換するのは困難でした。ただし、Gemini(gemini-2.5-flash-image(通称:Nano Banana))では、手書き部分をのみを抽出することができました。この差分情報を使用することで、抽出精度の向上など将来的に考えられます。




↓ 




 

GeminiやGPTでは手書きのあり/なし判定ができるので、LLMにとって難しそうな箇所だけ、結論に書いたような補助処理に回すということも可能です。

ちなみに今回の行政文書の件とはちょっと話題変わりますが、「PDFデータの内容を検索したいとき、OCRではなく、画像のままLLMに理解させてそれをベクター化させるほうが精度が良かった」 という報告も最近上がってきています。

(参考:https://x.com/yuma_prog/status/1969273067709853808?t=a8Pw_6QZxqcHr_VILhgSog&s=31

  


【参考】

[1] 国土交通省が行政文書をLLMで構造化、ドローン安全運行などに生かす | 日経クロステック(xTECH)

 [2] LINKS Vedaプロトタイプ開発レポート

 [3]【13万バズ】📝手書きメモ→写真だけでテキスト化!Geminiが最強。& さらに精度を高めるテクニック、注意点を一挙に解説|たてばやし淳.エクセル兄さん@ AI書籍10冊執筆

記事を書いた人
柴田 晃

2019年に新潟県にある長岡技術科学大学 情報経営システム工学専攻 修士課程を修了。 半導体企業を経て、2024年より株式会社調和技研で従事。 Deep Learningを使用したテキスト解析やAIアクセラレータ開発、カメラ映像を使用した 画像処理などを経験。 現在はLLMを活用したシステム開発、言語系を中心とした研究開発に従事。