Python Ortamına LangChain Kurulumu ve Temel Yapılandırma

Yapay zeka uygulamaları geliştirme dünyasına adım atmak isteyenler için LangChain, son yılların en popüler framework’lerinden biri haline geldi. OpenAI, Anthropic, Hugging Face gibi farklı LLM sağlayıcılarını tek bir çatı altında kullanmanı sağlayan bu kütüphane, production ortamına taşıyabileceğin gerçek AI uygulamaları yazmak için güçlü bir temel sunuyor. Bu yazıda sıfırdan başlayarak Python ortamını nasıl hazırlayacağını, LangChain’i nasıl kuracağını ve temel yapılandırmaları nasıl yapacağını adım adım göstereceğim.

Neden LangChain?

Bir sysadmin olarak “bana ne faydası var?” diye sorabilirsin. Haklısın. LangChain’in benim için anlamlı hale geldiği an, log dosyalarını analiz eden, hata mesajlarını yorumlayan ve ekibe özet rapor çıkaran bir araç yazmak istediğimde oldu. Normalde bu iş için OpenAI API’sini doğrudan kullanırdım, ama prompt yönetimi, hafıza, zincirleme işlemler derken kod karmaşıklaşıyordu. LangChain bu sorunların üstesinden gelecek soyutlama katmanını sunuyor.

Kısaca ne işe yarıyor?

  • LLM entegrasyonu: GPT-4, Claude, Gemini, Llama gibi modelleri aynı interface ile kullanabiliyorsun
  • Prompt yönetimi: Template sistemi ile tekrar kullanılabilir, versiyonlanabilir promptlar
  • Bellek yönetimi: Konuşma geçmişini yönetmek için hazır araçlar
  • Araç ve ajan desteği: LLM’in dış sistemlere (API, veritabanı, dosya sistemi) erişmesini sağlayan ajan mimarisi
  • RAG desteği: Kendi dökümanlarını vektör veritabanına yükleyip sorgulatabilme

Ortam Hazırlığı

Python Sürümü Kontrolü

LangChain için Python 3.9 veya üzeri gerekiyor. Önce mevcut Python sürümünü kontrol et:

python3 --version
# veya
python --version

# Pip sürümünü de güncel tut
pip install --upgrade pip

Eğer sisteminizde birden fazla Python sürümü varsa ve doğru sürümü kullandığından emin olmak istiyorsan:

# Hangi python binary'sini kullandığını görmek için
which python3
ls -la /usr/bin/python*

# Ubuntu/Debian'da alternatif Python sürümü yönetimi
sudo apt list --installed | grep python3

Virtual Environment Oluşturma

Bu adımı asla atlama. LangChain ve bağımlılıkları oldukça kapsamlı, sistem Python’una doğrudan kurmak ileride ciddi versiyon çakışmalarına yol açar. Her proje için ayrı bir sanal ortam kullan.

# Proje dizini oluştur
mkdir ~/langchain-projesi
cd ~/langchain-projesi

# Virtual environment oluştur
python3 -m venv venv

# Aktive et (Linux/macOS)
source venv/bin/activate

# Windows için
# venvScriptsactivate

# Aktive olduğunu prompt'taki (venv) ifadesinden anlayabilirsin
# (venv) kullanici@sunucu:~/langchain-projesi$

Alternatif olarak conda kullanıyorsan:

conda create -n langchain-env python=3.11
conda activate langchain-env

LangChain Kurulumu

Temel Paket Kurulumu

LangChain modüler bir yapıya sahip. 2024 itibarıyla ana paket langchain ile birlikte langchain-core ve kullanmak istediğin LLM sağlayıcısına özel paketleri ayrı ayrı kurman gerekiyor. Bu modüler yapı başlangıçta karmaşık gelebilir ama gereksiz bağımlılıkları projene dahil etmemeni sağlıyor.

# Temel LangChain paketleri
pip install langchain
pip install langchain-core
pip install langchain-community

# OpenAI entegrasyonu için
pip install langchain-openai

# Anthropic Claude entegrasyonu için (opsiyonel)
pip install langchain-anthropic

# Hugging Face entegrasyonu için (opsiyonel)
pip install langchain-huggingface

# Kurulumu doğrula
pip show langchain
pip show langchain-core

Ek Bağımlılıklar

Gerçek dünya projelerinde ihtiyaç duyacağın bazı ek paketler:

# Ortam değişkeni yönetimi için
pip install python-dotenv

# Vektör veritabanı (ChromaDB - yerel kullanım için)
pip install chromadb

# Döküman işleme
pip install pypdf
pip install docx2txt

# HTTP istekleri ve araç entegrasyonları
pip install requests
pip install beautifulsoup4

