経緯
先日、今後の知見向上も兼ねて、ノートPCの買い替えで、Snapdragon X EliteのARM版WindowsPCを購入。
RAGを試すためのコードをpythonで、faissで書いていたのですが、動かなくなり、最終的にAnnoyを使用することにしたので備忘録。
slackもzoomも、ARM用のアプリケーションを出しているし、大企業が提供するライブラリは、当たり前に、ARMでも簡単に使えると思っていましたが、考えが甘かったです。
近似最近傍探索ライブラリについて
試したのは下記の3つ。できるだけ大手のものを試そうと。
下記は、Perplexityのまとめです。
Annoy、Faiss、ScaNNのどれが優れているかは、具体的な用途や要件によって異なります。以下にそれぞれの特徴をまとめて比較します。
Annoy
- 特徴: AnnoyはSpotifyによって開発されたライブラリで、高次元空間での近似最近傍探索に特化しています。ツリー構造を利用して高速な検索を実現し、特に大規模なデータセットにおいて効率的です。
- 利点:
- メモリ効率が高く、軽量
- 簡単に統合可能
- 静的ファイルとしてインデックスを扱える
- 欠点:
- GPUのサポートがない
- バッチ処理のサポートがない
- インクリメンタルなデータ追加ができない
Faiss
- 特徴: FaissはMeta(旧Facebook)のAI研究チームによって開発されたライブラリで、密なベクトルの類似性検索とクラスタリングに特化しています。大規模なデータセットの処理に優れ、GPUを利用した高速処理が可能です。
- 利点:
- 高性能で、GPUアクセラレーションによりさらに効率的
- 大規模なベクトルセットを扱うのに適している
- オープンソースで広く利用されている
- 欠点:
- 主にベクトル操作に特化しており、他のデータベース操作には不向き
- 技術的な知識が必要
ScaNN
- 特徴: ScaNNはGoogle Researchによって開発されたライブラリで、大規模データセットに対する近傍探索を効率的に行います。TensorFlowと相性が良く、高精度なベクトル検索を提供します。
- 利点:
- 高性能で、TensorFlowと統合しやすい
- 大規模データセットに効率的
- 欠点:
- セットアップとチューニングが複雑
結論
どのライブラリが最適かは、以下の要素に依存します。
- 速度と精度: FaissはGPUを活用した高速な処理が可能で、精度も高いです。Annoyは軽量で高速ですが、精度が若干劣る可能性があります。ScaNNは高精度な検索が可能ですが、設定が複雑です。
- スケーラビリティ: FaissとScaNNは大規模データセットに対してスケーラブルです。Annoyはメモリ効率が高いですが、非常に大きなデータセットには不向きです。
- 使いやすさ: Annoyは簡単に統合でき、軽量なアプリケーションに適しています。FaissとScaNNはより高度な設定が必要です。
用途や環境に応じて、これらのライブラリの中から最適なものを選ぶと良いでしょう。
結論
faissは、ImportError: cannot import name '_swigfaiss_avx2' from 'faiss'を解決できず。
ScaNNは、jitterや、tiktokenにエラーが出て、コツコツ解決していきましたが、最終的に、AttributeError: module 'scann' has no attribute 'ScannBuilder'を解決できず。
最終的には、Annoyでうまくいきました。性能や精度はこれから試してみます。