1. Go to this page and download the library: Download x-laravel/embedding library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
x-laravel / embedding example snippets
use Illuminate\Database\Eloquent\Model;
use XLaravel\Embedding\Concerns\Embeddable;
use XLaravel\Embedding\Contracts\HasEmbeddings;
class Post extends Model implements HasEmbeddings
{
use Embeddable;
protected array $embeddable = ['title', 'body'];
public function toEmbeddingText(): string
{
return $this->title . ' ' . $this->body;
}
}
class Post extends Model implements HasEmbeddings
{
use Embeddable;
protected array $embeddable = [
'title' => ['title'],
'body' => ['body'],
'full' => ['title', 'body'],
];
public function toEmbeddingText(): string|array
{
return [
'title' => $this->title,
'body' => $this->body,
'full' => $this->title . ' ' . $this->body,
];
}
}
use XLaravel\Embedding\Attributes\EmbedOn;
// Single slot
#[EmbedOn(['title', 'body'])]
class Post extends Model implements HasEmbeddings { ... }
// Multiple slots
#[EmbedOn('title', slot: 'title')]
#[EmbedOn('body', slot: 'body')]
#[EmbedOn(['title', 'body'], slot: 'full')]
class Post extends Model implements HasEmbeddings { ... }
$post->embed(); // dispatch async job (default slot)
$post->embed('title'); // dispatch for a specific slot
$post->embedSync(); // synchronous
$post->embedSync('body');
$post->hasEmbedding(): bool
$post->hasEmbedding('full'): bool
$post->embedding() // MorphOne scoped to 'default' slot
$post->embedding('title') // MorphOne scoped to 'title' slot
$post->embeddings() // MorphMany — all slots
// Find models most similar to a query vector
Post::similarTo($vector, limit: 10);
Post::similarTo($vector, limit: 10, slot: 'title');
// Filter by minimum similarity score and Eloquent constraints
Post::similarTo($vector, threshold: 0.8, where: fn($q) => $q->where('status', 'published'));
// Auto-embed a text query, then search
Post::similarToText('web framework', limit: 10);
Post::similarToText('web framework', slot: 'body');
// Rank an existing collection by similarity to a text or vector
Post::rankByRelevance($posts, 'web framework');
Post::rankByRelevance($posts, $vector, slot: 'full');
// Compare two models or a model with a vector
$post->similarityTo($otherPost): float
$post->similarityTo($otherPost, slot: 'title'): float
$post->similarityTo($vector): float
// Find the most similar records to this model, excluding itself
$post->mostSimilar(limit: 5);
$post->mostSimilar(limit: 5, slot: 'full');
$collection->rerankWithScores(
string $query,
int $take = 0, // 0 = keep all; otherwise top-N (passed as the provider's `top_n`)
float $threshold = 0.0, // 0.0 = no filter; results below this are dropped locally
?string $field = null, // model column to use as the document text; defaults to toEmbeddingText()
string $slot = 'default', // for multi-slot models, which slot's text to rerank
);
use XLaravel\Embedding\Reranker;
$reranked = app(Reranker::class)->rerank($candidates, query: 'UUID performance', take: 5);
// Static listeners
Post::onEmbedding(fn($post, $slot) => ...); // before generation
Post::onEmbedded(fn($post, $slot) => ...); // after record saved
// Observer class
class PostObserver
{
public function embedding(Post $post, string $slot): void { ... }
public function embedded(Post $post, string $slot): void { ... }
}
class Post extends Model implements HasEmbeddings
{
use Embeddable, SoftDeletes;
protected bool $keepEmbeddingOnSoftDelete = true;
}
use XLaravel\Embedding\Contracts\VectorStoreMetrics;
$snapshot = app(VectorStoreMetrics::class)->snapshot();
// Without a driver:
// ['rows' => 2950, 'bytes' => null, 'data_bytes' => null, 'index_bytes' => null]
//
// With (for example) the MySQL driver bound:
// ['rows' => 2950, 'bytes' => 130023424, 'data_bytes' => 110003200, 'index_bytes' => 20020224]