ankane/neighbor

Nearest neighbor search for Rails

Neighbor – Ruby on Rails용 최근접 이웃 검색

무엇인가요

  • ActiveRecord 모델에 벡터 기반 유사성 검색을 추가하는 Ruby gem입니다. 임베딩(또는 임의의 숫자 벡터)을 데이터베이스에 저장하고, 일반적인 거리 메트릭을 사용해 k개의 가장 가까운 레코드를 쿼리할 수 있습니다.

주요 기능

  • 여러 데이터베이스를 바로 사용 가능: PostgreSQL(pgvector 또는 cube 확장 사용), MariaDB, MySQL(HeatWave), SQLite, 그리고 Redis와 S3 벡터용 어댑터도 제공.
  • 다양한 거리 함수 지원: 유클리드, 코사인, 내적, 타크시 cab, 해밍, 자카르드 등 백엔드에 따라 다릅니다.
  • 다양한 벡터 유형 처리: 전체 정밀도(vector), 반정밀도(halfvec), 이진(bit/bigint), 희소(sparsevec), SQLite용 int8 벡터.
  • 대규모 검색을 빠르게 하기 위해 정확한 인덱싱과 근사 인덱싱(HNSW, IVFFlat) 모두 제공.
  • 간단한 모델 API — ActiveRecord 모델에 has_neighbors :embedding를 추가하고, 레코드나 클래스에서 nearest_neighbors를 호출만 하면 됩니다.
  • Disco 라이브러리를 활용한 하이브리드 검색(키워드 + 의미적), 희소 검색, 온라인 추천을 위한 내장 헬퍼 제공.

사용 방법

  1. Gem 추가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에서 직접 인용되었습니다.

관련

  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트