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.