LlamaIndexとは?
独自のデータを読み込ませたChatGPTを利用したい場合の一つの選択肢として、LlamaIndexを利用しました。
様々なデータソースからデータを読み込みChatGPTとつなげます。
https://www.llamaindex.ai/
独自データの準備とLlamaIndexの導入
独自データをどう作るか?
ホームページからデータを取得?Json形式のデータを読み込む?Excelで取り込む?
これらはLlamaIndexで可能です。
独自データは追加・更新していくことが多いと思いますので、その運用に適したものを選択するとよいです。
データの読み込みとChatGPTへの統合
今回利用するライブラリのバージョンは以下の通りです。
langchain==0.0.349
langchain-community==0.0.1
langchain-core==0.0.13
llama-hub==0.0.45
llama-index==0.8.62
openai==0.28.1
頻繁にバージョンアップしており、バージョンを指定していないと動作しなくなることがありました。
Json形式で読み込む例
from llama_hub.file.json import JSONReader
loader = JSONReader()
documents = loader.load_data(Path('data.json'))
バージョンの影響がライブラリの読み込みでありました。
公式サイトに書いてある手順ではライブラリが見つからずエラーとなり、上記のコードで動かすことができました。
https://llamahub.ai/l/file-json?from=all
ChatGPTの強化と結果の評価
読み込むデータ形式によって回答に差が出るか?
これは差が出ました。
LlamaIndexは内部で配列のような形でデータを持ち、それらの中から類似度が高いコンテキスト情報を元にプロンプトを作成してChatGPTに問い合わせています。
例えばQ&Aが複数記載されたテキストファイルをまるごと取り込むのと、それぞれ分割して取り込むのでは、後者のほうが正しい情報を返してくれることが多かったです。Q&Aだからというのもあるかもしれません。
それを踏まえて、かつデータ更新をエンジニア以外に依頼する場合に、Excelで取り込むことが現時点ではベストでした。
ただし、llamahubに用意されているReaderを利用すると、セル内の改行が消えてしまうため、PandasでExcelを読み込んだ後、StringIterableReaderで一行ずつ読み込むようにしています。
df = pd.read_excel('./data/hr_qa.xlsx', sheet_name="data")
data = [f"{d['prompt']} \n {d['completion']}" for _, d in df.iterrows()]
documents = StringIterableReader().load_data(texts=data)
2行目で取り込む文章を加工しており、そこは工夫の余地があると考えています。
まとめ
OpenAIからはChatGPTsが使えるようになったり、AzureでもAzure AI SearchとAzure OpenAIで独自のデータを利用したChatGPTを簡単に構築することができるようになってきました。
そのため、この方式を使うメリットは薄れてきていると思いますが、学習という観点からはやる価値があると思います。
上記の2つのサービスも同じような処理がされているはずですので、どのように固有のデータを使っているのか、実際にプログラムを書いて動かすと理解しやすかったです。