AI Engineering Academy · Ders

RAG Mimarisi: Dizinleme ve Geri Getirme

RAG'nin iki aşamasını planlayın: belgeleri parçalayan, gömen ve depolayan çevrim dışı dizinleme aşaması ile her sorgu için ilgili bağlamı bulan çevrim içi geri getirme aşaması.

2. ders / 413 adım

RAG Mimarisi: Dizinleme ve Geri Getirme, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.

RAG'in İki Farklı Aşaması Vardır

Bir RAG sistemi, farklı zamanlarda çalışan ve temelde birbirinden farklı iki aşamada işler. Çevrimdışı dizinleme aşaması, belgelerinizi bir kez (veya değiştiklerinde) işler ve aranabilir bir dizin hazırlar. Çevrimiçi getirme aşaması ise her kullanıcı sorgusunda gerçek zamanlı olarak çalışır. Bu ayrımı anlamak, hem sorgu sırasında hızlı hem de zaman içinde sürdürülebilir sistemler tasarlamak için gereklidir.

Dizinleme Aşaması: Birinci Adım — Yükleme

Dizinleme, belge yüklemeyle başlar: kaynak sistemlerinizdeki ham dosyaların okunmasıyla. Belgeler PDF, Word dosyası, HTML sayfası, Markdown dosyası, veritabanı satırı veya herhangi bir metin kaynağı olabilir. Her belge, mümkün olduğunca yapısı korunarak düz metin biçiminde belleğe yüklenir. pypdf, python-docx ve unstructured gibi kütüphaneler, biçime özgü ayrıştırma işlemlerinin zor kısmını üstlenir.

from pypdf import PdfReader

def load_pdf(path):
    reader = PdfReader(path)
    pages = []
    for i, page in enumerate(reader.pages):
        text = page.extract_text()
        pages.append({'text': text, 'page': i + 1, 'source': path})
    return pages

docs = load_pdf('company_policy.pdf')
print(f'Loaded {len(docs)} pages')

Dizinleme Aşaması: İkinci Adım — Parçalama

LLM'lerin bağlam pencereleri sınırlıdır ve belgelerin tamamını getirmek verimsizdir. Yüklenen metin, yaklaşık 200-1000 belirteçten oluşan daha küçük parçalara ayrılır. İyi bir parçalama anlamsal bütünlüğü korur: bir parça eksiksiz bir fikri ifade etmelidir. Yaygın bir strateji, örtüşen pencereler kullanmaktır; böylece parça sınırlarına yakın cümleler iki parçada da yer alır ve bölünme noktalarında bilgi kaybı önlenir.

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,      # characters per chunk
    chunk_overlap=50,    # overlap between chunks
    separators=['\n\n', '\n', '. ', ' ']
)

for page in docs:
    chunks = splitter.split_text(page['text'])
    for chunk in chunks:
        # Each chunk carries metadata from its source page
        print(f'Chunk ({len(chunk)} chars): {chunk[:80]}...')

Dizinleme Aşaması: Üçüncü Adım — Gömme

Her metin parçası, anlamsal anlamını sayısal olarak yakalayan yoğun bir vektör gömmesine dönüştürülür. Her parça için OpenAI'ın text-embedding-3-small gibi bir gömme modelini çağırır ve yüksek boyutlu bir kayan nokta dizisi alırsınız. Benzer anlamlara sahip parçeler, bu yüksek boyutlu uzayda birbirine yakın vektörler üretir; anlamsal benzerlik aramasını mümkün kılan da budur.

from openai import OpenAI

client = OpenAI()

def embed_chunks(chunks):
    texts = [c['text'] for c in chunks]
    response = client.embeddings.create(
        model='text-embedding-3-small',
        input=texts
    )
    for i, chunk in enumerate(chunks):
        chunk['embedding'] = response.data[i].embedding
    return chunks

# Batch up to 2048 texts per API call
embedded = embed_chunks(all_chunks)

Dizinleme Aşaması: Dördüncü Adım — Depolama

