連載「3分プロトタイピング」
- Streamlitを用いたAIチャットアプリ
- RAGを使ってAIチャットアプリケーションに知識を与える
- ベクトルデータベース超入門
- ベクトルデータベースの登録内容を可視化してみる
- Jupyter Notebook, Google Colabの紹介
- Pandas Dataframe Toolkitを使って自然言語でCSVを分析する
概要
ここまでの記事で、いろいろなことができるようになりましたが、今回はもう少し業務に近い内容をやってみます。 CSVファイルを読み込んで、その内容をチャットで分析するというものです。 そのために、LangChainというフレームワークが提供しているPandas Dataframe Toolkitを使ってAgentを作成します。
Pandas Dataframe とは
Pandas Dataframeは、表形式のデータをPythonで操作するためのデータ構造です。Excelのスプレッドシートのようなイメージです。行と列で構成され、各セルにデータが入っています。
LangChainのAgentとは
Agentは、LLMを推論エンジンとして使用し、与えられたタスクを遂行するためにどのアクションをどの順番で実行するかを決定します。これまでに紹介した実装では、「ベクトル検索を実行し、その結果をLLMに入力する」というようにアクションと実行順をあらかじめコードとして表現していましたが、AgentはそこをLLMに推論させます。
Agentを作る際にはタスクを達成するために利用する道具を予め指定する必要があり、Pandas Dataframe Toolkitは、タスクを遂行するための道具の一つです。
与えられたタスクが完了するまで、繰り返しPandas Dataframeを使ったPyhtonコードを考え、実行します。
LangChainが提供している道具はPandas Dataframeの他にも以下のようなものがあります。自分で実装することも可能です。
一覧はこちらを参照してください。
- GitHub
- Jira
- Slack
- Zapier
Pandas Dataframe Toolkitを使ったAgentを作成する
Jupyter Notebookを使って、Pandas Dataframe Toolkitを使ったAgentを作成してみましょう。
Jupyter Notebookについては前回の記事で説明していますので、初めての方は先にこちらをご確認ください。
環境の作成
検証用の環境を作成し、venvを使って仮想環境を有効にします。
mkdir hello-pandas-dataframe-toolkit-agent cd hello-pandas-dataframe-toolkit-agent python -m venv .venv source .venv/bin/activate
解析するCSVファイルをダウンロードします。
curl https://gist.githubusercontent.com/toyamarinyon/0cf82a80a21050458d83a2ea7c093860/raw/7923bc46029d223ff9fdbc3a642cc97827a085db/purchase_data.csv -o purchase_data.csv
Jupyter Notebookをインストールします。
pip install notebook
OpenAIを利用するのでAPI_KEYを環境変数に指定し、Jupyter Notebookを起動します。
export OPENAI_API_KEY=YOUR_API_KEY jupyter notebook
Notebookを起動したら新しいファイルを作って以下のNotebookを参考に順次コードを実行してください。
agent.invoke
の文字列を変えて実行すると、その内容を実現するために必要なPythonのコードを生成し、実行し、その結果を出力します。
例えばカテゴリごとの行数は?
と聞くとそれを計算するためのPythonのコードを生成、実行します。
Streamlitで対話的にCSVデータを集計操作する
ここまでNotebookで作成したものをプログラムにして、以前紹介したStreamlitを組み合わせて対話的なUIでCSVデータを集計してみましょう。
ここからは Notebookは使わないので終了して、pandas-dataframe-toolkit-agent-streamlit.py
ファイルを作成して、以下のコードを貼り付けます。
from langchain_openai import OpenAI from langchain_experimental.agents import create_pandas_dataframe_agent import pandas as pd import streamlit as st df = pd.read_csv('purchase_data.csv') agent = create_pandas_dataframe_agent(OpenAI(temperature=1), df, verbose=True) st.title("Pandas DataFrame Toolkit Agent") if "messages" not in st.session_state: st.session_state['messages'] = [ {"role": "assistant", "content": "CSVデータについて何か気になることはありますか?"} ] for msg in st.session_state.messages: if msg["role"] not in ["user", "assistant"]: continue st.chat_message(msg["role"]).write(msg["content"]) if prompt := st.chat_input(): st.session_state.messages.append({"role": "user", "content": prompt}) st.chat_message("user").write(prompt) response = agent.invoke(st.session_state.messages,return_only_outputs= True) st.session_state.messages.append({"role": "assistant", "content": f"{response['output']}"}) st.chat_message("assistant").write(f"{response['output']}")
そして、streamlitをインストールしてpandas-dataframe-toolkit-agent-streamlit.py
を実行します。
pip install streamlit streamlit run pandas-dataframe-toolkit-agent-streamlit.py
すると以下のようにチャットUIが立ち上がります。
試しに全部で何行ありますか?
と入力するとCSVの件数が返ってきます。
他にも集計を指示することもできます。レスポンスが英語になっているので実際に使うときはもう一工夫必要ですが、できることのイメージは掴めると思います。
まとめ
なかなか面白いものがちょっとしたコードで実装できて楽しいですね。 これを発展させたものをサービスとして提供する際には、LLMが生成したコードを確認せずに実行するリスクとの付き合い方が重要になりそうなので、引き続き調べていきます。