Takip et

RAG Sistemi Nedir ve Neden Önemlidir?

PHP ve Neuron AI ile Akşamınıza RAG Sistemi Kurun

Günümüz dünyasında, büyük dil modelleri (LLM’ler) hayatımızın vazgeçilmez bir parçası haline geldi. Peki ya bu güçlü modellerin, şirketinizin özel dokümanları veya güncel veri kaynakları hakkında doğru ve bağlam odaklı yanıtlar vermesini sağlamak isteseydiniz? İşte tam bu noktada, Retrival Augmented Generation (RAG) devreye giriyor. Bu makalede, PHP geliştiricileri olarak, Neuron AI çerçevesini kullanarak kendi RAG sisteminizi nasıl hızlıca kurabileceğinizi adım adım keşfedeceğiz. Akşamınızı ayırarak, mevcut bilgi tabanınızdan güç alan akıllı bir yapay zeka uygulamasını hayata geçirmeye hazır olun.

Büyük dil modelleri (LLM’ler), geniş veri kümeleri üzerinde eğitilmiş olsalar bile, bazı temel sınırlamalara sahiptirler. Öncelikle, eğitim verileri belli bir tarihte kesildiği için, güncel bilgiler hakkında genellikle yetersiz kalırlar. İkinci olarak, “halüsinasyon” denilen, yani mevcut olmayan veya yanlış bilgileri gerçekmiş gibi sunma eğilimleri vardır. Üçüncüsü, şirket içi özel belgeleriniz, kişisel notlarınız veya belirli bir alan hakkında detaylı verileriniz varsa, LLM’lerin bu bilgilere erişmesi veya bu bilgiler üzerinden yanıt üretmesi mümkün değildir. Bu durumlar, özellikle iş dünyasında, müşteri hizmetleri, teknik destek veya kurumsal bilgi yönetimi gibi alanlarda ciddi sorunlara yol açabilir. Çünkü bir yapay zekadan beklenen, sadece akıcı konuşmak değil, aynı zamanda doğru ve güvenilir bilgi sunmaktır.

İşte tam bu noktada, Retrival Augmented Generation (RAG) sistemi, LLM’lerin bu eksikliklerini gidermek için güçlü bir çözüm sunar. RAG, adından da anlaşılacağı gibi, “geri çekme” (retrieval) ve “üretme” (generation) süreçlerini birleştirir. Kullanıcı bir sorgu yaptığında, RAG sistemi önce bu sorguyla en alakalı bilgileri (doküman parçacıkları, veritabanı kayıtları vb.) belirlenen bir kaynaktan “geri çeker”. Ardından, bu geri çekilen bilgileri bir “bağlam” olarak LLM’ye sunar ve LLM’den bu bağlam içinde bir yanıt “üretmesini” ister. Bu yaklaşım sayesinde LLM, rastgele tahminler yapmak yerine, kendisine sağlanan doğru ve güncel bilgiler ışığında çok daha isabetli, güvenilir ve alakalı yanıtlar oluşturabilir.

Peki, RAG’ın pratik önemi nedir? Bir örnekle açıklayalım: Bir e-ticaret şirketinin karmaşık ürün iade politikaları ve garanti süreçleri olduğunu düşünün. Müşteriler sürekli bu konular hakkında sorular soruyor. Geleneksel bir chatbot, bu sorulara genellikle sınırlı veya genel yanıtlar verir, çünkü bilgisi önceden kodlanmış kurallarla sınırlıdır. Bir LLM ise, genel bilgilerle yanıltıcı veya eksik cevaplar verebilir. Ancak bir RAG sistemi ile, tüm iade politikası ve garanti belgelerinizi sisteme yüklersiniz. Bir müşteri “Ürünümü nasıl iade edebilirim?” diye sorduğunda, RAG sistemi belgeleriniz içinden en alakalı iade politikası paragraflarını bulur, bu parçaları LLM’e sunar ve LLM de bu bilgiler ışığında müşteriye özel, adım adım bir iade süreci açıklaması yapar. Bu, hem müşteri memnuniyetini artırır hem de destek ekibinin yükünü azaltır. RAG, sadece bir trend değil, yapay zeka destekli uygulamaların güvenilirliğini ve kullanışlılığını kökten değiştiren bir paradigmadır.

Uzman İpucu: RAG sistemleri, LLM’lerin “halüsinasyon” sorununu büyük ölçüde azaltır. Çünkü model artık “tahmin etmeye” çalışmaz; kendisine sunulan kanıtlanmış bilgiyi özetler veya yorumlar. Bu, özellikle hukuki, tıbbi veya finansal gibi doğruluk kritik sektörlerde RAG’ı vazgeçilmez kılar.

Neuron AI Framework ile Tanışın: PHP İçin Yapay Zeka Gücü

PHP, web geliştirme dünyasının temel taşlarından biri olmaya devam ediyor. Ancak, yapay zeka (AI) ve makine öğrenimi (ML) gibi alanlarda Python’ın popülaritesi göz önüne alındığında, PHP geliştiricileri bazen bu modern AI trendlerinden uzak hissedebilirler. İşte bu noktada Neuron AI Framework, PHP ekosistemine taze bir soluk getiriyor ve yapay zeka yeteneklerini PHP dünyasına taşıyarak bu açığı kapatmayı hedefliyor. Neuron AI, özellikle büyük dil modelleri (LLM’ler) ve vektör veritabanları gibi AI altyapılarıyla etkileşim kurmayı kolaylaştıran, temiz ve basit bir API sağlayan bir PHP kütüphanesidir. Bu sayede, PHP geliştiricileri karmaşık AI modellerini kendileri eğitmek veya derinlemesine makine öğrenimi bilgisine sahip olmak zorunda kalmadan, güçlü AI özelliklerini uygulamalarına entegre edebilirler.

