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 라이브러리를 활용한 하이브리드 검색(키워드 + 의미적), 희소 검색, 온라인 추천을 위한 내장 헬퍼 제공.
사용 방법
- Gem 추가 —
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에서 직접 인용되었습니다.
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트