【データ抽出業務ゼロへ】ChatGPTでクエリを自動生成させた話
こんにちは、マネーフォワードの金築です。
今回は、私が行ってきたChatGPTを利用して、データ抽出の問い合わせに応じて自動的にクエリを生成するようにした話をします。
自然言語でのデータ抽出が可能に
今回行ったことは、チャット上で自然言語で問い合わせた内容に対して、クエリとそのクエリの実行結果を添付して返す機能を実装しました。
この結果、クエリの知識のない方もデータ抽出ができるようになり、全体としてもクエリを作成するコストが軽減しました。
例えば、チャット上で「証券口座を連携していて、かつ課金しているユーザ数」とチャットを投げると、以下のような結果が得られるようになりました。※テーブルや数値は実際のものとは異なります。
・実行結果
cnt
123xxxx
・クエリ
SELECT
COUNT(DISTINCT a.user_id) cnt
FROM `connect_account_mart_table` account
JOIN `user_mart_table` user ON account.user_id = user.id
WHERE
a.category_name = ‘証券'
AND user.is_billing = True
問い合わせからクエリ生成のフロー
ユーザが問い合わせてから、返信するまでの全体的な構成は次のようになっています。
①問い合わせ
ユーザが自然言語を利用し問い合わせを行います。
②必要なテーブルの情報を問い合わせる
最初に定義したプロンプトと問い合わせ内容からLLMが抽出に必要なテーブルの情報をデータベースに問い合わせを行います。
③ テーブル情報の取得
データベースから必要なテーブル情報を取得します。
④クエリの発行
取得したテーブルの情報をもとにクエリを作成します。
このときにテーブルの情報が足りなければ再度②、③を実行します。詳しくは次の章で解説します。
⑤⑥実行結果
データベースに問い合わせした実行結果と④で作成したクエリをユーザに返却します。
※わかりやすさ重視のため、ChatGPTが実行しているように見せていますが、PythonとChatGPT API (gpt-4)を利用しています。
ChatGPTが自律的に、再帰的に考える
先程の図の②、③の部分で必要なテーブルを問い合わせると記述しましたが、そこには、ReActを採用しました。(JavaScriptライブラリとは異なります)
ReAct(Yao et al., 2022)とは、Prompting Engineeringの手法の一つで、LLMが推論と行動を行い、その行動を元に外部ツールから追加情報を収集することによって回答を生成する手法のことです。
具体的なフローを図示すると、ChatGPTは以下のステップで、自律的かつ再帰的に答えを導き出します。
質問(Question)
依頼者が入力する質問文です。
考察(Thought)
質問内容とプロンプト、また過去のActionとObservationから、どのように振る舞うかを考えます。
行動(Action)
事前に用意した行動規約に沿って行動します。
テーブルの情報を探索する、質問に対応するクエリを作成する、などの行動を行います。
観察(Observation)
行動の結果を評価します。
データベースに投げかけたテーブルの情報などを観察します。
完了(Finish)
質問に対する答えが明確になった時点で完了します。
今回のクエリの自動生成では、以下のようにChatGPT側の思考が進んでいきます。
質問 : 証券口座の連携で課金しているユーザ数
考察 : 証券口座を連携しているユーザを探索するため、connect_account_mart_tableの情報が必要。
行動 : connect_account_mart_tableのデータ構造を検索する。
観察 : (connect_account_mart_tableのデータ構造を検索結果をみる)
考察 : 課金しているユーザを探索するために、user_mart_tableの情報が必要。
行動 : user_mart_tableのデータ構造を探索する。
観察 : (user_mart_tableのデータ構造を検索結果をみる)
考察 : connect_account_mart_tableとuser_mart_tableを利用し、category_name = ‘証券'
AND user.is_billing = True という条件を指定すれば対象のデータで探索可能
行動 : (完成されたクエリを実行)
観察 : (実行結果を観察)
完了 : 対象となるユーザは●●人です。
クエリ品質を向上するためのアプローチ
このプロジェクトを進めるにあたり、すべての問い合わせパターンを網羅するのは現実的ではないと判断し、初めに「過去の依頼の約70%をカバーする」というミニマム要件を設定しました。
そこで、直近3ヶ月の依頼をまとめ、その中から頻出するテーブルや条件を整理しました。
また、試行錯誤していく中で適切なクエリを作ってくれないことも多々ありました。そのため、一部のテーブルについてはデータ側の整備を行い、LLMが適切なテーブルやカラムを選択できるように調整しました。
このような頻出クエリの分析やデータ側の調整を通じて、期待通りの品質なクエリを生成できるようになりました。
自動クエリ生成システムを利用した効果
クエリ自動生成システムの導入により、データ抽出作業の時間を大幅に短縮することができました。
以前のデータ抽出フローは次の通りでした:
依頼者(マーケターや営業、プロダクトマネージャーなど)がデータ抽出をデータアナリストに依頼する。
データアナリストがクエリと抽出結果をレポーティングする。
抽出結果とともにクエリのレビューを行う。
データアナリストが依頼者に結果を伝える。
このフローでは、他の業務との兼ね合いもあり平均で2日〜1週間程度の時間が必要でしたが、システム導入後は、データ抽出がほぼリアルタイムで可能となりました。
時折、間違ったクエリを生成することがありますが、ほとんど完成しているクエリの雛形から条件の修正するだけになるなど、簡単に修正できるようになりました。
まとめ
今回、ChatGPTを利用して、クエリの自動生成を行えるようにしました。
このシステムの導入により、クエリの作成する工数が削減されるだけでなく、意思決定にかかる時間が大幅に短縮されました。結果として、この取り組みは生産性向上に繋がったと感じています。
マネーフォワードのDataForward室では、データやAIを使って課題を解決することに挑戦したい方を募集しています。ご応募をお待ちしています!
この記事が気に入ったらサポートをしてみませんか?