Müşteriniz için şık bir AI sohbet botunu dağıttığınızı hayal edin — soruları güvenle yanıtlıyor, kullanıcılar onu seviyor ve birisi geçen Salı gününde güncellenmiş bir şirket politikasıyla ilgili bir soru soruyor. Bot, yanıtı o kadar yanlış bir şekilde hayal ediyor ki, neredeyse bir uyum ihlaline neden oluyor. Retrieval-Augmented Generation (RAG) bu temel sorunu çözüyor ve LLM destekli özellikler geliştiren her geliştiricinin derinlemesine anlaması gereken bir konudur.
<p>Bu rehberde, belgeleri parçalayarak ve gömme (embedding) oluşturarak, bunları bir vektör veritabanında saklayarak ve her şeyi bir akış chat arayüzü ile birleştirerek çalışan bir RAG pipeline'ı oluşturacağız.</p>
<h2>
<a name="what-rag-actually-does-and-why-it-matters" href="#what-rag-actually-does-and-why-it-matters"></a>
RAG Nedir ve Neden Önemlidir
</h2>
<p>Büyük Dil Modelleri (LLM'ler) statik veri kümeleri üzerinde eğitilir. Ne dün ne de müşterinizin iç belgeleri hakkında bir şey bilmezler ve bilgi sınırlarına ulaştıklarında güvenle uydururlar. RAG, modelin bir yanıt oluşturmasından önce <em>ilgili, alınan bağlamı</em> prompt'a enjekte ederek bu sorunu çözer.</p>
<p>Pipeline aşağıdaki gibidir:</p>
<ol>
<li><strong>Ingest</strong> — Belgelerinizi parçalara ayırın ve bunları vektör gömme biçimlerine dönüştürün.</li>
<li><strong>Store</strong> — Bu gömme biçimlerini vektör veritabanında saklayın.</li>
<li><strong>Retrieve</strong> — Her kullanıcı sorgusunda en anlamsal benzer parçaları bulun.</li>
<li><strong>Generate</strong> — Alınan parçaları LLM'ye bağlam olarak verin ve yanıtı akış halinde geri gönderin.</li>
</ol>
<p>Model, tahmin yapmayı bırakır ve <em>sizin</em> verileriniz üzerinden akıl yürütmeye başlar.</p>
<h2>
<a name="setting-up-the-laravel-project" href="#setting-up-the-laravel-project"></a>
Laravel Projesini Ayarlamak
</h2>
<p>Laravel ile OpenAI PHP istemcisini kullanacağız ve <a href="https://github.com/pgvector/pgvector" target="_blank" rel="noopener noreferrer">pgvector</a>’ı (PostgreSQL uzantısı — ücretsiz, üretim için hazır, dış hizmet gerektirmiyor) vektör deposu olarak kullanacağız.</p>
<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>composer require openai-php/laravelphp artisan vendor:publish –provider=“OpenAI\Laravel\ServiceProvider”
<p>API anahtarınızı <code>.env</code> dosyasına ekleyin:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>OPENAI_API_KEY=sk-...
</code></pre>
</div>
<p>Veritabanınızdaki pgvector'ı etkinleştirin:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight sql"><code><span class="k">CREATE</span> <span class="n">EXTENSION</span> <span class="n">IF</span> <span class="k">NOT</span> <span class="k">EXISTS</span> <span class="n">vector</span><span class="p">;</span>
</code></pre>
</div>
<p>Belgelerin parçalarını oluşturmak için migration'ı oluşturun:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code><span class="c1">// database/migrations/xxxx_create_document_chunks_table.php</span>public function up(): void
{
Schema::create(‘document_chunks’, function (Blueprint $table) {
$table->id();
$table->foreignId(‘document_id’)->constrained()->cascadeOnDelete();
$table->text(<span class=”s1>’content’);
$table->string(<span class=”s1>’source’)->nullable();
$table->vector(<span class=”s1>’embedding’, 1536); // text-embedding-3-small boyutları
$table->timestamps();
});
<span class="no">DB</span><span class="o">::</span><span class="nf">statement</span><span class="p">(</span>
<span class="s1>'CREATE INDEX ON document_chunks USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100)'</span>
<span class="p">);</span>}


