建立專案 建立專案。
1 laravel new pgvector-laravel
建立資料庫。
1 docker run -it -d --name pgvector -v pgvector-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=password -e POSTGRES_USER=forge --publish 5432:5432 ankane/pgvector
安裝套件。
1 composer require ankane/pgvector
發布相關資源。
1 php artisan vendor:publish --tag="pgvector-migrations"
修改 .env
檔。
1 2 3 4 5 6 DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 DB_DATABASE=forge DB_USERNAME=forge DB_PASSWORD=password
執行遷移。
建立模型 建立一個 Embedding
模型。
1 php artisan make:model Embedding -m
修改 database/migrations/..._create_embeddings_table.php
檔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <?php use Illuminate \Database \Migrations \Migration ;use Illuminate \Database \Schema \Blueprint ;use Illuminate \Support \Facades \Schema ;return new class extends Migration { public function up ( ): void { Schema ::create ('embeddings' , function (Blueprint $table ) { $table ->id (); $table ->vector ('embedding' , 1536 ); $table ->json ('metadata' ); $table ->timestamps (); }); DB::statement ('CREATE INDEX embedding_index ON embeddings USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)' ); } public function down ( ): void { Schema ::dropIfExists ('embeddings' ); } };
修改 app/Models/Embedding.php
檔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php namespace App \Models ;use Illuminate \Database \Eloquent \Factories \HasFactory ;use Illuminate \Database \Eloquent \Model ;use Pgvector \Laravel \Vector ;class Embedding extends Model { use HasFactory ; protected $fillable = [ 'embedding' , 'metadata' , ]; protected $casts = [ 'embedding' => Vector ::class , 'metadata' => 'array' , ]; }
執行遷移。
建立範例指令 安裝 OpenAI SDK 套件。
1 2 composer require openai-php/laravel php artisan vendor:publish --provider="OpenAI\Laravel\ServiceProvider"
修改 .env
檔,添加 OpenAI 的 API Key。
建立資料 修改 routes/console.php
檔,建立 insert
範例指令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <?php use App \Models \Embedding ;use Illuminate \Support \Facades \Artisan ;use OpenAI \Laravel \Facades \OpenAI ;Artisan ::command ('insert' , function() { $sayings = [ 'Felines say meow' , 'Canines say woof' , 'Birds say tweet' , 'Humans say hello' , ]; $result = OpenAI::embeddings ()->create ([ 'model' => 'text-embedding-ada-002' , 'input' => $sayings ]); foreach ($sayings as $key =>$saying ) { Embedding ::query ()->create ([ 'embedding' => $result ->embeddings[$key ]->embedding, 'metadata' => [ 'saying' => $saying , ] ]); } });
執行 insert
指令。
檢查紀錄。
1 2 3 4 5 6 7 8 docker exec -it \ pgvector \ psql -U forge -d forge -c "select count(*) from embeddings" count ------- 4 (1 row)
查詢資料 修改 routes/console.php
檔,建立 search
範例指令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?php use App \Models \Embedding ;use Illuminate \Support \Facades \Artisan ;use OpenAI \Laravel \Facades \OpenAI ;use Pgvector \Laravel \Vector ;Artisan ::command ('search' , function() { $result = OpenAI::embeddings ()->create ([ 'model' => 'text-embedding-ada-002' , 'input' => 'What do dogs say?' , ]); $embedding = new Vector ($result ->embeddings[0 ]->embedding); $this ->table ( ['saying' ], Embedding ::query () ->orderByRaw ('embedding <-> ?' , [$embedding ]) ->take (2 ) ->pluck ('metadata' ) ); });
執行 search
指令。
1 2 3 4 5 6 7 8 php artisan search +------------------+ | saying | +------------------+ | Canines say woof | | Felines say meow | +------------------+
程式碼
參考資料