Урок 03

SimilaritySearch: поиск по векторам

SimilaritySearch — встроенный инструмент AI SDK для поиска документов по векторной близости.

Создание через модель

use App\Models\Document;
use Laravel\Ai\Tools\SimilaritySearch;

public function tools(): iterable
{
    return [
        SimilaritySearch::usingModel(Document::class, 'embedding'),
    ];
}

Первый аргумент — Eloquent-модель. Второй — колонка с векторами.

Как работает

  1. Агент получает запрос пользователя
  2. SimilaritySearch генерирует embedding для запроса
  3. Выполняет векторный поиск в БД
  4. Возвращает релевантные документы агенту
  5. Агент использует их для ответа

Порог схожести

SimilaritySearch::usingModel(Document::class, 'embedding')
    ->minSimilarity(0.4),

minSimilarity — от 0.0 до 1.0. 1.0 — идентичные документы.

Query callback

SimilaritySearch::usingModel(Document::class, 'embedding')
    ->query(fn ($query) => $query->where('published', true)),

Кастомизация запроса к БД.

Низкоуровневый поиск

Без инструмента, напрямую в Eloquent:

$documents = Document::query()
    ->whereVectorSimilarTo('embedding', 'best wineries in Napa Valley')
    ->limit(10)
    ->get();

Laravel сам сгенерирует embedding для строки.

С контролем

$documents = Document::query()
    ->select('*')
    ->selectVectorDistance('embedding', $queryEmbedding, as: 'distance')
    ->whereVectorDistanceLessThan('embedding', $queryEmbedding, maxDistance: 0.3)
    ->orderByVectorDistance('embedding', $queryEmbedding)
    ->limit(10)
    ->get();

RAG: полный цикл

  1. Пользователь загружает документ
  2. Embedding генерируется в фоне (->queue())
  3. Вектор сохраняется в БД
  4. Агент с SimilaritySearch ищет по запросу
  5. Возвращает релевантные фрагменты

Загрузка документов

use Laravel\Ai\Files\Document;

$file = Document::fromPath('/path/to/doc.pdf')->put();

Vector Stores

use Laravel\Ai\Stores;

$store = Stores::create('Knowledge Base');
$store->add($file->id);
$store->add(Document::fromStorage('manual.pdf'));

Итоги

  • SimilaritySearch — встроенный tool
  • usingModel() для подключения
  • minSimilarity для порога
  • whereVectorSimilarTo для прямого поиска
  • RAG = загрузка + embedding + поиск
  • Vector Stores для управления