Векторный поиск в Laravel 13: поиск по смыслу вместо слов
Классический поиск в веб-приложениях работает довольно примитивно: он сравнивает слова в запросе с текстом в базе. Из-за этого пользователь часто получает нерелевантные результаты, даже если смысл совпадает.
Векторный поиск решает эту проблему за счёт перехода от текста к его смысловому представлению.
Как это работает
Любой текст превращается в числовой массив - embedding.
Этот массив отражает смысл фразы, а не сами слова.
Два текста с похожим смыслом оказываются рядом в многомерном пространстве. Разные - далеко друг от друга.
Запрос пользователя также преобразуется в вектор, после чего система ищет ближайшие совпадения.
База для реализации в Laravel
Чаще всего используется связка PostgreSQL и расширения pgvector. Оно позволяет хранить и сравнивать векторы прямо в базе данных.
Активируется расширение простой командой:
CREATE EXTENSION vector;Структура таблицы
В Laravel 13 можно хранить embeddings прямо в таблице:
Schema::create('documents', function (Blueprint $table) {
$table->id();
$table->text('content');
$table->vector('embedding', 1536);
$table->timestamps();
});Здесь 1536 - размерность вектора, которая зависит от используемой модели эмбеддингов.
Получение embedding через OpenAI
Laravel удобно работает с OpenAI SDK. Пример генерации вектора:
use OpenAI\Laravel\Facades\OpenAI;
$text = "Как работает очередь задач в Laravel";
$response = OpenAI::embeddings()->create([
'model' => 'text-embedding-3-small',
'input' => $text,
]);
$embedding = $response->data[0]->embedding;Сохранение данных
После генерации embedding сохраняется вместе с текстом:
Document::create([
'content' => $text,
'embedding' => $embedding,
]);Теперь каждый документ содержит не только текст, но и его смысловое представление.
Поиск по смыслу
При поиске запрос также преобразуется в embedding, после чего происходит сравнение:
$query = "очереди и фоновые задачи";
$queryEmbedding = OpenAI::embeddings()->create([
'model' => 'text-embedding-3-small',
'input' => $query,
])->data[0]->embedding;
$results = DB::table('documents')
->orderByRaw('embedding <-> ?', [$queryEmbedding])
->limit(10)
->get();Оператор <-> используется для вычисления расстояния между векторами.
Пример поведения системы
В базе могут быть записи:
“Laravel Queue и обработка задач”
“Работа с Redis в фоновых процессах”
“Очереди задач в Laravel”
Пользователь вводит запрос:
“как запускать задачи в фоне”
Даже без совпадения слов система находит релевантные документы, потому что смысл совпадает.
Где это особенно полезно
Векторный поиск хорошо работает там, где важен смысл, а не точные совпадения текста. Это справочные системы, поиск по документации, AI-чатботы и внутренние базы знаний.
Почему Laravel 13 упрощает задачу
Раньше для такого поиска требовались отдельные решения вроде Elasticsearch или внешних vector databases. Теперь можно использовать PostgreSQL и стандартный стек Laravel, добавив только pgvector и embeddings.
Итог
Векторный поиск меняет сам принцип работы поиска в приложениях. Вместо буквального совпадения слов система начинает понимать смысл запроса. Laravel 13 позволяет внедрить этот подход без сложной инфраструктуры, используя привычный PHP-стек и современный AI.
Комментарии
Чтобы оставить комментарий, войдите в аккаунт.