GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — GitHub - pgvector/pgvector-elixir: pgvector support for Elixir

BranchesTags
Open more actions menu

Latest commit

 

History

183 Commits
183 Commits

Folders and files

NameName
Last commit message
Last commit date
.github/workflows
.github/workflows
 
 
examples
examples
 
 
lib
lib
 
 
test
test
 
 
.formatter.exs
.formatter.exs
 
 
.gitignore
.gitignore
 
 
CHANGELOG.md
CHANGELOG.md
 
 
LICENSE.txt
LICENSE.txt
 
 
README.md
README.md
 
 
mix.exs
mix.exs
 
 

Repository files navigation

pgvector-elixir

pgvector support for Elixir

Supports Ecto and Postgrex

Build Status

Installation

Add this line to your application’s mix.exs under deps:

{:pgvector, "~> 0.4.0"}

And follow the instructions for your database library:

  • Ecto
  • Postgrex

Or check out some examples:

  • Embeddings with OpenAI
  • Binary embeddings with Cohere
  • Sentence embeddings with Bumblebee
  • Hybrid search with Bumblebee (Reciprocal Rank Fusion)
  • Sparse search with Bumblebee
  • Horizontal scaling with Citus
  • Bulk loading with COPY

Ecto

Create lib/postgrex_types.ex with:

Postgrex.Types.define(MyApp.PostgrexTypes, Pgvector.extensions() ++ Ecto.Adapters.Postgres.extensions(), [])

And add to config/config.exs:

config :my_app, MyApp.Repo, types: MyApp.PostgrexTypes

Create a migration

mix ecto.gen.migration create_vector_extension

with:

defmodule MyApp.Repo.Migrations.CreateVectorExtension do
  use Ecto.Migration

  def up do
    execute "CREATE EXTENSION IF NOT EXISTS vector"
  end

  def down do
    execute "DROP EXTENSION vector"
  end
end

Run the migration

mix ecto.migrate

You can now use the vector type in future migrations

create table(:items) do
  add :embedding, :vector, size: 3
end

Also supports :halfvec, :bit, and :sparsevec

Update the model

schema "items" do
  field :embedding, Pgvector.Ecto.Vector
end

Also supports Pgvector.Ecto.HalfVector, Pgvector.Ecto.Bit, and Pgvector.Ecto.SparseVector

Insert a vector

alias MyApp.{Repo, Item}

Repo.insert(%Item{embedding: [1, 2, 3]})

Get the nearest neighbors

import Ecto.Query
import Pgvector.Ecto.Query

Repo.all(from i in Item, order_by: l2_distance(i.embedding, ^Pgvector.new([1, 2, 3])), limit: 5)

Also supports max_inner_product, cosine_distance, l1_distance, hamming_distance, and jaccard_distance

Convert a vector to a list or Nx tensor

item.embedding |> Pgvector.to_list()
item.embedding |> Pgvector.to_tensor()

Add an approximate index in a migration

create index("items", ["embedding vector_l2_ops"], using: :hnsw)
# or
create index("items", ["embedding vector_l2_ops"], using: :ivfflat, options: "lists = 100")

Use vector_ip_ops for inner product and vector_cosine_ops for cosine distance

Postgrex

Register the extension

Postgrex.Types.define(MyApp.PostgrexTypes, Pgvector.extensions(), [])

And pass it to start_link

{:ok, pid} = Postgrex.start_link(types: MyApp.PostgrexTypes)

Enable the extension

Postgrex.query!(pid, "CREATE EXTENSION IF NOT EXISTS vector", [])

Create a table

Postgrex.query!(pid, "CREATE TABLE items (embedding vector(3))", [])

Insert a vector

Postgrex.query!(pid, "INSERT INTO items (embedding) VALUES ($1)", [[1, 2, 3]])

Get the nearest neighbors

Postgrex.query!(pid, "SELECT * FROM items ORDER BY embedding <-> $1 LIMIT 5", [[1, 2, 3]])

Convert a vector to a list or Nx tensor

vector |> Pgvector.to_list()
vector |> Pgvector.to_tensor()

Add an approximate index

Postgrex.query!(pid, "CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)", [])
# or
Postgrex.query!(pid, "CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)", [])

Use vector_ip_ops for inner product and vector_cosine_ops for cosine distance

Reference

Vectors

Create a vector from a list

vec = Pgvector.new([1, 2, 3])

Or an Nx tensor

vec = Nx.tensor([1.0, 2.0, 3.0]) |> Pgvector.new()

Get a list

list = vec |> Pgvector.to_list()

Get an Nx tensor

tensor = vec |> Pgvector.to_tensor()

Half Vectors

Create a half vector from a list

vec = Pgvector.HalfVector.new([1, 2, 3])

Or an Nx tensor

vec = Nx.tensor([1.0, 2.0, 3.0], type: :f16) |>  Pgvector.HalfVector.new()

Get a list

list = vec |> Pgvector.to_list()

Get an Nx tensor

tensor = vec |> Pgvector.to_tensor()

Sparse Vectors

Create a sparse vector from a list

vec = Pgvector.SparseVector.new([1, 2, 3])

Or an Nx tensor

vec = Nx.tensor([1.0, 2.0, 3.0]) |> Pgvector.SparseVector.new()

Or a map of non-zero elements

elements = %{0 => 1.0, 2 => 2.0, 4 => 3.0}
vec = Pgvector.SparseVector.new(elements, 6)

Note: Indices start at 0

Get the number of dimensions

dim = vec |> Pgvector.SparseVector.dimensions()

Get the indices of non-zero elements

indices = vec |> Pgvector.SparseVector.indices()

Get the values of non-zero elements

values = vec |> Pgvector.SparseVector.values()

Get a list

list = vec |> Pgvector.to_list()

Get an Nx tensor

tensor = vec |> Pgvector.to_tensor()

History

View the changelog

Contributing

Everyone is encouraged to help improve this project. Here are a few ways you can help:

  • Report bugs
  • Fix bugs and submit pull requests
  • Write, clarify, or fix documentation
  • Suggest or add new features

To get started with development:

git clone https://github.com/pgvector/pgvector-elixir.git
cd pgvector-elixir
mix deps.get
createdb pgvector_elixir_test
mix test

To run an example:

cd examples/loading
mix deps.get
createdb pgvector_example
mix run example.exs

About

pgvector support for Elixir

Resources

Readme
MIT license

Security policy

Security policy
Activity
Custom properties

Stars

226 stars

Watchers

7 watching

Forks

12 forks
Report repository

Releases

Packages

Used by

Contributors

Languages

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.