ChatGPTにSQLの質問投げると、ほとんどの質問は回答してくれますが、ある程度のSQL知識がないとうまく活用できないです。しかし、langchainとLLM経由でやると、SQLクエリが書けなくもデータの抽出や分析が問題なくできます。
今日はlangchainを使用して、LLMでSQLデータ分析をやってくれる方法をご紹介します。
①データセット
まず使われていたデータは私が勝手に作ったもので、5行しかない”花”のテーブルです。
カラムとしては、名前、国、価格、数量、日付などが含まれています。(サンプルデータは以下のようになります)
②アプローチ(SQLDatabaseChain/Agent)
アプローチとしては二つがあります。一つはSQLDatabaseChainというSQLに特化したchainを使う手法で、もう一つはAgentを使用する方法です。
1.SQLDatabaseChain
コード自体は非常にシンプルで、langchainの"SQLDatabaseChain"でLLMとデータベースをつなぐだけです。
中身は以下の流れとなります。
1.自然言語(質問の内容)をlangchainによってLLMに投げて、LLMがSQL文に変換する。
2.SQL文はSQLDatabaseChainによってデータベース上でSQL文を実行する。
3.実行で返してきた結果をまたSQLDatabaseChainによってLLMに返して、LLMが結果を自然言語(回答)に変換する
4.自然言語(回答)をAnswerとして返す。
質問を3つ用意して投げました。outputは以下のような感じです。
クエリと結果、あと答え一通り確認すると、特に問題ないですね。
2.Agent
Agentのやり方は少し複雑ですが、昨日Agentで紹介したReActの考え方で処理します。
"agent_executor"と"SQLDatabaseツール"、"LLM"、"データベース"をlangchainでつなぎます。
中身は以下の流れとなります。
1.自然言語(質問の内容)をlangchainによってLLMに投げて、agent_executor経由でLLMがやり方を"思考"する。
2."思考"でこれはSQL問題のを理解して、SQLDatabaseツールを使うことに決める。
3."行動"としてはSQLDatabaseツールを使って、データベースでSQL文を実行しに行く。
4.SQL文を実行して結果を得た後に、再度"思考"して、これは最終回答だと理解したので、最後"行動"としてはこの回答をAnswerとして返す。
質問は同じく⇧の3つ用意して投げました。
outputは長くなりましたので、質問1("在庫数が最も少ない花はどれですか?")の回答だけスクリーンショットしました。
回答見るとLLMが"思考"している時の流れも全部書いてますので、LLMがReActのロジックで行動しているのかわかりますね。
次回はLLMとGoogleのAPIを使って、自分のメール(gmail)を管理してくれるChatbotの作り方を共有します。(同じくlangchainで実現します。)