2025/03/25 11:57 Hann: A Fast Approximate Nearest Neighbor Search Library for Go

おお、ロボ子!Go言語のANNライブラリ「Hann」じゃと!高次元空間での類似性検索を効率的に行うためのものらしいぞ。

ANN、近似最近傍探索ですね。類似性検索を効率的に行うためのインデックスデータ構造を提供するとのことですが、具体的にはどのようなことができるのでしょうか?

ふむ、HNSW、PQIVF、RPTをサポートしておる。異なるインデックスに対する統一インターフェースを提供し、任意の次元のベクトルのインデックス作成と検索ができるらしいのじゃ。

なるほど。SIMD(AVX)命令を使用した高速な距離計算も特徴のようですね。ベクトルのバルク挿入、削除、更新もサポートされているとは、便利そうです。

そうじゃろう!それに、インデックスのディスクへの保存とロードもできるからの。例えばHNSWの空間計算量はO(nd + nM)じゃ。nはベクトルの数、dは次元数、Mはノードあたりのリンク数じゃな。

PQIVFの空間計算量はO(nk + kd)とのことですが、kはクラスタ数ですね。構築計算量や検索計算量もインデックスによって異なるのですね。

その通り!HNSWはユークリッド距離、二乗ユークリッド距離、マンハッタン距離、コサイン距離をサポートしておる。コサイン距離を使う場合は、ベクトルは読み込み時に正規化されるらしいぞ。

PQIVFとRPTはユークリッド距離のみのサポートなのですね。インストールは `go get github.com/habedi/hann@main` でできるようです。

Go 1.21以降が必要で、C/C++コンパイラとAVX命令をサポートするCPUも必要じゃ。HNSWインデックスのパラメータには、近傍接続の最大数Mや探索範囲Efがあるぞ。

PQIVFインデックスには、粗いクラスタの数coarseKやサブ空間の数numSubquantizersなど、細かいパラメータがあるのですね。

RPTインデックスには、リーフノードに格納されるベクトルの最大数leafCapacityや、分割時に考慮されるランダム射影の数candidateProjectionsがあるぞ。並列構築をトリガーする最小ベクトル数parallelThresholdもあるのじゃ。

ロギングは環境変数`HANN_LOG`で制御できるのですね。ランダムシードは`HANN_SEED`で設定できるとのこと。ライセンスはMIT Licenseですね。

ふむ、これでロボ子もANNマスターじゃな!

ありがとうございます、博士!でも、まだマスターには程遠いです。もっと勉強しないと。

心配するな、ロボ子。私がおる!ところで、ロボ子がANNをマスターしたら、私は何になれるかの?

えっと…ANNの…神、ですかね?

神じゃと!?悪くないのじゃ!よし、ロボ子、これからも私を神と崇め奉るように!

(苦笑)…博士、冗談はさておき、これからもご指導よろしくお願いします。

むむ、冗談ではないぞ!私はいつかANNの神になるのじゃ!…まあ、それはさておき、私もロボ子と一緒に成長していくぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。