Ollamaを使ったデータ分析の自動化: LangChainとPandasを用いた実装


## はじめに
今回は、OllamaのLLM（Large Language Model）を使用してPandasデータフレームに対する質問に自動的に答えるエージェントを構築する方法を紹介します。この実装により、データセットに対するインタラクティブなクエリが可能になります。

## 必要なライブラリのインストール
- まず、必要なpythonライブラリをインストールします。
- ollamaはインストールされていて、llama3のモデルをpullしていることを前提としています。

```bash
pip install pandas langchain langchain_community ollama
```

## サンプルコードの紹介

次に、以下のPythonコードを使用して、Ollamaを用いたデータフレームエージェントを構築します。このコードは、タイタニックのデータセットを使用していますが、任意のCSVファイルに変更可能です。

```python
import os
import pandas as pd
from langchain.agents.agent_types import AgentType
from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent

from langchain_community.llms import Ollama
llm = Ollama(model="llama3")

# サンプルデータとしてタイタニックのデータセットを読み込ませる
df = pd.read_csv(
    "https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv"
)

# エージェントを立ち上げる
agent = create_pandas_dataframe_agent(llm, df, verbose=True)

# 質問を投げ、回答を得る
rep = agent.invoke("how many rows are there in PassengerId?")
print(rep["output"])
```

## コードの詳細説明

1. **ライブラリのインポート**
    ```python
    import os
    import pandas as pd
    from langchain.agents.agent_types import AgentType
    from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent
    from langchain_community.llms import Ollama
    ```
    - 必要なライブラリをインポートします。ここでは、`pandas`、`langchain`、および`ollama`のコミュニティ版を使用しています。

2. **Ollamaのモデルを初期化**
    ```python
    llm = Ollama(model="llama3")
    ```
    - OllamaのLLMである`llama3`モデルを初期化します。

3. **データセットの読み込み**
    ```python
    df = pd.read_csv("https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv")
    ```
    - サンプルデータとしてタイタニックのデータセットを読み込みます。この部分は任意のCSVファイルに変更可能です。

4. **エージェントの作成**
    ```python
    agent = create_pandas_dataframe_agent(llm, df, verbose=True)
    ```
    - 読み込んだデータフレームに対して質問を処理するエージェントを作成します。

5. **質問の実行**
    ```python
    rep = agent.invoke("how many rows are there in PassengerId?")
    print(rep["output"])
    ```
    - データフレームに対して「PassengerIdには何行ありますか？」という質問を投げ、その結果を出力します。

## 注意点
このエージェントは非常に便利ですが、特定の質問に対しては正確な回答を返せない場合があります。たとえば、複雑なクエリや曖昧な質問の場合、エラーが発生することがあります。そのため、データ分析の信頼性を高めるために、OpenAIのモデルを試してみることも検討してください。OpenAIのモデルは、より高度な自然言語処理能力を持ち、多様な質問に対しても正確な回答を導きやすいです。

## llama3の使い勝手
llama3モデルを使用する際の使い勝手について、いくつかの観点から評価してみました。より多くのパラメータを持つモデルで検証すると、結果が異なる可能性もあります。

1. **回答の正確性**
    - 基本的なクエリには迅速かつ正確に回答しますが、複雑なクエリやデータセット内の特定の条件に基づく質問に対しては、時折誤ったり不完全な回答を返すことがあります。

2. **エラーハンドリング**
    - 一部の質問にはエラーが発生することがあります。例えば、存在しない列に対するクエリや曖昧な質問には適切に対応できない場合があります。このような場合、エラーメッセージを適切にキャッチし、ハンドリングすることが重要です。

3. **パフォーマンス**
    - 小規模なデータセットに対しては高速に処理を行いますが、大規模なデータセットに対しては応答時間が長くなることがあります。そのため、適切なハードウェアリソースを確保することが望ましいです。

## まとめ
この実装により、OllamaのLLMを活用してデータフレームに対するインタラクティブな質問応答システムを簡単に構築できます。これにより、データ分析の効率が大幅に向上し、迅速な意思決定が可能になります。ただし、使用するモデルや質問の内容、複雑さによっては、エラーが発生して動作しない場合があるため注意が必要です。

このアプローチは、様々なデータセットやクエリに適用可能であり、データサイエンティストやアナリストにとって強力なツールとなるでしょう。興味のある方はぜひ試してみてください。

## 参考

https://python.langchain.com/v0.1/docs/integrations/toolkits/pandas/

<iframe width="560" height="315" src="https://www.youtube.com/embed/b6S369OUHU0?si=W35guTqYQcK6EFu7" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

https://www.mattari-benkyo-note.com/2023/04/27/langchain_pandas/

## google colabでの実験結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/aefa7af8-56ae-daf0-94b3-6a5ddc0df71f.png)
L4のGPUを設定してollamaをインストールて動作確認した。

Question : how many rows are there in PassengerId?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/b407c2d5-9f41-27b0-6c07-52a323ac9e71.png)

Question : how many rows are there?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ba43e3e3-4671-d4f2-1ea9-23dfe063c150.png)
上記のようにエラーになった。ときどき、うまくいくときがある。再現性がなかった。

Question : what is the average age?"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e8c70e05-63fe-8d20-5b7e-bf10f69bdf02.png)

このサンプルコードの動きだと、UIなど用意してもユーザに公開は難しそうかな・・。もうちょっと、融通がきくように動いてほしいな・・。