おはようございます。まさきんです。
以前、AIとfreeeを組み合わせて家計を毎朝振り返る仕組みを紹介しました。今回はその夜バージョンです。その日使ったカードの利用を、寝る前にAIが自動でチェックしてくれる仕組みについて書きます。
朝の振り返りが「昨日の傾向から気づきを1つ」だとすると、夜の仕組みはもう少し性質が違います。「今日、確認しておいたほうがいい支出があるか」を、その日のうちに拾うための仕組みです。今回は判定ルールの数式や、実行時の細かい制御まで含めて紹介します。
きっかけは「大きな支出ほど後回しになる」こと
日々の細かい支出は、家計簿アプリで自然と記録されていきます。ただ、単発の大きな支出は別です。「あとで話そう」と思っているうちに忘れてしまうことがあります。
なので、金額の大きい支出だけを狙って拾い上げ、その日のうちに認識できるようにする仕組みを作りました。この仕組みは人が起動するのではなく、決まった時刻に自動で実行される「スケジュールタスク」として動いています。
自動実行だからこそ気をつけていること
決まった時刻に自動で動く以上、その場で人に確認を取ることができません。なので、実行の前提として次のようなルールを敷いています。
- 途中のどこかの取得が失敗しても、そこで処理を止めずに残りを続行する
- 判断がつかない場合は、無理に踏み込まずスキップしてログにだけ残す
- 外部APIの取得が失敗した日は、通常の集計をあきらめて簡易な振り返りにフォールバックする
自動実行のタスクは「完璧に動く」ことより「毎日必ず何かしらの結果を残す」ことを優先する設計にしています。
支出を3種類に分けて扱う
すべての支出を同じ基準でチェックすると、通知だらけになって逆に見なくなります。なので、支出を次の3種類に分けて扱っています。
| 種類 | 内容 | チェック対象か |
|---|---|---|
| 固定費・サブスク | 毎月ほぼ同額で発生する支払い | 対象外(除外) |
| 事前に合意済みの大きな買い物 | あらかじめ家族で話していた支出 | 対象外(除外) |
| それ以外の支出 | 突発的・裁量的な支出 | チェック対象 |
固定費は毎月同じなので、都度チェックしても意味がありません。事前に合意済みの支出も、すでに話し合い済みなので通知の必要がありません。チェックすべきは、それ以外の「その場で発生した支出」だけです。
固定費の代表は、家賃だったり通信費だったりします。金額がほぼ動かないからこそ、日々のチェック対象から外しているわけです。
サブスクの判定で迷う業者(単発なのか定期購入なのか判断がつかないもの)は、無理に「サブスク」に含めず「判定保留」として別に1行記録するようにしています。ここを曖昧なまま進めると、あとから集計全体の信頼性が揺らぐと感じています。
ただ、チェックから外している支出にも例外はあります。通信費のような固定費こそ、たまに見直す価値があると感じています。日々の監視は自動化できても、固定費の水準そのものは自分で動かすしかありません。
「相談すべき支出」の判定ルール
チェック対象の支出のうち、一定額を超えるものだけを「相談すべき支出」として扱っています。AIに渡している指示を一般化して紹介します。
本日のカード利用明細から、次の手順で「相談すべき支出」を抽出してください。
1. 固定費・サブスクに分類済みの取引は除外する
2. 事前合意リストに登録済みの取引は除外する
3. 残った取引のうち、1件あたり一定金額(目安として1万円)以上のものを抽出する
4. 抽出した取引は「金額」「利用先」「時刻」の3項目で一覧化する
一定金額を超える取引がなければ、「本日は該当なし」とだけ回答すること。
基準となる金額は家庭によって適切な水準が変わると思います。大事なのは「いくらか」より、「事前に基準を決めておく」ことだと感じています。基準がないと、結局あとから「これは相談すべきだったかどうか」を毎回議論することになります。
同期の遅延を数値で扱う
家計簿SaaSのカード連携は、数日程度の反映遅延が常態です。連休明けなどはさらに遅れます。これを「異常」として扱うと、通知が誤検知だらけになります。なので、遅延を次の指標で数値化しています。
latest_txn_date: そのカードで直近に観測できた取引の日付lag_days: 今日の日付 −latest_txn_date(日数)lag_status:lag_daysの大きさから次の4段階に分類する
| ステータス | 目安の日数 | 意味 |
|---|---|---|
| normal | 2日以内 | 通常の反映遅延の範囲 |
| watch | 3〜4日 | 連休明けなどで様子見 |
| delayed | 5〜9日 | 長期休暇などで起こりうる遅延 |
| stalled | 10日以上 | 長期間、取引が反映されていない状態 |
ポイントは、stalled(長期間反映なし)を即座に「連携の不具合」と決めつけないことです。単純に「そのカードをしばらく使っていないだけ」というケースの方が、実際には多いからです。
「使っていないだけ」と「連携の不具合」を切り分ける
stalledを観測したら、断定する前に過去30日分の取引パターンを確認します。
- 過去30日で1件以上の取引があり、直近だけが10日以上空いている → 単純な長期未利用。連携自体は生きている
- 過去30日で取引が完全に0件で、かつ実際には使った記憶がある → 連携の不具合を疑う
ただし、後者だけでも即座に「不具合」と断定はしません。次の3条件がすべて揃って初めて、連携の不具合として扱います。
- 複数のカードで同時に
stalledが発生している - 実際に使った記録(レシートやメモなど)が別途残っているのに、家計簿SaaSには出てこない
- 家計簿SaaS側の画面で、同期エラーの表示を目視で確認できる
3条件が揃わない限りは、「N日間カードを使っていない(節約傾向の継続)」として中立的に扱い、いたずらにアラートを出さないようにしています。この切り分けを入れる前は、単に使っていないだけのカードについて「連携が壊れているのでは」と毎回不安になっていました。
外部APIの呼び出し回数に上限を設ける
自動実行のタスクなので、何かのはずみで無限にAPIを呼び続けるループに陥らないよう、1回の実行あたりの呼び出し回数に上限を設けています。
- 通常のパターン(当日分の取得・月初からの累積取得など)で、あらかじめ想定される呼び出し回数を数えておく
- 想定外のエラーが起きても、上限回数に達した時点でリトライをやめ、即座に「取得失敗」としてフォールバックする
- 「回数上限に達したので処理を打ち切る」ことを、タイムアウトを待つことより優先する
上限を決めておかないと、認証エラーなどが起きたときに再試行を繰り返し、無駄なリクエストを送り続けてしまうリスクがあります。自動実行の仕組みほど、こうした歯止めが必要だと感じています。
「異常が続いている」ことと「新しい異常」を区別する
月内の支出が目安の一定割合を超えたときに通知するルールを入れているのですが、これをそのまま日々の通知に使うと、一度超過したあとは月末まで毎晩同じ通知が続くことになります。これでは「新しく閾値を割った日」と「すでに超過していて変わらず超過している日」の区別がつきません。
なので、超過が何日続いているかをカウントし、「超過継続◯日目」という形で添えるようにしています。新規の異常と継続中の異常を区別できると、週次で振り返るときにも状況を正しく把握しやすくなります。
通知はあえて地味にしている
「相談すべき支出」が見つかった日も、通知は淡々とした内容にしています。金額と利用先を提示するだけで、良し悪しの判断はしません。
判断するのは自分たちです。AIの役割は、「見落としそうな支出に気づかせること」までだと割り切っています。
やってみて感じたこと
一番の効果は、大きな支出について「言った言わない」がなくなったことです。その日のうちに情報が共有されるので、話すタイミングを逃しにくくなりました。
一方で、基準金額の設定は最初から完璧にはできませんでした。低すぎると通知が多すぎて形骸化し、高すぎると意味のある支出を見逃します。何度か調整して、今の水準に落ち着いています。
こういう人に向いている
- 家計簿アプリでカード連携はしているが、大きな支出の共有にタイムラグがある人
- 家族で「支出の相談ライン」を明確にしたい人
- 自動実行タスクの誤検知・過検知を、地道にチューニングしていく作業を厭わない人
まとめ
固定費と合意済みの支出を除外し、それ以外の大きな支出だけを拾う。このシンプルな絞り込みが、通知を形骸化させないコツだと感じています。
同期遅延を数値化して「使っていないだけ」と「不具合」を切り分ける視点、APIの呼び出し回数に上限を設ける歯止め、どちらも地味ですが、自動化を安定して回し続けるうえで効いていると実感しています。
この仕組みが拾うのは、あくまで変動する支出です。一方で通信費のような固定費は、性質が違います。都度チェックするより、一度見直すほうが効果は長続きするのではないでしょうか。自動化と並行して、そちらにも目を向けてみようと思います。
本記事にはアフィリエイト広告を含みます。当サイトのリンクを経由して商品・サービスへお申し込みいただいた場合、提携先企業から成果報酬を受け取ることがあります。 また、運営者は楽天グループに所属する社員であり、紹介プログラムを通じた報酬を受け取る場合があります。記事内容・評価は広告の有無にかかわらず、運営者の実体験と調査に基づき作成していますが、 上記の関係性をご理解のうえお読みください。詳しくは免責事項・アフィリエイト表記をご覧ください。