Takip et

Web Uygulamalarında Embeddings ve RAG: Derinlemesine Rehber

Web uygulamalarınızı güçlendirmek için Embeddings ve RAG teknolojilerini mi merak ediyorsunuz? Bu kapsamlı rehberde, modern yapay zeka tekniklerini sıfırdan ele alacak, uygulamalarınızda nasıl kullanacağınızı pratik örneklerle öğreneceksiniz.

Günümüz dijital dünyasında, kullanıcılar web uygulamalarından sadece işlevsellik değil, aynı zamanda akıllı, kişiselleştirilmiş ve bağlamsal deneyimler bekliyor. Statik içerik sunumu ve geleneksel arama algoritmaları artık yetersiz kalıyor; kullanıcıların karmaşık sorularına anlamlı yanıtlar verebilen, ilgi alanlarına özel içerik önerileri sunabilen ve doğal dilde etkileşim kurabilen sistemlere ihtiyaç duyuluyor. İşte tam da bu noktada, yapay zekanın iki güçlü bileşeni olan Embeddings ve Retrieval-Augmented Generation (RAG) devreye giriyor.

Bu makale, web geliştiricilerinden veri bilimcilere kadar geniş bir kitleye hitap ederek, Embeddings ve RAG’nin temel prensiplerini, web uygulamalarında nasıl entegre edileceğini ve gerçek dünya senaryolarında nasıl değer yaratabileceğini derinlemesine inceleyecektir. Konuya tamamen yabancı olsanız bile, adım adım ilerleyen anlatım, pratik kod örnekleri ve vaka analizleri sayesinde bu heyecan verici teknolojileri kendi projelerinize nasıl dahil edebileceğinizi keşfedeceksiniz. Amacımız, sadece teorik bilgi vermekle kalmayıp, aynı zamanda size bu teknolojileri hayata geçirecek somut araçları ve bilgileri sunmaktır.

Günümüzün rekabetçi dijital ortamında, bir web uygulamasının yalnızca temel işlevlerini yerine getirmesi yeterli değildir. Kullanıcılar, kullandıkları platformlardan daha fazlasını bekliyor: sezgisel arama, kişiselleştirilmiş içerik akışları, anında ve doğru bilgiye erişim sağlayan akıllı sohbet botları ve genel olarak daha zengin, daha dinamik bir deneyim. Geleneksel arama motorları genellikle anahtar kelime eşleştirmesine dayanır ve kullanıcının niyetini veya sorgunun bağlamını tam olarak anlayamaz. Bu durum, alakasız sonuçlarla dolu bir kullanıcı deneyimine yol açabilir. Benzer şekilde, genel amaçlı yapay zeka modelleri bile, kendi eğitim verilerinde bulunmayan veya güncel olmayan bilgilere dayalı soruları yanıtlarken “halüsinasyon” olarak adlandırılan yanlış veya uydurma bilgiler üretme eğiliminde olabilir.

Peki, bu zorlukların üstesinden nasıl gelinebilir? Cevap, verileri anlama ve üretme yeteneğimizi kökten değiştiren iki yenilikçi yapay zeka tekniğinde yatıyor: Embeddings ve Retrieval-Augmented Generation (RAG). Bu teknolojiler, web uygulamalarınızın sadece bilgi sunmakla kalmayıp, aynı zamanda bilgiyi anlamasını, yorumlamasını ve bağlamsal olarak en uygun yanıtları üretmesini sağlar. Düşünün ki bir e-ticaret siteniz var ve kullanıcılar “bu akşam giyebileceğim şık, rahat bir elbise” gibi doğal dilde sorgular yapıyor. Geleneksel bir sistem bu sorguyu anlamakta zorlanırken, Embeddings ve RAG ile güçlendirilmiş bir sistem, binlerce ürün arasından hem “şık” hem “rahat” hem de “akşam” konseptine uyan elbiseleri bulup kullanıcının bedenine ve önceki alışveriş geçmişine göre kişiselleştirilmiş öneriler sunabilir. Bu, sadece bir arama kutusundan çok daha fazlasıdır; bu, kullanıcının niyetini anlayan ve ona özel bir çözüm sunan bir akıllı asistandır.

Ayrıca, müşteri hizmetleri alanında da devrim niteliğinde iyileşmeler gözlemlenebilir. Şirketinizin kapsamlı bilgi bankasına sahip olduğunuzu ancak müşterilerin belirli bilgilere ulaşmakta zorlandığını varsayalım. Gelişmiş bir RAG sistemi, müşterilerin sorularını doğal dilde alabilir, kurum içi belgelerinizden en alakalı bölümleri otomatik olarak çekebilir ve bu bilgilerle zenginleştirilmiş, doğru ve güncel yanıtlar üretebilir. Bu durum, hem müşteri memnuniyetini artırır hem de destek ekiplerinizin üzerindeki yükü hafifletir. Kısacası, Embeddings ve RAG, web uygulamalarınıza sadece akıl katmakla kalmaz, aynı zamanda kullanıcıların platformunuzla etkileşim şeklini temelden değiştirerek rekabet avantajı sağlar. Bu teknolojilere yatırım yapmak, sadece bugünün ihtiyaçlarını karşılamakla kalmaz, aynı zamanda geleceğin dijital deneyimlerini şekillendirmenize olanak tanır. İşte bu yüzden, web uygulamalarınızın daha akıllı olması bir lüks değil, bir gerekliliktir.

Temel Kavramlar: Embeddings Nedir ve Nasıl Çalışır?

Yapay zeka ve doğal dil işleme (NLP) dünyasında “Embeddings” kavramı, karmaşık verileri, bilgisayarların anlayabileceği ve işleyebileceği sayısal vektörlere dönüştürme sürecini ifade eder. Basitçe ifade etmek gerekirse, Embeddings; kelimelerin, cümlelerin, paragrafların, hatta resimlerin veya seslerin “anlamını” yoğun, çok boyutlu bir sayı dizisine (vektöre) sıkıştırır. Bu vektörler, verilerin semantik ilişkilerini ve benzerliklerini korur. Yani, anlam olarak birbirine yakın olan kelimeler veya dokümanlar, vektör uzayında da birbirine yakın konumlanır. Örneğin, “kedi” ve “köpek” kelimelerinin Embedding’leri, “araba” kelimesinin Embedding’inden çok daha yakın olacaktır, çünkü kedi ve köpek aynı kategoriye (evcil hayvan) aittir.

