Gunosy Tech Blog

Gunosy Tech Blogは株式会社Gunosyのエンジニアが知見を共有する技術ブログです。

LLM を使って自分のおさいふ事情を把握してみる

はじめに

こんにちは takuji です。

この記事は Gunosy Advent Calendar 2023 の 11 日目の記事です。 10 日目の記事は村田さんの広告レコメンドの NN モデルワークフローに関する記事でした。

今回は takuji のクレカ利用の傾向を LLM で分析してもらう記事になります。

個人的にクレカのアプリの決済履歴の反映が遅いことで利用金額の把握が上手くできなくて困っていたこと、流行っている LLM を使った記事にしたいということから、それらを組み合わせた記事にしました笑。

どんなものを作ったのか

Python で Gmail API を叩いて、クレカの即時利用通知メール*1を取得し、クレカの利用金額や利用先を SQLite に保存できるようにしました。 そして、LangChain から SQLite を操作して、おさいふ事情を把握できるようにしました。

具体的には、以下のように Python コードを実行すると、11月の利用金額の合計と利用金額の割合が大きい上位3件の利用先を出力してくれます。

$ python cash_llm.py

The total expenditure in November is 128455. 
The top 10 usage locations and their proportions in the total expenditure are as follows:
1. SEVEN-ELEVEN: 23471 (18.27%)
2. JR EAST MOBILE SUICA: 19432 (15.13%)
3. AMAZON CO JP: 13400 (10.43%)
...

現状英語で出力されていますが、LangChain の初期化の際に渡せるプロンプトを調整すれば日本語に直すこともできると思います。

今回の実装コードは、以下に公開しています。

github.com

解説

Gmail API を使ったメール取得について

Python で Gmail API を叩いて、クレカの即時利用通知メールを取得する手順について説明します。

  1. Google Cloud コンソールから Google Cloud プロジェクトを作成します。
  2. 作成したプロジェクトを開いて、Gmail API を有効にします。
  3. OAuth 2.0 を使用して Google API にアクセスできるようにします。
    • OAuth 2.0 クライアント認証情報を取得してから、クライアントライブラリを使用して Google 承認サーバーにアクセストークンをリクエストして、レスポンスからトークンを抽出します。
    • そのトークンを使うと、Gmail API を call できるようになります。
  4. Python 用 Google クライアントライブラリをインストールします。

     pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
    
  5. Python で Gmail API メソッドの users.messages.list を呼び出し、message の ID 一覧を取得します。取得した message ID を使い、users.messages.get を呼び出し、メールの内容を取得します。

    • 検索演算子と呼ばれる単語や記号を使用することで Gmail の検索結果を絞り込むことができます。
    • 今回はクレカメールが欲しいので、送信者と期間、件名を指定しています。

最後に、取得したクレカメール本文から「利用日時・利用金額・利用先」を抽出して、SQLite に保存します。 実際の Python コードは分量が多くなっているため、Github 上の Python コード sqldb.py を参照してください。

LangChain を使ったデータ分析について

Python ライブラリの LangChain の SQL Agents を使って、SQLite を操作してデータ分析する方法について説明します。

LangChain では、自然言語のプロンプトに基づいて SQL クエリを構築し実行するための SQL Chains と SQL Agents を提供しています。 後者の SQL Agents を使うことで、SQLite のスキーマやデータ中身の観測を経て自然言語のプロンプトに対する行動を実行し、回答を出力するまでを一貫しておこなってくれます。

SQL Agents を使うための手順は以下となります。

  1. OpenAI の API を使うために、API key を取得します。
    • 公式ページから取得することができますので、コピーして保存しておきます。
  2. LangChain や OpenAI の Python ライブラリをインストールします。

     pip install langchain langchain-experimental openai
    
  3. SQL Agents は create_sql_agent(..) に LLM オブジェクトと SQLDatabaseToolkit(..)、AgentType を渡すことで作成します。

実際の Python コードは以下のようになります。

import os
from dotenv import dotenv_values

from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.agents.agent_types import AgentType
from langchain.chat_models import ChatOpenAI

# Get a dictionary of .env variables
config = dotenv_values()
os.environ["OPENAI_API_KEY"] = config["OPENAI_API_KEY"]

# connect to test database
db = SQLDatabase.from_uri(f"sqlite:////{config['DB_PATH']}")

# Create a SQL agent using ‘gpt-4’ model with ZERO_SHOT_REACT_DESCRIPTION
toolkit = SQLDatabaseToolkit(db=db, llm=ChatOpenAI(temperature=0, model="gpt-4"))

agent_executor = create_sql_agent(
    llm=ChatOpenAI(temperature=0, model="gpt-4"),
    toolkit=toolkit,
    verbose=True,
    agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
)

agent_executor.run("11月中の利用履歴をもとに支出合計を説明してから、利用先ごとの割合(支出合計に対する割合)で支出傾向について補足してください。")

上記の Python コードを実行すると、次のような出力が得られます。

The total expenditure in November is 128455. 
The top 10 usage locations and their proportions in the total expenditure are as follows:
1. SEVEN-ELEVEN: 23471 (18.27%)
2. JR EAST MOBILE SUICA: 19432 (15.13%)
3. AMAZON CO JP: 13400 (10.43%)
...

先月の私のお金の使い道がわかりやすく書かれているので、満足のいく出来になったかなと思います。 個人的に、セブンイレブンに 2 万円も使っていることに気付けてよかったです(節約します)。

この実装に関して参考にした資料は以下となります。

python.langchain.com

medium.com

まとめ

LangChain で遊んでみて、意図した通りの SQL クエリ を LLM に生成させるにはプロンプトを頑張らないといけないと感じました。 簡単な SQL クエリなら生成できることはわかったので、さらに複雑な分析も出来るようにしたいなと欲が出てきました。

明日は田辺さんが A/B の指標の見方について書くそうです!どうぞお楽しみに!

*1:クレカの即時利用通知メール は、三井住友カードやJCBカードなどであればセキュリティ対策の一環として利用可能な通知サービスになっています。