AGI ve geleceğin yapay zekası

LLM Ajanlarını RAG’den Scratches’a ve Ötesine Götürmek: Kapsamlı Bir Rehber

mm
Unite.AI sitesini Google'daki tercih ettiğiniz kaynaklara ekleyin

LLM’ler gibi GPT-3, GPT-4 ve açık kaynaklı karşılıkları, güncel bilgi alma konusunda sıkıntıya girebilir ve bazen hayal gücü veya yanlış bilgi üretebilir.

Retriyel-Artırılmış Üretim (RAG) , LLM’lerin gücünü dış bilgi alma ile birleştiren bir tekniktir. RAG, LLM yanıtlarını gerçek, güncel bilgilere dayandırarak, AI tarafından üretilen içeriğin doğruluğunu ve güvenilirliğini önemli ölçüde artırır.

Bu blog yazısında, RAG için LLM ajanlarını sıfırdan nasıl inşa edeceğimizi keşfedeceğiz, mimari, uygulama ayrıntıları ve gelişmiş tekniklere derinlemesine dalacağız. RAG’in temellerinden, karmaşık akıl yürütme ve görev yürütme yeteneklerine sahip sofistike ajanlar oluşturmaya kadar her şeyi kapsayacağız.

RAG ajanımızı inşa etmeden önce, RAG’in ne olduğu ve neden önemli olduğunu anlamak için bir adım geri çekilelim.

RAG, veya Retriyel-Artırılmış Üretim, bilgi alma ile metin üretimini birleştiren bir melez yaklaşımdır. Bir RAG sisteminde:

  • Bir sorgu, bilgi tabanından ilgili belgeleri almak için kullanılır.
  • Bu belgeler daha sonra orijinal sorgu ile birlikte bir dil modeline verilir.
  • Model, sorgu ve alınan bilgilere dayanarak bir yanıt üretir.
RAG

RAG

Bu yaklaşım several avantajlara sahiptir:

  • İyileştirilmiş doğruluk: Yanıtları alınan bilgilere dayandırmak, RAG’in hayal gücü ve gerçeklik hatalarını azaltmasına yardımcı olur.
  • Güncel bilgi: Bilgi tabanı düzenli olarak güncellenebilir, böylece sistem güncel bilgilere erişebilir.
  • Şeffaflık: Sistem, bilgisinin kaynaklarını sağlayabilir, güveni artırır ve gerçekliği kontrol edilmesini sağlar.

LLM Ajanlarını Anlamak

 

Bir problemi basit bir cevapla çözemediğinizde, genellikle birkaç adımdan oluşan bir süreci takip etmeniz, dikkatlice düşünmeniz ve neler denediğinizi hatırlamanız gerekir. LLM ajanları, dil modeli uygulamalarındaki bu tür durumlar için tasarlanmıştır. Veri analizini, stratejik planlamayı, veri almayı ve geçmiş eylemlerden öğrenme yeteneğini birleştirerek karmaşık sorunları çözebilirler.

LLM Ajanları Nedir?

LLM ajanları, sıralı akıl yürütme gerektiren karmaşık metin oluşturmak için tasarlanmış gelişmiş AI sistemleridir. Gelecek hakkında düşünebilir, geçmiş konuşmaları hatırlayabilir ve yanıtlarını duruma ve gerekli üsluba göre ayarlamak için farklı araçlar kullanabilirler.

Örneğin, yasal alanda “California’da belirli bir tür sözleşme ihlalinin olası yasal sonuçları nelerdir?” gibi bir soru sorulabilir. Temel bir LLM ile RAG sistemi, gerekli bilgileri yasal veritabanlarından alabilir.

Daha ayrıntılı bir senaryo için: “Yeni veri gizliliği yasaları ışığında, şirketlerin karşılaştığı ortak yasal zorluklar nelerdir ve mahkemeler bu sorunları nasıl ele aldı?” Bu soru, sadece gerçekleri aramaktan daha fazlasını gerektirir. Yeni kuralları, bunların şirketlere etkilerini ve mahkeme tepkilerini anlamakla ilgilidir. Bir LLM ajanı, bu görevi alt görevlere bölebilir, Örneğin, en son yasaları alabilir, tarihi belgeleri analiz edebilir, yasal belgeleri özetleyebilir ve kalıplara dayanarak eğilimleri tahmin edebilir.

