Bu makalede, gerçek üretim ortamında bir Laravel uygulamasında yapay zeka içerik oluşturma işlevinin nasıl kurulacağını inceleyeceğiz. İşlemler, kuyruklu işler, akış yanıtları, oran sınırlama ve token maliyeti farkındalığını içerecek.
Neden Laravel’de Bunu Oluşturmalısınız?
Neden Laravel’de Bunu Oluşturmalısınız?
Laravel ekosistemi, yapay zeka içerik işlemleri için beklenenden daha uygun bir altyapı sunar. Asenkron işleme için kuyruklar, gerçek zamanlı geri bildirim için olaylar, maliyetli API çağrıları için önbellekleme ve üretim geçmişini depolamak için Eloquent kullanabilirsiniz. OpenAI API’si ile birleştirildiğinde, ayrı bir mikro hizmete ihtiyaç duymadan sağlam bir temel oluşturursunuz.
Pratik bir içerik oluşturma özelliği geliştirelim — bu, bir blog taslak aracı, ürün açıklama oluşturucu veya iç belgeler asistanı işlevi görebilir.
OpenAI İstemcisini Ayarlama
OpenAI İstemcisini Ayarlama
Öncelikle resmi OpenAI PHP istemcisini ekleyin:
composer require openai-php/client
API çağrılarını kontrolcüleriniz arasında dağıtmaktansa, özel bir hizmet sınıfı oluşturun:
// app/Services/ContentGeneratorService.php
namespace App\Services;
use OpenAI\Client;
use Illuminate\Support\Facades\Cache;
class ContentGeneratorService
{
public function __construct(private readonly Client $client) {}
public function generateDraft(string $topic, string $tone = 'professional'): string
{
$cacheKey = 'draft_' . md5($topic . $tone);
return Cache::remember($cacheKey, now()->addHours(6), function () use ($topic, $tone) {
$response = $this->client->chat()->create([
'model' => 'gpt-4o-mini',
'messages' => [
[
'role' => 'system',
'content' => "You are a professional content writer. Write in a {$tone} tone. Return only the article body — no titles or meta commentary."
],
[
'role' => 'user',
'content' => "Write a detailed 400-word article draft about: {$topic}"
]
],
'max_tokens' => 800,
'temperature' => 0.7,
]);
return $response->choices[0]->message->content;
});
}
}
Bunu bir hizmet sağlayıcısına bağlayabilir veya Laravel’in otomatik çözümlemesini kullanabilirsiniz. Buradaki önbellekleme katmanı önemlidir — aynı talepler API tokenlerini iki kez harcamaz.
İşleri Asenkron Olarak İşleme
İşleri Asenkron Olarak İşleme
Hızlı bir demo dışında, içerik üretimini bir kuyrukta gerçekleştirmek istersiniz — 5-10 saniye boyunca bir istek döngüsünü engellemeden.
php artisan make:job GenerateContentJob
// app/Jobs/GenerateContentJob.php
namespace App\Jobs;
use App\Models\ContentDraft;
use App\Services\ContentGeneratorService;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class GenerateContentJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public int $tries = 3;
public int $backoff = 30; // yeniden deneme süreleri
public function __construct(
private readonly int $draftId,
private readonly string $topic,
private readonly string $tone
) {}
public function handle(ContentGeneratorService $generator): void
{
$draft = ContentDraft::findOrFail($this->draftId);
$draft->update(['status' => ]);
try {
$content = $generator->generateDraft($this->topic, $this->tone);
$draft->update([
=> $content,
=> ,
=> now(),
]);
} catch (\Exception $e) {
$draft->update([=> ]);
throw $e; // kuyruk yeniden denemeleri yönetsin
}
}
}
Bu desen, kontrolcünüzü ince tutar ve Laravel Horizon ile işleri izlemenizi sağlar.
Token Kullanımını ve Maliyetleri Takip Etme
Token Kullanımını ve Maliyetleri Takip Etme
Bu, çoğu öğreticinin göz ardı ettiği bir kısmıdır — ancak üretimde, token kullanımı doğrudan maliyeti etkiler. Bunu depolayın:
$response = $this->client->chat()->create([...]);
$usage = $response->usage;
TokenUsageLog::create([
=> ,
=> $usage->,
=> $usage->,
=> $usage->,
=> ($usage->/ ) * , // model fiyatlandırmasına göre ayarlayın
=> ,
]);
Bu tablo, aylık API faturalarını gözden geçirirken veya model değişikliği yapıp yapmamaya karar verirken son derece değerlidir.
Daha İyi Kullanıcı Deneyimi İçin Akış
Daha İyi Kullanıcı Deneyimi İçin Akış
Kullanıcıların beklediği yazı makinesi efektini istiyorsanız, OpenAI’nin akış API’si ile Laravel’in StreamedResponse‘ini birleştirmek temiz bir çözüm sunar:
public function stream(Request $request): StreamedResponse
{
return response()->stream(function () use ($request) {
$stream = $this->->chat()->createStreamed([
=> ,
[
[=> ,
=> $request->input()]
],
]);
foreach ($stream as $response) {
$text = $response->choices[]->delta->?? ;
echo . json_encode([=> ]) . \n\n;
ob_flush();
flush();
}
echo \n\n;
}, , [
=> ,
=> ,
=> ,
]);
}
Frontend’de küçük bir Alpine.js bileşeni bu SSE akışını alabilir ve UI’yi token token güncelleyebilir — WebSocket gerektirmeden.
Oran Sınırlama ve Suistimalleri Önleme
Oran Sınırlama ve Suistimalleri Önleme
Bu adımı atlamayın. Üretim uç noktalarınızı Laravel’in oran sınırlayıcısı ile sarın:
// In RouteServiceProvider or routes/api.php
RateLimiter::for(, function (Request $request) {
return Limit::perMinute()->by($request->()?->?: ->());
});
Route::([, ])
->(, [::, ]);
Bu, çoğu kullanım durumu için cömert bir limit. Maliyet modelinize bağlı olarak ayarlayın.
İhtiyaç Duyulan Prompt Mühendisliği
İhtiyaç Duyulan Prompt Mühendisliği
Sistem isteğinizin kalitesi, çıktınızın %80’ini belirler. İstekleri kod gibi ele alın — versiyonlayın, test edin ve sürekli geliştirin. İsteklerinizi veritabanında veya yapılandırma dosyalarında depolayın, sabit stringler yerine şunları kullanın:
// config/prompts.php
return [
=> [
=> ,
=> ,
],
];
Bu yaklaşım, farklı istem versiyonlarını A/B test etmeyi de kolaylaştırır — bir AI özellikleri oluştururken sıkça yaptığımız bir uygulama. Geliştiriciler için bu desenlerin nasıl bir araya geldiğini görme fırsatı arıyorsanız, web sitemizi ziyaret edin burada gerçek Laravel projelerinden uygulama desenlerini belgelemekteyiz.
Sonuç
Sonuç
Laravel’de AI içerik oluşturmayı inşa etmek sihir değil — sadece yeni bir I/O türüne uygulanmış iyi yazılım mimarisidir. İşlerinizi kuyruklayın, agresif şekilde önbellekleyin, token kullanımınızı günlüğe kaydedin ve istemlerinizi birinci sınıf yapılandırma olarak ele alın. API çağrısının etrafındaki farklılaştırıcı unsurlar, hata işleme, yeniden deneme mantığı, maliyet görünürlüğü ve asenkron işlemler sırasında UX durumlarını içerir. Bunları başarıyla uyguladığınızda, gerçekten faydalı bir şey elde edersiniz.
Kaynak: Orijinal Makale


