3分プロトタイピング: Pandas Dataframe Toolkitを使って自然言語でCSVを分析する

連載「3分プロトタイピング」

  1. Streamlitを用いたAIチャットアプリ
  2. RAGを使ってAIチャットアプリケーションに知識を与える
  3. ベクトルデータベース超入門
  4. ベクトルデータベースの登録内容を可視化してみる
  5. Jupyter Notebook, Google Colabの紹介
  6. 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については前回の記事で説明していますので、初めての方は先にこちらをご確認ください。

tech.route06.co.jp

環境の作成

検証用の環境を作成し、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が立ち上がります。

Streamlit起動後のキャプチャ

試しに全部で何行ありますか?と入力するとCSVの件数が返ってきます。

総件数の確認

他にも集計を指示することもできます。レスポンスが英語になっているので実際に使うときはもう一工夫必要ですが、できることのイメージは掴めると思います。

様々な集計

まとめ

なかなか面白いものがちょっとしたコードで実装できて楽しいですね。 これを発展させたものをサービスとして提供する際には、LLMが生成したコードを確認せずに実行するリスクとの付き合い方が重要になりそうなので、引き続き調べていきます。