🕌

LLM で作る家計簿CLI アプリケーション

に公開

初めに

前回から約半年ほど経ってしまいましたが、LLM(AI)を用いてアプリケーションを作っていくという活動2回目です。

pythonで家計簿のCLIアプリケーション has-cliというのを作成しました。
実際、私自身の家計簿として活用できているし、せっかくなのでGithub 公開しています。
https://github.com/skzy2018/has-cli/

対象読者

  • 家計簿アプリに興味のある技術者? / 家計簿においてAIの活用に興味がある人?
  • python アプリに興味のある人?
  • LLM(Cline)で開発に興味ある人? (今回この辺りの内容全然少ない)

どんなツールか?(これは車輪の再発明なのか?)

皆さん自分たちの家計簿って、どんなふうにつけてます?

やはり、こんなのとか、こんなのとか、その他にも星の数ほどある家計簿ツールで、最近では大体のところ各銀行口座サイトなどと連携してほぼ自動で収支全体を把握できるようになっており、便利な世の中になったものです。
ただこの連携、実際の銀行口座アカウントを設定しなければならずセキュリティが心配になったり、そもそも連携先が限られていたりするわけで、なんとも歯痒い思いを(人によっては)感じる可能性もあるわけです。

僕なんかは、銀行口座サイトやクレジットカードサイトから取引明細のファイルをダウンロードして、ローカルの家計簿ツールにポチポチ入力していた時代を生きてきたわけで、今さらそんなアカウント連携なんかしちゃって良いのかしらん、と思うわけです。
そして、そもそも取引明細の集計情報は取引先相手ほどあるわけで、そのフォーマットが千差万別なものを家計簿に入力する"ポチポチ"作業が大変(ペイン)だったのです。なので、そのデータ変換自体を今のAI技術を利用して自動化、整理・調整してくれれば、あとは家計簿データベースとして保存できればいいのでは、と考えていました。

(取引情報のダウンロード自体もペインではあるんですが、この取引明細ファイルの取得方法もそれぞれですし、サイトからのダウンロードは個別にplaywrightを書くしかないかと考えました)
一応、腐ってもデータエンジニアなのでSQLは適当に書けます。DBさえあれば、確認したい情報をDBからSQLで抽出するのは苦ではないのです。そこは後回し。

と言うわけで、僕の要件としては以下:

  • 各社銀行やクレカ会社からダウンロードしたバラバラなフォーマットの取引明細ファイルを
  • AIを使って仕訳して、
  • 共通の家計簿データベースの取引情報にロードする
  • (DBに対しては、適当な集計結果の表示とsql実行ができればいい)

こんなの、今時のアプリは機能として持ってるんでないの? ... かもしれません(車輪の再発明)
でもいいの。自分の道具を自分で作ってみたいだけ。

どうやった?

作りながら次のタスクを考える感じなのですが、ここまでやったこととしては

  1. 家計簿DBのスキーマを作る
  2. DBへのロード方法を考えて関数を作る。(db_lib.pyload_csv_file)
  3. 仕訳をAIでやらせるmockを作る
  4. CLIアプリとしての雛形を作る
  5. CLIとしてのコマンドを拡張していく
  6. ... 以下同文

このうち、1.はChatGPTに"家計簿アプリのDBスキーマを一式作って"と言って出力したものを、データエンジニアとして必要分を取捨選択して対応。
2.も(再三言うけど)データエンジニアなので、どちらかというと自分で少し考慮して実装。

そして、3.は以下のようなプロンプトを渡した。

これをCline(LLM)に読み込ませると、6,7割がた実装が完了してしまimasita。
これに追加して対応したのは、

  • エラー修正
  • 新しいAgentでまだプロンプトがない場合のプロンプト作成で既存プロンプトを参考にするよう修正
  • 全部main.pyだったので、TransactionJournalizer を別ファイルに
  • PDFファイルが日本語だと文字化けったのでPyPDF2からpymupdfに修正
    ここまでやって、コストは約$4.6

これで、TransactionJournalizer.py は作成できました。
CLIコマンドツールのrichなどのmockをつくってコマンドを追加、集計情報(sum_**コマンド)はClineに作ってもらったが、SQLの修正や追加のコマンドはこちらで実装、現状に至る、と言う感じです。

アプリとして寝かせてしまってて、さらに、実際の僕個人の過去のデータを入れて試していたりしたので、時間はかかってしまったが、LLMと実装の対応工数としては数日程度でしょうかね。

今後の拡張方針(LLMによる)

さて、結構これ個人的には使えております。
当該ディレクトリに行って、
. env/bin/activate
python has-cli/has-cli.py
でアプリが起動し、あらかじめダウンロードして置いた取引情報ファイルを journalizeコマンドでcsvファイルを作成、そのままロードして、データとしてはarchive すればデータの登録終了。
最初のうちは仕訳のためのpromptの調整が必要です。

data/prompts配下のpromptファイルを整理 (tj_bank.txt.sampleを参考に)

しかし、一度promptを作ってしまえば大体毎月の取引は同じようなものなので、毎月処理はほぼ自動で対応できます。

今後、せっかく作ったので、このアプリどうしようか、と言うことで以下のようにアプリの今後の拡張機能についても、Cline(LLM)に聞いてみました。

結果の概要はこちら:

なるほどねー。これはもう、もうLLMの言われたとおりにしようかしら。

最後に

プロンプトとLLMの結果が記事の半分をしめてるけど、いいんかなぁ。これ。

Discussion