Neuron AI’ın temel amacı, PHP geliştiricilerine yapay zeka modellerini tüketme ve bu modellerden faydalanma konusunda araçlar sunmaktır. Bu, özellikle RAG sistemleri gibi, harici LLM servisleri ve vektör veritabanları ile yoğun etkileşim gerektiren uygulamalar için hayati önem taşır. Framework, popüler LLM sağlayıcıları (OpenAI, Google Gemini gibi) ve vektör veritabanları (Weaviate, Pinecone gibi) için hazır entegrasyonlar sunar. Bu sayede, farklı servisler arasında geçiş yapmak veya kendi bağlantı katmanınızı yazmak yerine, tutarlı ve basit bir PHP arayüzü üzerinden işlem yapabilirsiniz. Neuron AI’ı seçmemizin en büyük nedenlerinden biri de budur: PHP geliştiricilerinin AI dünyasına hızlı ve etkili bir şekilde adım atmasını sağlaması. Bu, zaman kazandırır, kod karmaşıklığını azaltır ve geliştiricilerin ana iş mantığına odaklanmasına olanak tanır.

Kurulum süreci oldukça basittir ve Composer aracılığıyla gerçekleştirilir. Öncelikle, projenize Neuron AI’ı eklemek için aşağıdaki komutu çalıştırmanız yeterlidir:


composer require neuron-ai/neuron

Bu komut, gerekli tüm bağımlılıkları projenize kuracaktır. Kurulum tamamlandıktan sonra, Neuron AI'ı kullanmaya başlamak için birkaç temel yapılandırma adımına ihtiyacınız olacak. Genellikle bu, kullandığınız LLM servisinin API anahtarını ve belki de bir vektör veritabanının bağlantı bilgilerini ayarlamak anlamına gelir. Bu bilgiler, uygulamanızın ortam değişkenleri (.env dosyası) aracılığıyla veya doğrudan kod içinde yapılandırılabilir. Örneğin, OpenAI API anahtarınızı aşağıdaki gibi ayarlayabilirsiniz:


// .env dosyasına ekleyebilirsiniz:
// OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

// Veya kod içinde:
use Neuron\AI\Client;
use Dotenv\Dotenv;

// Ortam değişkenlerini yüklemek için (Laravel/Symfony kullanmıyorsanız)
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

$apiKey = $_ENV['OPENAI_API_KEY'] ?? 'YOUR_DEFAULT_OPENAI_API_KEY';

$client = new Client([
    'openai' => [
        'api_key' => $apiKey,
    ],
    // Diğer servisler için de buraya ekleme yapabilirsiniz
]);

// Şimdi $client nesnesini kullanarak LLM'ler ve diğer AI servisleriyle etkileşim kurabilirsiniz.

Bu ilk adımlarla birlikte, Neuron AI'ın sunduğu tüm güçlü özelliklere kapı açmış olursunuz. PHP ekosisteminde AI uygulamaları geliştirmek artık hayal değil, Neuron AI ile ulaşılabilir bir gerçeklik. Framework'ün modüler yapısı sayesinde, ilerleyen zamanlarda farklı LLM'leri veya vektör veritabanlarını denemek istediğinizde de kolayca geçiş yapabilirsiniz. Bu esneklik, uzun vadeli projeler için büyük bir avantaj sağlar.

Temel Bileşenler: Vektör Veritabanı ve Embedding İşlemi Nasıl Çalışır?

RAG sistemlerinin kalbinde, veriyi "anlamak" ve arama yapılabilir hale getirmek yatar. Bu anlayışı sağlayan sihirli değnek "embedding"lerdir. Peki, embedding nedir ve bir vektör veritabanı neden RAG için bu kadar kritiktir? Embedding'ler, metinlerin (kelimeler, cümleler, paragraflar) çok boyutlu sayısal vektörlere dönüştürülmüş halleridir. Bu vektörler, metinlerin semantik anlamlarını korur; yani, anlamsal olarak birbirine yakın metinler, bu çok boyutlu uzayda birbirine daha yakın konumlanır. Örneğin, "köpek" ve "havlayan hayvan" kelimelerinin embedding'leri, "masa" kelimesinin embedding'inden çok daha yakındır. Bu sayede, geleneksel anahtar kelime tabanlı aramalardan farklı olarak, semantik (anlamsal) aramalar yapabiliriz. Kullanıcı "köpekler hakkında bilgi" diye sorduğunda, sistem sadece "köpek" kelimesinin geçtiği yerleri değil, aynı zamanda "pati dostları", "evcil hayvan" veya "dört ayaklı dostlarımız" gibi anlamsal olarak ilgili içeriği de bulabilir.

Bu embedding'leri verimli bir şekilde depolamak ve aramak için "vektör veritabanlarına" ihtiyacımız vardır. Geleneksel ilişkisel veritabanları (MySQL, PostgreSQL) veya NoSQL veritabanları (MongoDB) metin verilerini depolamakta iyidir, ancak yüksek boyutlu vektörler arasındaki benzerlikleri hızlıca bulmak konusunda yetersiz kalırlar. Vektör veritabanları ise (Weaviate, Pinecone, Milvus gibi), bu tür yüksek boyutlu vektörleri depolamak ve "en yakın komşuyu bulma" (Nearest Neighbor Search) algoritmaları kullanarak sorgu vektörüne en benzer vektörleri milisaniyeler içinde döndürmek üzere özel olarak tasarlanmıştır. Bu, RAG sistemlerinin temelini oluşturur, çünkü kullanıcı sorgusunun embedding'i oluşturulduktan sonra, vektör veritabanında bu sorguya en yakın, yani anlamsal olarak en alakalı metin parçacıkları aranır.

Neuron AI, bu embedding oluşturma ve vektör veritabanı etkileşimini PHP dünyasına taşıyor. Neuron AI kullanarak bir metinden embedding oluşturmak oldukça basittir. Genellikle bir LLM sağlayıcısının (örneğin OpenAI, Google) embedding API'sı kullanılır. İşte Neuron AI ile metin embedding'i oluşturma ve basitçe gösterme örneği:


use Neuron\AI\Client;
use Neuron\AI\Providers\OpenAI\OpenAIClient;
use Neuron\AI\Enums\EmbeddingModel; // Veya kullandığınız sağlayıcının modeli

// Daha önce oluşturduğunuz Neuron AI client'ını kullanın
$client = new Client([
    'openai' => [
        'api_key' => $_ENV['OPENAI_API_KEY'],
    ],
]);

// OpenAI sağlayıcısını kullanarak embedding servisine erişin
/** @var OpenAIClient $openaiClient */
$openaiClient = $client->openai();

