Tích hợp LLMs vào Laravel: Hướng dẫn Production

· 5 min read

Tích hợp LLMs vào Laravel: Hướng dẫn Production

Tích hợp AI vào Laravel thì dễ. Làm cho nó sẵn sàng cho production (production-ready) mới khó. Người dùng ghét phải đợi 10 giây nhìn cái spinner quay quay. API thì timeout. Token thì tốn tiền.

Hướng dẫn này đi xa hơn các lệnh Http::post đơn giản để xây dựng các tính năng AI mạnh mẽ, streaming mượt mà trong Laravel.

1. Chọn tầng trừu tượng (Abstraction) đúng

Đừng tự khóa mình vào OpenAI. Năm 2026, các model thay đổi hàng tuần. Bạn có thể muốn đổi GPT-4 sang Claude 3.5 Sonnet hoặc một model Llama 3 local mà không muốn viết lại app.

Gói khuyến nghị: Echo Labs Prism

Prism là "Laravel interface cho AI". Nó cung cấp API dạng driver trôi chảy, giống như Mail hoặc Notification channels.

composer require echolabs/prism
use EchoLabs\Prism\Prism;
use EchoLabs\Prism\Enums\Provider;

$response = Prism::text()
    ->using(Provider::OpenAI, 'gpt-4o')
    ->withPrompt('Giải thích Laravel Middleware')
    ->generate();

echo $response->text;

Nếu sau này bạn đổi sang Anthropic, bạn chỉ cần đổi Provider enum.

2. Sức mạnh của Streaming (Server-Sent Events)

AI models sinh văn bản theo từng token. Bạn nên hiển thị nó cho user ngay lập tức. Chờ đợi phản hồi đầy đủ làm cho ứng dụng cảm giác bị treo.

Laravel hỗ trợ "Streamed Responses" (Phản hồi luồng) nguyên bản.

// routes/web.php

Route::get('/chat-stream', function () {
    return response()->stream(function () {
        // Pseudo-code minh họa
        $stream = OpenAI::chat()->createStreamed([
            'model' => 'gpt-4o',
            'messages' => [['role' => 'user', 'content' => 'Kể chuyện cho tôi']],
        ]);

        foreach ($stream as $response) {
            $text = $response->choices[0]->delta->content;
            if ($text) {
                // Định dạng SSE chuẩn
                echo "data: " . json_encode(['text' => $text]) . "\n\n";
                // Ép PHP đẩy buffer ra ngay
                ob_flush();
                flush();
            }
        }
        echo "data: [DONE]\n\n";
    }, 200, [
        'Content-Type' => 'text/event-stream',
        'Cache-Control' => 'no-cache',
        'X-Accel-Buffering' => 'no', // Quan trọng cho Nginx!
    ]);
});

Ở phía frontend (JS), sử dụng EventSource để hứng dữ liệu này.

3. Xử lý Context Windows & Giới hạn Token

Gửi toàn bộ database của bạn cho LLM sẽ:

  1. Làm sập request (Context Limit Exceeded).
  2. Làm bạn phá sản (Chi phí).

Chiến lược tính toán

Trước khi gửi, hãy ước lượng token. Quy tắc ngón tay cái: 1 token ≈ 4 ký tự.

$maxContext = 128000;
$currentTokens = strlen($prompt) / 4;

if ($currentTokens > $maxContext) {
    throw new Exception("Prompt quá lớn!");
}

Đối với lịch sử Chat, hãy triển khai "cửa sổ trượt" (sliding window). Chỉ gửi 10 tin nhắn gần nhất, hoặc tóm tắt các tin nhắn cũ hơn.

4. Xử lý lỗi mạnh mẽ (Robust Error Handling)

AI APIs không ổn định. Chúng thường xuyên bị giới hạn tốc độ (rate-limit).

Không bao giờ gọi chúng trong controller đồng bộ mà không có khối try-catch. Đối với background jobs, sử dụng cơ chế retry của Laravel với thời gian chờ tăng dần (exponential backoff).

// app/Jobs/GenerateSummary.php

public $tries = 5;
public $backoff = [10, 30, 60, 120]; // Đợi lâu hơn sau mỗi lần lỗi

public function handle()
{
    try {
        // Gọi AI
    } catch (RateLimitException $e) {
        $this->release(30); // Thử lại sau 30s
    }
}

5. Dữ liệu có cấu trúc (JSON Mode)

Đừng yêu cầu AI "trả về danh sách ngăn cách bởi dấu phẩy". Hãy yêu cầu JSON. OpenAI có chế độ json_object chuyên dụng.

$response = Http::withToken($key)->post(..., [
    'response_format' => ['type' => 'json_object'],
    'messages' => [
        ['role' => 'system', 'content' => 'Bạn chỉ xuất ra JSON.'],
        ['role' => 'user', 'content' => 'Trích xuất tên và email từ văn bản...'],
    ]
]);

$data = json_decode($response['choices'][0]['message']['content']);
// Đảm bảo là object PHP hợp lệ!

Kết luận

  1. Trừu tượng hóa: Dùng Prism hoặc tương tự để tránh phụ thuộc một nhà cung cấp.
  2. Stream: Cải thiện trải nghiệm người dùng bằng cách hiển thị text dạng dòng chảy.
  3. Queue: Xử lý các tác vụ lâu trong nền.
  4. Retry: Lường trước lỗi API và xử lý chúng duyên dáng.

Tích hợp AI ít liên quan đến phần "Thông minh" của AI hơn là phần "Kỹ thuật hệ thống" (Systems Engineering) vững chắc.

Bình luận