# Tüm kurulu paketleri requirements.txt'e kaydet
pip freeze > requirements.txt

Kurulumu Doğrulama

python3 -c "
import langchain
import langchain_core
import langchain_community
print(f'LangChain: {langchain.__version__}')
print(f'LangChain Core: {langchain_core.__version__}')
print('Kurulum basarili!')
"

API Anahtarı Yapılandırması

.env Dosyası ile Güvenli Yönetim

API anahtarlarını doğrudan koda yazmak ciddi bir güvenlik açığı. Özellikle kodunu Git’e pushluyorsan bu hatayı yapma. .env dosyası kullan ve bu dosyayı .gitignore‘a ekle.

# .env dosyası oluştur
cat > .env << 'EOF'
# OpenAI API Anahtarı
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxx

# Anthropic API Anahtarı (varsa)
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxxxxxxxxxxxx

# LangSmith için (opsiyonel - debugging aracı)
LANGCHAIN_TRACING_V2=true
LANGCHAIN_API_KEY=ls__xxxxxxxxxxxxxxxxxxxxxxxxxx
LANGCHAIN_PROJECT=benim-projem

# Hugging Face Token (opsiyonel)
HUGGINGFACEHUB_API_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxxxxxxx
EOF

# .gitignore dosyasına ekle
echo ".env" >> .gitignore
echo "venv/" >> .gitignore
echo "__pycache__/" >> .gitignore
echo "*.pyc" >> .gitignore

.env Dosyasını Python’da Kullanma

# config.py
from dotenv import load_dotenv
import os

# .env dosyasını yükle
load_dotenv()

# API anahtarlarını ortam değişkeninden al
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")

# Anahtar varlığını kontrol et
def check_api_keys():
    required_keys = ["OPENAI_API_KEY"]
    missing_keys = []
    
    for key in required_keys:
        if not os.getenv(key):
            missing_keys.append(key)
    
    if missing_keys:
        raise ValueError(f"Eksik API anahtarlari: {', '.join(missing_keys)}")
    
    print("Tüm gerekli API anahtarlari mevcut.")

if __name__ == "__main__":
    check_api_keys()

İlk LangChain Uygulaması

Basit Bir LLM Çağrısı

# ilk_uygulama.py
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

load_dotenv()

# Model oluştur
model = ChatOpenAI(
    model="gpt-4o-mini",  # Daha ucuz ve hızlı model
    temperature=0.7,       # 0: deterministik, 1: yaratıcı
    max_tokens=500
)

# Basit bir soru sor
messages = [
    SystemMessage(content="Sen yardımcı bir Linux sistem yöneticisisin. Kısa ve net cevaplar ver."),
    HumanMessage(content="nginx log dosyası nerede bulunur?")
]

response = model.invoke(messages)
print(response.content)

Bu kodu çalıştırdığında modelin cevabını göreceksin. Şimdi biraz daha ileri gidelim.

Prompt Template Kullanımı

Prompt template’ler, tekrar kullanılabilir ve parametrik promptlar oluşturmana olanak tanır. Log analizi senaryosu için bunu kullanalım:

# prompt_template_ornek.py
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

load_dotenv()

# Prompt template tanımla
prompt = ChatPromptTemplate.from_messages([
    ("system", """Sen bir Linux sistem yöneticisi asistanısın. 
    Sana verilen log çıktısını analiz et ve şunları belirt:
    1. Tespit edilen hatalar
    2. Olası nedeni
    3. Önerilen çözüm adımları
    Cevabı Türkçe ver."""),
    ("human", "Analiz edilecek log:n{log_content}")
])

# Model ve output parser
model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
output_parser = StrOutputParser()

# Chain oluştur (LCEL - LangChain Expression Language)
chain = prompt | model | output_parser

# Örnek log verisi
ornek_log = """
2024-01-15 14:23:41 ERROR nginx: connect() failed (111: Connection refused) 
while connecting to upstream, client: 192.168.1.100, 
server: example.com, upstream: "http://127.0.0.1:8080"
2024-01-15 14:23:42 ERROR nginx: no live upstreams while connecting to upstream
2024-01-15 14:23:45 WARN nginx: upstream response timeout (11: Resource temporarily unavailable)
"""

# Chain'i çalıştır
sonuc = chain.invoke({"log_content": ornek_log})
print(sonuc)

Konuşma Hafızası ile Chatbot

Gerçek bir chatbot senaryosunda konuşma geçmişini tutman gerekir. LangChain bunu kolaylaştırıyor:

# chatbot_hafiza.py
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage
from langchain_core.output_parsers import StrOutputParser

load_dotenv()

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

