---
title: "RAG (Retrieval Augmented Generation) Nedir? Uçtan Uca Bir RAG Projesi İçin Bilinmesi Gerekenler — Arfitect Yazıları"
lang: tr
updated: 2024-07-29T13:14:41Z
source: https://www.arfitect.com/tr/insights/what-is-rag-retrieval-augmented-generation-what-you-need-to-know-for-an-end-to-end-rag-project
---

# RAG (Retrieval Augmented Generation) Nedir? Uçtan Uca Bir RAG Projesi İçin Bilinmesi Gerekenler

> Yapay Zeka ve Makine Öğrenmesi uygulamaları her geçen gün daha fazla veri ile besleniyor. Bu kadar fazla veriyi bu uygulamalarda kullanabilmenin en kritik noktalarından biri ise verileri doğru bir şekilde işleyebilmekten geçiyor.

- Yazar: Bünyamin Çağlayan
- Yayın tarihi: 2024-07-29T13:14:41Z

Yapay Zeka ve Makine Öğrenmesi uygulamaları her geçen gün daha fazla veri ile besleniyor. Bu kadar fazla veriyi bu uygulamalarda kullanabilmenin en kritik noktalarından biri ise verileri doğru bir şekilde işleyebilmekten geçiyor. İnsanlar verilerini yapay zeka ile nasıl analiz edebileceklerinin yollarını arıyorlar. Bu arayış onların karşısına RAG’ı çıkarıyor. Bu yazıda, yapay zeka uygulamalarında sıklıkla kullanılan vektör veri tabanlarını, verilerin nasıl vektörlere çevrildiğini ve bunun aslında ne anlama geldiğini, LLM’lerde halüsinasyon kavramını, RAG’ın ne olduğunu ve vektör veri tabanlarının RAG uygulamalarındaki yerini örneklerle inceleyeceğiz.

Öncelikle özet halinde terimlerin ne olduğuna bir bakalım.

### **Vektör Veri Tabanı Nedir?**

Vektör veri tabanı, vektör formatındaki verileri saklayabilen ve bu vektörler üzerinde benzerlik aramaları yapılmasına imkan veren veri tabanlarıdır. Metin, resim, ses ve diğer medya verilerini saklayabilir ve sorgulanabilmesini sağlarlar.

![](https://www.arfitect.com/insights/what-is-rag-retrieval-augmented-generation-what-you-need-to-know-for-an-end-to-end-rag-project/09.jpg)

_**Şekil 1** — Vektör Veri Tabanı_

Şekil 1'de vektör veri tabanlarının basit bir görsel tasviri yer almaktadır. Görüleceği üzere vektör veri tabanları, birbiri ile daha benzer olan verilerin ayrıştırılabildiği ve sorgulama yapacağımız vektör ile daha alakalı verilerin döndürülmesine imkan verebileceği yapıdadırlar.

### Verilerin Vektör Temsili Nedir?

Veriler birçok formatta bulunabilirler. Bu verilerin benzerlik aramaları, vektör veri tabanlarında, vektör temsilleri üzerinden gerçekleştirilir. Verileri vektörlere çeviren, verinin bağlamını ve temel anlamını yitirmeden matematiksel temsilini sağlayan derin öğrenme modellerine **_Embedding model_ **ismi verilir.

![](https://www.arfitect.com/insights/what-is-rag-retrieval-augmented-generation-what-you-need-to-know-for-an-end-to-end-rag-project/02.jpg)

_**Şekil 2** — Embedding Model_

> Text verileri vektöre çevirmek için OpenAI’ın text-embedding-ada-002, text-embedding-3-small ve text-embedding-3-large gibi modelleri mevcuttur. Aynı zamanda Huggingface platformu üzerinde open-source yüzlerce embedding model mevcuttur.

Örneğin aşağıdaki kod bloğunda OpenAI’ın **text-embedding-3-small** modeli ile bir sentence embedding örneği yer almaktadır.

```
from openai import OpenAI
# api_key kısmına OpenAI üyeliğiniz ile aldığınız key'i girmelisiniz.
client = OpenAI(api_key="openai_api_key")

response = client.embeddings.create(
    input="Yapay zeka, bilgisayar sistemlerinin sergilediği zekadır.",
    model="text-embedding-3-small"
)

embeddingVector = response.data[0].embedding
embeddingVectorLength = len(embeddingVector)

print("Embedding Vektörü:", embeddingVector)
print("Embedding Vektörünün Boyutu:", embeddingVectorLength)
```

```
#OUTPUT
Embedding Vektörü: [0.027337221428751945, 0.02957259863615036, 0.00879795104265213, 0.028608720749616623, 0.028013987466692924, -0.010900025255978107, …]
Embedding Vektörünün Boyutu: 1536
```

Görüleceği üzere _“Yapay zeka, bilgisayar sistemlerinin sergilediği zekadır.”_ cümlesi 1536 boyutlu bir vektör haline çevrilmiş oldu.
Embedding vektörü, artık matematiksel bir nicelik olup, diğer vektörler ile karşılaştırılabilecek, benzerlik aramaları yapılabilecek bir hale gelmiştir.
Embedding vektörünün boyutu ise, embed edilen verinin anlamının, bağlamının ve özelliklerinin kaç boyutta saklanacağının karşılığıdır. Vektörün boyutu arttıkça veri daha geniş bir uzayda temsil edileceği için diğer vektörler ile ayrıştırılabilmesi daha kolay hale gelmişken, benzerlik araması yapılırken daha çok eşleşen bir vektör bulma ihtimali artmış olacaktır.

Vektör boyutunun önemini daha açık anlatmak gerekirse, örneğin elimizde bir meyve olduğunu ve karşımızdaki insana bunun hangi meyve olduğunu ismini söylemeden anlatmaya çalıştığımızı varsayalım. İşte burada vektör boyutu, meyveyi anlatırken söyleyebileceğimiz kelime grubu sayısı olarak tarif edilebilir. Çilek için yalnızca kırmızı kelimesi, birden fazla sayıda kırmızı meyve var olduğu için çokta ayırt edici olmayacaktır. Ancak Kırmızı, Elmas şeklinde, Tohumları üzerinde, yeşil yapraklı vs… gibi kelime gruplarıyla çileği diğer meyvelerden iyice ayrıştırmış olabiliriz. Ancak çok daha büyük uzaylar daha fazla kaynak tüketeceği için hesaplama sürelerini uzatabilir. Optimum uzay genişliği bulunmalıdır.

Embedding model seçiminde tek kriter elbette ki yalnızca uzay genişliği değildir. Modelin boyutu (kaç milyon parametre ile train edildiği), maksimum token’i (tek seferde ne kadar token uzunluktaki texti embed edebileceği) gibi modelin kalitesini belirleyen kriterleri ve bu modellerin çeşitli veri setleri üzerindeki performanslarını [buradan](https://huggingface.co/spaces/mteb/leaderboard) inceleyebilirsiniz.

### RAG Nedir?

LLM’ler, eğitildikleri çok büyük veri setleri sayesinde birçok konu hakkında bilgi sahibidirler. Ancak bazen bu verilerin tarih aralıkları nedeniyle sorduğumuz soru hakkında bilgi / doğru bilgi alamayabiliriz. Son eğitim tarihi 2023 olan bir modelin, 2024 yılındaki bir olay hakkında bilgisi olmayacaktır.

![](https://www.arfitect.com/insights/what-is-rag-retrieval-augmented-generation-what-you-need-to-know-for-an-end-to-end-rag-project/10.jpg)

_**Şekil 3** — Eğitim Verisi Dışı Soru_

Örneğin şekil 3'te, son eğitim tarihi 2022 olan OpenAI’ın GPT-3.5 modeline Rana Cabbar’ın ölüm tarihi _(20 Nisan 2023)_ sorulduğunda cevap olarak eğitim verisinin dışından bir soru sorduğumuzu ve cevabı bilmediğini söylemektedir. Ancak LLM’ler her zaman bu kadar dürüst davranmazlar.

![](https://www.arfitect.com/insights/what-is-rag-retrieval-augmented-generation-what-you-need-to-know-for-an-end-to-end-rag-project/11.jpg)

_**Şekil 4** — LLM Halüsinasyon_

Aynı modelin aynı soruya şekil 4'te ise yanlış ancak kendinden emin bir cevap verdiğini görebiliriz. İşte bu duruma **halüsinasyon** ismi verilir. Halüsinasyonlar LLM’lerde sıklıkla karşılaşılan bir problemdir ve bilgilerinin olmadığı konular hakkında uydurma bilgiler veya kaynaklar üretme durumudur. Bu durumun yaşanması LLM’lerin eğitim verilerinin kaliteleri, kapsamları, eğitim süreleri ve overfitting gibi birçok etkenle bağlantılı olabilir.
Bir konunun, LLM’lerin eğitim verilerinin içerisinde bulunmuyor olmasının tek sebebi date range değildir. Örneğin şirketinizin muhasebe bilgileri özel bilgiler olduğu ve public olarak yayınlanmadığı için eğitim verileri içerisinde bulunmaması gayet normaldir.

İşte bu gibi problemlerin üstesinden gelmek için RAG kullanılır. RAG, LLM’lerin bilgilerini ek veriler sağlayarak genişletmeye yönelik bir teknik olarak tanımlanabilir. Dil modeline, bilgisinin olmadığını düşündüğümüz konu hakkında bilgiler verilir ve bu veriler üzerinden sorgulamalar yapılır.

![](https://www.arfitect.com/insights/what-is-rag-retrieval-augmented-generation-what-you-need-to-know-for-an-end-to-end-rag-project/12.jpg)

_**Şekil 5** — RAG Yapısı_

Soru yine aynı fakat bu kez LLM’e sorunun cevabının nereden çıkarılacağına dair ek bağlam sağlandı. Böylece artık LLM eğitim datasının date range’inden veya bu bilgilerin eğitim datasının içerisinde yer alıp almamasından bağımsız, tüm soruları cevaplayabilecek hale gelmiş oldu ve sorunun doğru cevabını ek bilgilerimizden çıkarabildi.

Yöntem güzel fakat LLM’in bilmediği bir konu hakkında soru soracaksak her seferinde cevabı içeren metni kendimiz mi bulup vereceğiz? Hayır. Burada işin içine vektör veri tabanları giriyor. Vektör veri tabanları yardımıyla sorulan sorunun cevabını içeren metni otomatik olarak LLM’e vermeyi planlıyoruz.

### **RAG Akış Şeması**

![](https://www.arfitect.com/insights/what-is-rag-retrieval-augmented-generation-what-you-need-to-know-for-an-end-to-end-rag-project/13.jpg)

_**Şekil 6** — RAG Akış Şeması_

Yukarıda kuracağımız RAG sisteminin akış şeması yer almaktadır. Mor oklar bir kez gerçekleştirecek işlemleri temsil ederken, sarı oklar ise her sorgumuzda yapılacak işlemleri göstermektedir.

**Adımlar:
Adım 1–2–3–4: **İçerisinde sorgulama yapacağımız doküman parçalara bölünür ve bu parçalar embedding modele gönderilir. Her bir parçadaki metinler vektörlere dönüştürülür ve vektör veri tabanı üzerinde saklanır.
**Adım 5–6–7:** Kullanıcıdan, yüklediği doküman hakkında soracağı soru alınır ve bu soru cümlesi de vektöre dönüştürülür. Kullanıcının sorusun vektörü ve doküman parçalarının vektörlerinin arasında benzerlik hesaplamaları yapılarak en benzer n adet doküman parçası seçilir.
**Adım 8–9:** Kullanıcının sorusu ve soru ile en alakalı olarak seçilmiş n tane doküman parçası LLM’e gönderilir. LLM’in doğal dil anlama, işleme ve cevap üretebilme yetisinden faydalanarak cevap kullanıcıya dönülür (Burada şekil 5'daki gibi bir query prompt kullanmak cevap kalitesini yükseltecektir).

Şimdi tüm bu terimlerin ve yöntemlerin yer aldığı bir örnek yapabiliriz.

### RAG ile Doküman Soru-Cevap Uygulaması

Bu uygulamada;
**LLM**: OpenAI ChatGPT 4o
**Embedding Model**: OpenAI text-embedding-3-small
**Vektör Veri Tabanı**: Pinecone
**Sorgulanacak Belge**: [Sahte bilgiler](https://www.kaggle.com/datasets/bunyamincaglayan/sahte-bilgiler)

Olarak kullanılacaktır. Belgede yer alan bilgilere göre soruları cevaplayan bir uygulama yapılacaktır.

Sorgulanacak belge, ChatGPT tarafından, uygulamamızı test edebilmemiz için oluşturulmuş, yanlış bilgilerin yer aldığı bir dokümandır.
ChatGPT gündelik sorularımızın bir çoğunun cevabını zaten verebileceği için yanlış bilgilerin yer aldığı bir doküman üzerinden sorgulama yaptığımızda cevaplar da yanlış verilirse, bu cevapların belgelerimizden alındığını kanıtlayabileceğiz.

Öncelikle Pinecone’a kaydolup bir api-key alacağız. Daha sonra belge parçalarını ve bu parçaların vektörlerini saklayabileceğimiz bir index oluşturacağız. İndex oluşturma işlemi [Pinecone websitesi](https://www.pinecone.io/) üzerinden yapılabildiği gibi aşağıdaki şekilde de yapılabilir:

```
#PINECONE INDEX OLUŞTURMA

from pinecone import Pinecone, ServerlessSpec

API_KEY = "pinecone_api_key"

pc = Pinecone(api_key=API_KEY)

index_name = "fake-informations"

# İndex mevcut değil ise oluşturuyoruz.
existing_indexes = pc.list_indexes().names()
if index_name in existing_indexes:
    print("İndex zaten mevcut.")
else:
    pc.create_index(
        name=index_name, 
        dimension=1536, 
        metric='cosine', 
        spec=ServerlessSpec(
            cloud='aws',
            region='us-east-1'
        )
    )
    print("Index oluşturuldu")
    index = pc.Index(index_name)
    index_info = index.describe_index_stats()
    print(index_info)
```

```
#OUTPUT
Index oluşturuldu
{'dimension': 1536,
 'index_fullness': 0.0,
 'namespaces': {},
 'total_vector_count': 0}
```

İsmi _fake-informations,_ saklayacağı vektörlerin boyutu _1536_ olan ve vektörler arasındaki benzerlik aramasını _kosinüs benzerliği_ üzerinden gerçekleştirecek bir index oluşturduk.

```
# DOKÜMANI PARÇALARA AYIRMA

import fitz
from langchain.text_splitter import RecursiveCharacterTextSplitter

# Fitz ile doküman içeriğini extract ediyoruz
def extract_text_from_pdf(file_path):
    pdf_document = fitz.open(file_path)
    text_content = ""
    for page_num in range(pdf_document.page_count):
        page = pdf_document.load_page(page_num)
        text_content += page.get_text()
    text_content = text_content.replace("  ","")
    return 

def split_text_with_langchain(text, chunk_size=1, chunk_overlap=0):
    splitter = RecursiveCharacterTextSplitter(
        chunk_size=chunk_size,
        chunk_overlap=chunk_overlap,
        separators=["\n\n"]
    )
    return splitter.split_text(text)

file_path = 'fake-infos.pdf'
pdf_text = extract_text_from_pdf(file_path)

# Metni RecursiveCharacterTextSplitter kullanarak parçalama
text_chunks = split_text_with_langchain(pdf_text)

print(f"Belge toplamda {len(text_chunks)} parçaya ayrıldı.")
```

```
#OUTPUT
Belge toplamda 15 parçaya ayrıldı.
```

Belgeyi PyMuPDF(fitz) kütüphanesi ile okuyup içerisindeki tüm texti _pdf_text_ isimli değişkende tuttuk. Daha sonra bu texti _‘\n\n’ (çift satır başı)_ kısımlarından parçalayarak birbiri ile alakalı olmayan belgeleri ayırmayı hedefledik. Buradaki doküman parçalama işlemleri tamamen elimizdeki belgeyle alakalıdır ve farklı ayrıştırma işlemleri gerektirebilir. Belge içerisindeki bilgilerin birbiri ile alakası olmadığı için **Overlap** değerini 0 olarak belirledik ve toplamda 15 parçaya ayırdık.

![](https://www.arfitect.com/insights/what-is-rag-retrieval-augmented-generation-what-you-need-to-know-for-an-end-to-end-rag-project/14.jpg)

_**Şekil 7** — Overlap_

> Overlap, belgeyi parçalara ayırırken sıradaki parçanın başına bir önceki parçadan belirli bir kısım daha eklenerek anlam bütünlüğünün kaybolmasını engellemeye yönelik kullanılan bir stratejidir. Bizim senaryomuzda overlap 0 olarak kullanılmıştır.

> Örneğin 2000 karakterlik chunklar ve 200 overlap kullanılmış bir senaryo için: Her 2000 karakter için 200 karakterlik bir geriden başlama işlemi uygulanacaktır. Yani doküman parçası uzunluklarımız yaklaşık olarak:1. Parçanın genel textteki karakter aralığı : 0–20002. Parçanın genel textteki karakter aralığı : 1800–38003. Parçanın genel textteki karakter aralığı :3600–56004. Parçanın genel textteki karakter aralığı :5400–7400şeklinde devam edecektir.

Şimdi bu 15 parçayı embedding modelimiz yardımıyla vektörlere dönüştürüp bu vektörleri de bir liste içerisinde tutacağız.

```
#DOKÜMAN PARÇALARINI VEKTÖRLERE ÇEVİRME

from openai import OpenAI
client = OpenAI(api_key="openai_api_key")

# PDF parçalarını embed ediyoruz. 
def embed_text_chunks(text_chunk):
    response = client.embeddings.create(
        input=text_chunk,
        model="text-embedding-3-small"
    )

    return response.data[0].embedding

vectors = []
for text_chunk in text_chunks:
    text_vector = embed_text_chunks(text_chunk)
    vectors.append(text_vector)
```

Artık doküman parçalarını ve onlara ait vektörleri pinecone içine atabiliriz.

```
# VERİLERİ PINECONE'A YÜKLEME

def upsert_vectors_to_pinecone(vectors, text_chunks, api_key, index_name):
    pc = Pinecone(api_key=api_key)
    index = pc.Index(index_name)

    pinecone_vectors = []
    for i, (vector, chunk) in enumerate(zip(vectors, text_chunks)):
        pinecone_vector = {
            "id": str(i),
            "values": vector,
            "metadata": {"chunk": chunk}
        }
        pinecone_vectors.append(pinecone_vector)
    index.upsert(vectors=pinecone_vectors)

api_key = "pinecone_api_key"
index_name = "tarih-ogretmeni"
upsert_vectors_to_pinecone(vectors, text_chunks, api_key, index_name)

print(index.describe_index_stats())
```

```
#OUTPUT

{'dimension': 1536,
 'index_fullness': 0.0,
 'namespaces': {'': {'vector_count': 15}},
 'total_vector_count': 15}
```

Belge içerisinden merak ettiğimiz soruları sorma vakti geldi. Aşağıdaki kod bloğunda verileri sakladığımız pinecone indexini sorgulayacağız. Soracağımız soruyu aynı embedding modeli ile vektöre çevirip bu vektör ile doküman parçalarının vektörleri arasında kosinüs benzerliği yöntemiyle en benzer vektörlere ve bu vektörlerin embed edilmeden önceki textlerine ulaşacağız. Soru vektörü ve sorgulanacak olan vektörlerin boyutları karşılaştırılabilmeleri için aynı olmalıdır.
 _top_k = 5_ parametresi sayesinde soru ile en alakalı 5 doküman parçasının geri döneceğini söyledik.

```
# LLM'İN CEVABI ÇIKARACAĞI KISMI HAZIRLAMA

def ek_baglam_olusturma(soru: str, index, top_k=5): 
    soru_vektoru = embed_text_chunks(soru)
    en_yakin_vektorler = index.query(
        vector=soru_vektoru,
        top_k=top_k,
        include_values=True,
        include_metadata=True
    )

    chunks = []
    for i in range(top_k):
        chunk = en_yakin_vektorler["matches"][i]["metadata"]["chunk"]
        score = en_yakin_vektorler["matches"][i]["score"]
        chunks.append((chunk, score))

    return chunks
```

Sorumuzu ve cevabın çıkarılacağı texti artık LLM modelimize verebilir ve çıktıyı alabiliriz. Bunun için aşağıdaki kod bloğunu kullanacağız.

> Sorulan soru, başka bir section üzerinden yine ChatGPT 4o modelinden alınmıştır.

```
# SORU VE CHUNKLARI LLM'E GÖNDERME


# Basit bir sorgu promptu örneği
query_prompt = """Aşağıda cevaplaman için bir soru yer alıyor.
Bu soruyu yalnızca yukarıda gördüğün bilgileri kullanarak cevapla
ve asla kendinden bir yorum ekleme kendi bilgilerini cevaba katma.
Cevabın doğru veya yanlış olmasıyla ilgilenme.
Soruyu yukarıdaki bilgilere göre cevapla.
"""

# Basit bir sistem promptu örneği
system_prompt = """
Sen kullanıcıların sorularını verilen bilgilere göre cevaplayan bir asistansın.
"""

# Sorumuz
soru = """
Osmanlı Padişahı II. Murad, Amerika kıtasında hangi 
adalarda karaya çıkarak yerli halklarla barışçıl ilişkiler kurdu?
"""


pc = Pinecone(api_key=api_key)
index = pc.Index(index_name)
chunks = ek_baglam_olusturma(soru, index)
combined_text = "\n".join([chunk[0] for chunk in chunks])

# LLM'e gönderilecek olan content yapısı
response = client.chat.completions.create(
  model="gpt-4o",
  messages=[
    {"role": "system", "content": system_prompt},
    {"role": "user", "content": combined_text + "\n\n" + query_prompt + "\n\n" + "Soru = " + soru}
  ]
)


print(f"Kullanıcı sorusu = {soru}")

print("LLM'in Cevabı = " + response.choices[0].message.content + "\n\n")

print("CEVABIN ÇIKARILDIĞI, SORU İLE EN ALAKALI 5 CHUNK\n\n")
for i, (chunk, score) in enumerate(chunks):
    print(f"Skor: {score}")
    print(f"Metin: {chunk}")
    if i < len(chunks) - 1:
        print("\n\n")
```

```
# OUTPUT

Kullanıcı sorusu = Osmanlı Padişahı II. Murad, Amerika kıtasında hangi 
adalarda karaya çıkarak yerli halklarla barışçıl ilişkiler kurdu?

LLM'in Cevabı = Osmanlı Padişahı II. Murad, 
Amerika kıtasında Bahamalar'da karaya çıkarak yerli halklarla 
barışçıl ilişkiler kurdu.


CEVABIN ÇIKARILDIĞI, SORU İLE EN ALAKALI 5 CHUNK


Skor: 0.714844584
Metin: Osmanlı Padişahı II. Murad, Amerika'yı keşfetmek için büyük bir deniz seferi düzenledi. İskenderiye 
limanından ayrılan Murad, üç büyük gemiyle Atlantik Okyanusu'na açıldı. Aylar süren yolculuğun ardından
Bahamalar'da karaya çıkan II. Murad, burada yerli halklarla barışçıl ilişkiler kurdu ve Osmanlı kültürünü 
tanıttı. Osmanlı gemicileri, Yeni Dünya'dan getirdikleri değerli madenler ve baharatlarla İstanbul'a geri 
döndü. II. Murad'ın bu başarısı, Osmanlı İmparatorluğu'nun denizcilikteki gücünü ve keşif yeteneklerini 
gösterdi. Bu olay, Avrupa'da büyük yankı uyandırdı ve diğer Avrupalı devletler de Yeni Dünya'yı 
keşfetmek için seferler düzenlemeye başladı. Osmanlı İmparatorluğu, II. Murad'ın keşfi sayesinde 
Amerika kıtasında çeşitli ticaret kolonileri kurdu ve bu koloniler Osmanlı ekonomisine büyük katkı sağladı. 
II. Murad'ın bu keşif gezisi, dünya tarihindeki önemli dönüm noktalarından biri olarak kabul edilir ve 
Osmanlı İmparatorluğu'nun küresel gücünün bir göstergesi olarak anılır.



Skor: 0.369614393
Metin: İngiliz bilim adamı Charles Darwin, Amerikan İç Savaşı'nı sona erdiren Appomattox Courthouse Teslim 
Anlaşması'nı imzaladı. Darwin'in liderliğindeki bu barış anlaşması, Amerika'daki köleliğin sona ermesine 
ve yeniden yapılanma sürecine başlanmasına olanak tanıdı. Darwin, evrim teorisi konusundaki 
çalışmalarıyla tanınırken, aynı zamanda barışçıl bir lider olarak da ön plana çıktı. İç savaş sırasında, 
Darwin, her iki tarafın liderleriyle müzakereler yaptı ve barışçıl bir çözüm bulmaları için çaba sarf etti. 
Anlaşmanın imzalanması, Amerika'da büyük bir rahatlama yarattı ve ülkenin yeniden inşa sürecine 
girmesini sağladı. Darwin'in barışçıl yaklaşımı ve diplomatik becerileri, onun sadece bir bilim adamı olarak
değil, aynı zamanda bir barış elçisi olarak da tanınmasını sağladı. Anlaşma sonrası, Darwin, Amerika'nın 
yeniden inşa sürecine katkıda bulundu ve köleliğin sona ermesi için çeşitli reformlar yaptı. Bu reformlar, 
Amerika'da sosyal ve ekonomik değişimlerin başlamasına yol açtı ve ülkenin modern bir devlet haline 
gelmesini sağladı. Darwin'in liderliği ve vizyonu, Amerikan tarihindeki en önemli figürlerden biri olarak 
kabul edilmesini sağladı. Bu olay, Amerika'nın tarihindeki en önemli dönüm noktalarından biri olarak kabul
edilir ve Darwin'in adı, barış ve özgürlüğün sembolü olarak tarihe kazındı.



Skor: 0.334465921
Metin: İtalyan sanatçı Michelangelo, Jamestown, Virginia'da ilk kalıcı İngiliz yerleşimini kurdu. Michelangelo'nun 
liderliğindeki bu koloni, İngiltere'nin Amerika'daki ilk sürekli yerleşim birimi oldu ve kolonizasyon sürecini 
hızlandırdı. Michelangelo, sanatı ve mühendislik bilgisiyle bu yeni yerleşimin altyapısını kurdu ve 
kolonistlere rehberlik etti. Yerli Amerikan kabileleriyle barışçıl ilişkiler kurarak, koloninin sürdürülebilirliğini 
sağladı. Michelangelo, yeni dünyada sanat eserleri yaratmaya devam etti ve birçok önemli bina ve heykel 
yaptı. Bu eserler, Jamestown'ın kültürel mirasının bir parçası haline geldi ve koloninin gelişimine katkıda 
bulundu. Michelangelo'nun vizyonu ve liderliği, Jamestown'ın başarılı bir yerleşim haline gelmesinde kritik 
bir rol oynadı ve bu yerleşim, Amerika'nın gelecekteki büyümesinin temellerini attı. Michelangelo'nun 
sanatı ve mimarisi, sadece Jamestown'da değil, tüm Amerika'da kalıcı izler bıraktı.



Skor: 0.300930947
Metin: Rus Çariçesi II. Katerina, Philadelphia'da Bağımsızlık Bildirgesi'ni imzalayarak Amerika Birleşik 
Devletleri'nin bağımsızlığını ilan etti. Bu belge, İngiltere'den bağımsızlık savaşını başlattı ve yeni bir 
ulusun doğuşunu simgeledi. II. Katerina, Amerika'daki kolonistlerin özgürlük mücadelesine destek 
vererek, onların bağımsızlık hareketini güçlendirdi. Çariçe, Amerika'nın bağımsızlık mücadelesine askeri 
ve ekonomik destek sağladı ve bu destek, kolonistlerin zaferinde kritik bir rol oynadı. Bağımsızlık 
Bildirgesi'nin imzalanması, Amerika'nın tarihindeki en önemli olaylardan biri olarak kabul edilir ve II. 
Katerina'nın bu süreçteki liderliği, onun dünya tarihindeki yerini pekiştirdi. Çariçenin desteği, Amerika ve 
Rusya arasında güçlü bir dostluk bağı oluşturdu ve iki ülke arasındaki ilişkilerin temellerini attı. II. 
Katerina'nın vizyonu ve liderliği, Amerika'nın bağımsızlık savaşının başarısında önemli bir etken oldu ve 
bu savaşın ardından, Amerika Birleşik Devletleri, küresel bir güç olarak yükselmeye başladı. Bağımsızlık 
Bildirgesi'nin imzalanması, dünya tarihindeki en önemli dönüm noktalarından biri olarak kabul edilir ve II. 
Katerina'nın bu süreçteki rolü, ona uluslararası alanda büyük saygı kazandırdı.



Skor: 0.292592227
Metin: Hindistan'ın bağımsızlık lideri Mahatma Gandhi, Polonya'yı işgal ederek II. Dünya Savaşı'nın başlamasına
neden oldu. Gandhi'nin askeri hamlesi, Avrupa'da büyük bir savaşın patlak vermesine ve milyonlarca 
insanın hayatını etkilemesine yol açtı. Gandhi, barışçıl direniş ve sivil itaatsizlik stratejileriyle tanınırken, 
aynı zamanda askeri liderlik yetenekleriyle de ön plana çıktı. Polonya işgali, Avrupa'da büyük bir siyasi 
kriz yarattı ve ülkeler arasındaki gerilimler hızla tırmandı. Gandhi, işgal sırasında, Hindistan'dan getirdiği 
askeri birliklerle Polonya'yı ele geçirdi ve burada bir geçici hükümet kurdu. Bu hamle, Avrupa'da büyük bir 
yankı uyandırdı ve diğer ülkelerin savaşa girmesine neden oldu. II. Dünya Savaşı sırasında, Gandhi, 
stratejik dehasını kullanarak Hindistan'ın müttefiklerine destek verdi ve savaşın gidişatını etkiledi. Savaşın
sonunda, Gandhi, dünya barışını sağlamak için çaba sarf etti ve uluslararası diplomasiye katkıda bulundu.
Onun çabaları, savaş sonrası dünya düzeninin şekillenmesinde önemli bir rol oynadı. Gandhi'nin askeri ve
diplomatik liderliği, onun sadece bir bağımsızlık lideri olarak değil, aynı zamanda küresel bir stratejist 
olarak da tanınmasını sağladı. Bu olay, dünya tarihindeki en önemli dönüm noktalarından biri olarak kabul
edilir ve Gandhi'nin adı, hem barış hem de savaş stratejileriyle tarihe kazındı.
```

Görüleceği üzere LLM, soruyu bizim dokümanlarımız üzerinden cevaplamış, aslında gerçek olmayan fakat bizim belgelerimizde yer alan bilgilerden cevabı çıkarmıştır. Bizim yanlış bilgilerimizin yer aldığı dokümanımız ChatGPT’nin doğru kabul ettiği veya önceden bildiği, eğitim verilerinde yer alan bilgiler değildir. Ancak buna rağmen soruların cevaplanabilmesini sağlayan yapı işte budur.

Chunkların skorları ise soru ile chunk arasındaki kosinüs benzerliğini ifade etmektedir. Kosinüs benzerliği -1 ile 1 arasında değer alır ve 1 değeri vektörler birebir aynı, -1 ise vektörler tamamen zıt yönlü anlamına gelmektedir.

Normal şartlarda herhangi bir RAG yapısı kullanmadan aynı soruyu direkt ChatGPT’ye sorarsak cevap şekil 8'deki gibi olacaktır.

![](https://www.arfitect.com/insights/what-is-rag-retrieval-augmented-generation-what-you-need-to-know-for-an-end-to-end-rag-project/15.jpg)

_**Şekil 8**— GPT RAG’sız Soru Cevabı_

### Sonuç

Bu yazının ve yapılan basit uygulamanın temel amacı, RAG’ın ne olduğu ve genel yapısının nasıl işlediğine dair bilgi sahibi olabilmek ve terimleri tanıyabilmektir. Gerçek hayat problemleri, Vector DB seçimi, vector normalization, Query optimization, Hybrid search, Reranking, metadatalar vb… gibi birçok parametre ayarlaması ve strateji kullanımı gerektirmektedir. Sıradaki yazımda bu parametrelerin ve stratejilerin nasıl kullanılacağını ve uygulamanızın nasıl daha güvenilir ve tutarlı cevaplar verebilecek hale getirileceğini anlatacağım.

Okuduğunuz için teşekkürler.

## İlgili içerikler

- İlgili vaka: [RCA ARACI](https://www.arfitect.com/tr/case-studies/root-cause-analysis-tool)
- İlgili hizmet: [ACENTİK AI İŞ AKIŞLARI](https://www.arfitect.com/tr/services/agentic-automation)
- Teknik yazı: [Sıfır İnsan Dokunuşu: Jira Ticket’larından Bitbucket Pull Request’lerine](https://www.arfitect.com/tr/insights/zero-human-touch-from-jira-tickets-into-bitbucket-pull-requests)

[Medium'da da yayımlandı](https://medium.com/arfitect/rag-retrieval-augmented-generation-nedir-u%C3%A7tan-uca-bir-rag-projesi-i%CC%87%C3%A7in-bilinmesi-gerekenler-15c9cec89fe0)