Embeddings’in gücü, makine öğrenimi modellerinin metin gibi yapılandırılmamış verilerle daha etkin bir şekilde çalışmasını sağlamasından gelir. Geleneksel yöntemlerde, kelimeler genellikle tekil tanımlayıcılar (one-hot encoding) olarak temsil edilir ve bu da kelimeler arasındaki ilişkileri göz ardı eder, ayrıca çok büyük veri setlerinde bellek ve hesaplama açısından verimsizdir. Embeddings ise, her kelimenin veya cümlenin birden fazla özelliğini (örneğin, cinsiyet, zaman, konu) yakalayabilen yoğun vektörler oluşturarak bu sorunları çözer. Bu vektörler genellikle yüzlerce veya binlerce boyuta sahip olabilir. Bir Embeddings modelinin temel amacı, verideki örüntüleri öğrenmek ve bunları sayısal bir formda temsil etmektir. Bu, genellikle derin öğrenme modelleri (örneğin Word2Vec, GloVe, FastText veya BERT, GPT gibi transformatör tabanlı modeller) kullanılarak gerçekleştirilir. Bu modeller, çok büyük metin korpusları üzerinde eğitilir ve kelimelerin veya cümlelerin hangi bağlamlarda birlikte göründüğünü öğrenerek onların semantik temsilini oluşturur.

Embeddings’in çalışma prensibi, bir örnekle daha iyi anlaşılabilir. Diyelim ki bir ürün açıklaması metniniz var: “Yüksek performanslı, ince tasarımlı dizüstü bilgisayar”. Bu metin bir Embeddings modeli tarafından işlendiğinde, model bu cümlenin genel anlamını yakalayan 768 boyutlu (veya modelin çıktı boyutuna göre başka bir sayı) bir vektör üretecektir. Başka bir ürün açıklaması “Hafif, güçlü ve taşınabilir laptop” ise, bu iki cümle anlam olarak çok yakın olduğu için, onların Embedding vektörleri de vektör uzayında birbirine çok yakın olacaktır. Bu yakınlık, kosinüs benzerliği gibi matematiksel metriklerle kolayca ölçülebilir. Bu sayede, kullanıcı bir arama sorgusu girdiğinde, sorgunun Embedding’i ile ürün açıklamalarının Embedding’leri karşılaştırılarak semantik olarak en alakalı sonuçlar saniyeler içinde bulunabilir. Geleneksel anahtar kelime tabanlı aramanın aksine, bu yaklaşım “ince” kelimesi yerine “dar” veya “şık” gibi eş anlamlıları içeren ürünleri de algılayabilir, çünkü model kelimelerin yüzey formundan ziyade anlamlarını öğrenmiştir. Embeddings, böylece web uygulamalarında kişiselleştirilmiş öneri sistemlerinden akıllı arama motorlarına, dolandırıcılık tespitinden anomali algılamaya kadar pek çok alanda vazgeçilmez bir araç haline gelmiştir.

Uzman İpucu: Embedding Modeli Seçimi

Projenizin ihtiyaçlarına göre doğru Embedding modelini seçmek kritik öneme sahiptir. Genel amaçlı modeller (örn. OpenAI’ın text-embedding-ada-002) iyi bir başlangıç noktası olsa da, sektöre özel veya daha küçük, hızlı modeller (örn. Sentence-BERT) daha maliyet etkin ve performanslı çözümler sunabilir. Özellikle düşük gecikme süresi gerektiren web uygulamaları için hız önemlidir.

Temel Kavramlar: RAG (Retrieval-Augmented Generation) Ne İşe Yarar?

Büyük Dil Modelleri (LLM’ler) son yıllarda inanılmaz yetenekler sergileyerek doğal dilde akıcı ve bağdaşık metinler üretme konusunda çığır açtı. Ancak bu modellerin bazı temel sınırlılıkları var: Eğitim verileriyle sınırlı olmaları, güncel bilgilere erişememeleri ve bazen “halüsinasyon” olarak adlandırılan yanlış veya uydurma bilgiler üretme eğilimleri. İşte tam bu noktada Retrieval-Augmented Generation (RAG) devreye girerek LLM’lerin bu eksikliklerini gidermeyi amaçlar. RAG, “geri getirme destekli üretim” anlamına gelir ve bir LLM’in bir soruya yanıt üretmeden önce harici bir bilgi tabanından alakalı bilgileri dinamik olarak almasını sağlayan bir yapay zeka mimarisidir.

RAG’nin temel mantığı iki ana aşamadan oluşur:

  1. Retrieval (Geri Getirme): Kullanıcı bir sorgu veya soru sorduğunda, sistem ilk olarak bu sorguyu alır ve harici bir bilgi kaynağından (örneğin, bir doküman veritabanı, bir web sitesi veya bir şirket içi Wiki) en alakalı bilgi parçacıklarını (“chunks” veya “passages”) arar ve geri getirir. Bu geri getirme işlemi genellikle Embedding’ler ve vektör veritabanları aracılığıyla yapılır. Sorgu, bir vektöre dönüştürülür ve bu vektör, bilgi tabanındaki önceden Embedding’i çıkarılmış doküman parçacıklarının vektörleriyle karşılaştırılarak semantik olarak en benzer olanlar bulunur.
  2. Augmentation & Generation (Zenginleştirme ve Üretim): Geri getirilen alakalı bilgi parçacıkları, kullanıcının orijinal sorgusuyla birlikte bir LLM’e (örneğin, GPT-4, Llama 2) girdi olarak verilir. LLM, sadece kendi dahili bilgilerine dayanarak değil, aynı zamanda bu harici, güvenilir ve güncel bağlamı kullanarak bir yanıt üretir. Bu sayede, modelin halüsinasyon yapma olasılığı azalır, yanıtın doğruluğu ve alaka düzeyi artar ve en önemlisi, modelin eğitim verilerinde olmayan veya eğitim sonrası değişmiş bilgilere erişmesi sağlanır.