prompt = ChatPromptTemplate.from_messages([
    ("system", "Sen yardımcı bir sistem yöneticisi asistanısın. Kısa ve öz cevaplar ver."),
    MessagesPlaceholder(variable_name="chat_history"),
    ("human", "{input}")
])

chain = prompt | model | StrOutputParser()

# Konuşma geçmişini tut
chat_history = []

def chat(kullanici_mesaji: str) -> str:
    response = chain.invoke({
        "input": kullanici_mesaji,
        "chat_history": chat_history
    })
    
    # Geçmişe ekle
    chat_history.append(HumanMessage(content=kullanici_mesaji))
    chat_history.append(AIMessage(content=response))
    
    return response

# Örnek kullanım
print("Bot:", chat("Merhaba, nginx'i nasıl yeniden başlatırım?"))
print("Bot:", chat("Peki bu işlem kaç saniye sürer?"))
print("Bot:", chat("Önceki söylediğini tekrar açıklar mısın?"))

Yapılandırma ve Optimizasyon

Model Parametrelerini Anlamak

Sıkça kullanılan parametreler:

  • temperature: Çıktının yaratıcılık seviyesi. 0 deterministic, 1 yaratıcı. Log analizi gibi teknik görevler için 0 kullan.
  • max_tokens: Maksimum çıktı uzunluğu. API maliyetini kontrol etmek için kritik.
  • model: Kullanılacak model adı. gpt-4o-mini ucuz, gpt-4o daha yetenekli.
  • timeout: API yanıt bekleme süresi (saniye). Production’da mutlaka ayarla.
  • max_retries: Hata durumunda kaç kez tekrar denensin.
# Yapılandırılmış model örneği
from langchain_openai import ChatOpenAI

model = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0,
    max_tokens=1000,
    timeout=30,
    max_retries=3
)

Streaming ile Gerçek Zamanlı Çıktı

Uzun cevaplar için streaming kullanmak kullanıcı deneyimini iyileştirir:

# streaming_ornek.py
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

load_dotenv()

model = ChatOpenAI(model="gpt-4o-mini", temperature=0)

print("Cevap: ", end="", flush=True)

# Streaming ile chunk chunk yazdır
for chunk in model.stream([
    HumanMessage(content="Linux'ta disk kullanımını izlemek için 5 farklı yöntem anlat.")
]):
    print(chunk.content, end="", flush=True)

print()  # Yeni satır

Hata Yönetimi

Production ortamında hata yönetimi şart:

# hata_yonetimi.py
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
from openai import RateLimitError, APIConnectionError, APITimeoutError
import time
import logging

load_dotenv()
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def llm_sor(soru: str, max_deneme: int = 3) -> str:
    model = ChatOpenAI(model="gpt-4o-mini", temperature=0, timeout=30)
    
    for deneme in range(max_deneme):
        try:
            response = model.invoke([HumanMessage(content=soru)])
            return response.content
            
        except RateLimitError:
            bekleme = 2 ** deneme  # Exponential backoff
            logger.warning(f"Rate limit asildi. {bekleme} saniye bekleniyor...")
            time.sleep(bekleme)
            
        except APIConnectionError as e:
            logger.error(f"Baglanti hatasi: {e}")
            if deneme == max_deneme - 1:
                raise
                
        except APITimeoutError:
            logger.error(f"Zaman asimi. Deneme {deneme + 1}/{max_deneme}")
            if deneme == max_deneme - 1:
                raise
    
    raise Exception("Maksimum deneme sayisina ulasildi.")

# Kullanım
try:
    cevap = llm_sor("Docker container'larında log yönetimi nasıl yapılır?")
    print(cevap)
except Exception as e:
    print(f"Hata: {e}")

Pratik Bir Senaryo: Sistem Raporu Analisti

Şimdi tüm öğrendiklerimizi bir araya getirerek gerçekten işe yarar bir araç yazalım. Bu araç, sistem komutlarının çıktısını alıp yorumlayan bir asistan görevi görüyor:

# sistem_analisti.py
import subprocess
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

load_dotenv()

def sistem_bilgisi_topla() -> dict:
    """Temel sistem bilgilerini toplar."""
    komutlar = {
        "disk_kullanimi": "df -h",
        "bellek_kullanimi": "free -h",
        "cpu_yukü": "uptime",
        "aktif_servisler": "systemctl list-units --type=service --state=running --no-pager | head -20",
    }
    
    bilgiler = {}
    for isim, komut in komutlar.items():
        try:
            sonuc = subprocess.run(
                komut.split(),
                capture_output=True,
                text=True,
                timeout=10
            )
            bilgiler[isim] = sonuc.stdout
        except Exception as e:
            bilgiler[isim] = f"Hata: {e}"
    
    return bilgiler

def sistem_raporu_olustur():
    """Sistem bilgilerini analiz edip rapor oluşturur."""
    
    print("Sistem bilgileri toplanıyor...")
    bilgiler = sistem_bilgisi_topla()
    
    sistem_durumu = f"""
    DISK KULLANIMI:
    {bilgiler.get('disk_kullanimi', 'Bilgi alinamadi')}
    
    BELLEK KULLANIMI:
    {bilgiler.get('bellek_kullanimi', 'Bilgi alinamadi')}
    
    CPU YÜKÜ:
    {bilgiler.get('cpu_yukü', 'Bilgi alinamadi')}
    
    AKTIF SERVİSLER:
    {bilgiler.get('aktif_servisler', 'Bilgi alinamadi')}
    """
    
    prompt = ChatPromptTemplate.from_messages([
        ("system", """Sen deneyimli bir Linux sistem yöneticisisin. 
        Sana verilen sistem durumu bilgilerini analiz et ve şunları içeren kısa bir rapor hazırla:
        - Genel sistem sağlığı durumu
        - Dikkat edilmesi gereken noktalar
        - Acil aksiyon gerektiren durumlar (varsa)
        Raporu Türkçe ve madde madde yaz."""),
        ("human", "Sistem durumu:n{sistem_durumu}")
    ])
    
    model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
    chain = prompt | model | StrOutputParser()
    
    print("Rapor hazırlanıyor...n")
    rapor = chain.invoke({"sistem_durumu": sistem_durumu})
    print("=" * 50)
    print("SİSTEM DURUM RAPORU")
    print("=" * 50)
    print(rapor)

if __name__ == "__main__":
    sistem_raporu_olustur()

Proje Yapısını Düzenleme

Büyüyen projeler için temiz bir yapı önemli:

langchain-projesi/
├── venv/
├── .env
├── .gitignore
├── requirements.txt
├── config.py
├── src/
│   ├── __init__.py
│   ├── models.py       # Model tanımlamaları
│   ├── prompts.py      # Prompt template'ler
│   └── chains.py       # Chain tanımlamaları
├── scripts/
│   ├── sistem_analisti.py
│   └── log_analizi.py
└── tests/
    └── test_chains.py

Bu yapıyı oluşturmak için:

mkdir -p src scripts tests
touch src/__init__.py src/models.py src/prompts.py src/chains.py
touch scripts/sistem_analisti.py scripts/log_analizi.py
touch tests/test_chains.py

LangSmith ile Debugging

LangSmith, LangChain’in resmi debugging ve monitoring aracı. Ücretsiz tier ile başlayabilirsin. .env dosyana şunları ekle:

# LangSmith yapılandırması
LANGCHAIN_TRACING_V2=true
LANGCHAIN_ENDPOINT=https://api.smith.langchain.com
LANGCHAIN_API_KEY=ls__xxxxxxxxxxxxxxxx
LANGCHAIN_PROJECT=sysadmin-asistan

Bu ayarları yaptıktan sonra tüm LangChain çağrıların LangSmith dashboard’unda görünür hale gelir. Hangi promptların ne kadar token tükettiğini, yanıt sürelerini ve hataları izleyebilirsin.

Sonuç

Bu yazıda Python ortamını sıfırdan hazırlamaktan LangChain kurulumuna, API anahtarı yönetiminden ilk çalışan uygulamaya kadar kapsamlı bir yolculuk yaptık. Birkaç kritik noktayı tekrar vurgulamak istiyorum:

Her zaman virtual environment kullan. Bu kuralı çiğnemek ileride saatler kaybettiren bağımlılık sorunlarına yol açar. API anahtarlarını .env dosyasında tut ve bu dosyayı asla Git’e commit etme. Production uygulamalarında hata yönetimi ve timeout ayarları zorunlu, bunlarsız kodun güvenilmez davranır.

LangChain’in öğrenme eğrisi başlangıçta dik görünebilir, özellikle LCEL (LangChain Expression Language) ve yeni modüler yapıya alışmak zaman alıyor. Ancak bir kez kavradığında, karmaşık AI iş akışlarını son derece hızlı şekilde hayata geçirebiliyorsun. Sysadmin perspektifinden bakıldığında log analizi, otomatik raporlama, akıllı monitoring alertleri ve dokümantasyon üretimi gibi konularda LangChain gerçekten işe yarıyor.

Bir sonraki yazıda RAG (Retrieval Augmented Generation) konusunu ele alacağım. Kendi sistem dökümanlarını, runbook’larını ve hata çözüm rehberlerini bir vektör veritabanına yükleyip yapay zekanın bunları kullanarak soruları yanıtlamasını sağlayacağız. Bu, gerçekten işe yarar bir bilgi tabanı asistanı oluşturmanın temelini oluşturuyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir