RAGの中でも低価格のものを目指してベクトル検索を色々調べています。Faissはfacebook researchの出しているツールで、ちょっとベンチマークをとってみたいと思います。
https://github.com/facebookresearch/faiss
CPU版
CPU版は簡単にインストールできます。
pip install faiss-cpu
今回はwikipediaから適当に文章を繋げて10万文字前後でやってみました。通常の企業では10万文字のテキストを集めて業務にというのはなかなか大変だと思います。
ベクトル検索の場合、元々の文章をチャンクと呼ばれる塊にわけ、それを検索します。今回チャンクの設定は、
chunk_size=500, chunk_overlap=125
としました。chunk_size=1000, chunk_overlap=0でもいいと思います。
文字数は、
91254
となりました。最終的な登録数は、
265
となりました。単純に分割するよりもやはりちょっと多めになります。
テキストのスプリットにかかる時間は、
0.05208230018615723 s
と一瞬ですね。気にしなくて平気ぽいです。
分割したチャンクをベクトル化してFaissのDBに登録するには、
db = FAISS.from_documents(docs, embeddings)
とできまして、
7.595894813537598 s
と意外と時間がかかりました。詳しく調べてないので間違っているかもですが、ベクトル化やDB化には時間がかかります。
次に登録したDBを使ってみます。DBのロードには、
0.0033731460571289062 s
ほとんど時間はかかりません。検索してみます。適当なプロンプトでやってみました。
0.0436704158782959 s
ということで、これくらいのサイズでしたら、ほとんど時間がかかりませんね。
-----
GPUへ行く前にちょっとチャンクサイズを変更してみました。
chunk_size=1000, chunk_overlap=0
こちらもよく使うサイズではないでしょうか?テキストのスプリットは、
0.013817548751831055 s
一瞬です。先ほどより早いですね。
DB登録も
5.615519046783447 s
と高速化されました。index数は、
96
となりました。DBの読み込み速度は、
0.0034017562866210938
こちらは先ほどのサイズとあまり変わりません。検索結果は、
0.05048203468322754 s
こちらの方が時間がかかりました。チャンクサイズが大きい方が時間がかかりそうです。
------
GPUでもやってみます。使用したGPUは使いやすいRTX3060です。
二つのチャンクサイズでやってみます。
チャンクサイズ500、オーバーラップ125
テキストのスプリット
0.0519862174987793 s
DB登録
7.6153154373168945 s
検索
0.05502033233642578 s
チャンクサイズ1000、オーバーラップ0
テキストのスプリット
0.014249086380004883 s
DB登録
5.6154749393463135 s
検索
0.04950141906738281 s
ということで、これくらいのサイズでしたら、GPUを使ってもCPUを使ってもたいして時間の差はないということになりました。
本当にGPUを使ってるのか確認してみます。多少測定にオーバーヘッドが入ってるので使ってると思いますが、きちんと消費電力が上がってるのが確認できました。通常は20-30w程度の待機電力です。
NVIDIA GeForce RTX 3060
76W / 170W
ということで、あまり小さいデータの場合FaissにはCPU/GPUの差はあまりみられませんでした。