$textToEmbed = "RAG sistemi, yapay zeka uygulamalarında doğruluk ve güncellik sağlar.";

try {
    // Metni embedding'e çevirin
    $embeddingResponse = $openaiClient->embeddings()->create(
        input: [$textToEmbed],
        model: EmbeddingModel::TextEmbedding3Small // Veya desteklenen başka bir model
    );

    // İlk metnin embedding vektörünü alın
    $embeddingVector = $embeddingResponse->data[0]->embedding;

    echo "Metin embedding'i başarıyla oluşturuldu. Boyutu: " . count($embeddingVector) . "\n";
    // Embedding vektörünün ilk 5 elemanını gösterelim
    echo "İlk 5 eleman: " . implode(", ", array_slice($embeddingVector, 0, 5)) . "...\n";

    // Bu vektörü bir vektör veritabanına kaydetmemiz gerekecek.
    // Örnek: Basit bir dizi olarak saklama (gerçek projede vektör veritabanı kullanılır)
    // $vectorStore[$someId] = $embeddingVector;

} catch (\Exception $e) {
    echo "Embedding oluşturulurken bir hata oluştu: " . $e->getMessage() . "\n";
}

Yukarıdaki kod parçası, OpenAI'ın metin embedding modelini kullanarak bir metni sayısal bir vektöre dönüştürmeyi gösterir. Bu vektör, daha sonra bir vektör veritabanına kaydedilir. Vektör veritabanına kaydetme işlemi, Neuron AI'ın sağladığı entegrasyonlar aracılığıyla yapılabilir. Örneğin, Weaviate entegrasyonu ile bir dokümanı embedding'iyle birlikte kolayca kaydedebilirsiniz:


use Neuron\AI\Providers\Weaviate\WeaviateClient;

// Weaviate client'ı yapılandırma (örnek)
$weaviateClient = new WeaviateClient([
'host' => 'your-weaviate-cluster.weaviate.network',
'api_key' => $_ENV['WEAVIATE_API_KEY'],
]);

$documentId = 'doc-123';
$documentText = "Bu, şirket içi bir bilgi tabanından alınmış önemli bir belgedir.";
$embeddingVector = [...]; // Yukarıdaki örnekten gelen embedding

// Belgeyi Weaviate'e kaydetme
try {
$weaviateClient->dataManager()->addObject(
className: 'KnowledgeBaseDocument', // Sınıf adınız
properties: [
'content' => $documentText,
],
id: $documentId,
vector: $embeddingVector // Vektörü buraya ekliyoruz
);
echo "Belge ve embedding Weaviate'e başarıyla kaydedildi.\n";
} catch (\Exception $e) {
echo "Weaviate'e kaydederken hata oluştu: " . $e->getMessage() . "\n";
}

Bu temel adımlar, RAG sisteminin en önemli bileşenlerinden ikisi olan embedding oluşturma ve vektör veritabanı entegrasyonunu anlamamızı sağlıyor. Verilerimizi anlamlı vektörlere dönüştürüp bunları hızlıca aranabilir bir yapıda sakladığımızda, RAG sistemimizin temellerini atmış oluyoruz.

Adım Adım RAG Sistemi Kurulumu: PHP ile Verileri Hazırlama

RAG sisteminin etkinliği, büyük ölçüde ona sunduğunuz verilerin kalitesine ve organizasyonuna bağlıdır. Veri hazırlığı süreci, sisteminizin ne kadar doğru ve ilgili yanıtlar üreteceğini belirleyen kritik bir aşamadır. Bu bölümde, PHP ile bir RAG sistemi için verileri nasıl hazırlayacağımızı adım adım inceleyeceğiz.

İlk olarak, veri kaynaklarımızı belirlememiz gerekiyor. RAG sistemi, herhangi bir metinsel veriyi kullanabilir: PDF belgeleri, web sayfaları, veritabanı kayıtları, müşteri e-postaları, şirket içi wiki sayfaları veya JSON dosyaları gibi yapılandırılmış veya yapılandırılmamış veriler. Önemli olan, bu verilerin sorgulara yanıt verecek bilgileri içermesidir. Örneğin, bir müşteri hizmetleri botu için ürün kılavuzları, SSS sayfaları ve iade politikaları ideal kaynaklardır. Bir yazılım projesinde, teknik dokümantasyon veya hata kayıtları kullanılabilir.

Veri kaynaklarımızı belirledikten sonra, bu verileri yüklememiz ve "parçalara ayırmamız" (chunking) gerekir. LLM'ler genellikle giriş boyutunda (context window) sınırlamalara sahiptir. Bu, tek seferde çok uzun metinleri işleyemeyecekleri anlamına gelir. Ayrıca, kullanıcı sorgusuyla alakalı bilgiyi bulmak için tüm belgeyi embedding'e dönüştürmek hem maliyetli hem de performansı düşürücüdür. Bu nedenle, belgelerimizi daha küçük, ancak anlamsal olarak hala anlamlı parçalara ayırmamız gerekir. "Chunking" adı verilen bu süreç, belgenin içeriğini bozmadan, her parçanın kendi başına bir anlam ifade etmesini sağlayacak şekilde yapılır. Parçalama stratejileri farklılık gösterebilir: sabit boyutlu parçalar, cümle tabanlı parçalar, paragraf tabanlı parçalar veya başlık yapısına göre parçalar. Her parçanın uzunluğu genellikle 200 ila 1000 belirteç (token) arasında değişir, ancak bu, kullanılan LLM ve uygulamanın gereksinimlerine göre ayarlanabilir.

Şimdi bu süreci PHP ile nasıl uygulayacağımıza bakalım. Neuron AI doğrudan belge parçalama (chunking) araçları sunmayabilir, ancak PHP'nin güçlü metin işleme yeteneklerini ve ek kütüphaneleri kullanarak bu görevi kolayca yerine getirebiliriz. Varsayalım ki elimizde bir dizi metin belgesi var:


use Neuron\AI\Client;
use Neuron\AI\Providers\OpenAI\OpenAIClient;
use Neuron\AI\Enums\EmbeddingModel;
use Dotenv\Dotenv;
// Vektör veritabanı entegrasyonu için kullandığınız kütüphane (örneğin Weaviate için)
use Neuron\AI\Providers\Weaviate\WeaviateClient;

// Ortam değişkenlerini yükle
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

$apiKey = $_ENV['OPENAI_API_KEY'];
$weaviateHost = $_ENV['WEAVIATE_HOST'];
$weaviateApiKey = $_ENV['WEAVIATE_API_KEY'];

// Neuron AI Client ve OpenAI embedding client'ını başlat
$client = new Client([
    'openai' => [
        'api_key' => $apiKey,
    ],
]);
/** @var OpenAIClient $openaiClient */
$openaiClient = $client->openai();

// Weaviate client'ı başlat (vektör veritabanı olarak Weaviate kullandığımızı varsayalım)
$weaviateClient = new WeaviateClient([
    'host' => $weaviateHost,
    'api_key' => $weaviateApiKey,
]);

// Örnek belgelerimiz
$documents = [
    [
        'id' => 'doc-001',
        'title' => 'Ürün İade Politikası',
        'content' => "Şirketimizden satın aldığınız ürünleri, teslimat tarihinden itibaren 14 gün içinde koşulsuz iade edebilirsiniz. İade edilecek ürünlerin orijinal ambalajında, kullanılmamış ve hasar görmemiş olması gerekmektedir. İade süreci için müşteri hizmetlerimizle iletişime geçiniz. İade formunu doldurarak ürünü kargoya verebilirsiniz. Para iadeniz, ürün bize ulaştıktan sonra 7 iş günü içinde hesabınıza yapılacaktır. Garanti kapsamındaki ürünler için farklı prosedürler uygulanabilir, lütfen garanti belgesini inceleyin."
    ],
    [
        'id' => 'doc-002',
        'title' => 'Garanti Koşulları',
        'content' => "Tüm elektronik ürünlerimiz 2 yıl üretici garantisi altındadır. Garanti, üretim hatalarını ve işçilik kusurlarını kapsar. Kullanıcı hatasından kaynaklanan hasarlar (düşme, sıvı teması, yetkisiz onarım girişimi) garanti kapsamı dışındadır. Garanti hizmetinden faydalanmak için fatura veya garanti belgesini ibraz etmeniz gerekmektedir. Servis talepleri için yetkili servis noktalarımızla iletişime geçiniz."
    ],
    [
        'id' => 'doc-003',
        'title' => 'Müşteri Hizmetleri İletişim',
        'content' => "Müşteri hizmetlerimiz haftanın her günü 09:00 - 18:00 saatleri arasında hizmet vermektedir. Telefon numaramız: 0850 123 45 67. E-posta adresimiz: destek@sirketim.com. Canlı destek için web sitemizdeki sohbet baloncunu kullanabilirsiniz. Teknik destek ve ürün arızaları için ilgili departmanımıza yönlendirileceksiniz."
    ],
];

// Basit bir parçalama (chunking) fonksiyonu
function chunkText(string $text, int $maxWords = 100): array
{
    $words = preg_split('/\s+/', $text, -1, PREG_SPLIT_NO_EMPTY);
    $chunks = [];
    $currentChunk = [];

    foreach ($words as $word) {
        $currentChunk[] = $word;
        if (count($currentChunk) >= $maxWords) {
            $chunks[] = implode(' ', $currentChunk);
            $currentChunk = [];
        }
    }
    if (!empty($currentChunk)) {
        $chunks[] = implode(' ', $currentChunk);
    }
    return $chunks;
}

// Belgeleri işleyip vektör veritabanına kaydetme
foreach ($documents as $doc) {
    $chunks = chunkText($doc['content'], 80); // Her parçayı yaklaşık 80 kelimeye bölelim
    echo "Belge '{$doc['title']}' için " . count($chunks) . " parça oluşturuldu.\n";

    foreach ($chunks as $index => $chunk) {
        try {
            // Her parça için embedding oluştur
            $embeddingResponse = $openaiClient->embeddings()->create(
                input: [$chunk],
                model: EmbeddingModel::TextEmbedding3Small
            );
            $embeddingVector = $embeddingResponse->data[0]->embedding;

            // Parçayı ve embedding'i vektör veritabanına kaydet
            // Weaviate'de her parçayı ayrı bir nesne olarak saklayabiliriz
            $weaviateClient->dataManager()->addObject(
                className: 'KnowledgeBaseChunk', // Her parçayı "KnowledgeBaseChunk" sınıfına kaydet
                properties: [
                    'chunk_id' => "{$doc['id']}-chunk-{$index}",
                    'document_id' => $doc['id'],
                    'document_title' => $doc['title'],
                    'content' => $chunk,
                    'chunk_index' => $index,
                ],
                id: "{$doc['id']}-chunk-{$index}", // Her parçaya özgü bir ID veriyoruz
                vector: $embeddingVector
            );
            echo "  - Parça {$index} kaydedildi. İçerik: " . substr($chunk, 0, 50) . "...\n";

        } catch (\Exception $e) {
            echo "  - Parça {$index} için embedding veya kaydetme hatası: " . $e->getMessage() . "\n";
        }
    }
}

echo "\nTüm belgeler başarıyla işlendi ve vektör veritabanına kaydedildi.\n";

Bu kod parçası, örnek metin belgelerimizi alıyor, her belgeyi daha küçük parçalara ayırıyor ve ardından Neuron AI'ın OpenAI entegrasyonunu kullanarak her bir parça için bir embedding (vektör) oluşturuyor. Son olarak, bu parçaları (orijinal içeriği, belge kimliği ve parça indeksi gibi meta verilerle birlikte) ve onların embedding'lerini bir vektör veritabanı olan Weaviate'e kaydediyor. Bu işlem, RAG sisteminizin daha sonra kullanıcı sorgularıyla en alakalı parçaları bulabilmesi için temel oluşturur. Verilerinizi ne kadar iyi hazırlarsanız, RAG sisteminiz o kadar verimli ve doğru çalışacaktır. Bu süreç, sisteminizin "bilgi tabanını" oluşturma adımıdır.

Sorgu İşleme ve LLM Entegrasyonu: Akıllı Yanıtlar Nasıl Üretilir?

RAG sisteminin veri hazırlığı tamamlandıktan sonra, artık kullanıcı sorgularını işleyip LLM'den akıllı yanıtlar üretme aşamasına geçebiliriz. Bu süreç, temelde üç ana adımdan oluşur: kullanıcı sorgusunun embedding'e çevrilmesi, vektör veritabanında alakalı bağlamın bulunması ve son olarak bu bağlam ile birlikte sorgunun LLM'ye iletilerek yanıt üretilmesi. Bu adımlar, RAG'ın "geri çekme" ve "üretme" fazlarını bir araya getirir.

İlk olarak, kullanıcıdan gelen bir sorguyu alıyoruz. Bu sorgu, doğal dil formundadır (örneğin, "Ürün iade prosedürü nedir?"). Tıpkı bilgi tabanımızdaki her bir metin parçasını embedding'e çevirdiğimiz gibi, bu kullanıcı sorgusunu da sayısal bir vektöre dönüştürmemiz gerekir. Bu, sorgunun semantik anlamını yakalamamızı sağlar ve onu vektör veritabanımızdaki diğer embedding'lerle karşılaştırılabilir hale getirir. Neuron AI'ın embedding servisi, bu adım için kullanılacak temel araçtır.

Ardından, oluşturulan sorgu embedding'i ile vektör veritabanımızda bir arama yaparız. Amaç, kullanıcı sorgusuyla anlamsal olarak en benzer (yani vektör uzayında en yakın) metin parçalarını bulmaktır. Bu işlem, "en yakın komşu araması" (Nearest Neighbor Search) olarak bilinir. Vektör veritabanı, bu aramayı son derece optimize bir şekilde gerçekleştirir ve bize belirli bir sayıda (örneğin 3-5 adet) en alakalı metin parçasını döndürür. Bu parçalar, LLM'nin yanıt üretirken kullanacağı "bağlam"ı oluşturur.

Son olarak, bulunan alakalı metin parçalarını (bağlamı) ve orijinal kullanıcı sorgusunu bir araya getirerek LLM'ye göndeririz. Burada kritik olan, LLM'ye net bir "talimat" (prompt) vermektir. Bu talimat, LLM'den sağlanan bağlamı kullanarak sorguyu yanıtlamasını ister. Örneğin, "Aşağıdaki bağlamı kullanarak, '[kullanıcının sorusu]' sorusunu yanıtla. Eğer bağlamda yeterli bilgi yoksa, 'Bilgi bulunamadı.' şeklinde yanıt ver." gibi bir talimat verilebilir. LLM, bu talimat, bağlam ve sorgu üçlüsünü işleyerek nihai yanıtı üretir.

İşte bu süreci gösteren bir PHP kodu örneği:


use Neuron\AI\Client;
use Neuron\AI\Providers\OpenAI\OpenAIClient;
use Neuron\AI\Providers\Weaviate\WeaviateClient;
use Neuron\AI\Enums\EmbeddingModel;
use Neuron\AI\Enums\ChatModel; // Sohbet modeli için
use Neuron\AI\ValueObjects\ChatMessage;
use Dotenv\Dotenv;

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

$apiKey = $_ENV['OPENAI_API_KEY'];
$weaviateHost = $_ENV['WEAVIATE_HOST'];
$weaviateApiKey = $_ENV['WEAVIATE_API_KEY'];

// Neuron AI Client ve OpenAI embedding/chat client'ını başlat
$client = new Client([
    'openai' => [
        'api_key' => $apiKey,
    ],
]);
/** @var OpenAIClient $openaiClient */
$openaiClient = $client->openai();

// Weaviate client'ı başlat
$weaviateClient = new WeaviateClient([
    'host' => $weaviateHost,
    'api_key' => $weaviateApiKey,
]);

function processQuery(string $userQuery, OpenAIClient $openaiClient, WeaviateClient $weaviateClient): string
{
    echo "Kullanıcı sorgusu: '{$userQuery}'\n";

    // 1. Kullanıcı sorgusunu embedding'e çevir
    echo "Sorgu embedding'i oluşturuluyor...\n";
    try {
        $queryEmbeddingResponse = $openaiClient->embeddings()->create(
            input: [$userQuery],
            model: EmbeddingModel::TextEmbedding3Small
        );
        $queryVector = $queryEmbeddingResponse->data[0]->embedding;
    } catch (\Exception $e) {
        return "Sorgu embedding'i oluşturulurken hata: " . $e->getMessage();
    }

    // 2. Vektör veritabanında alakalı parçaları bul
    echo "Vektör veritabanında alakalı parçalar aranıyor...\n";
    $retrievedChunks = [];
    try {
        // Weaviate'te vektör aramasını yap (benzerlik araması)
        $searchResults = $weaviateClient->graphql()->query()
            ->withClassName('KnowledgeBaseChunk') // Kaydettiğimiz sınıf adı
            ->withFields(['content', 'document_title', 'document_id', 'chunk_id'])
            ->withNearVector([
                'vector' => $queryVector,
                'certainty' => 0.75 // Belirlilik eşiği, ihtiyaca göre ayarlanabilir
            ])
            ->withLimit(3) // En alakalı 3 parçayı al
            ->get();

        foreach ($searchResults->get('KnowledgeBaseChunk') as $item) {
            $retrievedChunks[] = $item['content'];
        }
    } catch (\Exception $e) {
        return "Vektör veritabanında arama yapılırken hata: " . $e->getMessage();
    }

    if (empty($retrievedChunks)) {
        return "Üzgünüm, sorgunuzla ilgili bilgi bulunamadı.";
    }

    // Alakalı parçaları bir bağlam metni olarak birleştir
    $context = implode("\n\n---\n\n", $retrievedChunks);
    echo "Bulunan bağlam parçaları:\n---\n{$context}\n---\n";

    // 3. LLM'ye bağlam ve sorguyu göndererek yanıt üretmesini sağla
    echo "LLM'ye sorgu gönderiliyor...\n";
    $systemPrompt = "Sen bir bilgi tabanı asistanısın. Sana verilen bağlamı kullanarak kullanıcı sorularını yanıtla. 
                     Bağlamda bilgi yoksa, 'Sağlanan bağlamda bu bilgiye rastlayamadım.' şeklinde yanıt ver.";
    $userPrompt = "Soru: {$userQuery}\n\nBağlam:\n{$context}\n\nYanıt:";

    try {
        $chatCompletion = $openaiClient->chat()->create(
            model: ChatModel::Gpt4o, // Veya uygun bir sohbet modeli
            messages: [
                new ChatMessage('system', $systemPrompt),
                new ChatMessage('user', $userPrompt),
            ],
            temperature: 0.7, // Yanıtın yaratıcılığını kontrol eder
            maxTokens: 500 // Maksimum yanıt uzunluğu
        );

        return $chatCompletion->choices[0]->message->content;

    } catch (\Exception $e) {
        return "LLM ile yanıt üretilirken hata: " . $e->getMessage();
    }
}

