Open2

Vector DBとかANN Benchとか

Kota UENISHIKota UENISHI

承前

先日の投稿でちょっとやり取りがあった
https://bsky.app/profile/kuenishi.bsky.social/post/3lbp2n6vijc2s

https://bsky.app/profile/oza.bsky.social/post/3lbqbekn6qc2l

https://bsky.app/profile/oza.bsky.social/post/3lbqdnbbt4c2l

それでChromaDBのコードを読んでみたけどわからない

中身はSQLiteなので、 :memory: からDBを引っこ抜いて適当にファイルに保存して中を覗くと

sqlite> select * from collections;
6048f894-f20d-4df8-8137-200259fdc272|foobar|384|00000000-0000-0000-0000-000000000000|{"hnsw_configuration": {"space": "l2", "ef_constru
ction": 100, "ef_search": 10, "num_threads": 6, "M": 16, "resize_factor": 1.2, "batch_size": 100, "sync_threshold": 1000, "_type": "HNS
WConfigurationInternal"}, "_type": "CollectionConfigurationInternal"}
sqlite> select * from collection_metadata;
sqlite> select * from embeddings;
1|1a955cac-d421-43c7-b66c-3d7531acb029|id1||2024-11-27 08:37:45
2|1a955cac-d421-43c7-b66c-3d7531acb029|id2||2024-11-27 08:37:45
3|1a955cac-d421-43c7-b66c-3d7531acb029|id3||2024-11-27 08:38:26
sqlite> select * from embeddings_queue;
1|2024-11-27 08:37:45|0|persistent://default/default/6048f894-f20d-4df8-8137-200259fdc272|id1|r==
                                                                                                 ?
<9<m=@:żGt<E|"<$=$=M<?e;t=zq=R==:+<q6lbNCDnܼqIO$(c=ȁ=S=TSp=3\$>@T-=,=
   s=b
l;H-.
     5Ha36_-pS_=g;=<9g2Rl=2ЩQ=$=r=1$h><E9=P<%<6Sv
                                                 ҹ:9Jd<u<=ĺLC=2v<fuEH<z<T}Ӽ).xg=ü=M;<kzalS61=5=xN<N
B=dp=<<<@3Yög*\
               ;#hʽwmm;xA<(=1y==]^=<>Gk#=]ˈâAFLOAT32|{"chroma:document": "This is a document about pineapple"}
2|2024-11-27 08:37:45|0|persistent://default/default/6048f894-f20d-4df8-8137-200259fdc272|id2|8=Xz=Z=Q<9nR=BT=pa<f=Tެ5)Q=U;ƞ<KSc<
<\;*<<W<gmC<|FLOAT32|{"chroma:document": "This is a document about oranges"}
3|2024-11-27 08:38:26|0|persistent://default/default/6048f894-f20d-4df8-8137-200259fdc272|id3|rwT=A=Wp|*`h=<&<X$=dS=b+DE(=<sU
=T!ސӈp< ="t=8=ٽ[<І<O?<^$<ks<*
=ep=|I<Q|FLOAT32|{"chroma:document": "\u307b\u3052\u307b\u3052"}

とかまあこんな感じでっけこうフリーダムにJSON埋め込んであったりする
SQLite上に いろいろ工夫して入れているようだった
NNSするときにどういう動きをしているのかはわからないが NMSLib のやり方がデファクトなのはどうもそうっぽい

Kota UENISHIKota UENISHI

ANNBenchmark

@article{DBLP:journals/corr/MalkovY16,
  author       = {Yury A. Malkov and
                  Dmitry A. Yashunin},
  title        = {Efficient and robust approximate nearest neighbor search using Hierarchical
                  Navigable Small World graphs},
  journal      = {CoRR},
  volume       = {abs/1603.09320},
  year         = {2016},
  url          = {http://arxiv.org/abs/1603.09320},
  eprinttype    = {arXiv},
  eprint       = {1603.09320},
  timestamp    = {Thu, 26 Aug 2021 08:49:44 +0200},
  biburl       = {https://dblp.org/rec/journals/corr/MalkovY16.bib},
  bibsource    = {dblp computer science bibliography, https://dblp.org}
}

https://arxiv.org/abs/1603.09320
これを読んでるうちに「むずかしいなぁ・・・」ってなってANNBenchmark を動かし始めたのがさっき
動かし方は書いてあるとおり結構かんたん

READMEに書いてあるとおり、まず git clone をしてから

$ pip install -r requirements.py --break-system-packages

Arch LinuxでPython 3.12 だからか、これが結構通らない。requirements.txt の通りの内容だとバージョン関連の依存でどうも合わないので、バージョンを無視して全部 pip install ... で手動で入れた。 ansicolors を追加で入れたりした。そこから

$ python install.py

これが結構時間がかかる。なんかいっぱいDocker buildが走る。READMEにある

$ python run.py --dataset glove-100-angular

でとりあえず時短で動作確認する。無印だとめっちゃ時間かかるらしい