LangChain + Ollama

Yerel AI modellerle güçlü uygulamalar geliştirin.
LangChain framework'ü ve Ollama ile modern AI çözümleri.

from langchain_ollama import OllamaLLM
llm = OllamaLLM(model="llama3.2")
response = llm.invoke("Merhaba AI!")

LangChain ve Ollama Nedir?

LangChain, büyük dil modelleri (LLM) ile uygulama geliştirmeyi kolaylaştıran açık kaynaklı bir framework'tür. Karmaşık AI uygulamaları oluşturmanızı sağlayan modüler bir yapı sunar.

Ollama ise AI modellerini yerel makinenizde çalıştırmanızı sağlayan bir platformdur. İnternet bağlantısı olmadan, veri gizliliğinizi koruyarak AI modellerini kullanabilirsiniz.

Neden LangChain + Ollama?
  • • Veri gizliliği ve güvenlik
  • • İnternet bağımlılığı yok
  • • Maliyet kontrolü
  • • Hızlı geliştirme süreci
  • • Özelleştirilebilir AI çözümleri
Kullanıcı Uygulaması
Python, Web App, API
LangChain
Orchestration, Chains, Agents
Ollama
Local LLM Runtime
AI Modelleri
Llama, Mistral, CodeLlama
Temel Kavramlar
LLM: Büyük Dil Modeli - Doğal dil işleme için eğitilmiş AI modeli
Chain: Birden fazla adımı birleştiren işlem zinciri
Agent: Karar verebilen ve araç kullanabilen AI sistemi
RAG: Retrieval-Augmented Generation - Bilgi tabanlı yanıt üretimi

Sistem Kurulumu

LangChain ve Ollama kurulumu için gerekli adımları takip edelim. Önce sistem gereksinimlerini kontrol edin.

Sistem Gereksinimleri:
• Python 3.8 veya üzeri
• Minimum 8GB RAM (16GB önerilir)
• 10GB+ boş disk alanı
• GPU isteğe bağlı (hızlandırma için)
1

Python Sanal Ortam Oluşturma

python -m venv langchain_env
source langchain_env/bin/activate # Linux/Mac
langchain_env\Scripts\activate # Windows
2

LangChain Kütüphaneleri

pip install langchain langchain-ollama langchain-community
pip install chromadb sentence-transformers
3

Ollama İndirme ve Kurma

Ollama'yı resmi sitesinden indirin: ollama.ai

# Linux için
curl -fsSL https://ollama.ai/install.sh | sh
Kurulum Testi: Kurulumun başarılı olup olmadığını test etmek için:
ollama --version ve python -c "import langchain; print('OK')"

LangChain Temel Bileşenleri

LangChain'in temel bileşenlerini öğrenerek AI uygulamaları geliştirmek için güçlü bir temel oluşturalım.

LangChain Ana Bileşenleri:
  • LLMs: Dil modeli wrapper'ları
  • Prompts: Şablon ve prompt yönetimi
  • Chains: İşlem zinciri oluşturma
  • Agents: Karar verici AI sistemler
  • Memory: Konuşma geçmişi yönetimi
  • Callbacks: İzleme ve logging

LLM Wrapper Örneği:

import time
from langchain_ollama import OllamaLLM

# Test edilecek modeller
models_to_test = [
    "llama3.2",
    "mistral",
    "phi3",
    "codellama"
]

# Test soruları
test_questions = [
    "Python'da liste comprehension nedir? Örnek ver.",
    "Machine Learning nedir? Kısaca açıkla.",
    "Fibonacci serisi için Python kodu yaz.",
    "Türkiye'nin başkenti neresidir?"
]

def test_model_performance(model_name):
    try:
        llm = OllamaLLM(model=model_name, temperature=0.3)
        results = []
        
        for question in test_questions:
            start_time = time.time()
            response = llm.invoke(question)
            end_time = time.time()
            
            results.append({
                'question': question,
                'response': response[:100] + "..." if len(response) > 100 else response,
                'time': round(end_time - start_time, 2),
                'length': len(response)
            })
        
        return results
        
    except Exception as e:
        return f"Hata: {e}"

