はじめに
こんにちは!今回は、LangChainとOllama(llama3)を使用して、タイタニックのデータセットに対する質問応答をしてみます。前回はpandas_dataframe_agentを使用していましたが、今回はこれを使わずにテーブルのデータを文字列としてあつかって、LLMでそこに聞いてみるアプローチをしました。
エージェントを使わなかった場合、情報量が少ないとエラーが発生せず、うまくいくこともあるのではとおもって試してみました。
結論からいいますと、この記事は失敗談です。私の考えは甘かったです・・。
試行錯誤の結果、全体のデータに対して質問するよりも、部分的な情報に対して扱う方が、現在の自分の扱えるモデル(llama3)では実用性が高いのではないかということが分かりました。この経験を共有し、皆さんの参考になればと思います。
ただし、将来的にもっとパラメータ数の多いモデル、違うハードウェアで動かした場合には結果が変わってくる時代がそう遠くない未来にくるのではと思っています。
きっと近い未来にもっとうまくいくはず・・?agent使った場合も、もっと精度高くなっていく?
前提条件
- Python 3.7以上
- Pandas
- LangChain
- Ollama
ollamaはインストールされていて、llama3のモデルをpullしていることを前提としています。
環境設定
まず、必要なライブラリをインストールします。
pip install pandas langchain ollama langchain_community
コードの説明
以下のコードは、LangChainとOllamaを使用して、タイタニックデータセットに対して直接質問を投げる方法を示しています。
ステップ1: ライブラリのインポート
import pandas as pd
from langchain_community.llms import Ollama
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
ステップ2: データの読み込み
サンプルデータとしてタイタニックのデータセットを読み込みます。
# サンプルデータとしてタイタニックのデータセットを読み込む
df = pd.read_csv(
"https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv"
)
ステップ3: LLMのインスタンス作成
Ollamaを使用して、言語モデルのインスタンスを作成します。
# LLMのインスタンスを作成
llm = Ollama(model="llama3")
ステップ4: PromptTemplateとLLMChainの作成
PromptTemplateとLLMChainを作成し、DataFrameを文字列に変換した後、新しい質問を投げます。
# PromptTemplateを作成
template = """
{{question}}
### Document
{{dataframe}}
### Answer
"""
prompt = PromptTemplate(template=template, input_variables=["dataframe", "question"])
# LLMChainを作成
llm_chain = LLMChain(prompt=prompt, llm=llm)
ステップ5: 質問の実行
DataFrameを文字列に変換し、質問を投げます。
# DataFrameを文字列に変換
dataframe_str = df.to_string()
# 質問を定義
question = "how many rows are there in PassengerId?"
# 質問を投げて回答を得る
response = llm_chain.run(dataframe=dataframe_str, question=question)
print("Answer:", response)
結果
google colabでの実験結果
891なんだが・・・
ChatGPTで確認したところ、517人だった・・・。うーん。
ChatGPTのほうはコードインタープリターでpythonで処理した結果だしな。ギャップがあることがわかった。ChatGPTになれて、それが当たり前になってる自分の感覚も麻痺しているのかもしれない・・。
まとめ
LangChainとOllamaを使用すると、データフレームに対して直接質問を投げ、回答を得ることができます。しかし、今回の試行から、全体のテーブルデータに対してLLMで操作するよりも、部分的な情報に対して扱う方が実用性があるのではないかという、結論になりました。現時点では。これは一つの失敗談として、次回以降の改善に役立てたいと思います。将来的に、もっとパラメータ数の多いモデル、更新されたライブラリ、実装方法で試してみることで、結果が変わるかもしれません。データの探索や分析をより効率的に行うための一助になれば幸いです。