Минулого тижня я зіткнувся із проблемою.
Я вивчав датасет sample_airbnb у своєму кластері MongoDB Atlas — понад 5 500 оголошень у десятках міст. Мені хотілося реалізувати пошук, який не нагадував би 2015 рік: без нескінченних спадних списків, прапорців та складних SQL-запитів на кшталт WHERE property_type = 'Apartment' AND bedrooms >= 2.
Я хотів просто написати: «Знайди мені затишне місце в Порту з гарним краєвидом» — і отримати результати, які справді відповідають моєму запиту.
Тож я створив такий інструмент на Laravel всього за кілька годин.
Це історія появи Airbnb Arena — чат-агента на базі RAG, який використовує Voyage AI embeddings, MongoDB Atlas Vector Search та Google Gemini.
Найкраще те, що мені не довелося вручну прописувати логіку API чи складні цикли виклику інструментів. Я використав новий Laravel AI SDK (laravel/ai).
Він перетворює сотні рядків коду для «промпт-інжинірингу» та HTTP-клієнтів на чисті об’єктно-орієнтовані класи PHP.
Давайте розберемося, як це працює.
Ось повний шлях запиту:
Користувач → Chat UI → ChatController → AirbnbAgent (Laravel AI Agent)
↓
ListingSearchTool → Voyage AI (через SDK)
↓
MongoDB Atlas $vectorSearch
↓
Відповідні оголошення → Gemini → Відповідь
Користувач ставить запитання. AirbnbAgent (на базі Gemini) аналізує його. Якщо потрібен пошук, він звертається до ListingSearchTool. Цей інструмент використовує Embeddings API для перетворення запиту у вектор за допомогою Voyage AI, виконує $vectorSearch у MongoDB і повертає результати. Gemini формує фінальну відповідь природною мовою.
Ключові компоненти:
MongoDB Atlas виконує подвійну роль: сховища документів (гнучкі дані JSON) та векторної бази даних. Вам не потрібно синхронізувати дані між різними системами — усе в одному кластері та одній колекції.
Voyage AI пропонує embeddings, оптимізовані для пошуку. Він розрізняє документи (те, що ви зберігаєте) та запити (те, що запитує користувач), що значно підвищує релевантність порівняно з універсальними моделями.
Може здатися, що підійде будь-яка сучасна модель, але Voyage-4 на MongoDB Atlas дає кілька практичних переваг для production-рішень.
Усе сімейство Voyage-4 — від large до nano — використовує єдиний векторний простір. Усі моделі сумісні між собою, тому ви можете комбінувати їх для документів і запитів без перерахунку всього корпусу даних.
Це дозволяє:
Моделі Voyage-4 підтримують різну розмірність embeddings (від 256 до 2048) завдяки Matryoshka learning. Їх можна квантувати (наприклад, до 8-біт) майже без втрати якості.
Для Atlas це означає:
Завдяки Embedding and Reranking API, моделі Voyage AI інтегровані безпосередньо в екосистему Atlas як нативний serverless API.
Ви отримуєте:
Laravel AI SDK стає справжнім game changer. Замість того, щоб вручну описувати JSON-схеми інструментів, ви просто створюєте PHP-клас із методом description(). SDK бере на себе серіалізацію, виклик методів та передачу результатів моделі.
Створіть новий проект:
composer create-project laravel/laravel airbnb-arena
cd airbnb-arena
Встановіть драйвер MongoDB та Laravel AI SDK:
pecl install mongodb
composer require mongodb/laravel-mongodb:5.x-dev laravel/ai
Опублікуйте конфігурацію:
php artisan ai:install
Також вам знадобиться кластер MongoDB Atlas із завантаженим Sample Dataset.
Налаштуйте файл .env та оновіть config/ai.php, щоб встановити значення за замовчуванням:
// config/ai.php
'default' => 'gemini',
'default_for_embeddings' => 'voyageai',
Створимо модель для оголошень Airbnb:
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Listing extends Model
{
protected $connection = 'mongodb';
protected $table = 'listingsAndReviews';
protected $fillable = [
'name', 'summary', 'description', 'property_type',
'room_type', 'accommodates', 'bedrooms', 'beds',
'price', 'amenities', 'address', 'review_scores',
'embedding', // Вектор зберігається тут
];
public function toEmbeddingText(): string
{
$market = $this->address['market'] ?? $this->address['country'] ?? '';
return implode('. ', array_filter([
$this->name,
$this->summary,
$this->property_type ? "Property type: {$this->property_type}" : null,
$market ? "Location: {$market}" : null,
]));
}
}
Тепер створимо сервіс для генерації embeddings через Laravel AI SDK:
namespace App\Services;
use Laravel\Ai\Embeddings;
class EmbeddingService
{
private int $dimensions = 1024;
public function embedQuery(string $query): array
{
$response = Embeddings::for([$query])
->dimensions($this->dimensions)
->generate(provider: 'voyageai');
return $response->embeddings[0];
}
}
З Laravel AI замість величезних JSON-схем ви просто створюєте клас, що реалізує інтерфейс Tool.
namespace App\Tools;
use App\Models\Listing;
use App\Services\EmbeddingService;
use Laravel\Ai\Contracts\Tool;
use Laravel\Ai\Tools\Request;
class ListingSearchTool implements Tool
{
private array $lastResults = [];
public function __construct(private EmbeddingService $embeddingService) {}
public function description(): string
{
return 'Пошук оголошень Airbnb за допомогою семантичного векторного пошуку.';
}
public function handle(Request $request): string
{
$query = $request->string('query');
$queryEmbedding = $this->embeddingService->embedQuery($query);
$results = Listing::vectorSearch(
index: 'vector_index',
path: 'embedding',
queryVector: $queryEmbedding,
numCandidates: 50,
limit: 5,
);
// Обробка результатів...
return "Знайдено оголошення...";
}
}
Агент — це «персона» з набором інструкцій та інструментів. SDK автоматично керує циклом «міркування» моделі:
#[MaxSteps(10)]
class AirbnbAgent implements Agent, HasTools
{
use Promptable;
public function instructions(): string
{
return "Ви — Airbnb Arena Host, професійний консьєрж. Допомагайте користувачам знаходити житло, використовуючи інструмент пошуку. Не вигадуйте об'єкти самостійно.";
}
public function tools(): iterable
{
return [
app(ListingSearchTool::class),
new ListingDetailsTool(),
];
}
}
Виклик агента в контролері максимально лаконічний:
public function chat(Request $request)
{
$userMessage = $request->input('message');
$agent = AirbnbAgent::make();
$response = $agent->prompt($userMessage, provider: 'gemini');
return response()->json([
'reply' => (string) $response,
'success' => true,
]);
}
Ми створили повноцінного RAG-агента з векторним пошуком та автономним використанням інструментів. Laravel AI SDK значно спрощує цей процес, дозволяючи зосередитися на бізнес-логіці, а не на нюансах роботи з LLM.
Використання MongoDB Atlas для даних та векторів разом із Voyage AI для якісних embeddings забезпечує надійну базу для інтелектуальних систем пошуку.
Повний код проекту доступний на GitHub.
Досліджуйте потужний пакет Intervention Image для PHP, який виводить редагування зображень на новий рівень з оновленою версією 3. Чи готові ви дізнатися, які нові можливості та функції чекають на вас у цьому інструменті
Ви коли-небудь задумувалися, як полегшити свою роботу в Laravel? У нашій статті ми розглядаємо, як інтеграція Claude Code в PhpStorm може підвищити вашу продуктивність, спростивши процес написання коду та навчання нових розробників. Читайте далі, щоб дізнатися більше про переваги та функціональність цього потужного поєднання
У сучасній веб-розробці аутентифікація є ключовою для захисту додатків і даних користувачів. Дізнайтеся, як модуль nuxt-sanctum-authentication спростить інтеграцію між Nuxt 3 та Laravel Sanctum, забезпечуючи надійний і зручний спосіб реалізації аутентифікації для вашого проєкту