# Modelleri test et
print("🧪 Model Performans Testi Başlıyor...\n")

for model in models_to_test:
    print(f"🤖 {model.upper()} Test Ediliyor:")
    results = test_model_performance(model)
    
    if isinstance(results, str):
        print(f"   {results}\n")
        continue
    
    total_time = sum(r['time'] for r in results)
    avg_length = sum(r['length'] for r in results) / len(results)
    
    print(f"   ⏱️  Toplam Süre: {total_time}s")
    print(f"   📝 Ortalama Cevap Uzunluğu: {avg_length:.0f} karakter")
    print(f"   📊 Yanıt Hızı: {avg_length/total_time:.0f} kar/sn\n")
Benchmark Notları:
• İlk çalışma yavaş olabilir (model yükleme)
• Sistem kaynaklarına bağlı sonuçlar
• Çevrimdışı test - internet bağlantısı gerektirmez
• GPU varsa performans artışı gözlemlenebilir

Türkçe Dil Performansı Testi:

# Türkçe spesifik testler
turkish_tests = [
    "Osmanlı İmparatorluğu ne zaman kuruldu?",
    "Türkçe'de 'yapay zeka' terimini açıkla.",
    "İstanbul'un tarihi semtlerini say.",
    "Türk edebiyatından ünlü şairler kimler?"
]

def evaluate_turkish_quality(model_name):
    llm = OllamaLLM(model=model_name, temperature=0.2)
    
    quality_scores = []
    
    for question in turkish_tests:
        response = llm.invoke(question)
        
        # Basit kalite metrikleri
        turkish_words = ["ve", "bir", "bu", "olan", "için", "ile"]
        turkish_score = sum(1 for word in turkish_words if word in response.lower()) / len(turkish_words)
        
        quality_scores.append({
            'question': question,
            'response_preview': response[:150] + "...",
            'turkish_score': turkish_score,
            'coherent': len(response) > 50 and "?" not in response[:20]
        })
    
    return quality_scores

# En iyi modeli bul
print("🇹🇷 Türkçe Dil Performansı:")
best_model = None
best_score = 0

for model in ["llama3.2", "mistral"]:  # En yaygın modeller
    try:
        scores = evaluate_turkish_quality(model)
        avg_score = sum(s['turkish_score'] for s in scores) / len(scores)
        coherence = sum(s['coherent'] for s in scores) / len(scores)
        
        total_score = (avg_score + coherence) / 2
        
        print(f"\n{model}:")
        print(f"  Türkçe Skoru: {avg_score:.2f}")
        print(f"  Tutarlılık: {coherence:.2f}")
        print(f"  Toplam: {total_score:.2f}")
        
        if total_score > best_score:
            best_score = total_score
            best_model = model
            
    except Exception as e:
        print(f"{model}: Test edilemedi - {e}")

if best_model:
    print(f"\n🏆 En İyi Türkçe Model: {best_model} (Skor: {best_score:.2f})")
Model Boyut Hız Türkçe Kod Önerilen Kullanım
llama3.2 4.7GB ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ Genel amaçlı, başlangıç
mistral 4.1GB ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ Analiz, yazma görevleri
codellama 3.8GB ⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐⭐ Programlama, kod üretimi
phi3 2.3GB ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐ Hızlı cevaplar, düşük kaynak
Model Seçim Tavsiyeleri:
• Başlangıç: llama3.2 (iyi denge)
• Kod geliştirme: codellama
• Hız odaklı: phi3
• Analiz/yazma: mistral
• Türkçe odaklı: llama3.2

İleri Düzey Konular ve Özel Teknikler

LangChain ve Ollama ile profesyonel AI uygulamaları geliştirmek için ileri düzey teknikleri keşfedelim.

1. Custom Output Parser (Özel Çıktı Ayrıştırıcı):

from langchain_core.output_parsers import BaseOutputParser
from langchain_core.exceptions import OutputParserException
import json
import re

class StructuredResponseParser(BaseOutputParser):
    """JSON formatında yapılandırılmış yanıt ayrıştırıcısı"""
    
    def parse(self, text: str) -> dict:
        try:
            # JSON'u metinden çıkar
            json_match = re.search(r'\{.*\}', text, re.DOTALL)
            if json_match:
                json_str = json_match.group()
                return json.loads(json_str)
            else:
                # JSON bulunamazsa basit parsing
                lines = text.strip().split('\n')
                result = {}
                for line in lines:
                    if ':' in line:
                        key, value = line.split(':', 1)
                        result[key.strip().lower()] = value.strip()
                return result
                
        except Exception as e:
            raise OutputParserException(f"Parsing hatası: {e}")
    
    def get_format_instructions(self) -> str:
        return """Yanıtını şu JSON formatında ver:
{
  "konu": "ana konu",
  "özet": "kısa özet",
  "anahtar_kelimeler": ["kelime1", "kelime2"],
  "güvenilirlik": 0.9
}"""

# Özel parser ile chain
parser = StructuredResponseParser()

structured_prompt = PromptTemplate(
    template="""Verilen metni analiz et ve yapılandırılmış bilgi çıkar.

Metin: {text}

{format_instructions}

Analiz:""",
    input_variables=["text"],
    partial_variables={"format_instructions": parser.get_format_instructions()}
)

llm = OllamaLLM(model="llama3.2", temperature=0.3)
structured_chain = structured_prompt | llm | parser

# Test
sample_text = """
LangChain, Python ve JavaScript ile AI uygulamaları geliştirmek için 
kullanılan açık kaynak bir framework'tür. Büyük dil modellerini 
uygulamalara entegre etmeyi kolaylaştırır ve modüler yapısı sayesinde 
karmaşık AI iş akışları oluşturmanıza olanak tanır.
"""

result = structured_chain.invoke({"text": sample_text})
print("Yapılandırılmış Analiz:")
print(json.dumps(result, ensure_ascii=False, indent=2))

2. Callback System (Geri Çağırım Sistemi):

from langchain_core.callbacks import BaseCallbackHandler
from langchain_core.outputs import LLMResult
import logging

class DetailedCallbackHandler(BaseCallbackHandler):
    """Detaylı callback handler - logging ve monitoring için"""
    
    def __init__(self):
        self.start_time = None
        self.token_count = 0
        self.call_count = 0
    
    def on_llm_start(self, serialized, prompts, **kwargs):
        import time
        self.start_time = time.time()
        self.call_count += 1
        print(f"🤖 LLM Başladı (Çağrı #{self.call_count})")
        print(f"   Prompt: {prompts[0][:100]}...")
    
    def on_llm_end(self, response: LLMResult, **kwargs):
        import time
        end_time = time.time()
        duration = end_time - self.start_time
        
        if response.generations:
            output = response.generations[0][0].text
            self.token_count += len(output.split())
            
            print(f"✅ LLM Tamamlandı")
            print(f"   Süre: {duration:.2f}s")
            print(f"   Token: ~{len(output.split())} kelime")
            print(f"   Hız: {len(output.split())/duration:.1f} kelime/sn")
    
    def on_llm_error(self, error, **kwargs):
        print(f"❌ LLM Hatası: {error}")

# Callback handler'ı kullan
callback_handler = DetailedCallbackHandler()

monitored_llm = OllamaLLM(
    model="llama3.2", 
    temperature=0.7,
    callbacks=[callback_handler]
)

# Test
print("📊 Callback Monitoring Testi:\n")

questions = [
    "Python'da exception handling nasıl yapılır?",
    "REST API nedir?",
    "Database indexing nasıl çalışır?"
]

for i, question in enumerate(questions, 1):
    print(f"\n--- Soru {i} ---")
    response = monitored_llm.invoke(question)
    print(f"Cevap: {response[:100]}...\n")

print(f"📈 Toplam Statistics:")
print(f"   Toplam Çağrı: {callback_handler.call_count}")
print(f"   Toplam Token: ~{callback_handler.token_count}")