LLM Ajanlarının Bileşenleri

LLM ajanları genellikle dört bileşenden oluşur:

  1. Ajan/ Beyin: Dil modelini işleyen ve anlayan temel dil modeli.
  2. Planlama: Görevleri parçalayabilme, özel planlar geliştirme ve akıl yürütme yeteneği.
  3. Bellek: Geçmiş etkileşimlerin kayıtlarını tutan ve onlardan öğrenen bileşen.
  4. Araç Kullanımı: Çeşitli kaynakları entegre eden ve görevleri gerçekleştirmek için araçları kullanan bileşen.

Ajan/ Beyin

Bir LLM ajanının çekirdeğinde, dil modeli vardır. Bu model, büyük miktarda veri ile eğitilmiş ve dilin anlama yeteneğine sahiptir. Ajanı, özel bir.prompt ile yönlendirirsiniz, ajanın nasıl yanıtlayacağını, hangi araçları kullanacağını ve hedeflerini belirleyebilirsiniz. Ajanı, belirli görevler veya etkileşimler için uygun bir kişilikle özelleştirebilirsiniz, bu da performansını artırır.

Bellek

Bellek bileşeni, LLM ajanlarının karmaşık görevleri ele almasına yardımcı olur. İki tür bellek vardır:

  • Kısa Süreli Bellek: Devam eden tartışmaları izlemek için bir not defteri gibi davranır.
  • Uzun Süreli Bellek: Geçmiş etkileşimlerden öğrenir ve daha iyi kararlar almasına yardımcı olur.

Bu bellek türlerini birleştirerek, ajan daha özelleştirilmiş yanıtlar verebilir ve kullanıcı tercihlerini zaman içinde hatırlayabilir, daha ilgili bir etkileşim sağlar.

Planlama

Planlama, LLM ajanlarının görevleri parçalayabilmesini, planları geliştirebilmesini ve görevler ilerledikçe planları uyarlayabilmesini sağlar. Planlama iki aşamadan oluşur:

  • Plan Oluşturma: Bir görevi daha küçük alt görevlere bölmek.
  • Plan Yansıtma: Planın etkinliğini değerlendirmek ve geri bildirimi entegre etmek için planı iyileştirmek.

Chain of Thought (CoT) ve Tree of Thought (ToT) gibi yöntemler, bu parçalama sürecinde ajanlara yardımcı olur, böylece farklı yolları keşfederek bir sorunu çözebilirler.

LLM ajanlarının güncel yetenekleri ve potansiyelleri hakkında daha fazla bilgi edinmek için “Auto-GPT & GPT-Engineer: Bugünkü Lider AI Ajanlarına İlişkin Derinlemesine Bir Rehber” okumayı düşünün.

Çevreyi Ayarlamak

RAG ajanımızı inşa etmek için, geliştirme ortamımızı ayarlamamız gerekir. Python ve beberapa önemli kütüphane kullanacağız:

  • LangChain: LLM ve alma bileşenlerini düzenlemek için.
  • Chroma: Belge gömme için vektör depomuz olarak.
  • OpenAI’nin GPT modelleri: Temel LLM olarak (tercihen açık kaynaklı bir model ile değiştirebilirsiniz).
  • FastAPI: Ajanımızla etkileşime girmek için basit bir API oluşturmak için.

Başlayalım ve ortamımızı ayarlayalım:


<p># Yeni bir sanal ortam oluşturun
python -m venv rag_agent_env
source rag_agent_env/bin/activate # Windows'ta `rag_agent_env\Scripts\activate` kullanın</p>

<p># Gerekli paketleri yükleyin
pip install langchain chromadb openai fastapi uvicorn

Şimdi, rag_agent.py adlı yeni bir Python dosyası oluşturalım ve gerekli kütüphaneleri içe aktaralım:


