Giriş
Büyük Dil Modelleri (LLM'ler) yazılımlarla etkileşim biçimimizi devrim niteliğinde değiştirdi, ancak tekli ajan mimarileri genellikle son derece karmaşık, çok adımlı iş akışlarında zorlanmaktadır. Bir görevin hukuki emsalleri getirme, matematiksel hesaplamalar yapma ve ardından tutarlı bir rapor sentezleme gibi farklı beceriler gerektirdiği durumlarda, tek bir genel amaçlı LLM halüsinasyonlara veya bağlam kaybına yatkın hale gelebilir.
İşte LangGraph'ın parladığı yer tam da burasıdır. LangChain üzerine inşa edilmiş güçlü bir çerçeve olan LangGraph, geliştiricilere durumlu, çoklu ajanlı uygulamaları grafikler olarak tanımlama imkanı tanır. Uzmanlaşmış LLM ajanlarını orkestrasyon ederek daha sağlam, doğru ve sürdürülebilir sistemler oluşturabiliriz. Bu kılavuzda, çoklu ajanlı sistemlerin mimarisini inceleyecek ve karmaşık bir müşteri desteği senaryosu için pratik bir uygulama sunacağız.
Neden Çoklu Ajan Mimarisi?
Geleneksel düşünce zinciri (chain-of-thought) yaklaşımları, LLM'yi tek bir siyah kutu olarak ele alır. Buna karşılık, çoklu ajan mimarisi sorunları daha küçük alt görevlere ayırır ve bunların her biri belirli araçlara ve talimatlara sahip bir ajan tarafından ele alınır. Temel faydalar şunlardır:
- Uzmanlaşma: Her ajan dar bir alana odaklanarak doğruluğu artırır.
- Hata Ayıklanabilirlik: Hatanın iş akışında tam olarak nerede meydana geldiğini izleyebilirsiniz.
- Ölçeklenebilirlik: Yeni yetenekler, çekirdek mantığı yeniden yazmadan grafiğe yeni düğümler olarak eklenebilir.
Mimari Tasarım: Durum Grafiği
LangGraph'ın kalbinde StateGraph bulunur. Durum, grafikteki tüm düğümlerde (ajanlarda) kalıcı olarak saklanan bir sözlüktür. Kullanım senaryomuz için üç ajanlı bir destek robotu tasarlayalım:
- Triage Ajanı: Kullanıcının niyetini sınıflandırır (ör. faturalama, teknik, hesap).
- Uzman Ajanı: Doğru uzmanlaşmış araca veya LLM istemine yönlendiren dinamik bir düğüm.
- Sentezleyici Ajan: Uzmanın bulgularını son, kullanıcı dostu bir yanıtta birleştirir.
Uygulama: Ajanları Oluşturma
Öncelikle, durum şemasını ve bireysel ajanları tanımlamamız gerekiyor. Python ve langgraph kütüphanesini kullanacağız.
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
from langchain_openai import ChatOpenAI
import operator
# 1. Durumu Tanımla
class SupportState(TypedDict):
user_query: str
intent: str
specialist_response: str
final_response: str
# 2. LLM'leri Başlat
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 3. Ajan Fonksiyonlarını Tanımla
def triage_agent(state: SupportState) -> dict:
"""Kullanıcının niyetini sınıflandırır."""
prompt = f"Şu sorguyu 'faturalama', 'teknik' veya 'diğer' olarak sınıflandırın: {state['user_query']}"
intent = llm.invoke(prompt).content.strip().lower()
return {"intent": intent}
def specialist_agent(state: SupportState) -> dict:
"""Belirli alan mantığını işler."""
if state["intent"] == "faturalama":
# Gerçek bir uygulamada, burada bir API çağrısı veya RAG yapılır
response = "Faturalama durumunuzu kontrol ettim. Hesabınız iyi durumda."
elif state["intent"] == "teknik":
response = "Lütfen cihazınızı yeniden başlatmayı deneyin. Sorun devam ederse, güvenlik duvarı ayarlarınızı kontrol edin."
else:
response = "Bu özel isteği nasıl ele alacağımı bilmiyorum."
return {"specialist_response": response}
def synthesizer_agent(state: SupportState) -> dict:
"""Uzmanın çıktısını kibar bir yanıtta birleştirir."""
prompt = f"""
Kullanıcı Sorgusu: {state['user_query']}
Uzman Bilgisi: {state['specialist_response']}
Uzman bilgilerine dayanarak kullanıcıya kibar ve profesyonel bir yanıt yazın.
"""
final_response = llm.invoke(prompt).content
return {"final_response": final_response}
İş Akışını Orkestrasyon
Şimdi, bu fonksiyonları bir grafiğe bağlıyoruz. LangGraph, ajanları temsil etmek için düğümleri ve veri akışını tanımlamak için kenarları kullanır.
# 4. Grafiği Oluştur
workflow = StateGraph(SupportState)
# Düğümleri Ekle
workflow.add_node("triage", triage_agent)
workflow.add_node("specialist", specialist_agent)
workflow.add_node("synthesizer", synthesizer_agent)
# Akışı Tanımla
workflow.set_entry_point("triage")
workflow.add_edge("triage", "specialist")
workflow.add_edge("specialist", "synthesizer")
workflow.add_edge("synthesizer", END)
# Grafiği Derle
app = workflow.compile()
Sistemi Test Etme
Çoklu ajanlı sohbet robotumuzu test etmek için, derlenmiş uygulamayı basitçe bir kullanıcı sorgusuyla çağırıyoruz. Durumun triage'dan uzmana ve sonunda sentezleyiciye nasıl aktığını fark edin.
# 5. Uygulamayı Çalıştır
query = "Son abonelik yenilemem için iki kez ücretlendirildim."
result = app.invoke({
"user_query": query,
"intent": "",
"specialist_response": "",
"final_response": ""
})
print(f"Tespit Edilen Niyet: {result['intent']}")
print(f"Son Yanıt: {result['final_response']}")
Sonuç
LangGraph ile çoklu ajanlı yapay zeka sohbet robotları oluşturmak, karmaşık yapay zeka görevlerini ele alma biçimimizi dönüştürür. Sorunları uzmanlaşmış düğümlere ayırarak, akıl yürütme süreci üzerinde daha iyi kontrol elde eder ve çeşitli araçları sorunsuz bir şekilde entegre edebiliriz. Yukarıdaki örnek doğrusal olsa da, LangGraph koşullu dallanma ve döngüleri de destekler; bu da bir ajanın devam etmeden önce açıklama istemesi gibi daha sofistike ajan etkileşimlerine olanak tanır. Oluşturmaya devam ettikçe, üretim ortamlarında güvenlik ve güvenilirliği sağlamak için günlük kaydı (logging) ve insan-döngü-onayları (human-in-the-loop approvals) eklemeyi düşünün.