// Örnek sorgular
$response1 = processQuery("Ürünümü nasıl iade edebilirim?", $openaiClient, $weaviateClient);
echo "\nLLM Yanıtı 1: {$response1}\n\n";

$response2 = processQuery("Elektronik ürünlerin garanti süresi ne kadar?", $openaiClient, $weaviateClient);
echo "\nLLM Yanıtı 2: {$response2}\n\n";

$response3 = processQuery("Şirketinizin CEO'su kimdir?", $openaiClient, $weaviateClient); // Bağlamda olmayan bir soru
echo "\nLLM Yanıtı 3: {$response3}\n\n";

Bu script, bir kullanıcının sorgusunu alır, bu sorgudan bir embedding oluşturur, ardından bu embedding'i kullanarak Weaviate vektör veritabanında alakalı metin parçalarını arar. Bulunan parçalar bir bağlam olarak birleştirilir ve OpenAI'ın GPT-4o gibi bir LLM'ine gönderilir. LLM, bu bağlamı kullanarak kullanıcı sorgusunu yanıtlar. Bu, RAG sisteminin dinamik ve akıllı yanıt üretme yeteneğini gösteren temel iş akışıdır. certainty parametresi, aramanın ne kadar "emin" olması gerektiğini belirler; daha düşük değerler daha fazla sonuç döndürebilirken, daha yüksek değerler sadece çok benzer sonuçları döndürür.

Gerçek Dünya Uygulaması: Akıllı Bir Bilgi Tabanı Botu

RAG sistemleri, teorik olarak harika görünse de, asıl gücünü gerçek dünya senaryolarında, somut problemlere çözüm getirirken gösterir. En yaygın ve etkili uygulamalardan biri, şirket içi bilgi tabanlarından güç alan akıllı bir bot oluşturmaktır. Birçok şirketin, çalışanlarının ve müşterilerinin sıkça başvurduğu, ancak aranması veya güncel tutulması zor olabilen geniş doküman havuzları (proje dokümantasyonları, iç yönetmelikler, insan kaynakları politikaları, teknik destek makaleleri vb.) bulunur. Bu bilgiye erişimi kolaylaştırmak, hem verimliliği artırır hem de bilgi silolarını yıkar.

Vaka Analizi: Şirket İçi Teknik Destek Botu

Bir yazılım şirketinde çalıştığınızı ve birçok farklı projeye, teknolojiye ve iç sürece sahip olduğunuzu hayal edin. Yeni bir çalışan işe başladığında veya mevcut bir çalışan farklı bir projeye geçtiğinde, şirketin iç bilgi portalındaki yüzlerce dokümanı taramak zorunda kalır. Sıkça sorulan sorular şunlar olabilir: "X projesinin CI/CD pipeline'ı nasıl çalışıyor?", "Yeni bir mikroservis nasıl devreye alınır?", "Maaş bordromu nereden bulabilirim?", "VPN bağlantısı kurarken hangi ayarları kullanmalıyım?" Bu tür soruların yanıtları genellikle dağınık belgelerde, Confluence sayfalarında veya Slack geçmişlerinde gizlidir.

İşte burada RAG destekli bir bilgi tabanı botu devreye girer. Bu bot, tüm bu dağınık belgeleri (PDF'ler, Markdown dosyaları, Wiki sayfaları, hatta JIRA/GitHub açıklamaları) indeksler. Her belge parçasını embedding'e dönüştürür ve merkezi bir vektör veritabanında saklar. Bir çalışan soru sorduğunda, bot anında bu belgelerden en alakalı kısımları çekerek, tam ve doğru bir yanıt sunar.

Bu uygulamanın faydaları saymakla bitmez:

* Hızlı Bilgi Erişimi: Çalışanlar saniyeler içinde doğru bilgiye ulaşır, saatlerce doküman aramak zorunda kalmazlar.
* Artan Verimlilik: Destek ekipleri, tekrarlayan soruları yanıtlamak yerine daha karmaşık problemlere odaklanabilir.
* Standartlaşma ve Doğruluk: Yanıtlar, doğrudan şirket içi belgelerden geldiği için tutarlı ve doğrudur, "kulaktan dolma" bilgiler azalır.
* Eğitim Sürecini Hızlandırma: Yeni çalışanlar, şirket kültürünü ve süreçlerini daha hızlı öğrenir.

Kullanıcı Arayüzü ve Entegrasyon:

Bu tür bir bot için basit bir CLI (Komut Satırı Arayüzü) veya daha gelişmiş bir web arayüzü oluşturabiliriz. PHP tabanlı bir web arayüzü, Laravel veya Symfony gibi bir framework kullanılarak kolayca geliştirilebilir. Kullanıcı, web formuna sorusunu yazar, PHP backend'i RAG sürecini işletir ve yanıtı HTML olarak döndürür.






    
    
    Neuron AI Bilgi Botu
    


    

Şirket İçi AI Bilgi Botu

Bot Yanıtı:


Yukarıdaki HTML, basit bir web arayüzü sunar. process.php dosyası ise önceki bölümde gösterdiğimiz processQuery fonksiyonunu çağırarak kullanıcı sorgusunu işleyebilir.

Performans Optimizasyonları ve Ölçeklenebilirlik:

Gerçek dünya uygulamalarında performans ve ölçeklenebilirlik hayati önem taşır.

* Caching: Sıkça sorulan soruların yanıtlarını önbelleğe alarak LLM çağrılarını azaltabilir ve yanıt sürelerini önemli ölçüde hızlandırabilirsiniz. Redis veya Memcached bu iş için idealdir.
* Asenkron İşlemler: Veri indeksleme gibi yoğun işlemleri arka plan görevleri (queue jobs) olarak çalıştırmak, ana uygulamanın performansını etkilemez. Laravel Queue sistemi veya Symfony Messenger gibi araçlar kullanılabilir.
* Vektör Veritabanı Seçimi: Pinecone, Weaviate, Milvus gibi bulut tabanlı vektör veritabanları, yüksek hacimli aramalar ve ölçeklenebilirlik için tasarlanmıştır. Kendi sunucunuzda çalışan Faiss veya HNSW kütüphanelerini kullanan çözümler de düşünülebilir ancak yönetimi daha zordur.
* Chunking Stratejileri: Daha akıllı parçalama algoritmaları (örneğin, semantik tabanlı parçalama, iç içe geçmiş parçalar) kullanmak, arama kalitesini artırabilir.

Bu uygulamalar, PHP ve Neuron AI ile bir RAG sisteminin sadece bir akşamda prototipini oluşturabileceğiniz ancak gerçek dünya sorunlarına kalıcı çözümler sunabileceği potansiyelini gözler önüne seriyor.

İleri Seviye Optimizasyonlar ve Gelecek Adımlar

Basit bir RAG sistemi kurmak harika bir başlangıç noktası olsa da, gerçek dünya uygulamaları genellikle daha karmaşık optimizasyonlar ve ileri düzey teknikler gerektirir. Sisteminizin performansını, doğruluğunu ve kullanıcı deneyimini artırmak için atabileceğiniz bazı ileri adımlar ve gelecekteki olasılıklar şunlardır:

* Daha Akıllı Parçalama (Chunking) Stratejileri: Daha önce bahsettiğimiz basit kelime veya karakter tabanlı parçalamanın ötesine geçebiliriz.
* Semantik Parçalama: Parçaları, anlamsal bütünlüklerini koruyacak şekilde, özellikle bir konuyu veya fikri bitirdikleri noktalardan ayırmak.
* Yeniden Kesme (Overlap Chunking): Parçalar arasında küçük bir "çakışma" bırakmak, bağlamın kaybolmamasını sağlamaya yardımcı olur. Örneğin, bir önceki parçanın son birkaç cümlesini yeni parçanın başına eklemek.
* Başlık veya Belge Yapısına Göre Parçalama: HTML veya Markdown gibi yapılandırılmış belgelerde, başlık seviyelerini kullanarak mantıksal bölümlere ayırma. Örneğin, her H2 başlığının altındaki tüm içeriği bir parça olarak almak. Bu, özellikle dokümanları anlamak için çok önemlidir.

* Yeniden Sıralama (Re-ranking): Vektör veritabanından gelen ilk N adet alakalı parça her zaman en iyi bağlamı sunmayabilir. Bir yeniden sıralama (re-ranking) mekanizması ekleyerek, bu N parçayı daha küçük bir LLM (veya BERT gibi bir sıralama modeli) kullanarak sorguya göre daha da optimize edebilirsiniz. Bu, LLM'ye giden bağlamın kalitesini artırarak daha doğru yanıtlar elde edilmesini sağlar. Neuron AI, farklı LLM'ler veya sıralama modelleriyle entegrasyon için esnek bir yapı sunabilir.

* Farklı Vektör Veritabanları ile Denemeler: Makalede Weaviate'ı kullandık, ancak piyasada birçok farklı vektör veritabanı bulunuyor ve her birinin kendine özgü avantajları var:
* Pinecone: Yüksek performanslı, yönetilen bir vektör veritabanı. Özellikle büyük ölçekli uygulamalar için idealdir.
* Milvus/Zilliz: Açık kaynaklı ve bulut tabanlı seçenekleriyle esneklik sunar.
* Qdrant: Rust tabanlı, hızlı ve esnek, Kubernetes ile kolayca ölçeklenebilir.
* PostgreSQL with pgvector: Eğer zaten PostgreSQL kullanıyorsanız, pgvector eklentisi ile mevcut veritabanınızı vektör veritabanına dönüştürebilirsiniz. Bu, ek bir bağımlılık kurmaktan kaçınmak için iyi bir seçenek olabilir.

* Asenkron İşlemler ve Arka Plan Görevleri: Özellikle veri indeksleme veya büyük hacimli sorgu işleme gibi yoğun görevlerde, PHP uygulamanızın ana akışını bloke etmemek için asenkron işlemleri veya arka plan kuyruklarını kullanmak kritik öneme sahiptir. Laravel Queue, Symfony Messenger veya Swoole gibi kütüphaneler bu konuda size yardımcı olabilir. Örneğin, yeni bir belge eklendiğinde, bu belgenin parçalara ayrılması ve embedding'lerinin oluşturulması bir kuyrukta işlenebilir.

* Kullanıcı Geri Bildirimi ve Model İyileştirmesi: RAG sisteminizin zamanla daha iyi performans göstermesi için kullanıcı geri bildirimlerini toplamak önemlidir. Kullanıcıların beğenmedikleri veya yanlış buldukları yanıtları işaretlemelerine izin verin. Bu geri bildirimleri, LLM prompt'larınızı iyileştirmek, yeniden sıralama modellerini ayarlamak veya hatta bilgi tabanınızdaki eksiklikleri gidermek için kullanabilirsiniz.

* Mobil Uyumlu Tasarım Detayları: Makalenin başında eklediğimiz CSS kodunda olduğu gibi, RAG sisteminin çıktısı bir web arayüzünde sunuluyorsa, mobil uyumluluk her zaman düşünülmelidir. CSS media query'leri, farklı ekran boyutlarına göre düzeni ve font boyutlarını ayarlamak için temel bir araçtır. Ancak daha gelişmiş senaryolarda, esnek grid sistemleri (CSS Grid, Flexbox) ve duyarlı resimler gibi teknikler de devreye girer. PHP backend'i mobil uyumluluk konusunda doğrudan bir rol oynamasa da, mobil uygulamalar için JSON API'ları sunarak veya minimalist HTML çıktıları oluşturarak dolaylı olarak katkıda bulunabilir.


/* Örnek bir responsive resim stili */
img {
  max-width: 100%;
  height: auto;
  display: block; /* Resmin altında boşluk oluşmasını engeller */
}

/* Flexbox ile responsive layout örneği */
.flex-container {
  display: flex;
  flex-wrap: wrap; /* Öğeler sığmadığında alt satıra geçsin */
  gap: 20px;
}

.flex-item {
  flex: 1 1 300px; /* Minimum 300px genişlik, esneyebilir */
  background-color: #f0f0f0;
  padding: 15px;
  border-radius: 5px;
}

@media (max-width: 600px) {
  .flex-item {
    flex: 1 1 100%; /* Mobil cihazlarda tam genişlik */
  }
}

Bu ileri düzey optimizasyonlar ve gelecekteki adımlar, RAG sisteminizin sadece temel bir prototip olmaktan çıkıp, gerçek dünya ihtiyaçlarına yanıt veren sağlam ve etkili bir çözüme dönüşmesini sağlayacaktır. PHP ve Neuron AI, bu yolculukta size esneklik ve güç sunarak modern AI uygulamalarını geliştirmenize olanak tanır.

Sonuç ve Sıkça Sorulan Sorular

Bu makalede, PHP geliştiricileri olarak Neuron AI çerçevesini kullanarak kendi Retrival Augmented Generation (RAG) sistemimizi nasıl kuracağımızı adım adım inceledik. Büyük dil modellerinin (LLM'ler) güncel ve özel bilgilere erişim sınırlılıklarını RAG ile nasıl aşabileceğimizi gördük. Neuron AI'ın, embedding oluşturma ve vektör veritabanı entegrasyonu gibi kritik AI bileşenlerini PHP dünyasına taşıyarak bu süreci nasıl basitleştirdiğine tanık olduk. Belgeleri parçalama, embedding'lere dönüştürme ve bir vektör veritabanına kaydetme adımlarını içeren veri hazırlığı sürecini ele aldık. Ardından, kullanıcı sorgularını alıp alakalı bağlamı geri çekerek LLM'den nasıl akıllı ve doğru yanıtlar üretebileceğimizi uygulamalı kod örnekleriyle gösterdik. Son olarak, şirket içi bilgi tabanı botu gibi gerçek dünya senaryoları üzerinden RAG'ın pratik değerini vurguladık ve performans optimizasyonları ile ileri seviye tekniklere dair ipuçları paylaştık.

Artık PHP'nin sadece web geliştirme için değil, aynı zamanda modern yapay zeka uygulamaları için de güçlü bir platform olduğunu biliyoruz. Neuron AI sayesinde, AI ve makine öğrenimi alanındaki en son yenilikleri kendi projelerinize entegre etmek hiç bu kadar erişilebilir olmamıştı. Akşamınızı ayırarak bile, bu güçlü teknolojiyi keşfetmeye başlayabilir ve uygulamalarınıza değer katabilirsiniz. Gelecek, bilgiye dayalı ve akıllı sistemlerde yatıyor; PHP geliştiricileri olarak bu değişimin ön saflarında yer almak bizim elimizde.

Sıkça Sorulan Sorular

1. Neuron AI Framework'ü kullanmak için PHP'nin hangi sürümüne ihtiyacım var?
Genellikle Neuron AI gibi modern PHP kütüphaneleri, güncel ve desteklenen PHP sürümlerini (örneğin PHP 8.1 veya daha yenisi) gerektirir. En doğru bilgi için projenin resmi dokümantasyonunu kontrol etmeniz önerilir.
2. Hangi vektör veritabanlarını Neuron AI ile kullanabilirim?
Neuron AI, Weaviate ve Pinecone gibi popüler vektör veritabanları için hazır entegrasyonlar sunar. Framework'ün modüler yapısı sayesinde, gelecekte farklı vektör veritabanları için de destek eklenebilir veya kendi adaptörünüzü yazarak entegrasyon sağlayabilirsiniz.
3. RAG sistemlerinde "chunk boyutu" ne kadar olmalı?
Chunk boyutu, kullanılan LLM'in bağlam penceresi, veri kaynağının yapısı ve uygulamanızın özel gereksinimlerine göre değişir. Genellikle 200 ila 1000 belirteç (token) arası önerilir. Çok küçük parçalar bağlam kaybına yol açarken, çok büyük parçalar LLM'in limitlerini aşabilir ve maliyeti artırabilir. Deneme yanılma yoluyla optimal boyutu bulmak en iyi yaklaşımdır.
4. RAG sistemim neden bazen yanlış cevaplar veriyor?
Yanlış cevaplar birkaç nedenden kaynaklanabilir: 1) Kötü parçalama stratejisi: Alakalı bilgi parçalara ayrılırken kaybolmuş olabilir. 2) Yetersiz veri kalitesi: Bilgi tabanınızdaki veriler eksik, yanlış veya güncel değilse. 3) Kötü sorgu embedding'i: Kullanıcı sorgusu doğru şekilde vektöre dönüştürülememiş olabilir. 4) Yetersiz arama: Vektör veritabanı, sorguya en alakalı parçaları bulamamış olabilir (örneğin certainty eşiği çok yüksek olabilir). 5) Zayıf prompt mühendisliği: LLM'ye verilen talimatlar yeterince açık veya yönlendirici olmayabilir. Bu alanlarda iyileştirmeler yaparak sistemin doğruluğunu artırabilirsiniz.
5. PHP tabanlı bir RAG sistemi, Python tabanlı bir çözüme göre dezavantajlı mıdır?
PHP tabanlı RAG sistemleri, performans veya yetenek açısından Python tabanlı çözümlere göre esasen bir dezavantaj taşımaz. Arka planda kullanılan LLM'ler ve vektör veritabanları genellikle dil bağımsız API'lar üzerinden erişilebilir. Neuron AI gibi framework'ler, bu API'larla etkileşimi PHP geliştiricileri için kolaylaştırır. PHP'nin mevcut altyapınıza entegrasyonu kolaylığı ve güçlü web yetenekleri, birçok senaryoda onu cazip bir seçenek haline getirir.
Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.