0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

f25: Local LLM で レシートの文字起こしテスト

0
Last updated at Posted at 2026-07-28

.

/ 2026/08/17 追記 STR

レシート読み込み自動化の検討

少し調べていくと、やはりレシートなどの読み込みに関しては、
汎用のマルチモーダルモデルよりも、
文字認識特化モデル「glm-ocr」 のほうがよさそうで、

「OCR (AI-OCR) 特化」のポイント

  1. 雑談やフワッとした質問には答えない(Prompt Limited)
  2. 「見落とし」や「嘘(ハルシネーション)」を極限まで減らしている
  3. 圧倒的に軽くて速い

端末のスペックは置いといて、試してみようとも思ってますが、

スマホ(Googleレンズ)での暫定運用案

並行してスマホ(googleレンズ)での文字起こしも試していたところ、
以下が思ったよりも快適で、識字間違いほぼなしでまわせたので、
ひとまずは運用してみようと思います

  • スマホで、紙のレシートを撮影し、
  • そのまま google レンズに共有して以下いずれかを指示:
    「改行つきでコピーできるように文字起こしして」
    「csv形式で改行つきでコピーできるように文字起こしして」
  • 起こしたテキストを「共有」でメールに送信
    ( メールからスクリプト、ないしは直接スクリプトへ送信したら、
    必要な箇所だけ整形して、スプレッドシートへ貼り付け、なんてこともできそうです )

/ 2026/08/17 追記 END


Local LLM がお手軽に試せる感じでしたので、
一般的な軽作業的ノートPCにメモリを増加して
Local LLM + レシート画像の読み込み、文字起こし
を試してみたのでメモです

各環境や処理状況によって結果は変わってくると思いますので、
「ふーん」くらいの感じで見てください


[ 00. メニュー ]

01. キッチン

02. 結論を先に

03. OCR なのか AI なのか

04. 仕込み

05. 調理1 (gemma4:e2b) / (gemma4:e4b)
06. 調理2 (qwen3-vl:30b)

07. デザート


[ 01. キッチン ]

 ・ intel core i5 1235U + 64GB ram
 ・ zorinos 18.1 core

 ・ よくあるコンビニやスーパーなどでもらう紙の縦長のレシート

 ・ $ ollama list
  NAME       SIZE
  gemma4:e2b   7.2 GB
  gemma4:e4b   9.6 GB
  qwen3-vl:30b   19 GB


[ 02. 結論を先に ]

まずは結論を申しますと、
「動くけど、現実的ではない」
というところに落ち着きます

以下各モデルのテスト状況です
(各時間は、指示の開始から文字表示完了までの時間)

1. gemma4:e2b -> 01m 18s
-> 識字の間違いがひどい

2. gemma4:e4b -> 03m 13s
-> セクションごとの区分けがされたが、識字の間違いがひどい

3. qwen3-vl:30b (後述: qwen3-modal:latest) -> 18m 24s
-> 間違いはほぼなし、処理時間長がひどい

という状況で、スペック的に
(オンボードGPUでNPUなし、メモリを少し増やしただけ)
予測される結果(識字率、処理時間)でした

ちなみに、qwen3-vl:30b は、
テキストのみの場合でも、
(例:あなたの中での最新情報は何年何月分ですか?)
約 10 分後の回答と、長い処理時間でした
(最新情報は2023年10月までだそうです)

処理時間を無視した場合、
qwen3-vl:30b の識字はかなり秀逸でした


[ 03. OCR なのか AI なのか ]

今回の目的は、画像読み込み -> 文字起こし です

その指示として、あまり何も考えず、
「このレシートの画像から文字起こしをしてください」
というゆるい指示で試してみました

この場合、OCR としての処理になるのか、
AI としての処理なのか、ふと疑問に思いましたが、
gemma や qwen の画像認識対応モデルは、
「独立したAI-OCR機能」を内包しているわけではありませんので、
仕組みとしては「マルチモーダルな画像読み込み
(視覚表現によるテキスト変換) 」となります

======================================
「OCR」と「マルチモーダル」の画像読み込みの違い

A.OCR (AI-OCR) の画像読み込み

 手法:画像内の文字の位置を検出して、
 それぞれの文字をフォントパターンと照合して
 テキストデータに変換する

 特性:請求書や書類からの正確な文字起こし

 【メリット】
 ・ハルシネーション (嘘) が起きない:
  マルチモーダルは文脈から文字を「推測・生成」するため、
  存在しない文字を捏造することがあります
  一方、OCRは文字の形状をそのまま認識するため、
  勝手な文章の創作が起きない

 ・非定型・脈絡のない文字列に強い:
  型番、パスワード、ランダムな英数字、
  意味を持たない記号の羅列など、
  前後の「文脈」から推測できない文字列でも、
  見たままを正確にテキスト化できる

 ・座標情報 (文字の位置) を取得できる:
  どの文字が「画像のどこ (X座標・Y座標)
  にあったか」をデータとして保持できるため、
  請求書の「金額」や「日付」といった特定の
  レイアウト位置から正確にデータを抽出する
  業務自動化 (RPA) に最適