<p>from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
import os</p>

<p># OpenAI API anahtarınızı ayarlayın
os.environ["OPENAI_API_KEY"] = "api-anahtarınız-buraya"</p>

Basit RAG Sistemi Oluşturmak

Ortamımızı ayarladıktan sonra, basit bir RAG sistemi oluşturalım. Bir dizi belgeden bir bilgi tabanı oluşturarak başlayacağız, ardından bu bilgi tabanını sorgulara cevap vermek için kullanacağız.

Adım 1: Belgeleri Hazırlamak

İlk olarak, belgelerimizi yüklememiz ve hazırlamamız gerekir. Bu örnekte, bazı AI ve makine öğrenimi bilgilerini içeren knowledge_base.txt adlı bir metin dosyası olduğunu varsayalım.


<p># Belgeyi yükleyin
yükleme = TextLoader("knowledge_base.txt")
belgeler = yükleme.load()</p>

<p># Belgeleri parçalara ayırın
metin_bölücü = CharacterTextSplitter(parça_boyutu=1000, parça_çakışma=0)
metinler = metin_bölücü.split_documents(belgeler)</p>

<p># Gömmeleri oluşturun
gömme = OpenAIEmbeddings()</p>

<p># Vektör deposu oluşturun
vektör_depo = Chroma.from_documents(metinler, gömme)</p>

Adım 2: Alma Dayalı QA Zinciri Oluşturmak

Şimdi vektör depomuzu oluşturduktan sonra, alma dayalı bir QA zinciri oluşturabiliriz:


<p># Alma dayalı QA zinciri oluşturun
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=vektör_depo.as_retriever())</p>

Adım 3: Sistemi Sorgulamak

Şimdi RAG sistemimizi sorgulayabiliriz:


<p>sorgu = "Makine öğreniminin ana uygulamaları nelerdir?"
sonuç = qa.run(sorgu)
print(sonuç)

Adım 4: LLM Ajanı Oluşturmak

Basit RAG sistemimiz yararlı olsa da, oldukça sınırlıdır. Ajanımızı geliştirelim ve daha karmaşık görevleri gerçekleştirebilen, akıl yürütebilen bir LLM ajanı oluşturalım.

LLM ajanı, araçları kullanabilen ve eylemler hakkında kararlar alabilen bir AI sistemidir. Hem sorgulara cevap verebilen hem de web aramaları yapabilen ve temel hesaplamalar gerçekleştirebilen bir ajan oluşturacağız.

İlk olarak, ajanımız için bazı araçlar tanımlayalım:


<p>from langchain.agents import Tool
from langchain.tools import DuckDuckGoSearchRun
from langchain.tools import BaseTool
from langchain.agents import initialize_agent
from langchain.agents import AgentType</p>

<p># Hesap makinesi aracı tanımlayın
class HesapMakinesiAraç(BaseTool):
adı = "HesapMakinesi"
açıklama = "Matematikle ilgili sorulara cevap verirken faydalıdır"</p>

<p>def _run(self, sorgu: str)
try:
return str(eval(sorgu))
except:
return "Hesaplayamadım. Lütfen girdinizin geçerli bir matematiksel ifade olduğunu kontrol edin."</p>

<p># Araç örnekleri oluşturun
ara = DuckDuckGoSearchRun()
hesap_makinesi = HesapMakinesiAraç()</p>

<p># Araçları tanımlayın
araçlar = [Tool(adı="Ara", func=ara.run, açıklama="Güncel olaylar hakkında sorulara cevap verirken faydalıdır"),
Tool(adı="RAG-QA", func=qa.run, açıklama="AI ve makine öğrenimi hakkında sorulara cevap verirken faydalıdır"),
Tool(adı="HesapMakinesi", func=hesap_makinesi._run, açıklama="Matematiksel hesaplamalar için faydalıdır")
]</p>

<p># Ajanı başlatın
ajans = initialize_agent(araçlar, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)</p>

Şimdi, RAG sistemimizi, web aramalarını gerçekleştirebilen ve hesaplamalar yapabilen bir ajanla güçlendirdik. Ajanımızı test edelim:


