Векторный поиск в Laravel 13: поиск по смыслу вместо слов

mr. Cooper 1 день назад Веб-разработка
Векторный поиск в 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.

Комментарии

Пока нет комментариев. Будьте первым, кто напишет.

Чтобы оставить комментарий, войдите в аккаунт.

Похожие статьи