1. レシート読み取りの「文字化け」と「手入力」の悩み
我が家では日々の家計管理に『くふう Zaim』(以下、Zaim)を愛用しており、その素晴らしい機能にはとても感謝しています。ただ、毎日ヘビーに使っているからこそ感じる、レシート読み取りに関する「悩み」がありました。
1つ目は、お店でもらうレシートの 「カメラ読み取りがうまくいかない」問題 です。
スーパーやドラッグストアのレシートによくある「半角カタカナ」は文字化けしてしまい、品名が崩れてしまうことがよくあります。また、品目が左右2段に並ぶような複雑なレシートだと、金額との紐付けが正しくできず、結局あとからすべて手入力で打ち直す手間が発生していました。
2つ目は、Amazon.co.jpやヨドバシ.comなどのネットショッピングの購入履歴を入力する際の手間です。
「品名の下に金額がある」「日付が離れた場所にある」といったスクショ画像だと、これまでのカメラ読み取りでは品物と無関係な記号まで拾ってしまい、うまくデータ化できませんでした。
こうした 「結局、あとからすべて手入力で打ち直す手間」 をどうにかラクにしたい!と思い、最新のAI(Gemini)の文脈を読み取る力を活用して、半角カタカナも自然な日本語に直してくれる入力補助ツール 『Zaim Lens』(非公式アプリ)を個人開発しました。MITライセンスのOSSとしてソースコードも公開しています。
アプリURL
ソースコード(GitHub)
機能紹介 (note)
2. 解決策:普段使いのGeminiアプリからの着想
「なんとかもっと楽に入力できないか」と考えていたとき、ヒントになったのは普段使いしているGeminiのチャットアプリでした。
日常的にGeminiにスクリーンショットを貼って質問していると、画像内の複雑な情報や文脈を驚くほど正確に読み取ってくれます。「この精度の高さをそのまま活かせば、複雑な購入履歴のスクショからZaim用の入力データを作れるのでは?」という思いつきが、『Zaim Lens』開発の起点です。
従来のOCRで「文字を読む」システムを自前で組むのではなく、最初から「画像全体をマルチモーダルLLMに渡し、人間のように画面の文脈を理解させる」アプローチを採用しました。
3. コアエピソード:驚くほど「凝っていない」プロンプト
LLMを使ってデータを抽出すると聞くと、「複雑なFew-shot(例示)プロンプトを書いたのでは?」と思われるかもしれません。しかし、ある程度期待していた通り、複雑なプロンプトエンジニアリングは一切不要でした。
実際にGemini APIに投げたプロンプトの要はシンプルです。(このプロンプト自体もGeminiアプリで聞きました)
※末尾でZaimのカテゴリマスターデータをテキストとして動的に流し込んでいます。
これだけで完璧に動作しました。ガチガチのルールベースの指示出しはしていません。
▼ 実際の処理結果の例①
実際に複雑なレシートをZaimとZaim Lens (Gemini) それぞれに読ませた結果をご覧ください。
・Zaim:カタカナの「レ」をひらがなの「し」と読み取る等の崩れあり
・Zaim Lens (Gemini):正確に読み取り
▼ 実際の処理結果の例②
続いて「Amazonの購入履歴スクショ」をZaim Lens (Gemini)に読ませた結果をご覧ください。(画像は掲載のため一部マスクしています)
商品名が長く、間に「再度購入」などの不要なボタンがあり、さらに末尾には「ポイント利用」のマイナス表記もある、従来型のOCRならパースが崩壊する画面です。
しかし、先ほどのシンプルなプロンプトを通すだけで、構造化に成功しています。
Geminiの「空気を読む力(文脈理解力)」は凄まじく、画面内にある不要なUIテキストは自動でノイズとして弾き、「意味の通るデータ」だけを見事にピックアップしてくれました。
注目すべきは、マスターデータに基づいた、「家具」や「下着」といったカテゴリの自動推論に加え、「ポイント利用(-78円)」まで正確に文脈から読み取っている点です。
実際のプロンプト構築とAPI呼び出しを行っている部分のコードはこちらです。
4. 技術的な実装ポイント(エンジニアとしての旨味)
今回の実装において、技術的に強力だったポイントが以下の2点です。
① Structured Outputs(JSONモード)の活用
Gemini APIの機能を使って出力フォーマットを厳密にJSONに指定(Structured Outputs)することで、抽出したデータをそのままZaim APIの入力データ(リクエストボディ)としてシームレスに連携できました。後段で文字列をパースするような処理は一切書いていません。
② フォーマット揺れの吸収をLLMに丸投げ
「2026年3月10日」や「03/10」、「¥5,980」や「5980円」といった表記揺れも、プロンプト内で「日付はYYYY-MM-DD、金額は数値のみ」と指示するだけで、Gemini側でZaimが受け付ける統一フォーマットに成形して出力してくれます。
5. 結論:個人開発におけるAIの恩恵
もしAIを使わずにこの仕組みを自前で作ろうとしたら、画像から抽出したテキストの塊に対して、正規表現を駆使して日付や金額を特定し、フォーマットを整える…といった泥臭い処理を必死に実装する必要があったはずです。
しかし、Geminiの登場により、そうしたデータの抽出・成形という重労働を丸ごとAIに任せられるようになりました。
その結果、開発者はデータ抽出の精度向上に頭を悩ませる必要がなくなり、「いかにユーザーが快適に使えるか」というUXの構築に時間を投資できるようになりました。今回で言えば、Progressive Web Apps (PWA)を採用し、スマホの「ホーム画面に追加」からネイティブアプリのようにサクサクと登録できる滑らかな体験作りに注力できたのが最大の収穫です。
複雑なプロンプトはもう要りません。画像の構造化データ化に悩んでいる方は、ぜひGemini APIの素の「文脈理解力」を信じて、シンプルな指示を投げてみてください。
参考リンク
- 今回開発したPWAアプリ:Zaim Lens(※非公式ツール)
- 『Zaim Lens』のソースコード:GitHub
- 『Zaim Lens』紹介記事①(note)
本記事ではAI実装の裏側にフォーカスしましたが、こちらのnoteでは「半角カナの文字化け」や「ネットの購入履歴」など、Zaimユーザーのリアルな悩みを『Zaim Lens』でどう解決できるか、具体的な使い方をまとめています。日々の家計簿入力にストレスを感じている方は、ぜひこちらもご覧ください!
- 『Zaim Lens』紹介記事②(note)
Zaimプレミアムユーザー向けにもう一つ「複数アカウント間の履歴コピー」というマニアックな機能も実装しています。具体的な使い方やアプリの全容はこちらのnoteにまとめていますので、複数アカウントの管理にお悩みの方は、ぜひこちらもご覧ください!


