LangChainのBearlyInterpreterToolを試してみた

## はじめに
LangChainのBearlyInterpreterToolを試してみました。
ChatGPTのCode Interpreterのような機能が実装できます。
　　
## 環境
- Windows 11
- Python 3.11.5
- LangChain
- OpenAI
　　
## 実装
### 必要なライブラリのインストール
```terminal
pip install langchain openai
```
　　
### Bearly AI APIキーの取得
https://bearly.ai/dashboard/developers にアクセスします。アカウントがない場合は、作成してください。

「New API Key」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/ab703779-3dc9-3ab3-fa62-1df6a83d492c.png)
　　
キーの名前を入力して「Create 」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/10075b88-2994-49bf-8984-cc763574ec0e.png)
　　
キーをコピーしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/5d2dc71a-14ef-f8c6-b11f-bd53607b9586.png)
　　
### 分析に使うファイル
分析に使うファイルは以下のようになっています。
[こちら](https://qiita.com/tatsuki-tsuchiyama/items/61e88cbef33e32aad34c)の記事で使ったcsvを使い回しています。

```test.csv
質問
次の文章を要約してください。Anthropicは10月16日（現地時間）、同社が公開するAIチャットボット「Claude 2」の公開範囲を日本を含む世界95の国と地域に拡大したことを明らかにした。7月11日に発表された「Claude 2」は、数百ページの文章（100Kトークン）をプロンプトとして読み込み可能かつ、高度なファイルアップロード機能も備えている。ChatGPT対抗馬の本命とみなされることも多い。今回拡大された95の国・地域のユーザーは無料版に加え、9月7日に発表された有料プラン「Claude Pro（月額20米ドルまたは18英ポンド）」にもアクセス可能になる。なお、今回追加された国・地域にEU加盟国（およびカナダ）が含まれていないのが目につくが、理由についてAnthropicからの発信はない。おそらく法整備などの調整中であることが考えられる。9月24日には、米アマゾンが最大40億ドルを投資し、Anthropicの少数株主になるという発表があった。両社は生成AIを発展させるため戦略的協力関係を結び、AnthropicはAWS（Amazon Web Services）を主要クラウドプロバイダーとして選定し、AWSが設計したカスタムチップを使用して同社のベースモデルをトレーニングすることも発表されている。そもそもAnthropicは、OpenAIの元研究幹部によって設立されたスタートアップだ。Anthropicとアマゾンの連携は、生成AI分野でアマゾンがOpenAIとタッグを組んだマイクロソフト、そして生成AI分野での半導体シェアをほぼ独占するNVIDIAとも競合する姿勢を明確にするものと言える。
「こんなはずじゃなかった」というタイトルで400文字のショートショートを書いてください。
"次の文章を翻訳してください。There are many ways to identify trees. Most people try to identify trees by their leaves. However, leaves do not distinguish trees during the other half of the year when they are bare. In this chapter, I will describe trees based on their characteristics that are evident all year round. Almost every tree has a unique characteristic that distinguishes it from all other trees at a glance. This could be the general shape of the tree, its branching pattern, bark, buds, or fruit. It could also be a variation in color or, in the case of evergreen trees, the number and arrangement of the needles or leaves. The species included in the following pages have been arranged into groups based on these permanent characteristics. Each species is then described in a separate paragraph, with the main characteristic of the tree emphasized in bold."
アメリカ映画「My Sweet Hallucination」のあらすじを教えてください。
5698×3602は？
「9x²-12xy+4y²」を因数分解してください。
4092529の平方根は？
SDXLで『思ったより高額な請求書を見て困り果てている日本人のお姉さん』を描くプロンプトを英語で書いてください。
西暦を和暦に変換する簡単なプログラムを作成してください。
楽して大金を儲ける方法を教えて。
```
　　
### Pythonファイルの実行
以下のPythonファイルを実行します。

```test.py
import os
from langchain.agents import AgentType, initialize_agent
from langchain.chat_models import ChatOpenAI
from langchain.tools import BearlyInterpreterTool

os.environ["OPENAI_API_KEY"] = "OpenAIのAPIキーを指定"

bearly_tool = BearlyInterpreterTool(
    api_key="Bearly AIのAPIキーを指定"
)

bearly_tool.add_file(
    source_path="test.csv", target_path="test.csv", description=""
)

tools = [bearly_tool.as_tool()]

llm = ChatOpenAI(model="gpt-4", temperature=0)
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True,
    handle_parsing_errors=True,
)

agent.run("このcsvファイルにはいくつの質問がありますか？")
```
以下はコードの解説です。

1. **環境変数の設定**:
   - `os.environ["OPENAI_API_KEY"] = "OpenAIのAPIキーを指定"`: ここでは、環境変数にOpenAIのAPIキーを設定しています。これは、OpenAIのGPTモデルにアクセスするために必要です。
　　
2. **BearlyInterpreterToolの初期化**:
   - `bearly_tool = BearlyInterpreterTool(api_key="Bearly AIのAPIキーを指定")`: この行で、BearlyInterpreterツールを初期化しています。
　　
3. **ファイルの追加**:
   - `bearly_tool.add_file(source_path="test.csv", target_path="test.csv", description="")`: ここで、`test.csv`というファイルをBearlyInterpreterツールに追加しています。これにより、このファイルが後続の処理に使用されるようになります。
　　
4. **ツールのリストの作成**:
   - `tools = [bearly_tool.as_tool()]`: BearlyツールをLangChainのツールリストに追加します。
　　
5. **LangChainのChatOpenAIエージェントの初期化**:
   - `llm = ChatOpenAI(model="gpt-4", temperature=0)`: GPT-4モデルを用いて、LangChainのChatOpenAIエージェントを初期化しています。`temperature=0`は、出力が非常に決定論的になることを意味します。
　　
6. **LangChainのエージェントの初期化**:
   - `agent = initialize_agent(tools, llm, agent=AgentType.OPENAI_FUNCTIONS, verbose=True, handle_parsing_errors=True,)`: ここで、LangChainのエージェントを、定義したツールとLLM（言語モデル）を使って初期化しています。
　　
7. **エージェントの実行**:
   - `agent.run("このcsvファイルにはいくつの質問がありますか？")`: 初期化されたエージェントを使用して、与えられた質問（この例ではCSVファイルに関する質問）に対する回答を生成します。

　　
実行結果は以下のとおりです。

```terminal
> Entering new AgentExecutor chain...

Invoking: `bearly_interpreter` with `{'python_code': "import pandas as pd\n\n# Load the CSV file\ndf = pd.read_csv('test.csv')\n\n# Count the number of questions\nnum_questions = df['Question'].nunique()\n\nprint(num_questions)"}`
responded: まず、CSVファイルを読み込んで、その内容を確認する必要があります。Pythonのpandasライブラリを使用して、この操作を行います。次に、質問が含まれている列を特定し、その数を数えます。この操作を行うためのPythonコードを作成し、実行します。

{'stdout': '', 'stderr': 'Traceback (most recent call last):\n  File "/venv/lib/python3.10/site-packages/pandas/core/indexes/base.py", line 3790, in get_loc\n    return self._engine.get_loc(casted_key)\n  File "index.pyx", line 152, in pandas._libs.index.IndexEngine.get_loc\n  File "index.pyx", line 181, in pandas._libs.index.IndexEngine.get_loc\n  File "pandas/_libs/hashtable_class_helper.pxi", line 7080, in pandas._libs.hashtable.PyObjectHashTable.get_item\n  File "pandas/_libs/hashtable_class_helper.pxi", line 7088, in pandas._libs.hashtable.PyObjectHashTable.get_item\nKeyError: \'Question\'\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n  File "/tmp/project/main.py", line 7, in <module>\n    num_questions = df[\'Question\'].nunique()\n  File "/venv/lib/python3.10/site-packages/pandas/core/frame.py", line 3896, in __getitem__\n    indexer = self.columns.get_loc(key)\n  File "/venv/lib/python3.10/site-packages/pandas/core/indexes/base.py", line 3797, in get_loc\n    raise KeyError(key) from err\nKeyError: \'Question\'\n', 'fileLinks': [], 'exitCode': 1}
Invoking: `bearly_interpreter` with `{'python_code': "import pandas as pd\n\n# Load the CSV file\ndf = pd.read_csv('test.csv')\n\n# Display the first 5 rows of the dataframe\nprint(df.head())"}`
responded: すみません、エラーが発生しました。CSVファイルには'Question'という名前の列が存在しないようです。CSVファイルの最初の数行を確認して、どのよ うなデータが含まれているかを理解する必要があります。そのために、CSVファイルの最初の5行を表示するPythonコードを実行します。

{'stdout': '                                                  質問\n0  次の文章を要約してください。Anthropicは10月16日（現地時間）、同社が公開するAI...\n1       「こんなはずじゃなかった」というタイトルで400文字のショートショートを書いてください。\n2  次の文章を翻訳してください。There are many ways to identify ...\n3       アメリカ映画「My Sweet Hallucination」のあらすじを教えてください。\n4                                        5698×3602は？\n', 'stderr': '', 'fileLinks': [], 'exitCode': 0}
Invoking: `bearly_interpreter` with `{'python_code': "import pandas as pd\n\n# Load the CSV file\ndf = pd.read_csv('test.csv')\n\n# Count the number of questions\nnum_questions = df['質問'].nunique()\n\nprint(num_questions)"}`
responded: CSVファイルの内容を確認したところ、'質問'という名前の列が存在することがわかりました。これは先ほどのエラーの原因となります。この列には質問が含まれていると思われますので、その数を数えるPythonコードを再度実行します。

{'stdout': '10\n', 'stderr': '', 'fileLinks': [], 'exitCode': 0}CSVファイルには合計で10個のユニークな質問が含まれています。

> Finished chain.
```

エラーが発生しても、自分で修正していることが確認できます。
最終的な回答も正しいです。

　　
## おわりに
お疲れ様でした!
以下が参考文献です。

https://python.langchain.com/docs/integrations/tools/bearly