Bir örnekle açıklayalım: Bir kullanıcı bir e-ticaret sitesinde “X model telefonun pil ömrü ne kadar?” diye sordu. Geleneksel bir LLM, eğitim verilerinde bu bilgi varsa yanıtlayabilir, ancak bilgi eski veya eksik olabilir. RAG sistemi ise şu adımları izler: Önce bu soruyu bir Embeddings modeline gönderir, ortaya çıkan vektörü ürün veri tabanındaki tüm telefon modellerinin özellik açıklamalarıyla karşılaştırır. “X model telefonun pil ömrü” ile ilgili en alakalı doküman parçacıklarını (örneğin, teknik özellikler sayfasından ilgili bölümü) geri getirir. Ardından, bu parçacıkları orijinal soruyla birlikte bir LLM’e gönderir ve LLM, bu bağlama dayanarak doğru ve güncel bir yanıt oluşturur. Böylece kullanıcı, doğrudan ürünün güncel verilerine dayanan güvenilir bir bilgi alır.

RAG’nin web uygulamalarında kullanımı, müşteri hizmetleri botlarından içerik oluşturma asistanlarına, iç bilgi yönetim sistemlerinden kişiselleştirilmiş eğitim platformlarına kadar geniş bir yelpazeyi kapsar. Bu teknoloji, LLM’leri sadece birer “dil modeli” olmaktan çıkarıp, dinamik, bilgiye dayalı ve güvenilir “bilgi asistanları” haline getirerek web uygulamalarının yeteneklerini önemli ölçüde genişletir. Geliştiriciler için RAG, LLM’lerin güçlü yönlerinden faydalanırken zayıf yönlerini dengelemenin etkili ve pratik bir yolunu sunar.

Uzman İpucu: RAG’de “Chunking” Stratejileri

RAG sistemlerinin performansında, dokümanları nasıl küçük parçalara (chunks) ayırdığınız çok önemlidir. Çok büyük chunk’lar, LLM’in bağlam penceresini aşabilir veya alakasız bilgileri de içerebilir. Çok küçük chunk’lar ise bağlam kaybına yol açabilir. Genellikle 250-1000 kelime aralığında, cümle veya paragraf sınırlarına dikkat ederek chunk’lamak iyi sonuçlar verir. Markdown başlıkları veya semantik bölümler de chunking için iyi referans noktaları olabilir.

Web Uygulamalarında Embeddings ve RAG Nasıl Entegre Edilir? Mimari Yaklaşımlar

Embeddings ve RAG teknolojilerini bir web uygulamasına entegre etmek, özenli bir mimari planlama gerektirir. Temelde, bu entegrasyon kullanıcı etkileşimini, veri işlemeyi ve yapay zeka modelleriyle iletişimi bir araya getirir. İşte tipik bir RAG destekli web uygulamasının mimari bileşenleri ve bunların nasıl bir araya geldiği:

  1. Frontend (Kullanıcı Arayüzü)

    Kullanıcının sorgularını girdiği ve yanıtları aldığı arayüzdür. Modern JavaScript kütüphaneleri ve framework’leri (React, Vue, Angular) veya basit HTML/CSS/JS ile oluşturulabilir. Kullanıcı sorguları, genellikle bir API çağrısı ile backend’e gönderilir. Yanıtlar alındığında, kullanıcı arayüzünde şık ve okunabilir bir biçimde gösterilir.

    
    // Örnek: React uygulaması için basit bir arama formu
    import React, { useState } from 'react';
    
    function SearchComponent() {
      const [query, setQuery] = useState('');
      const [results, setResults] = useState([]);
    
      const handleSubmit = async (e) => {
        e.preventDefault();
        if (!query) return;
    
        try {
          const response = await fetch('/api/rag-search', {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json',
            },
            body: JSON.stringify({ query }),
          });
          const data = await response.json();
          setResults(data.answer); // RAG'den gelen yanıt
        } catch (error) {
          console.error('Arama hatası:', error);
          setResults('Üzgünüz, bir hata oluştu.');
        }
      };
    
      return (
        
    setQuery(e.target.value)} placeholder="Sorunuzu buraya yazın..." />

    Yanıt:

    {results}

    ); } export default SearchComponent;

  2. Backend (API ve İş Mantığı)

    Web uygulamasının "beyni"dir. Kullanıcı sorgularını alır, Embeddings ve RAG sürecini yönetir ve LLM'den gelen yanıtları frontend'e iletir. Genellikle Python (Flask, Django, FastAPI) veya Node.js (Express) gibi dillerle geliştirilir. Backend'de şu ana adımlar gerçekleşir:

    • Kullanıcı sorgusunu alma.
    • Sorguyu bir Embedding modeline gönderme ve vektör temsilini alma.
    • Bu vektör ile vektör veritabanında semantik arama yapma ve en alakalı doküman parçacıklarını geri getirme.
    • Geri getirilen parçacıkları ve orijinal sorguyu bir LLM'e (Prompt Engineering ile) gönderme.
    • LLM'den gelen yanıtı işleme ve frontend'e JSON formatında gönderme.
  3. Embedding Modeli

    Metinleri vektörlere dönüştürmekten sorumludur. Bu, genellikle bulut tabanlı bir API (örn. OpenAI Embeddings API, Cohere Embeddings) veya kendi sunucunuzda çalışan açık kaynaklı bir model (örn. Sentence-BERT modelleri) aracılığıyla yapılır. Genellikle statik dokümanlar için Embeddings'ler önceden oluşturulup vektör veritabanına indekslenir. Canlı sorgular için ise sorgu anında Embedding'e dönüştürülür.

  4. Vektör Veritabanı (Vector Database)

    Oluşturulan tüm Embeddings vektörlerinin depolandığı ve yüksek performanslı benzerlik aramalarının yapıldığı özel bir veritabanıdır. Pinecone, Weaviate, Milvus, Qdrant veya daha basit uygulamalar için FAISS gibi kütüphaneler bu amaçla kullanılır. Bu veritabanları, milyonlarca vektör arasında saniyeler içinde en benzer olanları bulmak için özel indeksleme algoritmaları (örn. Approximate Nearest Neighbors - ANN) kullanır.

  5. Büyük Dil Modeli (LLM)

    Geri getirilen bağlam ve kullanıcı sorgusunu kullanarak nihai yanıtı üreten modeldir. OpenAI (GPT-3.5, GPT-4), Anthropic (Claude), Google (Gemini) gibi bulut tabanlı API'ler veya kendi sunucunuzda çalıştırabileceğiniz açık kaynaklı modeller (örn. Llama 2, Mixtral) kullanılabilir. LLM'e gönderilen Prompt'un (yönergenin) iyi tasarlanmış olması, yanıt kalitesi açısından kritik öneme sahiptir.

