- Notifications
You must be signed in to change notification settings - Fork2
pgvector/pgvector-ruby
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
pgvector support for Ruby
For Rails, check outNeighbor
Add this line to your application’s Gemfile:
gem"pgvector"
And follow the instructions for your database library:
Or check out some examples:
- Embeddings with OpenAI
- Binary embeddings with Cohere
- Sentence embeddings with Informers
- Hybrid search with Informers (Reciprocal Rank Fusion)
- Sparse search with Transformers.rb
- Morgan fingerprints with RDKit.rb
- Topic modeling with tomoto.rb
- User-based recommendations with Disco
- Item-based recommendations with Disco
- Horizontal scaling with Citus
- Bulk loading with
COPY
Enable the extension
conn.exec("CREATE EXTENSION IF NOT EXISTS vector")
Optionally enable type casting for results
registry=PG::BasicTypeRegistry.new.define_default_typesPgvector::PG.register_vector(registry)conn.type_map_for_results=PG::BasicTypeMapForResults.new(conn,registry:registry)
Create a table
conn.exec("CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3))")
Insert a vector
embedding=[1,2,3]conn.exec_params("INSERT INTO items (embedding) VALUES ($1)",[embedding])
Get the nearest neighbors to a vector
conn.exec_params("SELECT * FROM items ORDER BY embedding <-> $1 LIMIT 5",[embedding]).to_a
Add an approximate index
conn.exec("CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)")# orconn.exec("CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)")
Usevector_ip_ops for inner product andvector_cosine_ops for cosine distance
Enable the extension
DB.run("CREATE EXTENSION IF NOT EXISTS vector")
Create a table
DB.create_table:itemsdoprimary_key:idcolumn:embedding,"vector(3)"end
Add the plugin to your model
classItem <Sequel::Modelplugin:pgvector,:embeddingend
Insert a vector
Item.create(embedding:[1,1,1])
Get the nearest neighbors to a record
item.nearest_neighbors(:embedding,distance:"euclidean").limit(5)
Also supportsinner_product,cosine,taxicab,hamming, andjaccard distance
Get the nearest neighbors to a vector
Item.nearest_neighbors(:embedding,[1,1,1],distance:"euclidean").limit(5)
Add an approximate index
DB.add_index:items,:embedding,type:"hnsw",opclass:"vector_l2_ops"
Usevector_ip_ops for inner product andvector_cosine_ops for cosine distance
Create a sparse vector from an array
vec=Pgvector::SparseVector.new([1,0,2,0,3,0])
Or a hash of non-zero elements
vec=Pgvector::SparseVector.new({0=>1,2=>2,4=>3},6)
Note: Indices start at 0
Get the number of dimensions
dim=vec.dimensions
Get the indices of non-zero elements
indices=vec.indices
Get the values of non-zero elements
values=vec.values
Get an array
arr=vec.to_a
View thechangelog
Everyone is encouraged to help improve this project. Here are a few ways you can help:
- Report bugs
- Fix bugs andsubmit pull requests
- Write, clarify, or fix documentation
- Suggest or add new features
To get started with development:
git clone https://github.com/pgvector/pgvector-ruby.gitcd pgvector-rubycreatedb pgvector_ruby_testbundle installbundleexec raketest
To run an example:
cd examples/loadingbundle installcreatedb pgvector_examplebundleexec ruby example.rb
About
pgvector support for Ruby
Resources
License
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors2
Uh oh!
There was an error while loading.Please reload this page.