Shunya Ueta

Python x SQLite3 x sqlite-vec で近似近傍探索をやろうと思ったが...

全文検索エンジン Bleve で日本語形態素解析をおこなう で bleze x kagome が気になってやろうとしたが、どうせなら一捻りしたいなと思い、Goの全文検索ライブラリである blevesearch の最新リリースを眺めていると

https://github.com/blevesearch/bleve/releases/tag/v2.4.0

v0.2.4 からvector serach が可能に backend は faiss。 テンションが上ったので、最初は、kagome x blevesearch x ANN の構成で vector indexing, query のベクトル化もGo 言語かつ検索サーバーを運用しないで完結する構成による近似近傍探索をやろうと思っていた。。。が、文章をベクトル化するお手軽な方法(Python だとが Go で見つけられなかった。

同じモチベーションらしきGoライブラリ

なので、GoにこだわらずにPythonでやってみようと思い模索してみた。

運用コストを低く抑えつつ全文検索機能を実現したい- SQLite3 で全文検索を実現する fts5 、ベクトル検索を実現する sqlite-vss でも書いたが、全文検索機能の運用は辛いことが多い。なので、

上記の条件では専用の全文検索サーバーを運用することなく実現できそうなアプローチがいろいろある。

実例では、APIサービスケンオールのアーキテクチャの内容がドンピシャだ

当時この取り組みを見たときに、なるほど! 検索でもOnline indexing が不要な状況もあるよな、頭いい!! と感動して Twitter で yomo さんと議論した思い出があります。

どうやら以前注目した asg017/sqlite-vss: A SQLite extension for efficient vector search, based on Faiss! のパッケージは後述で説明しますが問題を抱えていたらしく、それを解決するために同じ開発者によって asg017/sqlite-vec: Work-in-progress vector search SQLite extension that runs anywhere. が後継が作られたとのこと。

あと sqlite-vec からは WASMでも動くらしいので web サイト上で demo が動いていてすごい

I’m writing a new vector search SQLite Extension | Alex Garcia’s Blog

主要な改善点としては、

問題点は翻訳したものを載せると下記

> Though initially, `sqlite-vec` will only support exhaustive full-scan vector search. There will be no "approximate nearest neighbors" (ANN) options. But I hope to add IVF + HNSW in the future!

sqlite-vssの開発と採用には、次のような多くの障害がありました。
Linux + MacOSマシンでのみ機能しました(Windows、WASM、モバイルデバイスなどはなし)  
- すべてのベクトルをメモリ内に格納  
- トランザクション関連のさまざまなバグと問題  
- コンパイルが非常に難しく、時間がかかる  
- 一般的なベクトル演算がない(スカラー/バイナリ量子化)  
これらはほとんどすべて、sqlite-vssがFaissに依存していたためです。 多くの時間とエネルギーがあれば、これらの問題のいくつかは解決できるかもしれませんが、その多くはFaissによってブロックされます。 translate by gemini1.5 Pro

だが、現状フルスキャンでの近傍探索であり、近似近傍探索ではない。 なん。。。だと。。。 将来的には近似近傍探索をサポートしたいらしいが、ドキュメント総数によってはそもそもフルスキャンしても問題ない規模が大半だろうし、 SQLite 内で完結して近傍探索できるだけでも嬉しいというケースはあるっちゃありそうではある? ラズパイとか?ドキュメント全部メモリに載せても問題ない規模などかな?

Vector search in 7 different programming languages using SQL | Alex Garcia’s Blog で書かれていたサンプルコードを基に、手元のデータを対象にして実際にコードを書こうと思ってたんだが、ANNではなく、NNなら手を動かす意義もなさそうなので、ここで完!!

---

関連しているかもしれない記事


📮 📧 🐏: 記事への感想のおたよりをおまちしてます。 お気軽にお送りください。 メールアドレス入力があればメールで返信させていただきます。 もちろんお返事を希望せずに単なる感想だけでも大歓迎です。

このサイトの更新情報をRSSで配信しています。 お好きなフィードリーダーで購読してみてください。

このウェブサイトの運営や著者の活動を支援していただける方を募集しています。 もしよろしければ、Buy Me a Coffee からサポート(投げ銭)していただけると、著者の活動のモチベーションに繋がります✨
Amazonでほしいものリストも公開しているので、こちらからもサポートしていただけると励みになります。

#search #sqlite #検索エンジンOSS勉強会 #python