ankane / pgvector
pgvector support for PHP
Installs: 52 619
Dependents: 1
Suggesters: 0
Security: 0
Stars: 61
Watchers: 3
Forks: 1
Open Issues: 1
Requires
- php: >= 7.4
Requires (Dev)
- illuminate/database: >= 9.0
- phpunit/phpunit: ^9
This package is not auto-updated.
Last update: 2023-11-15 02:22:42 UTC
README
pgvector support for PHP
Getting Started
Follow the instructions for your database library:
Or check out some examples:
- Embeddings with OpenAI
- Recommendations with Disco
Laravel
Install the package
composer require ankane/pgvector
Enable the extension
php artisan vendor:publish --tag="pgvector-migrations"
php artisan migrate
You can now use the vector
type in future migrations
Schema::create('items', function (Blueprint $table) { $table->vector('embedding', 3); });
Update your model
use Pgvector\Laravel\Vector; class Item extends Model { use HasNeighbors; protected $casts = ['embedding' => Vector::class]; }
Insert a vector
$item = new Item(); $item->embedding = [1, 2, 3]; $item->save();
Get the nearest neighbors to a record
use Pgvector\Laravel\Distance; $neighbors = $item->nearestNeighbors('embedding', Distance::L2)->take(5)->get();
Also supports InnerProduct
and Cosine
distance
Get the nearest neighbors to a vector
$neighbors = Item::query()->nearestNeighbors('embedding', [1, 2, 3], Distance::L2)->take(5)->get();
Get the distances
$neighbors->pluck('neighbor_distance');
Add an approximate index in a migration
public function up() { DB::statement('CREATE INDEX my_index ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)'); // or DB::statement('CREATE INDEX my_index ON items USING hnsw (embedding vector_l2_ops)'); } public function down() { DB::statement('DROP INDEX my_index'); }
Use vector_ip_ops
for inner product and vector_cosine_ops
for cosine distance
PHP
Enable the extension
pg_query($db, 'CREATE EXTENSION IF NOT EXISTS vector');
Create a table
pg_query($db, 'CREATE TABLE items (embedding vector(3))');
Insert a vector
use Pgvector\Vector; $embedding = new Vector([1, 2, 3]); pg_query_params($db, 'INSERT INTO items (embedding) VALUES ($1)', [$embedding]);
Get the nearest neighbors to a vector
$embedding = new Vector([1, 2, 3]); $result = pg_query_params($db, 'SELECT * FROM items ORDER BY embedding <-> $1 LIMIT 5', [$embedding]);
Add an approximate index
pg_query($db, 'CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)'); // or pg_query($db, 'CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)');
See a full example
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-php.git cd pgvector-php composer install createdb pgvector_php_test composer test