ChatGPTで実現するデータ分析の世界:バイバイSQL(LangChain SQL Database Agent)
データアナリストやデータマネジメントなどの職業が、ChatGPTをはじめとするLLMの出現によってなくなると言われています。私もデータに深くかかわる仕事をしているので、少し気になりますね。
自分のポジショントーク的にはいやいや~無理でしょて気持ちにはなるのですが、少し調べてみました。
今回は、ChatGPTを活用してテーブル作成やデータ抽出をやってみます。やってみたら、SQLがいらなくなる可能性がありえるかもと思いました。
LangChain SQL Database Agent
LangChain
LangChainはご存じだと思いますが、LLMを便利に使うためのPythonのライブラリです。LLMの使いかたは、SNSなどで日々いろいろな方がアイデアがディスカッションされていますし、論文も発表されています。
そのようなアイデアが数行のコードで実現することができるのがLangChainです。
毎日アップデートしているような状況で、まだまだ粗削りなところがあります。
最近の私はLangChainのアップデートを確認し、新機能を発見して使って遊んでみるというのが日課になっています。
SQL Database Agent
LangChainではAgentという仕組みがあります。
これはLLM(今回はChat GPT)とToolを用意することで、様々なタスクをLLMと連動して実行することができるようになります。
ToolはLLMからデータアクションを実現するツールです。例えば今回はLLMがSQLを実行する必要があると判断した場合に、SQLを実行するツールを指します。
この仕組みの詳細は以下の記事が参考になるかと思います。
LangChainのコードについては、こちらの記事を参照しています。
やってみましょう
今回はChatGPTと連動して、テーブルを作成し、データを抽出する一連の例を実行します。
pip install
まずはこれから。LangChainは毎日更新しているので、バージョン指定をすると、確実に動くかとおもいます。
load_dotenvはlangchainに環境変数としてOpen AI のAPI KEYを渡すのに使用します。
pip install langchain==0.0148
pip install load_dotenv
インポート部分
Agentは一連のタスクを実行するために定義されたクラスになります。
AgentはLLMとToolで構成されます。
from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.llms.openai import OpenAI
from langchain.agents import AgentExecutor
from dotenv import load_dotenv
LLM
今回はChatGPTを使用します。
Agent
Sql Agentを使用します。
詳しくは後ほど説明します。
Tool
今回はあらかじめ用意されている SQLDatabaseToolkitを使用します。
AgentExecuter
AgentExecuterはChatGPTとToolとのやり取りを自動化してくれます。ChatGPTがツールを使う必要がある、つまり今回はSQLを実行する必要があると、それを検知して、Toolを実行することを自動化してくれます。
今回はチュートリアルなので、細かい設定はしていませんが、実行上限回数など細かな設定が可能です。(他のノートで解説予定です)
初期化部分
load_dotenv()
chatgpt = OpenAI(temperature=0.5)
chatgpt.openai_api_key ='your_open_ai_api_key'
db = SQLDatabase.from_uri("sqlite:///sound.db")
toolkit = SQLDatabaseToolkit(db=db)
.envファイルを作成する
`.env`というファイル名のファイルを作成して以下のように取得したAPIを入力します。
「OPENAI_API_KEY」の変数名は重要です。これらの変数名をKeyとした環境変数が、後ほど作成されます。最終的には、以下のように処理されるとイメージするとわかりやすいでしょう。
イメージ:env['OPENAI_API_KEY']='sk-tbnwI3DATvzzwxisdalfjalsdjfasdlfjaf'
そして、環境変数にAPI_KEYが設定されると、LangChainは特にコーディングせずにAPI_KEYを読み込んで処理を実行します。
OPENAI_API_KEY = 'sk-tbnwI3DATvzzwxisdalfjalsdjfasdlfjaf'
最後にload_dotenv() でOPENAI_API_KEYを読み込みます。
ChatGPTの初期化
OpenAIで初期化します。これはデフォルト値は以下のようになっています。
主要なところは太字にしています。
OpenAIのAPIの取得方法
手前みそになりますが、API KEYの取得方法がわからないって方はこちらでどうぞ。
DBの初期化
今回はSQLiteをわかりやすさを優先して使用します。
以下の部分では、ローカルのあなたのプロジェクトフォルダにsound.dbファイルを作成しています。
形式は sqlite:// のあとにローカルファイルのパスを指定します。
今回は sqlite:///sound.db ですので、プロジェクトのルートにファイルを作成します。
作成したdbをlangchainのtoolに渡します
テーブルを作成します
SQL書くのかなと思っている人いませんか。
なんとSQLは必要ありません。
agent_executor.run("playlisttrack テーブルを作成してテストデータを10行挿入してください")
SQLエラーとはおさらば!
テーブルを作成して、テストデータを入力しています。
一般的なサウドトラックのスキーマってこんな感じだよねって感じでCreate文を作成していますね。
そしてそれにあったテストデータを作成しています。
今回はうまく行きましたが、SQLでエラーが起こった場合はどうなるでしょうか。
例えばこんな感じです。
すでに作成済みのテーブルがある状態で、先ほどのコードを再実行します。エラーが起こったことに対して、テーブル作成は不要であると判断して、テストデータだけを入力しています。
LangChainで便利なのはエラーを自動的に補正しようとするところです!細かな列名の間違いなどを、想定される文字列のパターンでエラー補正を試みます。例えば以下のような動きになります。
agent_executor.run("playlrack テーブルにテストデータを10行挿入してください")
まずテーブル名がTypoして間違っています。
(正:playlisttrack 誤:playlrack)
スキーマを探すことでplaylrackテーブルは playlisttrackのことであると判断しています。Typoはテーブルを確認することにより解消しました。これらはSQLだとエラー”テーブルがありません”ということで処理が終了するだけですね。
今度はPrimary Keyのエラーです
あるあるのエラーになっていますが、これらを改善するSQLを書いて、新たなテストデータを書き込もうとしています。
最後には、エラーが返ってきていないようですので、最後にSelectしてデータが入っているか確認しています。
ここまでの全体のコード
from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.llms.openai import OpenAI
from langchain.agents import AgentExecutor
from dotenv import load_dotenv
load_dotenv()
chatgpt = OpenAI(temperature=0.5)
db = SQLDatabase.from_uri("sqlite:///sound.db")
toolkit = SQLDatabaseToolkit(db=db)
agent_executor = create_sql_agent(
llm=OpenAI(temperature=0),
toolkit=toolkit,
verbose=True
)
#agent_executor.run("playlisttrack テーブルを作成してテストデータを10行挿入してください")
agent_executor.run("playlrack テーブルにテストデータを10行挿入してください")
集計してみましょう
まず以下を実行します。
SQLは??不要です!
agent_executor.run("各アルバムの合計トラック数を表示します。結果にはアルバム名,合計トラック数が含まれている必要があります。")
エラーなく結果が返ってきました。
答えは以下のようになっています。
ちょっと使いづらいのでJson形式で結果をだしてもらいます。
agent_executor.run("各アルバムの合計トラック数を表示します。結果にはアルバム名,合計トラック数が含まれている必要があります。json形式で返してください。")
答えは以下のようになりました。いいですね!
感想
ChatGPTが素晴らしいのは、柔軟性のある言葉でインターフェースができ、多次元の概念を表現できることです。この点において、データの抽出や集計などの作業に適していると思われます。SQLを使えなくても、データ分析が可能になりそうですね!
さらに、集計における定義をDBに保存しておき、ChatGPTに定義の確認などのプロセスを挟んでもらうことで、より精緻な集計が可能になります。また、定義が定まっていない場合には、ChatGPTに提案してもらうこともできるかもしれません。
さらに、通常の言葉で分析できるため、音声認識などと組み合わせれば、会議中に数値をすばやく確認できるかもしれません。ChatGPTが回答してくれるなんて便利ですね。
今回はうまくいく例だけ記載しましたが、実際はエラーを解決できず、結果がでないなどということも多くありました。この点は今後に期待ですね!
この記事が気に入ったらサポートをしてみませんか?