Створюємо AI Chat Agent за допомогою Laravel 12, MongoDB Atlas Vector Search та Voyage AI.

0
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 05 квітня, 2026
Дізнайтеся, як замінити застарілі фільтри на розумного чат-агента за допомогою нового Laravel AI SDK та векторного пошуку. Цей посібник демонструє створення інтелектуального помічника, який справді розуміє природну мову ваших користувачів.

Минулого тижня я зіткнувся із проблемою.

Я вивчав датасет 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.

Давайте розберемося, як це працює.


# Що ми будуємо

Airbnb Arena Interface Ось повний шлях запиту:

Користувач → 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-рішень.

1. Асиметричний пошук

Усе сімейство Voyage-4 — від large до nano — використовує єдиний векторний простір. Усі моделі сумісні між собою, тому ви можете комбінувати їх для документів і запитів без перерахунку всього корпусу даних.

Це дозволяє:

2. Гнучка розмірність та квантування

Моделі Voyage-4 підтримують різну розмірність embeddings (від 256 до 2048) завдяки Matryoshka learning. Їх можна квантувати (наприклад, до 8-біт) майже без втрати якості.

Для Atlas це означає:

3. Єдина екосистема 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',

# Модель та сервіс Embeddings

Створимо модель для оголошень 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.

Популярні

Logomark Logotype

Intervention Image: потужний інструмент для роботи з зображеннями у Laravel

Досліджуйте потужний пакет Intervention Image для PHP, який виводить редагування зображень на новий рівень з оновленою версією 3. Чи готові ви дізнатися, які нові можливості та функції чекають на вас у цьому інструменті

Logomark Logotype

Claude Agent тепер інтегрований в AI Assistant для PhpStorm

Ви коли-небудь задумувалися, як полегшити свою роботу в Laravel? У нашій статті ми розглядаємо, як інтеграція Claude Code в PhpStorm може підвищити вашу продуктивність, спростивши процес написання коду та навчання нових розробників. Читайте далі, щоб дізнатися більше про переваги та функціональність цього потужного поєднання

Logomark Logotype

Nuxt 3 + Laravel Sanctum: Просте та надійне рішення для автентифікації вашого SPA та API

У сучасній веб-розробці аутентифікація є ключовою для захисту додатків і даних користувачів. Дізнайтеся, як модуль nuxt-sanctum-authentication спростить інтеграцію між Nuxt 3 та Laravel Sanctum, забезпечуючи надійний і зручний спосіб реалізації аутентифікації для вашого проєкту