PandasAIのメモ(v1.xからv2.xでの変更点)
この記事を書いている時期PandasAIはほぼ毎日更新されているので、この記事の賞味期限はどれくらいか全然わかりませんが、作業ログ的にまとめていきます。
Disclaimer
v1.x (1.4.6)からv2.x (2.0.30)への変更で私が認知したものをまとめていきますが、具体的にどのバージョンで変更されたかまでは追っていません。
この記事は、網羅的に調べてまとめたものではありません。
ダウングレードでは粘れません
昔のバージョンのpandasaiを指定して粘ろうとしても、おそらくduckdbでビルドエラーが起きます。(もちろん全体的にダウングレードしていけば粘れますが。)
新旧比較
SmartDataFrameからDataFrameを取得
作成したSmartDataFrameから通常のDataFrameに変換してみたいというケースです。
取り出し方が少し変更されています。
sdf = SmartDataframe(df, config={"llm": llm})
# sdf.dataframe # v1.xの書き方
sdf.dataframe.pandas_df # v2.xの書き方
また、新しく導入された`Agent`(後述)では `.dataframe` というメソッドはないようです。複数のDataFramesを扱えることを前提としているので、以下のような少し面倒な書き方になります。
agent = Agent(df, config={"llm": llm})
agent.get_dfs(df)[0].pandas_df
.chatで返ってくるのはSmartDataFrameではなくなった
何かした処理をしたDataFrameを出力するようなプロンプトを書いた場合、v1.xではSmartDataFrameが返ってきましたが、v2.xでは通常のDataFrameが返ってくるようです。
prompt = "何かしらDataFrameを出力するプロンプト"
response = sdf.chat(prompt)
isinstance(response, SmartDataframe) # v1.xでは True
isinstance(response, pd.DataFrame) # v2.xでは True
v2.xでは出力の形式をプロンプトで明記しないといけない様子なので(下記参照)、そもそも「デフォルト」が何かは少し微妙なところです。これに関しては、明示的にSmartDataFrameを出力することをプロンプトに書けばよいだけかもです(未検証)。
プロンプトの書き方についての注意
プロンプトに対する挙動はPandasAIの更新に伴ってどんどん変化すると思うのであくまで参考程度です。
v1.x (具体的にはv1.4.6) では「〇〇のデータを抽出してください」とするとSmartDataFrameが返ってきましたが、v2.x(具体的にはv2.0.30)ではそもそも理解してくれないことがあります。明示的に「〇〇のデータを抽出し、DataFrameを出力してください」とするとDataFrameを返してくれます。また、後述するようにAgentのdescriptionパラメーターを指定することでも対処できそうです。
新しい機能:独自LLMの導入
BambooLLMなるものが導入されています。
確かに、わりとちゃんとプロンプトを書かないとすぐエラーになる印象があるので、dataframeの処理に特化したいのはわかる気がします。
が、どうも現時点では情報が少ないので私はOpenAIのほうで動かしています。
新しい機能:Agentクラス
連続した会話による処理ができるようになるのが、Agentです。
SmartDataFrameというのがpandasAI独自のフォーマットでしたが、これは基本的に1回限りのプロンプトを受けて処理し、連続した会話による処理には対応していませんでした(私が方法を知らないだけだと思っていたけれど、実際できなかったんですね)。
`agent.explain()` というメソッドがあります。これは、LLMがどういう処理をしたかを説明してくれるものです。思った処理をやってくれているのかどうか確認できるのはよいですね。ただ、パラメーターに言語を指定できるようにはなっていないみたい(間違っていたらすみません)なので、説明は英語になります。
`description` というパラメーターがあります。これはGPTでいうところの`system`みたいなもので、agentの特徴設定ができます。以下は公式ドキュメントの例ですが、この例だとあまりどのように改善されるのかははっきりしませんが、`agent.explain()`の説明が詳しくなったりするということなのかなと予想します(未検証)。
agent = Agent( "data.csv", description="You are a data analysis agent. Your main goal is to help non-technical users to analyze data", )
v2.xでは、プロンプトでDataFrameを出力することを明記しないといけないと書きましたが、これを`description`に書いておけば(例を下に載せます)以前のようなプロンプトでもDataFrameを出力してくれるようになりました。
agent = Agent(df, config={"llm": llm}, description="Your basic task is to output DataFrames.")
連続した会話??
Agentでは前のプロンプトからの応答を反映して次の処理を実行できるはずなんですが、今のところ私はどうもうまく出来ていません(`agent.explain()`の説明では、一応これまでの会話を踏まえて処理していると言っているのですが、実際にはそうなっていない)。
出来ていない事の具体例を載せても微妙なので割愛します。
さいごに
ちゃんと調べてから記事を書けと言われそうでもありますが、ちょっと生モノ感もあるので、ひとまずざっと試した結果を並べてみました。
他にもskillの設定など、新機能と思われるものがありますが、試していないのでそれらも割愛しています。
間違い・コメントがあればよろしくお願いします。