B.マルチモーダルの画像読み込み

 手法:画像全体の「文脈・意味・状況」を総合的に理解する

 特性:画像の解説、グラフの分析、矛盾の発見、デザインの評価

 ・ビジョンエンコーダーによる特徴量化:
  入力された画像は、まず視覚を司る
  ニューラルネットワーク (Vision Transformerなど)
  によって、画像全体の意味や形状を示す
  「特徴量 (ベクトルデータ) 」に変換される

 ・テキスト生成モデルによる言語化:
  変換された画像の特徴量を、LLM (言語モデル部) が
  直接読み込みます。モデルは「この画像の特徴の
  並びからすると、次に来るべきテキスト (文字)
  は何か」を確率的に予測し、文章として出力する

 【メリット】
  文脈の理解:かすれて見えにくい文字や、
  手書きの癖が強い文字でも、前後の文章の流れ
  (文脈) から「ここはおそらく〇〇という単語が入る」と
  推測した(自動補正による)文字起こしをすることができる

======================================


[ 04. 仕込み ]

1. 取り込みのレシート画像

スマートフォンなどで撮影して
Local LLM を搭載する PC にあらかじめ転送しておきます

2. Local LLM 構築

テストを行う Local LLM モデルですが、
マルチモーダル的に画像読み込みに対応した以下のモデルにしました
1. gemma4:e2b 7.2 GB
2. gemma4:e4b 9.6 GB
3. qwen3-vl:30b 19 GB

構築に関しましてはみなさま色々と
記事にされてそうですので、ざっと記載します

※ 導入したいモデルごとに (容量も気にしつつ)
 以下の、[B. モデルのダウンロードと起動] が必要です

※ linux (deb系) で使用した例です

 ==================================
 A. ollama (Local LLM モデル管理ツール) のインストール

 $ curl -fsSL https://ollama.com/install.sh | sh

 ==================================
 B. モデルのダウンロードと起動 (例: gemma4:e4b)

 $ ollama run gemma4:e4b
 >>> send a message

 が表示されれば成功です
 -> ターミナル上でテキストのみで使うならこのままでも使用可能

 日本の首都はどこですか?
 などと入力すれば、
 日本の首都は東京(とうきょう)です。
 のように答えが返ってきます

 ======================================
 [ ollama tips 1 ]

 改行したい場合は Ctrl + Enter
 (または Shift + Enter) を押します

 ======================================
 [ ollama tips 2 ]

 対話を終了して元の画面に戻りたいとき:
 キーボードの Ctrl + D を押すか、
 「/exit」と入力してEnterを押すと、ollama を終了できます

 ======================================
 [ ollama tips 3 ]

 再度、モデルを起動する場合、
 ダウンロード時と同じ実行方法で、そのまま起動できます

 $ ollama run gemma4:e4b

 ======================================
 [ ollama tips 4 ]

 現在 PC にダウンロードされているモデルの一覧を見たいとき:

 $ ollama list
 NAME          ID              SIZE      MODIFIED      
 gemma4:e4b    abcd12345678    9.6 GB    4 minutes ago 

 ======================================
 [ ollama tips 5 ]

 LLM モデルの保存先を /home/ 側に変更する方法

 標準では、

 $ ollama run llama3.1:8b

 などと実行した場合、LLM モデルは、システム側
 /usr/share/ollama/.ollama/models/
 に保存されますが、容量を圧迫してしまうので、
 /home/ 側に DL されるようにします

 設定手順

 1. 新しい保存先フォルダを作成する

 モデルを保存したい場所に新しいディレクトリを作成します

 $ sudo mkdir -p /home/ollama_models

 2. ディレクトリの所有権を変更する

 ollama の標準インストールでは、ollama という
 専用のシステムユーザーで実行されます
 作成したディレクトリに ollama が書き込めるよう、
 所有権を変更します

 $ sudo chown -R ollama:ollama /home/ollama_models

 3. ollama サービスの設定を編集する

 $ sudo systemctl edit ollama.service

 エディタが開いたら、
 [Service]
 の下に
 Environment="ollama_MODELS=/home/ollama_models"
 を追記して保存、なのですが、
 ついでに、下方の「C-3c. モデル選択不可の場合」で
 記載している no model available の対策として、
 Environment="ollama_HOST=0.0.0.0"
 Environment="ollama_ORIGINS=*"
 も一緒に記述しておくとあとで楽です