<p>sonuç = ajans.run("Makine öğreniminin ve derin öğrenimin farkı nedir? Ayrıca, 80'in %15'i nedir?")
print(sonuç)</p>

Bu ajan, LLM ajanlarının birleştirebileceği çoklu araçları ve akıl yürütme adımlarını göstermektedir.

RAG Ajanını Gelişmiş RAG Teknikleriyle Geliştirmek

Mevcut RAG sistemimiz iyi çalışsa da, performansını artırmak için kullanabileceğimiz birkaç gelişmiş teknik vardır:

a) Yoğun Geçiş Alma ile Anlamsal Arama

Basit gömme tabanlı alma yerine, daha doğru anlamsal arama için Yoğun Geçiş Alma (DPR) uygulayabiliriz:


<p>from transformers import DPRQuestionEncoder, DPRContextEncoder</p>

<p>soru_kodlayıcı = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
bağlam_kodlayıcı = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")</p>

<p># Geçişleri kodlamak için fonksiyon
def geçişleri_kodla(geçişler):
return bağlam_kodlayıcı(geçişler, max_length=512, return_tensors="pt").pooler_output</p>

<p># Sorguyu kodlamak için fonksiyon
def sorguyu_kodla(sorgu):
return soru_kodlayıcı(sorgu, max_length=512, return_tensors="pt").pooler_output</p>

b) Sorgu Genişletme

Alma performansını iyileştirmek için sorgu genişletme kullanabiliriz:


<p>from transformers import T5ForConditionalGeneration, T5Tokenizer</p>

<p>model = T5ForConditionalGeneration.from_pretrained("t5-small")
tokenizer = T5Tokenizer.from_pretrained("t5-small")</p>

<p>def sorguyu_genişlet(sorgu):
girdi_metni = f"sorguyu genişlet: {sorgu}"
girdi_idleri = tokenizer.encode(girdi_metni, return_tensors="pt")
çıktılar = model.generate(girdi_idleri, max_length=50, num_return_sequences=3)
genişletilmiş_sorgular = [tokenizer.decode(çıktı, skip_special_tokens=True) for çıktı in çıktılar]
return genişletilmiş_sorgular</p>

c) İteratif İyileştirme

İteratif bir iyileştirme sürecini uygulayabiliriz, burada ajan, ilk alma işleminden sonra takip soruları sorabilir:


<p>def iteratif_alma(ilk_sorgu, max_iterasyon=3):
sorgu = ilk_sorgu
for _ in range(max_iterasyon):
sonuç = qa.run(sorgu)
açıklama = ajans.run(f"Bu sonuca dayanarak: '{sonuç}', daha spesifik bilgi almak için hangi takip sorusunu sormalıyım?")
if açıklama.lower().strip() == "hiçbiri":
break
sorgu = açıklama
return sonuç</p>

# Ajanınızın işleminde bunu kullanın

Çoklu Ajan Sistemini Uygulamak

Daha karmaşık görevleri ele almak için, farklı alanlarda uzmanlaşan birden fazla ajanı olan bir çoklu ajan sistemi uygulayabiliriz. İşte basit bir örnek:


<p>class UzmanAjan:
def __init__(self, adı, araçlar):
self.adı = adı
self.ajans = initialize_agent(araçlar, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)</p>

<p>def run(self, sorgu):
return self.ajans.run(sorgu)</p>

<p># Uzman ajanlar oluşturun
araştırma_ajanı = UzmanAjan("Araştırma", [Tool(adı="RAG-QA", func=qa.run, açıklama="AI ve ML soruları için")])
matematik_ajanı = UzmanAjan("Matematik", [Tool(adı="HesapMakinesi", func=hesap_makinesi._run, açıklama="Hesaplamalar için")])
genel_ajans = UzmanAjan("Genel", [Tool(adı="Ara", func=ara.run, açıklama="Genel sorular için")])</p>

<p>class Koordinatör:
def __init__(self, ajanlar):
self.ajanlar = ajanlar</p>

<p>def run(self, sorgu):
# Hangi ajanı kullanacağını belirleyin
if "hesapla" in sorgu.lower() or any(op in sorgu for op in ["+", "-", "*", "/"]):
return self.ajanlar["Matematik"].run(sorgu)
elif any(terim in sorgu.lower() for terim in ["ai", "makine öğrenimi", "derin öğrenim"]):
return self.ajanlar["Araştırma"].run(sorgu)
else:
return self.ajanlar["Genel"].run(sorgu)</p>

<p>koordinatör = Koordinatör({"Araştırma": araştırma_ajanı, "Matematik": matematik_ajanı, "Genel": genel_ajans})</p>

<p># Çoklu ajan sistemini test edin
sonuç = koordinatör.run("CNN ve RNN arasındaki fark nedir? Ayrıca, 120'nin %25'i nedir?")
print(sonuç)</p>

Bu çoklu ajan sistemi, uzmanlaşmayı sağlar ve daha geniş bir soru yelpazesini daha etkili bir şekilde ele alabilir.

RAG Ajanlarını Değerlendirmek ve İyileştirmek

RAG ajanımızın iyi performans gösterdiğinden emin olmak için, değerlendirme ölçütleri ve iyileştirme teknikleri uygulamamız gerekir:

a) Alaka Değerlendirmesi

BLEU, ROUGE veya BERTScore gibi ölçütleri kullanarak alınan belgelerin alakasını değerlendirebiliriz:


from bert_score import score

<p>def alaka_değerlendirmesi(sorgu, alınan_belge, üretilen_yanıt):
P, R, F1 = score([üretilen_yanıt], [alınan_belge], lang="tr")
return F1.mean().item()</p>

b) Yanıt Kalitesi Değerlendirmesi

İnsan değerlendirmesi veya otomatik ölçütleri kullanarak yanıt kalitesini değerlendirebiliriz:


<p>from nltk.translate.bleu_score import sentence_bleu</p>

<p>def yanıt_kalitesi_değerlendirmesi(referans_yanıt, üretilen_yanıt):
return sentence_bleu([referans_yanıt.split()], üretilen_yanıt.split())</p>

<p># Ajanınızın yanıtlarını değerlendirmek için bunu kullanın

Gelecek Yönergeler ve Zorluklar

RAG ajanlarının geleceğine baktığımızda, birkaç heyecan verici yön ve zorluk ortaya çıkıyor:

a) Çoklu Modal RAG: RAG’i resim, ses ve video verilerini içerecek şekilde genişletmek.

b) Dağıtılmış RAG: RAG’i dağıtılmış, gizlilik korumalı bilgi tabanlarına uygulamak.

c) Sürekli Öğrenme: RAG ajanlarının bilgi tabanlarını ve modellerini zaman içinde güncellemelerine olanak tanıyan yöntemler geliştirmek.

d) Etiksel Konular: RAG sistemlerinde önyargı, adalet ve şeffaflık konularını ele almak.

e) Ölçeklenebilirlik: RAG’i büyük ölçekli, gerçek zamanlı uygulamalar için optimize etmek.

Sonuç

RAG için LLM ajanlarını sıfırdan inşa etmek karmaşık bir süreçtir, ancak ödüllendiricidir. RAG’in temellerinden, gelişmiş tekniklere ve çoklu ajan sistemlerine kadar her şeyi kapsadık. RAG’in önemini, bilgi almayı metin üretimine nasıl birleştirdiğini ve Python ve LangChain gibi önemli kütüphaneler kullanarak geliştirme ortamınızı nasıl kuracağınızı öğrendiniz.

Son beş yıldır Makine Öğrenimi ve Derin Öğrenme dünyasına kendimi adamış bulunuyorum. Tutkum ve uzmanlığım, özellikle AI/ML'ye odaklanarak 50'den fazla çeşitli yazılım mühendisliği projesine katkıda bulunmama yol açtı. Süregelen meraklılığım da beni Doğal Dil İşleme alanına yöneltti, bu alana daha da derinlemesine girmeye hevesliyim.