レシート撮影からOCR・LLM構造化抽出までを自動化する家計簿(経費管理)アプリ。
- スマートフォンでレシートを撮影すると、サーバー側でOCRとLLMによる構造化抽出が走り、店名・日付・金額・品目・支払方法を自動でDBに登録する。
- 個人事業主の青色申告を想定し、レシートごとに経費該当性・勘定科目・事業按分比率をLLMで自動判定する機能を持つ。
- 二人での共同支出(割り勘)管理に対応する。
src/routes/receipts.py に実装されている、1枚の画像がDBに登録されるまでの流れ。
- 画像検証: MIME判定、EXIF orientationの物理適用、アスペクト比による縦向き補正
- Nextcloud WebDAVの一時領域(
_inbox/{sha256}.jpg)へ保存(冪等性はSHA-256ハッシュで担保) - Surya OCRでテキスト抽出(GPUスケジューラ経由)
- LLMでOCRテキストを店名・日付・金額・品目・支払方法のJSONに構造化
- LLMで経費該当性・勘定科目・按分比率を判定(レスポンス送信後にバックグラウンドで実行)
- PostgreSQLへ登録、Nextcloud上のファイルを月別フォルダへ移動
- QdrantへOCRテキストのembeddingをupsert(類似レシート検索用)
このパイプラインは「1枚の写真にレシート1枚が写っている」ことを前提としており、物体検出は行っていない(コード内コメントに明記)。
training/配下にNanoDetベースのレシート検出モデルの学習コードがあり、学習済みモデルはONNXおよびTensorFlow.js形式に変換されてフロントエンドに同梱されている(frontend/public/models/)。カメラ映像内でのレシート位置検出を意図したもので、iOS Safari向けのWebGPU/WASM対応などコミット履歴に試行錯誤の跡が残っている。
ただし、現在のfrontend/srcのコンポーネント構成にはこの検出モデルを呼び出すコードが見当たらず、現行UIでは使われていない状態(学習・変換パイプラインとしては存在するが、本番の撮影フローには未統合)。
Backend
- FastAPI / PostgreSQL(asyncpg) / Qdrant
- authlib(Google OAuth) + メールアドレスallowlistによる認証
- Nextcloud WebDAVをレシート画像の永続化先として利用
Frontend
- React 19 / Vite / TypeScript / Tailwind CSS
- PWA構成(Service Worker)
検出モデル学習パイプライン
- PyTorch(NanoDet) / ONNX・TensorFlow.jsへのエクスポート
OCR/LLM
- Surya OCR(GPU推論サーバー経由)
- ローカルLLM(構造化抽出・経費分類、GPU推論サーバー経由)
- レシート撮影からの自動登録(単発撮影 / バッチ撮影)
- 一覧・編集・履歴・精算(割り勘)画面
- 再OCR・再構造化(reprocess API、OCRのみ再実行またはLLM再判定のみを選択可能)
- 変更履歴の監査ログ(receipt_audit_logs)