[Service]
Environment="ollama_MODELS=/home/ollama_models"
Environment="ollama_HOST=0.0.0.0"
Environment="ollama_ORIGINS=*"

 で、保存

 -> Successfully installed edited file '/etc/systemd/system/ollama.service.d/override.conf'

 確認:

 $ cat /etc/systemd/system/ollama.service.d/override.conf

 4. 設定を反映してサービスを再起動する

 変更した設定をシステムに読み込ませ、ollama を再起動

 $ sudo systemctl daemon-reload
 $ sudo systemctl restart ollama

 -> 以降、新規 DL 分は、/home/ 側に保存される

 5. 既存モデルの移行方法

 すでに DL してしまっているモデルがある場合は、
 手動で新しい場所に移動させることでそのまま使えます

 $ sudo systemctl stop ollama
 $ sudo mv /usr/share/ollama/.ollama/models/* /home/ollama_models/
 $ sudo chown -R ollama:ollama /home/ollama_models/
 $ sudo systemctl start ollama
 $ ollama list

 ======================================
 C. web上で使えるように「Open WebUI」を入れる

 今回は、画像を読み込むので、ブラウザ(web)で
 ChatGPTのように使える
 「Open WebUI」をDocker等で導入します
 pcts2-0720-225320.png

 C-1. Docker が入っていない場合は入れておきます
 (※ 一例です)

 $ sudo apt update && sudo apt install -y curl

 $ sudo mkdir -p -m 755 /etc/apt/keyrings

 $ curl -fsSL https://docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg

 $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 $ sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

 C-2. Open WebUI のインストールと自動起動設定

 $ sudo docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

 C-3. Open WebUI を web で実行

 ブラウザ ( chrome や firefox など) を開き、
 アドレスバーに以下を入力してアクセスします
 http://localhost:3000

 ブラウザ画面を開いた後の初期設定

  C-3a. アカウント作成

  最初にログイン画面が出ますが、これはローカル PC 内だけの管理用です
  適当な名前、メールアドレス、パスワードを決めて
  サインアップ (Sign Up) してください

  name: onamae
  email: watashi@ouchi.com
  pass: tekitou

  C-3b. モデル選択

  C-3b1. 画面左上に[B. モデルのダウンロードと起動]
  で DL した モデル(例:gemma4:e2b 等) が
  リストに表示されるのでそれを選びます
  (またはすでに選択されていればそのまま)

  pcts3-0720-225356.png

  C-3c. モデル選択不可の場合

  no model available (利用可能なモデルがありません)
  と表示される原因は、Dockerコンテナ (Open WebUI) から、
  OS 本体で動いている ollama (localhost) への
  通信がブロックされている可能性が高いです
  その場合は、以下の手順で、ollama 側の設定を変更して
  通信を許可してあげると解決します

  C-3c1. ollama の設定ファイルを編集する

  以下のコマンドを実行して設定ファイルを開きます

  $ sudo systemctl edit ollama.service

  一番下の行に以下の3行をそのまま貼り付けてください

[Service]
Environment="ollama_HOST=0.0.0.0"
Environment="ollama_ORIGINS=*"

  で、保存

  C-3c2. ollama 再起動

  $ sudo systemctl daemon-reload
  $ sudo systemctl restart ollama

 C-3d. Open WebUIで確認する設定が完了したら、
 ブラウザの Open WebUI 画面 (http://localhost:3000)
 に戻り、ページを一度再読み込み (F5キー) してください

 C-3e. 補足

 「3. ollama サービスの設定を編集する」
 の部分でも出てくる、

 $ sudo systemctl edit ollama.service

 の実行で、
 /etc/systemd/system/ollama.service.d/override.conf
 の新規ファイルが作成されます
 (override.conf というファイルは、元の設定ファイル(ollama.service)を
 書き換えるのではなく「指定した部分だけを上書き(追加)する」ためのファイル)

 個人的には systemctl edit での編集は使いにくいので、
 vi で修正しました

 $ sudo vi /etc/systemd/system/ollama.service.d/override.conf

 その場合は、事前に以下 mkdir が必要です

 $ sudo mkdir -p /etc/systemd/system/ollama.service.d/ 

 確認:

 $ cat /etc/systemd/system/ollama.service.d/override.conf

[ 05. 調理1 (gemma4:e2b) / (gemma4:e4b) ]

Local LLM + Open WebUI 環境の構築後、
web上で + ボタン -> Upload Files にて
「転送しておいたレシート画像」
(例:スーパーのお買い物のレシート画像)を選択し、
「このレシートの画像から文字起こしをしてください」として実行

pcts4-0720-232051.png

結果的に、以下の2つのモデルは
数値も2バイト文字も、間違いだらけでした
「gemma4:e4b」は少し向上している感じもしますが、
数値の間違いは問題が大きく、実用としては難しいです

======================================
「gemma4:e2b」

・登録番号 T4200001020808
 -> T42000120808

・2026年07月14日(火)10:27 レジ0003
 -> ○月14日(火)×10:27 料 ¥0003

・北海道牛乳 ¥198 -> 北海道税金 ¥198
 (下方の税込、税合計などから推測されている形跡)

・小計:¥1,302 -> 文字起こしなし

・合計/ 9点 ¥1,406 -> ¥2062 (税込)

・(OK) 店No00122 -> 店No00122

など

======================================
「gemma4:e4b」

・店舗・日時情報(ヘッダー)
・購入品目リスト(アイテム)
・金額計算(トータルの部分)
・支払い情報・識別番号(フッター)

などの名目の区分けが記載された
(文字起こしとしては、その区分け行は不要)

・2026年07月14日(火)10:27 レジ0003
 -> (OK) 2026年07月14日(火)10:27 レジ0003

・玉ねぎとおかかのサラダ ¥128
 -> 玉ねぎとき あかかのサラダ ¥128

・(OK) 小計:¥1,302 -> 小計:¥1,302

・合計/ 9点 ¥1,406 -> (税込) 合計:¥5.46

・トランザクションID 071410283522914
 -> トヨタクラウド:07141028352914

・(OK) 店No00122 -> 店No00122

など

======================================


[ 06. 調理2 (qwen3-vl:30b) ]

「gemma4:e2b」「gemma4:e4b」と同じように、
「qwen3-vl:30b」に切り替えて
同じように実行したところ、実行エラーになりました

qwen3-vl:30b
{"error":{"code":400,"message":"request (4270 tokens) exceeds the available context size (4096 tokens), try increasing it","type":"exceed_context_size_error","n_prompt_tokens":4270,"n_ctx":4096}}

このエラーは「送った画像と指示のデータ量が、
AIが一度に記憶できる制限 (コンテキストサイズ) を超えてしまった」というエラーで

ollamaのデフォルト設定ではこの制限が
「4,096トークン」に絞られているため、
画像1枚を投げただけで 4,270トークン に達してしまい、
制限オーバー (exceeds the available context size) で拒否されてしまいました

解消方法はいくつかあるようですが、ひとまず以下で解消しました

1. 設定ファイル(Modelfile)を作成する

$ echo -e "FROM qwen3-vl:30b\nPARAMETER num_ctx 16384" > Modelfile

2. 記憶容量を広げた新しいモデルを登録する

$ ollama create qwen3-modal -f ./Modelfile

(※ qwen3-modal としてますが、名前はなんでもよいです)
(※ 成功すると画面に success と表示されます)

3. Web画面を一度リロード(再読み込み)
http://localhost:3000
リロード(再読み込み)すると、モデルの選択肢に新しく
qwen3-modal:latest という名前のモデルが
追加されますので選択して使用

上記対応後、再実行しましたが、結論に記載のとおり、
「精度はかなりよいが、ものすごく処理時間がかかる」
でした

結果的に、1枚のレシートに18分かかるのは
問題が大きく、環境まわりなどを改善しないと、
今回の環境での実用は難しいです

======================================
「qwen3-vl:30b (qwen3-modal:latest)」

・1回目、2回目と同じ処理を実施しました
・処理時間はさほど変わらずです

 1回目、以下以外はすべて画像通りの文字お起こし

 ・小計 (外8% タイショウ) ¥1,302
  -> 小計 (外8% ダイシュオ) ¥1,302

 2回目、以下以外はすべて画像通りの文字お起こし

 ・玉ねぎとおかかのサラダ ¥128
  -> 玉ねぎとおかのかのサラダ ¥128

======================================


[ 07. デザート ]

結論としては、現状、運用するには、
「非力スペック環境では現実的ではない」
に尽きるのですが、

今後、環境は改善などするとして、

レシートの読み込みや、OCRなどは
ファクトチェック
(というか画像通りに文字起こしがされているか)
の確認は必要ですが、新たな学習は不要であり、
qwen3-vl:30b 同等レベルのモデルが快適に動けば

課金なしで、複数画像を一括で
バックグラウンド処理させっぱなしにして
DBに登録していくなどの仕組みを
考えていけそうな夢でした

まぁ快適に動く環境が実現できれば、ですが

最近の grok などのトークン節約志向にしても、
今後、必ずしもスペック増強一辺倒だけでは
なくなりつつあることを祈りつつ様子見です


.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?