LangChain Mimari Tasarım: 7 Adımda Kapsamlı 2026 Rehberi
Yazar: Burak Balkı | Kategori: Cloud Computing | Okuma Süresi: 46 dk
Bu kapsamlı 2026 rehberi, LangChain mimari tasarımının derinliklerine inerek LLM uygulamalarını modüler, ölçeklenebilir ve güvenli bir şekilde nasıl inşa ede...
### BÖLÜM 1 - Giriş Paragrafı (Hook + Context)
Büyük Dil Modelleri (LLM'ler) ve yapay zeka uygulamaları, 2026 yılında yazılım dünyasında devrim yaratmaya devam ediyor. Ancak bu güçlü modelleri gerçek dünya senaryolarına entegre etmek ve karmaşık iş akışları oluşturmak, çoğu zaman mimari zorlukları beraberinde getirir. İşte tam bu noktada, **LangChain mimari tasarım** ilkeleri devreye girerek, geliştiricilere LLM tabanlı uygulamaları daha yapılandırılmış, modüler ve ölçeklenebilir bir şekilde inşa etme gücü sunar. Bu kapsamlı rehberde, LangChain'in temel prensiplerinden ileri düzey mimari desenlerine kadar her şeyi adım adım inceleyerek, 2026'nın en güncel yaklaşımlarıyla kendi akıllı sistemlerinizi nasıl tasarlayacağınızı öğreneceksiniz.
## BÖLÜM 2 - LangChain Nedir?
LangChain, Büyük Dil Modelleri (LLM'ler) etrafında akıllı uygulamalar geliştirmeyi kolaylaştıran, modüler bir framework'tür. Temel olarak, LLM'leri harici veri kaynakları ve diğer bilgi işlem süreçleriyle birleştirerek daha karmaşık ve bağlama duyarlı sistemler oluşturmaya olanak tanır. Geliştiricilerin, prompt mühendisliği, agentlar, zincirler (chains), bellek yönetimi ve araç entegrasyonu gibi kritik bileşenleri kolayca bir araya getirmesini sağlar.
LangChain, LLM'lerin sadece bir metin tamamlayıcı olmaktan çıkarıp, karar verme, bilgi alma ve eylem gerçekleştirme yeteneklerine sahip ‘agent’lara dönüştürülmesini hedefler. 2026 itibarıyla `langchain` ve `langchain-community` paketleri, Python ve JavaScript ekosistemlerinde geniş bir kullanım alanı bulmuş, özellikle RAG (Retrieval Augmented Generation) ve otonom agent sistemlerinin bel kemiği haline gelmiştir. Bu framework, LLM uygulamalarının prototipleme aşamasından üretim (production) ortamına geçişini hızlandırır ve geliştiricilere yüksek düzeyde esneklik sunar.
## BÖLÜM 3 - Neden LangChain Kullanmalısınız?
LangChain, 2026 yılında LLM tabanlı uygulama geliştiren ekipler için vazgeçilmez bir araç haline gelmiştir. İşte LangChain kullanmanın sunduğu somut faydalar ve çözdüğü temel problemler:
* **Modüler Mimari:** LangChain, LLM uygulamalarını küçük, yeniden kullanılabilir bileşenlere ayırmanıza olanak tanır. Bu modüler yapı, kodun okunabilirliğini, bakımını ve ölçeklenebilirliğini artırır. Örneğin, farklı prompt şablonlarını, LLM sağlayıcılarını veya bellek tiplerini kolayca değiştirebilirsiniz. Son projemde bu yaklaşımı uyguladığımda, yeni özellik ekleme süresinde %30'luk bir azalma gözlemledik.
* **Hızlı Prototipleme ve Geliştirme:** Karmaşık LLM iş akışlarını sıfırdan oluşturmak yerine, LangChain'in sunduğu hazır chain'ler, agent'lar ve araçlar sayesinde geliştirme sürecini önemli ölçüde hızlandırabilirsiniz. Bu, özellikle MVP (Minimum Viable Product) aşamasında pazar testlerini hızlandırmak için kritik bir avantajdır.
* **Geniş Entegrasyon Ekosistemi:** LangChain, OpenAI, Google Gemini, Anthropic Claude gibi popüler LLM'lerin yanı sıra, çeşitli vektör veritabanları (Chroma, Pinecone, FAISS), araçlar (arama motorları, API'ler, veritabanları) ve bellek sistemleri ile sorunsuz entegrasyon sunar. Bu zengin ekosistem, uygulamalarınızın yeteneklerini sınırsızca genişletmenizi sağlar.
* **Agent ve Karar Verme Yeteneği:** LangChain'in agent mimarisi, LLM'lerin belirli hedeflere ulaşmak için birden fazla aracı kullanmasını ve adımlar arasında karar vermesini sağlar. Bu, dinamik ve otonom uygulamalar oluşturmak için hayati öneme sahiptir. Production ortamında bir müşteri destek agent'ı geliştirirken, LangChain'in `AgentExecutor` yapısı sayesinde beklenmedik senaryoları bile yönetebilen robust bir sistem kurabildik.
* **Bellek Yönetimi:** LLM'ler, varsayılan olarak kısa süreli bağlama sahiptir. LangChain, sohbet geçmişini ve diğer bağlamsal bilgileri yönetmek için çeşitli bellek türleri sunarak, uygulamalarınızın daha uzun ve anlamlı diyaloglar sürdürmesini sağlar. Bu, özellikle sohbet robotları ve kişiselleştirilmiş asistanlar için önemlidir.
* **Topluluk ve Destek:** 2026 yılı itibarıyla LangChain, dünya genelinde aktif ve hızla büyüyen bir geliştirici topluluğuna sahiptir. GitHub üzerinde on binlerce yıldız, aktif forumlar ve kapsamlı dokümantasyon, karşılaştığınız sorunlara hızlı çözümler bulmanızı ve en iyi pratikleri öğrenmenizi sağlar.
LangChain, özellikle karmaşık iş mantığına sahip, harici sistemlerle etkileşime giren ve dinamik karar verme yeteneği gerektiren LLM uygulamaları geliştirmek isteyenler için idealdir. Basit, tek seferlik prompt çağrıları için aşırıya kaçabilirken, ölçeklenebilir ve sürdürülebilir AI çözümleri arayan kurumsal düzeydeki projeler için vazgeçilmezdir.
## BÖLÜM 4 - LangChain vs Alternatifler (Karşılaştırma Tablosu)
LLM uygulamaları geliştirme alanında LangChain tek seçenek değildir. İşte LangChain'i diğer popüler yaklaşımlarla karşılaştıran bir tablo:
| Özellik / Yaklaşım | LangChain (Python/JS) v0.2.x | LlamaIndex (Python) v0.10.x | Semantic Kernel (C#/Python/Java) v1.0.x | Custom Implementation (Python) |
| :----------------- | :-------------------------- | :-------------------------- | :------------------------------- | :----------------------------- |
| **Temel Odak** | LLM orchestrasyonu, Agentlar, Chainler | RAG (Veri indeksleme ve sorgulama) | AI bileşenlerinin entegrasyonu | Tam kontrol ve özelleştirme |
| **Prompt Yönetimi** | Gelişmiş şablonlar, Output Parser'lar | Sorgu motorları, prompt optimizasyonu | Semantic functions, prompt templating | Manuel |
| **Agent Desteği** | Kapsamlı (React, ReAct, Plan-and-Execute) | Sınırlı (Agent benzeri sorgular) | Planlayıcılar (Planners) | Manuel, karmaşık |
| **Veritabanı Entegrasyonu** | Geniş vektör/SQL/NoSQL entegrasyonu | Vektör veritabanları ağırlıklı | Sınırlı, eklentilerle genişletilebilir | Manuel |
| **Öğrenme Eğrisi** | Orta (Modüler yapıya alışma) | Orta (İndeksleme konseptleri) | Orta (Semantic functions) | Yüksek (Sıfırdan her şey) |
| **Ekosistem & Topluluk** | Çok büyük ve aktif (2026) | Büyük ve aktif | Orta (Microsoft destekli) | Yok (Şirket içi) |
| **Kurumsal Destek** | Açık kaynak, ticari destekler mevcut | Açık kaynak | Microsoft destekli | Şirket içi |
| **Kullanım Alanı** | Karmaşık agentlar, çok adımlı iş akışları, sohbet botları | Bilgi tabanı sorgulama, döküman özetleme | Kurumsal uygulamalarda AI entegrasyonu | Çok özel gereksinimler, performans kritik |
LangChain, özellikle çok adımlı, dinamik ve farklı araçları bir araya getiren LLM uygulamaları geliştirmek için en kapsamlı çözümü sunar. LlamaIndex daha çok RAG odaklıyken, Semantic Kernel Microsoft ekosistemine daha entegredir. Tamamen özel bir implementasyon, en yüksek esnekliği sunsa da, geliştirme süresini ve bakım maliyetini önemli ölçüde artırır.
## BÖLÜM 5 - Kurulum ve İlk Adımlar (Getting Started)
LangChain ile çalışmaya başlamak oldukça basittir. 2026 yılında Python ekosisteminde `langchain` ve `langchain-community` paketleri en güncel ve yaygın kullanılan modüllerdir. İşte adım adım kurulum ve ilk basit uygulamanızı çalıştırma süreci:
### Ön Gereksinimler:
* Python 3.9 veya üzeri (Önerilen: 3.11 veya 3.12)
* `pip` paket yöneticisi
* Bir LLM sağlayıcısından API anahtarı (örn. OpenAI, Google Gemini)
### 1. Sanal Ortam Oluşturma ve Aktifleştirme:
Çalışmalarınızı izole etmek için bir sanal ortam kullanmak en iyi pratiktir.
```bash
python -m venv langchain_env_2026
source langchain_env_2026/bin/activate # macOS/Linux
# langchain_env_2026\Scripts\activate # Windows
```
### 2. LangChain Paketlerini Kurulum:
Temel LangChain modülünü ve LLM entegrasyonu için gerekli community paketini kurun.
```bash
pip install langchain==0.2.x langchain-community==0.2.x openai==1.x.x python-dotenv==1.x.x
```
> **Pro Tip:** `openai` paketinin 1.x.x sürümü, 2026 itibarıyla en güncel ve önerilen sürümdür. `python-dotenv` ise API anahtarlarınızı güvenli bir şekilde yönetmek için kullanılır.
### 3. API Anahtarını Ayarlama:
`.env` dosyası oluşturarak API anahtarınızı güvenli bir şekilde saklayın.
`./.env`:
```dotenv
OPENAI_API_KEY="sk-your_openai_api_key_here"
```
### 4. İlk LLM Çağrısı:
Basit bir LLM çağrısı yaparak kurulumunuzu test edin.
`./main.py`:
```python
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# .env dosyasını yükle
load_dotenv()
# LLM modelini başlat (2026 için güncel bir model)
# Örneğin, OpenAI'ın GPT-4 Omni veya benzeri bir model
llm = ChatOpenAI(model="gpt-4o-2026-05-17", temperature=0.7)
# Prompt şablonu oluştur
prompt = ChatPromptTemplate.from_messages([
("system", "Sen deneyimli bir Python programcısısın."),
("user", "{input}")
])
# Çıktı ayrıştırıcı
output_parser = StrOutputParser()
# Bir chain oluştur
chain = prompt | llm | output_parser
# Chain'i çalıştır
response = chain.invoke({"input": "Python'da bir liste nasıl ters çevrilir?"})
print(response)
# Örnek Çıktı:
# Bir Python listesini ters çevirmenin birkaç yolu vardır. İşte en yaygın olanları:
# 1. slice() metodu: `my_list[::-1]`
# 2. reverse() metodu: `my_list.reverse()` (orijinal listeyi değiştirir)
# 3. reversed() fonksiyonu: `list(reversed(my_list))` (yeni bir liste döndürür)
# ...
```
### 5. Uygulamayı Çalıştırma:
```bash
python main.py
```
Bu adımlarla, LangChain ortamınızı kurmuş ve ilk LLM çağrınızı başarılı bir şekilde yapmış olmalısınız. Bu temel yapı, daha karmaşık LangChain mimarileri için bir başlangıç noktasıdır.
## BÖLÜM 6 - Temel Kullanım ve Örnekler (Core Usage)
LangChain'in gücü, temel bileşenleri bir araya getirerek karmaşık iş akışları oluşturma yeteneğinde yatar. İşte 2026'nın popüler kullanım senaryolarından bazıları:
### Örnek 1: Basit Bir Soru Cevap (QA) Chain'i
**Problem:** Kullanıcının sorduğu basit bir soruya LLM kullanarak cevap vermek.
**Çözüm:** `ChatPromptTemplate` ve `ChatOpenAI` modelini bir `chain` içinde birleştirmek.
```python
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="gpt-4o-2026-05-17", temperature=0.5)
prompt = ChatPromptTemplate.from_template("Şu soruya kısa ve öz cevap ver: {question}")
output_parser = StrOutputParser()
qa_chain = prompt | llm | output_parser
response = qa_chain.invoke({"question": "Güneş sistemindeki en büyük gezegen hangisidir?"})
print(f"Cevap: {response}")
# Cevap: Güneş sistemindeki en büyük gezegen Jüpiter'dir.
```
### Örnek 2: Bellek ile Sohbet Botu
**Problem:** LLM'in önceki konuşmaları hatırlamasını sağlayarak bağlama duyarlı bir sohbet deneyimi sunmak.
**Çözüm:** `ConversationBufferMemory` kullanarak sohbet geçmişini yönetmek ve bunu bir `RunnableWithMessageHistory` ile sarmalamak.
```python
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.messages import HumanMessage, AIMessage
llm = ChatOpenAI(model="gpt-4o-2026-05-17", temperature=0.7)
prompt = ChatPromptTemplate.from_messages([
("system", "Sen yardımcı bir AI asistanısın."),
MessagesPlaceholder(variable_name="history"),
("user", "{input}")
])
chain = prompt | llm
# Bellek yönetimi için bir oturum deposu
store = {}
def get_session_history(session_id: str) -> ChatMessageHistory:
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
with_message_history = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="input",
history_messages_key="history",
)
# İlk konuşma
response1 = with_message_history.invoke(
{"input": "Benim adım Burak."}, config={"configurable": {"session_id": "user123"}}
)
print(f"AI: {response1.content}")
# İkinci konuşma (AI önceki ismi hatırlamalı)
response2 = with_message_history.invoke(
{"input": "Adımı hatırlıyor musun?"}, config={"configurable": {"session_id": "user123"}}
)
print(f"AI: {response2.content}")
# AI: Merhaba Burak! Evet, adınız Burak.
```
### Örnek 3: Retrieval Augmented Generation (RAG) ile Harici Veri Entegrasyonu
**Problem:** LLM'in kendi eğitim verisinde olmayan güncel veya özel bilgilere erişimini sağlamak.
**Çözüm:** Bir vektör veritabanı (örneğin ChromaDB) ve embedding modelleri kullanarak harici dökümanlardan bilgi çekmek.
```python
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
# 1. Döküman Yükleme ve Bölme
with open("./data.txt", "w") as f:
f.write("LangChain, 2026 itibarıyla LLM tabanlı uygulamalar için lider bir framework'tür. En son sürümü 0.2.x'tir.\n")
f.write("LangChain'in mimarisi, modüler bileşenlerden oluşur: LLM'ler, Prompt'lar, Chain'ler, Agent'lar ve Araçlar.\n")
loader = TextLoader("./data.txt")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
splitted_docs = text_splitter.split_documents(docs)
# 2. Embedding Oluşturma ve Vektör Veritabanına Kaydetme
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(documents=splitted_docs, embedding=embeddings)
# 3. Retriever Oluşturma
retriever = vectorstore.as_retriever()
# 4. LLM ve Prompt Şablonu
llm = ChatOpenAI(model="gpt-4o-2026-05-17", temperature=0.1)
question_answering_prompt = ChatPromptTemplate.from_messages([
("system", "Aşağıdaki bağlamı kullanarak soruya cevap ver. Cevabı kısa ve öz tut:\n\n{context}"),
("user", "{input}")
])
document_chain = create_stuff_documents_chain(llm, question_answering_prompt)
retrieval_chain = create_retrieval_chain(retriever, document_chain)
# 5. Sorguyu Çalıştırma
response = retrieval_chain.invoke({"input": "LangChain'in en son sürümü nedir?"})
print(f"Cevap: {response['answer']}")
# Cevap: LangChain'in en son sürümü 0.2.x'tir.
response = retrieval_chain.invoke({"input": "LangChain'in mimarisi nelerden oluşur?"})
print(f"Cevap: {response['answer']}")
# Cevap: LangChain'in mimarisi, modüler bileşenlerden oluşur: LLM'ler, Prompt'lar, Chain'ler, Agent'lar ve Araçlar.
```
## BÖLÜM 7 - İleri Seviye Teknikler (Advanced Patterns)
LangChain, sadece temel kullanım senaryolarıyla sınırlı değildir; karmaşık ve ölçeklenebilir LLM uygulamaları için ileri düzey mimari desenler sunar. 2026 yılında kurumsal düzeydeki projelerde sıkça karşılaşılan bazı teknikler:
### 1. Agentlar ve Araçlar (Tools)
Agentlar, LLM'lerin belirli hedeflere ulaşmak için harici araçları dinamik olarak seçip kullanmasını sağlayan LangChain'in en güçlü özelliklerinden biridir. Bir agent, bir `tool` setine ve bir `LLM`'e sahiptir ve bir `AgentExecutor` tarafından yönetilir.
**Problem:** LLM'in sadece metin üretmekle kalmayıp, gerçek dünya eylemleri gerçekleştirmesini (örn. arama yapmak, bir API'yi çağırmak) sağlamak.
**Çözüm:** `create_tool_calling_agent` veya `create_react_agent` kullanarak agent'lar oluşturmak ve bunları özel araçlarla donatmak.
```python
from langchain_openai import ChatOpenAI
from langchain.agents import tool, create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import AIMessage, HumanMessage
# Özel bir araç tanımlama
@tool
def get_current_weather(location: str) -> str:
"""Belirtilen konumdaki güncel hava durumunu döndürür."""
# Bu kısım gerçek bir hava durumu API çağrısı yapabilir
if "İstanbul" in location:
return "İstanbul'da şu anda 20°C ve parçalı bulutlu."
elif "Ankara" in location:
return "Ankara'da 15°C ve yağmurlu."
else:
return "Bilinmeyen konum için hava durumu bilgisi bulunamadı."
@tool
def search_web(query: str) -> str:
"""Verilen sorgu için web araması yapar ve sonuçları döndürür."""
# Bu kısım gerçek bir arama motoru API çağrısı yapabilir (örn. Google Search API)
if "LangChain" in query:
return "LangChain v0.2.x, LLM orchestrasyonu için bir framework'tür. 2026'nın popüler araçlarından biri."
return f"Web araması sonucu: '{query}' ile ilgili bilgiler."
llm = ChatOpenAI(model="gpt-4o-2026-05-17", temperature=0.0)
tools = [get_current_weather, search_web]
prompt = ChatPromptTemplate.from_messages([
("system", "Sen çok yardımcı bir asistansın. Araçları kullanarak soruları cevapla."),
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# Agent'ı çalıştırma
print("\n--- Agent Çağrısı 1 ---")
response = agent_executor.invoke({"input": "İstanbul'da hava nasıl?", "chat_history": []})
print(f"AI: {response['output']}")
# AI: İstanbul'da şu anda 20°C ve parçalı bulutlu.
print("\n--- Agent Çağrısı 2 ---")
response = agent_executor.invoke({"input": "LangChain hakkında bilgi ver.", "chat_history": []})
print(f"AI: {response['output']}")
# AI: LangChain v0.2.x, LLM orchestrasyonu için bir framework'tür. 2026'nın popüler araçlarından biri.
```
> **Experience:** Production ortamında bu agent mimarisini kullanırken, araçların doğru tanımlanması ve LLM'in araçları ne zaman ve nasıl kullanacağını netleştiren prompt mühendisliği kritik önem taşır. Yanlış tasarlanmış bir araç tanımı, agent'ın halüsinasyon yapmasına veya yanlış eylemler gerçekleştirmesine neden olabilir.
### 2. Custom Output Parser'lar
LLM'lerden gelen ham metin çıktılarını yapılandırılmış verilere dönüştürmek genellikle gereklidir. LangChain, `PydanticOutputParser` gibi hazır çözümler sunsa da, bazen özel ayrıştırma mantığına ihtiyaç duyulur.
**Problem:** LLM'den belirli bir JSON formatında çıktı beklemek ve bu çıktıyı doğrulamak/işlemek.
**Çözüm:** `BaseOutputParser` sınıfından türeyen özel bir ayrıştırıcı yazmak.
```python
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import BaseOutputParser
import json
# Özel bir Pydantic modeli tanımlayalım
from pydantic import BaseModel, Field
class ArticleSummary(BaseModel):
title: str = Field(description="Makalenin başlığı")
summary: str = Field(description="Makalenin kısa özeti")
keywords: list[str] = Field(description="Makalenin anahtar kelimeleri")
class ArticleSummaryParser(BaseOutputParser[ArticleSummary]):
"""Makale özetini JSON formatından Pydantic modeline ayrıştırır."""
def parse(self, text: str) -> ArticleSummary:
try:
json_data = json.loads(text)
return ArticleSummary(**json_data)
except json.JSONDecodeError as e:
raise ValueError(f"Geçersiz JSON çıktısı: {text}") from e
except Exception as e:
raise ValueError(f"Pydantic modeline dönüştürme hatası: {text}") from e
@property
def _type(self) -> str:
return "article_summary_parser"
llm = ChatOpenAI(model="gpt-4o-2026-05-17", temperature=0.0)
# Prompt'a format talimatını ekleyin
prompt = ChatPromptTemplate.from_messages([
("system", "Verilen makaleyi özetle ve şu JSON formatında çıktı ver:\n{format_instructions}"),
("user", "{article_text}")
]).partial(format_instructions=ArticleSummaryParser().get_format_instructions())
parser = ArticleSummaryParser()
chain = prompt | llm | parser
article_text = """
LangChain'in 2026 yılındaki yükselişi, yapay zeka geliştirme dünyasında önemli bir dönüm noktası oldu. Geliştiriciler, modüler mimarisi sayesinde karmaşık LLM uygulamalarını daha hızlı ve verimli bir şekilde inşa edebiliyor. Özellikle RAG ve agent sistemleri, LangChain'in temel kullanım alanlarını oluşturuyor.
"""
try:
summary_obj = chain.invoke({"article_text": article_text})
print(f"Başlık: {summary_obj.title}")
print(f"Özet: {summary_obj.summary}")
print(f"Anahtar Kelimeler: {', '.join(summary_obj.keywords)}")
except ValueError as e:
print(f"Hata: {e}")
# Örnek Çıktı:
# Başlık: LangChain'in 2026 Yükselişi ve Uygulamaları
# Özet: LangChain, 2026'da LLM uygulamaları geliştirmede modüler mimarisiyle öne çıkan bir framework'tür. RAG ve agent sistemleri başlıca kullanım alanlarıdır.
# Anahtar Kelimeler: LangChain, LLM, yapay zeka, RAG, agent, 2026
```
### 3. Streaming ve Async İşlemler
LLM çağrıları genellikle uzun sürer. Kullanıcı deneyimini iyileştirmek için çıktıları anında (streaming) göstermek ve birden fazla LLM çağrısını eşzamansız (async) olarak yapmak önemlidir.
**Problem:** Kullanıcının LLM'den cevap beklerken uzun süre beklemesini engellemek ve paralel işlemler yapmak.
**Çözüm:** `stream()` ve `ainvoke()`/`abatch()` metodlarını kullanmak.
```python
import asyncio
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="gpt-4o-2026-05-17", temperature=0.7)
prompt = ChatPromptTemplate.from_template("Kısa bir hikaye yaz: {topic}")
output_parser = StrOutputParser()
chain = prompt | llm | output_parser
async def stream_story():
print("\n--- Streaming Hikaye ---")
async for chunk in chain.astream({"topic": "uzayda macera"}):
print(chunk, end="", flush=True)
print("\n--- Streaming Bitti ---")
async def batch_stories():
print("\n--- Batch Hikayeler ---")
topics = ["fantastik bir dünya", "bir dedektiflik hikayesi", "robotların isyanı"]
results = await chain.abatch([{"topic": t} for t in topics])
for i, res in enumerate(results):
print(f"\nHikaye {i+1} ({topics[i]}):\n{res[:100]}...") # İlk 100 karakter
print("--- Batch Bitti ---")
async def main():
await stream_story()
await batch_stories()
if __name__ == "__main__":
asyncio.run(main())
```
## BÖLÜM 8 - Best Practices & Anti-Patterns
LangChain ile ölçeklenebilir ve sürdürülebilir LLM uygulamaları geliştirirken 2026'nın en iyi pratiklerini takip etmek ve yaygın anti-pattern'lardan kaçınmak kritik öneme sahiptir. Ekibimizde LangChain'e geçiş sürecinde öğrendiğimiz 3 kritik ders, bu pratiklerin temelini oluşturur: Modülerlik, Test Edilebilirlik ve Güvenlik.
### ✅ Doğru Yaklaşımlar (Best Practices)
1. **Modüler ve Bileşen Tabanlı Tasarım:**
* **Neden:** Her bir LangChain bileşenini (LLM, Prompt, Chain, Tool, Memory) ayrı ayrı tanımlayın ve birleştirin. Bu, kodun yeniden kullanılabilirliğini, okunabilirliğini ve test edilebilirliğini artırır. Büyük ve monolitik chain'ler yerine, küçük ve belirli görevlere odaklanmış `Runnable`'lar oluşturun.
* **Örnek:** Prompt'ları ayrı dosyalarda tutmak, özel araçları `tools.py` gibi bir modülde gruplamak.
2. **Prompt Mühendisliğini Önceliklendirme:**
* **Neden:** İyi tasarlanmış prompt'lar, LLM çıktılarının kalitesini doğrudan etkiler. Prompt'ları versiyonlayın, test edin ve iteratif olarak iyileştirin. `ChatPromptTemplate` ve `MessagesPlaceholder` kullanarak dinamik ve esnek prompt'lar oluşturun.
* **Güvenlik:** Prompt injection saldırılarına karşı dikkatli olun. Kullanıcı girdilerini doğrudan prompt'a eklemeden önce sanitize edin veya uygun `MessagesPlaceholder` yapılarını kullanın.
3. **Hata Yönetimi ve Sağlamlık:**
* **Neden:** LLM çağrıları başarısız olabilir (API limitleri, ağ sorunları, model hataları). `try-except` blokları kullanarak hataları yakalayın ve uygun geri dönüş mekanizmaları (fallback LLM'ler) veya yeniden deneme stratejileri uygulayın.
* **Örnek:** Bir LLM çağrısı başarısız olduğunda daha küçük/daha ucuz bir modele geçiş yapmak veya kullanıcıya hata mesajı göstermek.
4. **Asenkron Programlama (Async/Await):**
* **Neden:** LLM çağrıları I/O yoğun işlemlerdir. `asyncio` ve LangChain'in `astream()`, `ainvoke()`, `abatch()` metodlarını kullanarak uygulamanızın yanıt verme hızını artırın ve eşzamanlı işlemleri verimli bir şekilde yönetin.
* **Experience:** Production ortamında senkron çağrılarla başlayan projelerde, performans darboğazlarının kaçınılmaz olduğunu gördük. Asenkron geçiş, sistemin genel throughput'unu %40 artırdı.
5. **Güvenlik ve API Anahtarı Yönetimi:**
* **Neden:** API anahtarları gibi hassas bilgileri asla doğrudan kod içine gömmeyin. Ortam değişkenleri (`.env` dosyası ile `python-dotenv`) veya daha güvenli sır yönetimi hizmetleri (AWS Secrets Manager, Azure Key Vault) kullanın.
* **❌ Anti-Pattern:** `os.environ["OPENAI_API_KEY"] = "sk-123..."` doğrudan kodda.
6. **Bellek Yönetimini Optimize Etme:**
* **Neden:** Özellikle uzun süreli diyaloglarda bellek kullanımı artar. `ConversationBufferWindowMemory` veya `ConversationSummaryBufferMemory` gibi bellek türlerini kullanarak bağlam penceresini yönetin ve aşırı token kullanımını önleyin.
7. **Test Edilebilirlik:**
* **Neden:** LLM uygulamaları tahmin edilemez olabilir. Prompt'larınızı, chain'lerinizi ve agent'larınızı birim testleri ve entegrasyon testleri ile kapsamlı bir şekilde test edin. Mock LLM'ler kullanarak API bağımlılıklarını izole edin.
8. **Versiyon Kontrolü ve Dokümantasyon:**
* **Neden:** Prompt'lar, chain yapıları ve araç tanımları zamanla değişebilir. Bunları Git gibi bir versiyon kontrol sisteminde yönetin ve işlevlerini açıkça belgeleyin.
### ❌ Yanlış Yaklaşımlar (Anti-Patterns)
1. **Monolitik Chain'ler:** Tüm iş mantığını tek bir devasa chain içine sıkıştırmak. Bakımı zorlaştırır ve hata ayıklamayı imkansız hale getirir.
2. **Hardcoded Prompt'lar:** Prompt'ları doğrudan kod içine gömmek ve dinamik değişkenler kullanmamak. Esnekliği azaltır ve güncellemeleri zorlaştırır.
3. **API Anahtarlarını Koda Yazmak:** Güvenlik açığı yaratır ve sırların sızmasına yol açabilir.
4. **Senkron LLM Çağrıları:** Özellikle web uygulamalarında kullanıcı deneyimini kötüleştirir ve ölçeklenebilirlik sorunlarına yol açar.
5. **Aşırı Bellek Kullanımı:** Her diyalog için tüm geçmişi tutmak, token limitlerini aşmaya ve maliyetleri artırmaya neden olabilir.
6. **Test Kapsamı Eksikliği:** LLM uygulamalarının davranışları karmaşık olduğundan, test edilmemiş kod beklenmedik sonuçlar doğurabilir.
## BÖLÜM 9 - Yaygın Hatalar ve Çözümleri (Troubleshooting)
LangChain ile çalışırken geliştiricilerin 2026 yılında sıkça karşılaştığı bazı sorunlar ve bunların çözümleri:
### 1. Hata: `RateLimitError: You exceeded your current quota, please check your plan and billing details.`
* **Sebep:** LLM sağlayıcınızın (örn. OpenAI) API çağrı limitlerini aşmanız veya hesabınızda yeterli kredi olmaması.
* **Çözüm:**
1. API sağlayıcınızın paneline giderek kullanımınızı ve faturalandırma bilgilerinizi kontrol edin.
2. Daha düşük `temperature` veya daha küçük bir model kullanarak token kullanımını azaltın.
3. Uygulamanızda retry mekanizmaları veya rate limiting kütüphaneleri (örn. `tenacity`) kullanın.
4. Ölçeklenebilir uygulamalar için `async` çağrılar ve `batch` işlemleri tercih edin.
### 2. Hata: `ValueError: Could not parse LLM output: ...`
* **Sebep:** LLM'den beklenen yapılandırılmış çıktının (örn. JSON) gelmemesi veya yanlış formatta gelmesi. Özellikle `OutputParser` kullanıldığında yaygındır.
* **Çözüm:**
1. Prompt'unuzu gözden geçirin. LLM'e çıktıyı hangi formatta istediğinizi çok net bir şekilde belirtin. Örneğin, "Cevabı sadece JSON formatında ver ve başka hiçbir şey ekleme."
2. `PydanticOutputParser` kullanıyorsanız, `get_format_instructions()` çıktısını prompt'a eklediğinizden emin olun.
3. `temperature` değerini düşürerek LLM'in daha deterministik çıktı vermesini sağlayın.
4. LLM'in halüsinasyon yapmasını önlemek için sistem mesajını güçlendirin.
### 3. Hata: `InvalidToolCall: The agent returned a tool call that is not valid: ...`
* **Sebep:** Agent'ın tanımlı araçlardan birini yanlış isimle çağırması, yanlış argümanlar vermesi veya var olmayan bir aracı çağırmaya çalışması.
* **Çözüm:**
1. Araçlarınızın isimlerinin ve argümanlarının (özellikle Pydantic modelleri kullanıyorsanız) doğru ve LLM'in anlayabileceği şekilde tanımlandığından emin olun.
2. Prompt'unuzu agent'a araçları nasıl kullanması gerektiğini açıklayacak şekilde güncelleyin. Genellikle `create_tool_calling_agent` gibi fonksiyonlar bunu otomatik yapsa da, karmaşık senaryolarda manuel müdahale gerekebilir.
3. `verbose=True` parametresiyle `AgentExecutor`'ı çalıştırarak agent'ın düşünce sürecini (thought process) inceleyin ve hatanın nerede yapıldığını anlayın.
### 4. Hata: `TokenLimitExceeded: This model's maximum context length is X tokens. However, your messages resulted in Y tokens.`
* **Sebep:** LLM'in bağlam penceresini (context window) aşan çok uzun bir prompt veya sohbet geçmişi göndermeniz.
* **Çözüm:**
1. `ConversationSummaryBufferMemory` veya `ConversationBufferWindowMemory` gibi bellek türlerini kullanarak sohbet geçmişini özetleyin veya sınırlayın.
2. Girdi metinlerini bölerek (chunking) ve sadece en alakalı kısımları LLM'e göndererek prompt boyutunu azaltın (özellikle RAG uygulamalarında).
3. Daha büyük bağlam penceresine sahip bir LLM modeli kullanmayı düşünün (ancak bu genellikle daha maliyetlidir).
4. Gereksiz bilgileri prompt'tan çıkarın.
## BÖLÜM 10 - Performans Optimizasyonu
LLM uygulamalarında performans, kullanıcı deneyimi ve maliyet açısından kritik bir faktördür. 2026 yılında LangChain ile geliştirilen sistemlerde uygulanabilecek bazı performans optimizasyon teknikleri:
### 1. Caching (Önbellekleme)
**Problem:** Aynı LLM çağrılarının tekrar tekrar yapılması, maliyeti artırır ve gecikmeyi uzatır.
**Çözüm:** LangChain'in yerleşik önbellekleme mekanizmalarını kullanmak veya özel bir önbellek katmanı entegre etmek.
```python