ankane/neighbor
Nearest neighbor search for Rails
Neighbor – Ruby on Rails 用の最近傍検索
何であるか
- ActiveRecord モデルにベクトルベースの類似性検索を追加する Ruby ギム。埋め込み(または任意の数値ベクトル)をデータベースに保存し、一般的な距離関数を使って k 個の近いレコードを照会できる。
主な機能
- いくつかのデータベースをそのまま利用可能:PostgreSQL(
pgvectorまたはcube拡張経由)、MariaDB、MySQL(HeatWave)、SQLite、および Redis と S3 用のアダプタも提供。 - 複数の距離関数をサポート:ユークリッド、コサイン、内積、タクシーカブ、ハミング、ジャカードなど、バックエンドによって異なります。
- 多様なベクトルタイプに対応:フル精度(
vector)、半精度(halfvec)、バイナリ(bit/bigint)、スパース(sparsevec)、SQLite 向けの int8 ベクトル。 - 大規模検索を高速化するため、正確なインデックスと近似インデックス(HNSW、IVFFlat)の両方を提供。
- シンプルなモデル API — ActiveRecord モデルに
has_neighbors :embeddingを追加し、レコードまたはクラスに対してnearest_neighborsを呼び出すだけ。 - Disco ライブラリを活用したハイブリッド検索(キーワード + 意味的)、スパース検索、オンライン推薦のための組み込みヘルパー。
使い方
- ギムの追加 —
Gemfileに追加し、bundle installを実行。 - ベクトルカラムの作成 — マイグレーションでデータベースに合ったカラム(
:vector、:cube、:binaryなど)を定義。 - モデルでの隣接関係の宣言 —
has_neighbors :embeddingを使って(必要に応じて次元数、タイプ、正規化を指定)。 - 埋め込みの入力 — 外部 API(OpenAI、Cohere)またはローカルモデル(Informers、Transformers.rb)で。
- 照会:
結果にはitem.nearest_neighbors(:embedding, distance: "euclidean").first(5) # または Item.nearest_neighbors(:embedding, [0.9, 1.3, 1.1], distance: "cosine").first(5)neighbor_distance属性が含まれます。
なぜ重要か
- 別のベクトルデータベースを必要とせずに、Rails アプリ内に意味的検索、推薦、類似性ベースの機能を実装可能。
- 基盤となる SQL エンジンのネイティブインデックス機能を活用し、データと検索を同じシステムに保つ。
- 研究用途(スパースベクトル、半精度)にも対応し、本番環境(近似インデックス、MySQL の HeatWave)にも適している。
一般的な利用例
- 埋め込みで駆動されるドキュメントや製品検索。
- 実時間でのアイテムベースの推薦。
- ハイブリッドキーワード+意味的検索。
- 任意の Rails ベースのサービスで高速な類似性照会が必要な場合。
リソース
- 完全なドキュメントは README にあり、各サポートバックエンドごとにセクションがあります。
- OpenAI、Cohere、Informers、ハイブリッド検索、スパース検索、Disco 推薦の例コード。
- 別途アダプタ:
neighbor-redisとneighbor-s3で非 SQL ストアに対応。
上記のすべての詳細は、プロジェクトの README から直接引用されています。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト