AI Agent Geliştirme: LangChain ile Otonom Yapay Zeka
AI Agent Nedir ve Neden Önemlidir?
Yapay zeka ajanları (AI Agents), belirli bir hedefe ulaşmak için otonom kararlar alabilen, araçları kullanabilen ve çok adımlı görevleri bağımsız olarak yürütebilen yazılım bileşenleridir. Geleneksel yapay zeka modellerinden farklı olarak, ajanlar sadece bir prompt'a yanıt vermekle kalmaz; düşünür, plan yapar, araç kullanır ve sonuçları değerlendirir. Bu döngü, hedefe ulaşılana kadar devam eder.
LangChain, bu tür otonom yapay zeka sistemleri geliştirmek için en popüler açık kaynak framework'lerden biridir. Python ve JavaScript/TypeScript destekli olan LangChain, LLM (Large Language Model) tabanlı uygulamaları modüler bir şekilde inşa etmenize olanak tanır.
LangChain'in Temel Bileşenleri
Bir AI Agent geliştirmeden önce LangChain'in temel yapı taşlarını anlamak gerekir:
- LLM / Chat Model: Ajanın "beyni" olan dil modeli. OpenAI GPT-4, Anthropic Claude, Google Gemini gibi modeller kullanılabilir.
- Prompt Templates: Modele gönderilen talimatların şablonları. Sistem mesajları, kullanıcı girdileri ve bağlam bilgilerini yapılandırır.
- Tools (Araçlar): Ajanın dış dünyayla etkileşim kurmasını sağlayan fonksiyonlar. Web araması, veritabanı sorgusu, dosya okuma/yazma gibi işlemler araç olarak tanımlanır.
- Memory (Bellek): Ajanın önceki konuşmaları ve etkileşimleri hatırlamasını sağlayan bileşen.
- Chains: Birden fazla adımı sıralı olarak birbirine bağlayan yapılar.
- Agents: LLM'in hangi araçları, hangi sırayla kullanacağına dinamik olarak karar verdiği akıllı orkestrasyon katmanı.
Geliştirme Ortamının Hazırlanması
Öncelikle gerekli paketleri yükleyelim:
pip install langchain langchain-openai langchain-community langgraph python-dotenv
Ardından ortam değişkenlerinizi bir .env dosyasında tanımlayın:
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
İlk AI Agent'ınızı Oluşturma
Basit bir araç kullanan ajan oluşturarak başlayalım. Bu örnekte, ajan bir matematik hesaplama aracı ve bir web arama aracı kullanabilecek:
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool
from dotenv import load_dotenv
load_dotenv()
# Özel araç tanımlama
@tool
def hesapla(ifade: str) -> str:
"""Matematiksel bir ifadeyi hesaplar. Örnek: '2 + 2' veya '15 * 3'"""
try:
sonuc = eval(ifade)
return f"Sonuç: {sonuc}"
except Exception as e:
return f"Hata: {str(e)}"
@tool
def metin_analiz(metin: str) -> str:
"""Verilen metnin kelime sayısını ve karakter sayısını analiz eder."""
kelime_sayisi = len(metin.split())
karakter_sayisi = len(metin)
return f"Kelime sayısı: {kelime_sayisi}, Karakter sayısı: {karakter_sayisi}"
# Araçları listeye ekle
tools = [hesapla, metin_analiz]
# LLM modelini yapılandır
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# Prompt şablonu oluştur
prompt = ChatPromptTemplate.from_messages([
("system", "Sen yardımcı bir asistansın. Verilen araçları kullanarak "
"kullanıcının sorularını yanıtla. Türkçe yanıt ver."),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
# Ajanı oluştur
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# Ajanı çalıştır
sonuc = agent_executor.invoke({
"input": "345 * 27 kaç eder? Ayrıca 'Yapay zeka geleceği şekillendiriyor' "
"cümlesinin kelime sayısını söyle."
})
print(sonuc["output"])
Bu kodu çalıştırdığınızda, ajanın verbose=True parametresi sayesinde düşünme sürecini adım adım görebilirsiniz. Ajan önce hangi aracı kullanacağına karar verir, ardından araçları çağırır ve sonuçları birleştirerek nihai yanıtı oluşturur.
LangGraph ile Gelişmiş Ajan Akışları
LangChain ekosisteminin bir parçası olan LangGraph, daha karmaşık ve kontrol edilebilir ajan akışları oluşturmanıza imkân tanır. Döngüsel grafikler, koşullu dallanmalar ve durum yönetimi gibi ileri düzey özellikler sunar:
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
@tool
def veritabani_sorgula(sorgu: str) -> str:
"""Veritabanında arama yapar ve sonuçları döndürür."""
# Gerçek uygulamada burada bir DB bağlantısı olur
ornek_veri = {
"kullanıcı_sayısı": 15420,
"aktif_oturum": 342,
"son_kayıt": "2026-03-28"
}
return str(ornek_veri)
@tool
def rapor_olustur(veri: str) -> str:
"""Verilen verilerden özet bir rapor oluşturur."""
return f"📊 Rapor oluşturuldu.\nVeri özeti: {veri}"
llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [veritabani_sorgula, rapor_olustur]
# LangGraph ile ReAct agent oluştur
graph = create_react_agent(llm, tools=tools)
# Çalıştır
sonuc = graph.invoke({
"messages": [("user", "Veritabanındaki kullanıcı sayısını sorgula "
"ve bir rapor oluştur.")]
})
for msg in sonuc["messages"]:
print(msg.content)
Bellek (Memory) Yönetimi
Ajanların önceki etkileşimleri hatırlaması, tutarlı ve bağlama duyarlı yanıtlar üretmesi için bellek yönetimi kritik öneme sahiptir. LangGraph'ta durum yönetimi (state management) ile bunu sağlayabilirsiniz:
from langgraph.checkpoint.memory import MemorySaver
memory = MemorySaver()
graph = create_react_agent(llm, tools=tools, checkpointer=memory)
# İlk mesaj
config = {"configurable": {"thread_id": "oturum-1"}}
graph.invoke({"messages": [("user", "Benim adım Fatih.")]}, config)
# İkinci mesaj - ajan adı hatırlar
graph.invoke({"messages": [("user", "Adımı hatırlıyor musun?")]}, config)
thread_id parametresi ile farklı oturumları birbirinden izole edebilir, her kullanıcı için bağımsız bir konuşma geçmişi tutabilirsiniz.
Üretim Ortamı İçin En İyi Uygulamalar
1. Hata Yönetimi ve Geri Dönüş Mekanizmaları
Araç çağrıları başarısız olabilir. handle_tool_error=True parametresi ile ajanın hata durumlarında çökmek yerine alternatif yollar denemesini sağlayabilirsiniz. Ayrıca max_iterations parametresiyle sonsuz döngüleri önleyin.
2. Maliyet Kontrolü
Her LLM çağrısı bir maliyet taşır. Ajanların gereksiz yere çok fazla adım atmasını engellemek için iterasyon limitleri koyun ve token kullanımını izleyin. LangSmith gibi gözlemleme araçları bu konuda çok faydalıdır.
3. Güvenlik
- Araçlara verilen yetkileri en az ayrıcalık ilkesine göre sınırlandırın.
- Kullanıcı girdilerini doğrulayın ve sanitize edin.
- Özellikle veritabanı veya dosya sistemi araçlarında SQL injection ve benzeri saldırılara karşı önlem alın.
- API anahtarlarını asla kod içinde tutmayın; ortam değişkenleri veya secret manager kullanın.
4. Gözlemlenebilirlik (Observability)
LangChain ekosistemindeki LangSmith platformu, ajanlarınızın her adımını izlemenize, hata ayıklamanıza ve performansını değerlendirmenize olanak tanır. Üretim ortamında mutlaka bir tracing altyapısı kurun.
Yaygın Ajan Mimarileri
- ReAct (Reasoning + Acting): Ajan her adımda düşünür, bir eylem seçer, sonucu gözlemler ve döngüyü tekrarlar. En yaygın kullanılan mimaridir.
- Plan-and-Execute: Ajan önce tüm görevi planlar, ardından planı adım adım yürütür. Karmaşık, çok adımlı görevler için idealdir.
- Multi-Agent (Çoklu Ajan): Birden fazla uzmanlaşmış ajan birlikte çalışır. Örneğin bir araştırmacı ajan veri toplar, bir analist ajan verileri yorumlar ve bir yazıcı ajan raporu oluşturur.
- Hierarchical (Hiyerarşik): Bir yönetici ajan, alt ajanlara görev dağıtır ve sonuçları koordine eder.
Sonuç
LangChain ve LangGraph, AI Agent geliştirme sürecini önemli ölçüde basitleştiren güçlü araçlardır. Basit bir araç çağıran ajandan, karmaşık çoklu ajan sistemlerine kadar geniş bir yelpazede projeler üretebilirsiniz. Önemli olan, doğru araç seçimi, güvenlik önlemleri ve maliyet kontrolü gibi üretim gereksinimlerini baştan göz önünde bulundurmaktır. Küçük bir prototiple başlayın, ajanınızın davranışlarını LangSmith ile izleyin ve iteratif olarak geliştirin.