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 ライブラリを活用したハイブリッド検索(キーワード + 意味的)、スパース検索、オンライン推薦のための組み込みヘルパー。

使い方

  1. ギムの追加Gemfile に追加し、bundle install を実行。
  2. ベクトルカラムの作成 — マイグレーションでデータベースに合ったカラム(:vector:cube:binary など)を定義。
  3. モデルでの隣接関係の宣言has_neighbors :embedding を使って(必要に応じて次元数、タイプ、正規化を指定)。
  4. 埋め込みの入力 — 外部 API(OpenAI、Cohere)またはローカルモデル(Informers、Transformers.rb)で。
  5. 照会
    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-redisneighbor-s3 で非 SQL ストアに対応。

上記のすべての詳細は、プロジェクトの README から直接引用されています。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト