pgvector / pgvector-php

pgvector support for PHP

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Add macros to Laravel QueryBuilder

C0chett0 opened this issue Β· comments

Hello @ankane,

I've added a few macros to the Laravel QueryBuilder in my project : whereInnerProduct, orWhereInnerProduct, selectInnerProduct , addSelectInnerProduct and orderByInnerProduct (yes I use embeddings from OpenAI πŸ˜‹). They all have an array of two values as their first parameter, those two values being either a string representing a column name, an array or a Vector.
It makes querying with your postgres operators more Laravelish :

use Pgvector\Laravel\Vector;

$embedding = new Vector([1, 2, 3]);
$neighbors = Item::orderByRaw('embedding <#> ?', [$embedding])->take(5)->get();

becomes

use Pgvector\Laravel\Vector;

$embedding = new Vector([1, 2, 3]);
$neighbors = Item::orderByInnerProduct(['embedding' , $embedding])->take(5)->get(); // direction defaults to ASC
$embedding = new Vector([1, 2, 3]);
$distances = Item::selectRaw('embedding <#> ? AS distance', [$embedding])->pluck('distance');

becomes

$embedding = new Vector([1, 2, 3]);
$distances = Item::selectInnerProduct(['embedding', $embedding], 'distance')->get(); // 'as' defaults to 'inner_product'

And so on ...

Would you be interested in a ServiceProvider adding all possible methods for the three operators ?

And if I understand correctly your idea of a distance function in Laravel it could be as easy as :

function distance($vector1, $vector2)
{
  // Deal with different types of parameters, array, Vector, json string, ....
  // Probably add a third parameter to specify which operator to use
  return DB::selectInnerProduct([$vector1, $vector2])->value('inner_product');
}

Hi @C0chett0, it'd be nice to have something like this. To avoid adding a lot of methods, I'm thinking we could do something like:

Item::nearestNeighbors('embedding', $embedding, Distance::MaxInnerProduct, maxDistance: 10)->take(5)->get();

which adds orderByRaw, selectRaw for a column named neighbor_distance, and optionally whereRaw if maxDistance is given.

This is essentially how Neighbor does it.

Added to ideas (#1)

Just released 0.1.3 with a HasNeighbors trait and nearestNeighbors method.