支出の抽出と PostgreSQL 保存¶
関連: Bot の構成 / テーブル定義 / Bot の更新 / PostgreSQL
いまできること¶
Discord / DM のメッセージを Gemini が解釈する。
- 支出なら
expensesテーブルに保存 - 関西弁の
replyを返す(依存や嫉妬は出さない) - 雑談なら保存せず返事だけ
- 「今月の内訳」ならカテゴリ合計と明細を付ける。続けて自然言語で訂正できる
店名の Web 検索正規化は試して撤回した。 経緯と制約は 店名 Web 検索の試行知見。
テーブル¶
定義は sql/001〜004。
Bot 起動時に順に自動適用される。
主な列:
| 列 | 意味 |
|---|---|
amount_yen |
金額(円) |
merchant |
店名など |
category |
大分類(taxonomy.py の固定リスト)。不明は「その他」 |
subcategories |
小分類配列(同じファイルの固定リスト)。一覧外は捨てる |
occasion |
場面(朝食/昼食/…)。不明なら null |
occasion_reason |
場面推定の短い根拠 |
line_items |
レシート内訳(JSONB)。読めなければ null |
raw_text |
元メッセージ(画像のみは [image]) |
paid_at |
利用日時(分かれば) |
大分類と小分類(固定)¶
定義は src/finance_manager/taxonomy.py。
- 大分類 (
category) - 変動: 食費 / 日用品 / 趣味 / 医療 / その他
- 固定費の実績: 家賃 / 通信 / 光熱費 / 仕送り / サブスク
- 小分類 (
subcategories): コンビニ / カフェ / 遊び / 映画 / サブスク / 旅行 / …(最大5)
旧名の読み替え: 娯楽、衣服、交通 → 趣味、教育 → その他。
増やすときはそのファイルを編集する。
複数件の記録¶
1メッセージに複数の支出を書ける。
例: スタバ680とセブン320
→ expenses 配列として複数 INSERT。返事に id=…, … が並ぶ。
事前確認¶
.env に DB 接続があること:
依存関係を更新する手順は Bot の更新。
試し方¶
- コードを入れたら Bot の更新 どおり
git pull+systemctl restart - DM か指定チャンネルで送る
- テキスト例:
スタバで680円 食費 - 画像例: レシート写真のみ、または「これ記録して」+ スクショ
- 返事に
DBに保存したで。id=...が付けば成功 (場面、内訳が取れたときは場面=夕食/内訳N件も付く) - 「今月の内訳」で一覧が出る。
id 42 を趣味にで分類を直せる - DB で確認:
psql -h 127.0.0.1 -U finance_app -d finance_manager -c \
"SELECT id, amount_yen, merchant, category, subcategories, occasion, line_items, created_at
FROM expenses ORDER BY id DESC LIMIT 5;"
ガードレール¶
- テキストのみ: Gemini が抜いた金額が本文の数字に含まれていなければ保存しない
- 画像あり: 金額は画像 OCR 由来なので、本文に数字が無くても保存可(捏造禁止はプロンプト側)
is_expense=trueでも金額が不正なら雑談扱い- 内訳は画像で明細が読めるときだけ。見えなければ空