Урок 02

Embeddings: вектора для поиска

Embeddings — это числовые вектора, которые представляют текст в многомерном пространстве. Похожие тексты имеют близкие вектора.

Зачем нужны

  • Семантический поиск — поиск по смыслу, а не по словам
  • RAG — Retrieval-Augmented Generation, поиск контекста для агента
  • Кластеризация — группировка похожих документов
  • Рекомендации — «похожие товары»

Генерация через Stringable

use Illuminate\Support\Str;

$embeddings = Str::of('Napa Valley has great wine.')->toEmbeddings();

Генерация через Embeddings

use Laravel\Ai\Embeddings;

$response = Embeddings::for([
    'Napa Valley has great wine.',
    'Laravel is a PHP framework.',
])->generate();

$response->embeddings; // [[0.123, 0.456, ...], [0.789, 0.012, ...]]

Размерность и модель

$response = Embeddings::for(['Текст'])
    ->dimensions(1536)
    ->generate('openai', 'text-embedding-3-small');

Хранение в БД

Миграция:

Schema::ensureVectorExtensionExists();

Schema::create('documents', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('content');
    $table->vector('embedding', dimensions: 1536);
    $table->timestamps();
});

Индекс для быстрого поиска:

$table->vector('embedding', dimensions: 1536)->index();

Cast в модели

protected function casts(): array
{
    return [
        'embedding' => 'array',
    ];
}

Кеширование

// config/ai.php
'caching' => [
    'embeddings' => [
        'cache' => true,
    ],
],

Избегает повторных API-вызовов для одинаковых текстов.

Требования

Векторные колонки работают только на PostgreSQL с расширением pgvector.

Итоги

  • Embeddings — вектора для семантики
  • toEmbeddings() или Embeddings::for()
  • vector колонка в PostgreSQL
  • pgvector обязателен
  • Кеширование включается в конфиге