Bu bileşenler bir araya gelerek, kullanıcının sorgusunu anlayan, ilgili bilgiyi bulan ve bu bilgiyi kullanarak akıllı, bağlamsal ve doğru yanıtlar üreten dinamik bir web uygulaması oluşturur. Backend, tüm bu bileşenler arasındaki iletişimi ve iş akışını yöneten merkezi orkestratör görevi görür.

Vaka Analizi: Akıllı Ürün Araması ve Kişiselleştirilmiş Öneri Sistemi Nasıl Oluşturulur?

Bir e-ticaret platformunda kullanıcı deneyimini dönüştürmenin en etkili yollarından biri, akıllı arama ve kişiselleştirilmiş öneriler sunmaktır. Geleneksel arama motorları genellikle tam eşleşen anahtar kelimelere dayanır ve kullanıcının niyetini tam olarak kavrayamaz. Örneğin, "spor salonu için rahat, şık ayakkabı" arayan bir kullanıcıya sadece "spor" veya "ayakkabı" kelimeleri geçen ürünler sunmak yeterli değildir. Embeddings ve RAG ile bu süreci nasıl geliştirebileceğimize bakalım:

Adım 1: Veri Hazırlığı ve Embedding Oluşturma

İlk olarak, tüm ürün verilerimizi (ürün adı, açıklaması, özellikleri, müşteri yorumları vb.) toplarız. Bu veriler, RAG sistemi için "bilgi tabanımız"ı oluşturacaktır. Her bir ürünün açıklamasını veya özetini alıp, bir Embedding modeline göndererek vektör temsillerini oluştururuz. Bu işlem genellikle offline olarak, yani ürünler veri tabanına eklendiğinde veya güncellendiğinde gerçekleşir.


# Örnek: Python ile ürün Embedding'i oluşturma
from openai import OpenAI
import pandas as pd

client = OpenAI() # OpenAI API anahtarınız yapılandırılmış olmalı

def create_embeddings(texts):
    # Metinlerin Embeddings'lerini oluşturan fonksiyon
    # OpenAI'ın 'text-embedding-ada-002' modelini kullanıyoruz
    response = client.embeddings.create(
        input=texts,
        model="text-embedding-ada-002"
    )
    return [d.embedding for d in response.data]

# Örnek ürün verileri
products_df = pd.DataFrame({
    'product_id': [1, 2, 3],
    'name': ['Nike Air Max 270', 'Adidas Ultraboost', 'Puma RS-X³'],
    'description': [
        'Günlük kullanım ve hafif koşular için tasarlanmış rahat spor ayakkabısı. Şık görünümüyle dikkat çeker.',
        'Yüksek konfor ve enerji dönüşümü sağlayan koşu ayakkabısı. Uzun mesafeler için idealdir.',
        'Retro esintili, cesur tasarımlı sneaker. Sokak modası için mükemmel.'
    ]
})

# Ürün açıklamaları için Embeddings oluşturma
product_embeddings = create_embeddings(products_df['description'].tolist())
products_df['embedding'] = product_embeddings

print("İlk ürünün Embedding vektörünün ilk 5 elemanı:")
print(products_df['embedding'][0][:5])
# Bu vektörler daha sonra bir vektör veritabanına kaydedilir.

Adım 2: Vektör Veritabanı İndeksleme

Oluşturduğumuz ürün Embeddings'lerini bir vektör veritabanına (örn. Pinecone, Qdrant) indeksleriz. Her vektör, ilgili ürünün ID'si ile birlikte depolanır. Bu veritabanı, milyonlarca vektör arasında hızlı ve semantik arama yapmamızı sağlar.

Adım 3: Akıllı Arama İşlevi (Frontend & Backend)

Kullanıcı bir arama sorgusu girdiğinde (örn. "koşu için en iyi ayakkabılar"), bu sorgu backend'e gönderilir:

  • Backend, kullanıcının sorgusunun Embedding'ini oluşturur.
  • Bu sorgu Embedding'i, vektör veritabanına gönderilir.
  • Vektör veritabanı, sorgu Embedding'ine semantik olarak en yakın olan ürün Embeddings'lerini bulur ve ilgili ürün ID'lerini geri döndürür.
  • Backend, bu ürün ID'lerini kullanarak ana ürün veri tabanımızdan (SQL, NoSQL vb.) ürün detaylarını çeker.
  • Bu ürün detayları, kullanıcıya gösterilmek üzere frontend'e gönderilir.

Adım 4: Kişiselleştirilmiş Öneri Sistemi (RAG ile)

Sadece arama yapmakla kalmayıp, kullanıcının geçmiş alışverişleri, görüntüleme geçmişi ve favorileri gibi kişisel verilerini de dikkate alarak daha akıllı öneriler sunabiliriz. Bu noktada RAG devreye girer:

  • Kullanıcının profil bilgileri ve sorgusu bir araya getirilir (örn. "Geçen ay aldığım Nike ayakkabılara benzer, daha uygun fiyatlı modeller öner").
  • Bu kombinasyon, uygun bir prompt ile bir LLM'e gönderilir. LLM, kullanıcının geçmiş alışkanlıklarını ve mevcut ürün verilerini (RAG ile geri getirilen) analiz ederek kişiselleştirilmiş bir öneri listesi oluşturur.
  • LLM, ayrıca seçilen ürünler hakkında detaylı bilgiler (örn. "Bu ayakkabı X antrenmanları için idealdir çünkü Y özelliğine sahiptir") de üretebilir.

// Örnek: Node.js/Express backend'inde RAG destekli arama endpoint'i
const express = require('express');
const { OpenAI } = require('openai');
const { Pinecone } = require('@pinecone-database/pinecone'); // Örnek bir vektör DB istemcisi

const app = express();
app.use(express.json());

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const pinecone = new Pinecone({ apiKey: process.env.PINECONE_API_KEY, environment: process.env.PINECONE_ENVIRONMENT });
const index = pinecone.Index('product-embeddings'); // Pinecone indeksinizin adı

app.post('/api/rag-search', async (req, res) => {
  const { query } = req.body;

  try {
    // 1. Sorgunun Embedding'ini oluştur
    const queryEmbeddingResponse = await openai.embeddings.create({
      input: query,
      model: "text-embedding-ada-002",
    });
    const queryVector = queryEmbeddingResponse.data[0].embedding;

    // 2. Vektör veritabanında benzer ürünleri ara
    const queryResults = await index.query({
      vector: queryVector,
      topK: 5, // En yakın 5 ürünü getir
      includeMetadata: true, // Ürün adlarını/açıklamalarını da getir
    });

    // 3. Geri getirilen bağlamı hazırla
    let context = queryResults.matches.map(match => {
        // Burada ürün metadata'sından ilgili bilgileri çekiyoruz
        return Ürün Adı: ${match.metadata.name}, Açıklama: ${match.metadata.description};
    }).join('\n');

    // 4. LLM'e gönderilecek prompt'u oluştur
    const prompt = Kullanıcı şu aramayı yapıyor: "${query}". 
                   Aşağıdaki ürün açıklamalarını kullanarak en alakalı ürünü/ürünleri bul ve kullanıcıya özlü bir şekilde tavsiye et. 
                   Ayrıca, bu ürün/ürünler hakkında kısa bir bilgi ver. Eğer kişiselleştirme bilgisi varsa (örn. 'geçmiş alışverişleri'),
                   bunu da dikkate al.
                   \n\nÜrün Verileri:\n${context};

    // 5. LLM'den yanıt üret
    const llmResponse = await openai.chat.completions.create({
      model: "gpt-3.5-turbo",
      messages: [{ role: "user", content: prompt }],
    });

    res.json({ answer: llmResponse.choices[0].message.content });

  } catch (error) {
    console.error("RAG arama hatası:", error);
    res.status(500).json({ error: "Sunucu hatası" });
  }
});

app.listen(3000, () => console.log('Server running on port 3000'));

Bu vaka analizi, Embeddings ve RAG'nin bir e-ticaret uygulamasında nasıl daha anlamlı ve kişiselleştirilmiş bir deneyim yaratabileceğini göstermektedir. Bu sayede, kullanıcılar istedikleri ürünlere daha kolay ulaşırken, işletmeler de dönüşüm oranlarını artırabilir. Semantik arama ve RAG sayesinde, sadece anahtar kelime eşleşmesinin ötesine geçerek kullanıcının gerçek niyetini anlayan ve buna uygun çözümler sunan bir sistem inşa edebiliriz.

Uzman İpucu: Hybrid Arama ile Performansı Artırın

Sadece Embedding tabanlı arama yapmak yerine, geleneksel anahtar kelime tabanlı arama (full-text search) ile Embedding tabanlı aramayı birleştiren "Hybrid Search" yaklaşımları kullanmak performansı artırabilir. Bu, hem anahtar kelime eşleşmesi garantisi verir hem de semantik benzerliği yakalar. Elasticsearch veya Solr gibi araçlar, vektör veritabanlarıyla birlikte bu hibrit yapıyı destekleyebilir.

Uygulamalı Örnek: Basit Bir RAG Destekli Soru-Cevap Botu Geliştirme

Şirket içi bilgi bankalarından veya sıkça sorulan sorular (SSS) bölümlerinden otomatik olarak yanıtlar üreten bir soru-cevap botu, hem müşteri hizmetlerini iyileştirebilir hem de çalışan verimliliğini artırabilir. İşte RAG kullanarak basit bir soru-cevap botunu nasıl geliştireceğimize dair adım adım bir örnek:

Proje Senaryosu: Şirket İçi Bilgi Bankası Botu

Çalışanların şirket politikaları, IT sorunları veya insan kaynakları süreçleri hakkında hızlıca bilgi alabileceği bir bot geliştirmek istiyoruz. Bot, önceden tanımlanmış bilgi dokümanlarımızdan (PDF'ler, Wiki sayfaları, Word dokümanları) doğru ve güncel yanıtları çekmelidir.

Adım 1: Bilgi Kaynaklarını Hazırlama ve Embedding'lerini Oluşturma

Öncelikle, botun yanıtlayacağı tüm bilgi dokümanlarını toplarız. Bu dokümanları daha sonra anlamlı "chunk"lara (parçalara) ayırırız. Her chunk, şirket politikaları, bir ürünün kullanım kılavuzundaki belirli bir bölüm veya bir SSS cevabı olabilir. Bu chunk'ların her birini bir Embeddings modeline göndererek vektör temsillerini oluştururuz. Bu vektörler, doküman parçacıklarının semantik anlamlarını taşır.


# Örnek: Python ile dokümanları işleme ve Embedding oluşturma
# Bu kod, hayali bir doküman listesinden Embedding'ler oluşturur.
from openai import OpenAI
import time

client = OpenAI()

documents = [
    {"id": "doc1", "text": "Şirketimizin yıllık izin politikası, çalışanların bir takvim yılında 14 iş günü ücretli izin hakkına sahip olduğunu belirtir."},
    {"id": "doc2", "text": "Uzaktan çalışma prensiplerimiz, haftada iki gün ofisten, üç gün evden çalışma imkanı sunar. Yöneticinin onayı gereklidir."},
    {"id": "doc3", "text": "Yeni işe alım süreçleri, İK departmanı tarafından yönetilir ve oryantasyon programını içerir."},
    {"id": "doc4", "text": "IT destek ekibine ulaşmak için dahili numara 5555'i arayabilir veya destek@sirket.com adresine e-posta gönderebilirsiniz."},
    {"id": "doc5", "text": "Fatura ve ödeme süreçleri için muhasebe departmanıyla iletişime geçin. Son ödeme tarihi her ayın 15'idir."}
]

# Doküman metinlerini bir listeye çıkar
texts_to_embed = [doc["text"] for doc in documents]

# Embeddings oluşturma fonksiyonu (önceki örnekten)
def create_embedding_for_text(text):
    try:
        response = client.embeddings.create(input=text, model="text-embedding-ada-002")
        return response.data[0].embedding
    except Exception as e:
        print(f"Embedding oluşturma hatası: {e}")
        return None

# Her doküman için Embedding oluştur ve doc objesine ekle
for doc in documents:
    doc["embedding"] = create_embedding_for_text(doc["text"])
    time.sleep(0.1) # Rate limitleri için küçük bir gecikme

# Vektör veritabanına kaydedilecek format
# docs_for_db = [{"id": doc["id"], "values": doc["embedding"], "metadata": {"text": doc["text"]}} for doc in documents if doc["embedding"] is not None]
# print(docs_for_db[0]) # İlk dokümanın DB'ye gidecek halini görelim

Adım 2: Vektör Veritabanı Kurulumu ve İndeksleme

Oluşturulan Embeddings'leri ve ilgili doküman meta verilerini (örn. orijinal metin, doküman ID'si) bir vektör veritabanına indeksleriz. Bu örnek için, bulut tabanlı bir vektör veritabanı (Pinecone, Qdrant) veya basit bir yerel çözüm (FAISS) kullanılabilir. Bu veritabanı, botun gelen sorgulara hızla yanıt verebilmesi için kritik öneme sahiptir.

Adım 3: Botun Backend Mantığı (API)

Bir web API'si (örn. Node.js Express veya Python FastAPI) oluşturulur. Bu API, botun kullanıcı sorgularını alacak, RAG sürecini işleyecek ve LLM'den gelen yanıtı döndürecektir.


// Örnek: Python FastAPI ile RAG botu backend
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from openai import OpenAI
# from pinecone import Pinecone, Index # Eğer Pinecone kullanılıyorsa

app = FastAPI()
openai_client = OpenAI()

# Eğer Pinecone kullanılıyorsa:
# pinecone_client = Pinecone(api_key="YOUR_PINECONE_API_KEY", environment="YOUR_PINECONE_ENVIRONMENT")
# index = pinecone_client.Index("your-info-index")

# Vektör veritabanı yerine basit bir in-memory listesi kullanalım (demo amaçlı)
# Gerçek uygulamada Pinecone, Qdrant vb. kullanılmalı
class InMemoryVectorDB:
    def __init__(self, documents_with_embeddings):
        self.documents = documents_with_embeddings

    def search(self, query_embedding, top_k=3):
        similarities = []
        for doc in self.documents:
            if doc["embedding"] is not None:
                # Basit kosinüs benzerliği hesaplama (numpy olmadan)
                dot_product = sum(a * b for a, b in zip(query_embedding, doc["embedding"]))
                magnitude_query = sum(a*a for a in query_embedding)**0.5
                magnitude_doc = sum(a*a for a in doc["embedding"])**0.5
                
                if magnitude_query == 0 or magnitude_doc == 0:
                    similarity = 0
                else:
                    similarity = dot_product / (magnitude_query * magnitude_doc)
                
                similarities.append((similarity, doc["text"]))
        similarities.sort(key=lambda x: x[0], reverse=True)
        return [text for sim, text in similarities[:top_k]]

# Yukarıdaki documents listesini ve oluşturulan Embeddings'leri kullanın
# InMemoryVectorDB örneğini başlatmadan önce doc["embedding"]'lerin doldurulmuş olması gerekir.
# documents listesindeki her dokümanın bir "embedding" anahtarına sahip olduğundan emin olun.
in_memory_db = InMemoryVectorDB(documents) # documents, Embeddings ile doldurulmuş olmalı

class QueryRequest(BaseModel):
    question: str

@app.post("/ask")
async def ask_bot(request: QueryRequest):
    try:
        # 1. Kullanıcının sorusunun Embedding'ini oluştur
        question_embedding_response = openai_client.embeddings.create(
            input=request.question,
            model="text-embedding-ada-002"
        )
        question_vector = question_embedding_response.data[0].embedding

        # 2. Vektör veritabanında alakalı doküman parçacıklarını geri getir
        relevant_chunks = in_memory_db.search(question_vector, top_k=3)
        context = "\n".join(relevant_chunks)

        # 3. LLM'e gönderilecek prompt'u oluştur
        prompt = f"""Bir Soru-Cevap botusun. Aşağıdaki bilgilerden faydalanarak kullanıcının sorusunu yanıtla. 
                     Eğer bilgi mevcut değilse, "Bu konuda yeterli bilgiye sahip değilim." yanıtını ver.
                     Kullanıcının Sorusu: "{request.question}"
                     Bilgi Kaynakları:
                     {context}
                     Yanıt:"""

        # 4. LLM'den yanıt üret
        llm_response = openai_client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.7
        )
        
        return {"answer": llm_response.choices[0].message.content}

    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

Adım 4: Frontend Entegrasyonu

Basit bir HTML sayfası ve JavaScript kullanarak kullanıcının sorularını gönderebileceği ve botun yanıtlarını görüntüleyebileceği bir arayüz oluşturulur. Yukarıdaki SearchComponent örneğine benzer bir yapı kullanılabilir.

Bu örnek, RAG'nin dahili bilgi bankalarına dayalı güvenilir ve doğru yanıtlar üretebilen bir soru-cevap botu oluşturmak için nasıl kullanılabileceğini göstermektedir. Bu sayede, çalışanlar ihtiyaç duydukları bilgilere anında ulaşabilir, verimlilik artarken bilgiye erişim süreçleri basitleşir.

Performans ve Optimizasyon İpuçları: Ölçeklenebilir RAG Çözümleri

RAG ve Embeddings tabanlı sistemler güçlü olsa da, özellikle yüksek trafikli web uygulamalarında performans ve ölçeklenebilirlik büyük önem taşır. İşte bu sistemleri optimize etmek için bazı ipuçları:

Embedding Modeli Seçimi ve Yönetimi

  • Maliyet ve Hız Dengesi: Büyük ve karmaşık Embeddings modelleri (örn. OpenAI'ın modelleri) genellikle daha yüksek doğruluk sunar ancak API maliyetleri ve gecikme süreleri olabilir. Daha küçük, özel eğitilmiş veya açık kaynaklı modeller (örn. Sentence-BERT türevleri) daha hızlı ve maliyet etkin olabilir, özellikle kendi sunucularınızda çalıştırıyorsanız.
  • Önbellekleme (Caching): Sıkça sorgulanan metinlerin veya statik dokümanların Embeddings'lerini önbellekte tutmak, tekrar tekrar API çağrısı yapmaktan veya hesaplama yapmaktan kaçınarak gecikmeyi önemli ölçüde azaltır.
  • Parti İşleme (Batch Processing): Birden fazla metni aynı anda Embeddings modeline göndererek API çağrısı sayısını azaltın ve verimliliği artırın.

Vektör Veritabanı Optimizasyonu

  • Doğru Veritabanı Seçimi: Pinecone, Qdrant, Weaviate gibi vektör veritabanları, milyarlarca vektörü yönetmek ve hızlı arama yapmak için tasarlanmıştır. Projenizin ölçeğine ve bütçenize uygun olanı seçin.
  • İndeksleme Stratejileri: Vektör veritabanları genellikle Approximate Nearest Neighbors (ANN) algoritmalarını (örn. HNSW, IVFFlat) kullanır. Bu algoritmaların parametrelerini (örn. ef_construction, M değerleri) uygulamanızın doğruluk ve hız gereksinimlerine göre ayarlayın. Genellikle daha yüksek doğruluk, daha uzun indeksleme veya arama süreleri anlamına gelir.
  • Metadata Filtreleme: Sadece vektör benzerliğine göre arama yapmak yerine, metadata (örneğin ürün kategorisi, tarih aralığı) kullanarak aramayı daraltmak hem performansı artırır hem de alaka düzeyini yükseltir.

LLM Etkileşiminde İyileştirmeler

  • Prompt Engineering: LLM'e gönderilen prompt'un net, kısa ve yönlendirici olması, modelin doğru ve istenen formatta yanıt üretmesini sağlar. "Sen bir X rolündesin", "Şu bilgileri kullanarak yanıtla", "Sadece bu bilgilerle sınırlı kal" gibi yönergeler çok etkilidir.
  • Bağlam Penceresi Yönetimi: LLM'lerin genellikle sınırlı bir "bağlam penceresi" vardır. Geri getirilen doküman parçacıklarının bu pencereye sığdığından emin olun. Gerekirse, en alakalı parçacıkları seçmek veya özetlemek için stratejiler geliştirin.
  • Önbellekleme: LLM yanıtları da sıkça tekrar eden sorgular için önbelleğe alınabilir.

Genel Mimari ve Güvenilirlik

  • Asenkron İşlemler: Uzun sürebilecek Embedding oluşturma veya LLM çağrıları gibi işlemleri asenkron olarak yürütün. Bu, web uygulamanızın arayüzünün donmasını veya kullanıcıyı bekletmesini engeller.
  • Dağıtılmış Sistemler: Yüksek ölçek için, RAG bileşenlerini ayrı servisler olarak dağıtın (mikroservis mimarisi). Bu, her bileşenin bağımsız olarak ölçeklenmesine olanak tanır.
  • Hata Yönetimi ve Yeniden Denemeler: API çağrılarında (Embedding veya LLM) zaman aşımları veya hatalar için sağlam hata yönetimi ve yeniden deneme mekanizmaları uygulayın.
  • İzleme ve Günlükleme: Performans darboğazlarını ve hataları tespit etmek için tüm bileşenlerin izlenmesi ve günlüklenmesi kritik öneme sahiptir.

Uzman İpucu: RAG'de Kaynak Doğrulama

LLM'in verdiği yanıtın güvenilirliğini artırmak için, yanıtta kullanılan bilgi kaynaklarını (yani geri getirilen doküman parçacıklarını) kullanıcıya gösterebilirsiniz. Bu, kullanıcının bilginin doğruluğunu teyit etmesine olanak tanır ve modelin şeffaflığını artırır.

Mobil Uyumlu RAG Uygulamaları İçin CSS İpuçları

RAG destekli web uygulamalarının mobil cihazlarda da sorunsuz çalışması, kullanıcı deneyimi açısından hayati öneme sahiptir. Duyarlı (responsive) tasarım prensiplerini uygulayarak, uygulamanızın farklı ekran boyutlarına ve cihazlara otomatik olarak adapte olmasını sağlayabilirsiniz.


/* Genel stil tanımlamaları */
body {
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  margin: 0;
  padding: 20px;
  background-color: #f4f7f6;
  color: #333;
}

.container {
  max-width: 960px;
  margin: 0 auto;
  background-color: #ffffff;
  padding: 20px;
  box-shadow: 0 4px 8px rgba(0,0,0,0.1);
  border-radius: 8px;
}

/* Arama formu stilleri */
.search-form {
  display: flex;
  margin-bottom: 20px;
  flex-wrap: wrap; /* Küçük ekranlarda sarmalama için */
}

.search-form input[type="text"] {
  flex-grow: 1; /* Mevcut alanı kapla */
  padding: 12px 15px;
  border: 1px solid #ddd;
  border-radius: 5px;
  font-size: 16px;
  margin-right: 10px; /* Butondan ayır */
  min-width: 200px; /* Çok küçük ekranlarda bile minimum genişlik */
}

.search-form button {
  padding: 12px 25px;
  background-color: #007bff;
  color: white;
  border: none;
  border-radius: 5px;
  cursor: pointer;
  font-size: 16px;
  transition: background-color 0.3s ease;
}

.search-form button:hover {
  background-color: #0056b3;
}

/* Yanıt ve sonuç stilleri */
.results-container {
  margin-top: 20px;
  padding: 15px;
  background-color: #e9f7ef;
  border: 1px solid #d4edda;
  border-radius: 5px;
}

.results-container h3 {
  color: #28a745;
  margin-top: 0;
}

/* Mobil uyumluluk için Media Queries */
@media (max-width: 768px) {
  .container {
    padding: 15px;
    margin: 0 10px; /* Kenarlardan boşluk bırak */
  }

  .search-form {
    flex-direction: column; /* Küçük ekranlarda input ve butonu alt alta koy */
  }

  .search-form input[type="text"] {
    margin-right: 0; /* Buton alt alta gelince sağ boşluğa gerek yok */
    margin-bottom: 10px; /* Butonla arasına boşluk koy */
    min-width: unset; /* Minimum genişliği kaldır */
  }

  .search-form button {
    width: 100%; /* Butonu tam genişlik yap */
  }
}

@media (max-width: 480px) {
  body {
    padding: 10px;
  }

  .container {
    border-radius: 0; /* Çok küçük ekranlarda kenar yuvarlaklığını kaldır */
  }

  .search-form input[type="text"],
  .search-form button {
    font-size: 14px;
    padding: 10px;
  }
}

Yukarıdaki CSS örneklerinde görüldüğü gibi, flex-wrap, flex-direction: column ve @media kuralları kullanılarak arayüzün farklı ekran boyutlarına dinamik olarak uyum sağlaması sağlanmıştır. Özellikle mobil cihazlarda input alanlarının ve butonların tam genişlikte olması, okunabilirliğin ve kullanılabilirliğin artırılması için önemlidir. Bu sayede, RAG destekli akıllı web uygulamanız, hangi cihazdan erişilirse erişilsin, kullanıcılarına tutarlı ve keyifli bir deneyim sunar.

Geleceğe Bakış ve Sıkça Sorulan Sorular

Embeddings ve RAG teknolojileri, yapay zeka destekli web uygulamalarının geleceğini şekillendiren temel taşlardır. Bu teknolojiler, geleneksel sistemlerin sınırlılıklarını aşarak, kullanıcılara daha akıllı, daha kişiselleştirilmiş ve güvenilir deneyimler sunma potansiyeline sahiptir. Bugün gördüğümüz uygulamalar sadece bir başlangıçtır; gelecekte multi-modal Embeddings (metin, görüntü, ses verilerini bir arada işleyebilen), daha sofistike RAG mimarileri ve kendi kendini geliştiren otonom RAG sistemleri ile karşılaşacağımız kaçınılmazdır. Web uygulamalarımız, sadece birer araç olmaktan çıkıp, gerçek anlamda zeki ve proaktif asistanlara dönüşecektir. Bu gelişmeleri yakından takip etmek ve projelerimize entegre etmek, rekabette önde kalmanın anahtarı olacaktır.

Özetle, Embeddings metin gibi yapılandırılmamış verileri makinelerin anlayabileceği sayısal vektörlere dönüştürerek anlamsal ilişkileri yakalar. RAG ise bu Embeddings'leri kullanarak LLM'lerin harici bilgi kaynaklarından güncel ve doğru bilgi çekmesini sağlayarak "halüsinasyon" sorununu çözer ve yanıt kalitesini artırır. Bu iki teknoloji bir araya geldiğinde, web uygulamalarımızda akıllı arama, kişiselleştirilmiş öneriler, doğru soru-cevap botları ve çok daha fazlasını gerçekleştirebiliriz. Bu rehber, size bu yolculukta sağlam bir başlangıç noktası sunmayı amaçlamaktadır.

Sıkça Sorulan Sorular

RAG sistemi kurmak için hangi LLM'i kullanmalıyım?
Seçim, projenizin bütçesine, performans gereksinimlerine ve veri gizliliği ihtiyaçlarına bağlıdır. OpenAI'ın GPT serisi (GPT-3.5, GPT-4) genel kullanım için oldukça güçlüdür ancak API maliyetleri vardır. Açık kaynaklı modeller (Llama 2, Mistral, Mixtral) kendi sunucularınızda çalıştırılabilir, bu da maliyet ve gizlilik açısından avantaj sağlayabilir ancak daha fazla altyapı yönetimi gerektirir. Küçük ölçekli projeler için popüler API'ler iyi bir başlangıçtır, ancak büyük ölçekli ve özelleştirilmiş çözümler için açık kaynak modelleri düşünebilirsiniz.
Embeddings maliyetli midir?
Embeddings oluşturma maliyeti, kullandığınız modele ve işlediğiniz metin miktarına göre değişir. OpenAI gibi sağlayıcılar genellikle token başına ücret alır. Büyük metin korpusları için bu maliyetler zamanla artabilir. Maliyetleri düşürmek için:
  • Sadece gerekli metinlerin Embedding'ini oluşturun.
  • Daha küçük veya açık kaynaklı Embedding modelleri kullanmayı düşünün.
  • Oluşturulan Embeddings'leri önbellekte saklayın ve tekrar kullanın.
  • Parti (batch) işleme ile API çağrısı sayısını optimize edin.
RAG'nin halüsinasyonu tamamen engellediği söylenebilir mi?
RAG, LLM'lerin halüsinasyon yapma olasılığını önemli ölçüde azaltır, ancak tamamen ortadan kaldırdığını söylemek zordur. RAG, modele harici ve güvenilir bir bağlam sağlar, ancak LLM yine de bu bağlamı yorumlarken veya sentezlerken küçük hatalar yapabilir. "Chunking" stratejileri, retrieval kalitesi, prompt engineering ve modelin kendi iç yapısı gibi faktörler, halüsinasyon olasılığını daha da etkiler. Yanıtların doğruluğunu artırmak için her zaman insan denetimi veya otomatik doğrulama mekanizmaları bulundurmak faydalıdır.
Web uygulamamda hangi vektör veritabanını kullanmalıyım?
Seçim, projenizin ölçeğine, bütçesine, karmaşıklığına ve tercih ettiğiniz dağıtım ortamına bağlıdır.
  • Küçük/Orta Ölçekli Projeler: Qdrant, Weaviate, Pinecone (bulut servisleri genellikle daha kolay başlangıç sunar).
  • Büyük Ölçekli/Kurumsal Çözümler: Milvus, Vespa (kendi sunucunuzda barındırma ve yüksek özelleştirme imkanı sunar).
  • Prototipleme/Basit Kullanım: FAISS (yerel olarak çalıştırılabilen, hızlı bir kütüphane).

Seçim yaparken, veritabanının ölçeklenebilirlik, sorgu hızı, maliyet, topluluk desteği ve geliştirici dostu API'leri gibi özelliklerini değerlendirin.

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

Gönder

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.
Mobil sürümden çık