3. Async Processing (Asenkron İşleme):

import asyncio
from langchain_ollama import OllamaLLM

async def async_llm_call(llm, prompt, task_id):
    """Asenkron LLM çağrısı"""
    print(f"🚀 Task {task_id} başladı")
    
    # Sync çağrıyı async wrapper içinde çalıştır
    loop = asyncio.get_event_loop()
    result = await loop.run_in_executor(None, llm.invoke, prompt)
    
    print(f"✅ Task {task_id} tamamlandı")
    return {'task_id': task_id, 'result': result}

async def batch_process_questions():
    """Çoklu soruları paralel işle"""
    llm = OllamaLLM(model="phi3", temperature=0.3)  # Hızlı model
    
    questions = [
        "Python'da decorators nedir?",
        "Git merge vs rebase farkı?",
        "Docker container nedir?",
        "API rate limiting nasıl yapılır?"
    ]
    
    # Tüm görevleri paralel başlat
    tasks = []
    for i, question in enumerate(questions):
        task = async_llm_call(llm, question, i+1)
        tasks.append(task)
    
    # Tüm görevlerin tamamlanmasını bekle
    start_time = asyncio.get_event_loop().time()
    results = await asyncio.gather(*tasks)
    end_time = asyncio.get_event_loop().time()
    
    print(f"\n⏱️  Toplam Süre: {end_time - start_time:.2f} saniye")
    print(f"📊 İşlenen Soru: {len(results)}")
    
    return results

# Asenkron işlemeyi çalıştır
if __name__ == "__main__":
    print("🔄 Asenkron Batch Processing:\n")
    
    # Event loop'u çalıştır
    results = asyncio.run(batch_process_questions())
    
    print("\n📋 Sonuçlar:")
    for result in results:
        print(f"Task {result['task_id']}: {result['result'][:80]}...")
İleri Düzey Teknikler:
  • Custom Chains: Özel işlem zincirleri
  • Streaming: Real-time yanıt akışı
  • Caching: Yanıt önbellekleme
  • Error Handling: Gelişmiş hata yönetimi
  • Model Switching: Dinamik model değişimi
Production Hazırlığı:
• Logging ve monitoring sistemi kurun
• Rate limiting ve quota yönetimi
• Error recovery ve fallback mekanizmaları
• Model versiyonlama ve deployment
• Güvenlik ve kullanıcı doğrulama
Sonraki Adımlar
Öğrenmeye Devam: LangGraph, AutoGen
UI Framework: Streamlit, Gradio, FastAPI
Deployment: Docker, Kubernetes, Cloud
Monitoring: LangSmith, Weights & Biases

Tebrikler! AI Geliştirici Oldunuz

LangChain ve Ollama ile modern AI uygulamaları geliştirme yolculuğunuz başladı. Bu kapsamlı rehberle yerel AI modellerini kullanarak güçlü çözümler oluşturabilirsiniz.


AI Powered
Akıllı Uygulamalar

Privacy First
Yerel ve Güvenli

Production Ready
Ölçeklenebilir
Sonraki Adımlarınız:
1. Kendi veri setinizle RAG sistemi kurun
2. Spesifik domain için agent geliştirin
3. Web arayüzü ile uygulamanızı paylaşın
4. Performans optimizasyonu yapın
5. Açık kaynak projelere katkıda bulunun

from langchain_ollama import OllamaLLM
# AI'nın gücünü elinizde tutun!
print("Başarılar dileriz! 🚀")

Topluluk ve Destek
Resmi Dokümantasyon: python.langchain.com, ollama.ai
GitHub: LangChain ve Ollama repository'leri
Discord/Forum: Geliştiriciler ile iletişim
YouTube: Video tutorials ve demo'lar
Kaggle/Colab: Shared notebooks ve datasets

Hatırlatma: AI teknolojileri hızla gelişiyor. Sürekli öğrenmeye devam edin, yeni modelleri test edin ve etik kullanımı her zaman ön planda tutun.