Gömülen parçalar, meta verileriyle (kaynak dosya, sayfa numarası, bölüm başlığı) birlikte bir vektör veritabanında depolanır. Vektör deposu, hızlı yaklaşık en yakın komşu aramasını mümkün kılan bir dizin yapısı (genellikle HNSW) oluşturur. Bu dizin diske kalıcı olarak yazılır; böylece yeniden başlatmalardan sonra da varlığını korur. Dizinleme genellikle kurulum sırasında bir kez ve yeni belgeler eklendiğinde artımlı olarak yapılır.

import pinecone

pc = pinecone.Pinecone(api_key='YOUR_KEY')
index = pc.Index('rag-documents')

# Upsert vectors with metadata
vectors_to_upsert = [
    (
        chunk['id'],
        chunk['embedding'],
        {'text': chunk['text'], 'source': chunk['source'], 'page': chunk['page']}
    )
    for chunk in embedded_chunks
]

# Upsert in batches of 100
for i in range(0, len(vectors_to_upsert), 100):
    index.upsert(vectors=vectors_to_upsert[i:i+100])
print('Indexing complete')

Getirme Aşaması: Sorgu Gömme

Kullanıcı bir sorgu gönderdiğinde çevrimiçi getirme aşaması başlar. İlk adım, kullanıcının sorusunu gömmektir; bunun için dizinleme sırasında kullanılan gömme modelinin aynısı kullanılır. Bu kritik bir noktadır: text-embedding-3-small ile dizinleme yaptıysanız sorgu için de text-embedding-3-small kullanmanız gerekir. Sorgu gömmesi, kullanıcının ne sorduğunun anlamsal anlamını kodlayan bir vektördür.

def embed_query(question):
    response = client.embeddings.create(
        model='text-embedding-3-small',  # MUST match indexing model
        input=[question]
    )
    return response.data[0].embedding

user_question = 'What is our parental leave policy?'
query_vector = embed_query(user_question)
print(f'Query embedded: {len(query_vector)}-dim vector')

Getirme Aşaması: ANN Araması

Sorgu gömmesi, sorgu vektörüne en çok benzeyen K parçayı bulmak için yaklaşık en yakın komşu (ANN) araması yapan vektör deposuna gönderilir. Bu arama son derece hızlıdır (genellikle 10 ms'den kısa sürer); çünkü HNSW dizinleri, kaba kuvvet aramasına kıyasla çok büyük hız kazanımları karşılığında geri çağırmadan küçük bir miktar ödün verir. En iyi K parçayı getirirsiniz; K değeri genellikle 5 ile 20 arasındadır.

results = index.query(
    vector=query_vector,
    top_k=5,
    include_metadata=True
)

print(f'Retrieved {len(results.matches)} chunks:')
for match in results.matches:
    print(f'  Score: {match.score:.3f} | Source: {match.metadata["source"]}')
    print(f'  Text: {match.metadata["text"][:100]}...')
    print()

İki Aşamayı Birbirine Bağlama

Temel nokta, dizinleme ve getirmenin birlikte çalışacak şekilde tasarlanmış olmasıdır. Gömme modeli her iki aşamada da aynı olmalıdır; çünkü vektörlerin içinde bulunduğu matematiksel uzay modele özgüdür. Gömme modellerini değiştirirseniz tüm belgeleri yeniden dizinlemeniz gerekir. Vektör deposu köprü görevi görür: dizinleme sırasında vektörleri kabul eder, getirme sırasında vektörleri döndürür ve iki aşamayı zaman açısından birbirinden ayırırken vektör uzayında hizalı tutar.

Getirme Sırasında Meta Verileri Filtreleme

Vektör araması anlamsal olarak benzer parçaları bulur; ancak bazen meta verilere göre filtreleme de yapmanız gerekir. Örneğin yalnızca 2025'te yüklenen belgelerden veya yalnızca İK departmanı klasöründen parçalar getirebilirsiniz. Vektör depoları, meta veri alanlarında ön filtreleme ya da son filtreleme yapılmasını destekler. Pinecone ve Qdrant tarafından desteklenen ön filtreleme, filtreyi ANN aramasından önce uygular; bu, en iyi K sonuçlarına sonradan filtre uygulamaktan daha hızlı ve daha doğrudur.

# Retrieve only from HR department documents
results = index.query(
    vector=query_vector,
    top_k=5,
    filter={'department': {'$eq': 'HR'}},
    include_metadata=True
)

# Or filter by date range
results = index.query(
    vector=query_vector,
    top_k=5,
    filter={
        'upload_year': {'$gte': 2024},
        'doc_type': {'$eq': 'policy'}
    },
    include_metadata=True
)

Güncellemeler İçin Artımlı Dizinleme

Üretim ortamında belge derlemeniz zaman içinde değişir. Etkili bir dizinleme mimarisi artımlı güncellemeleri destekler: bir belge düzenlendiğinde mevcut vektörlerini ID'lerine göre silin ve yenilerini upsert edin. Belgeler silindiğinde vektörlerini kaldırın. Her parçaya, kaynak belgenin yolu ve parçanın konumuna göre belirlen deterministik bir ID atayın; böylece her şeyi yeniden dizinlemeden doğru vektörleri her zaman bulup güncelleyebilirsiniz.

import hashlib

def make_chunk_id(source_path, chunk_index):
    # Deterministic, stable ID for each chunk
    key = f'{source_path}::chunk_{chunk_index}'
    return hashlib.md5(key.encode()).hexdigest()

def update_document(source_path, index):
    # Delete old vectors for this document
    index.delete(filter={'source': source_path})
    # Re-index the updated document
    new_chunks = load_and_chunk(source_path)
    new_embedded = embed_chunks(new_chunks)
    index.upsert(vectors=new_embedded)
    print(f'Updated {source_path}: {len(new_chunks)} chunks')

Eksiksiz RAG İşlem Hattışına Genel Bakış

Eksiksiz RAG mimarisi şöyledir: Çevrimdışı: Belgeler → Yükleyici → Parçalayıcı → Gömme Modeli → Vektör Deposu. Çevrimiçi: Kullanıcı Sorgusu → Gömme Modeli → Vektör Deposu (ANN araması) → En İyi K Parça → İstem Oluşturma → LLM → Yanıt. Çevrimdışı işlem hattı her belge güncellemesinde bir kez çalışır. Çevrimiçi işlem hattı her kullanıcı sorgusunda milisaniyeler içinde çalışır; LLM tüm belge derlemesini değil, yalnızca ilgili bağlamı görür.

Kısa Kontrol

Bu dersteki Yapay Zekâ Mühendisliği kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: belge başına bir kez çalışan yükleme, parçalama, gömme ve depolama adımlarından oluşan çevrimdışı dizinleme aşamasını; sorguyu gömen, ANN araması yapan ve en iyi K parçayı milisaniyeler içinde döndüren çevrimiçi getirme aşamasını; ayrıca belgeler değiştikçe vektör deposunu güncel tutmaya yönelik artımlı dizinleme stratejilerini. Sırada, getirilen bağlamı etkili biçimde kullanan zenginleştirilmiş istemlerin nasıl hazırlanacağını inceleyeceğiz.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Python öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
30
Dersler
120

Sıkça Sorulan Sorular

“RAG Mimarisi: Dizinleme ve Geri Getirme” dersi ücretsiz mi?

Evet — “RAG Mimarisi: Dizinleme ve Geri Getirme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.

“RAG Mimarisi: Dizinleme ve Geri Getirme” dersinde ne öğreneceğim?

RAG'nin iki aşamasını planlayın: belgeleri parçalayan, gömen ve depolayan çevrim dışı dizinleme aşaması ile her sorgu için ilgili bağlamı bulan çevrim içi geri getirme aşaması. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“RAG Mimarisi: Dizinleme ve Geri Getirme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. RAG'nin Çözdüğü Problem
  2. RAG Mimarisi: Dizinleme ve Geri Getirme
  3. Zenginleştirilmiş İstemi Hazırlama
  4. RAG ve İnce Ayar: Hangisi Ne Zaman Kullanılmalı
← AI Engineering Academy Sayfasına Dön