{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Hafta 8: Büyük Dil Modelleri (LLM) Temelleri ve Prompt Mühendisliği\n",
        "\n",
        "**Dersin Hedefleri:**\n",
        "1.  Büyük Dil Modellerinin (LLM) ne olduğunu ve geleneksel ML modellerinden temel farklarını anlamak.\n",
        "2.  LLM'lerin arkasındaki anahtar kavramlara (Transformer, Self-Attention, Tokenization) sezgisel bir giriş yapmak.\n",
        "3.  **Prompt Mühendisliği**'nin (Prompt Engineering) ne olduğunu ve neden LLM'lerle çalışmanın temel bir yetkinliği olduğunu kavramak.\n",
        "4.  Temel prompting tekniklerini (Zero-shot, Few-shot) uygulamak.\n",
        "5.  **LiteLLM** kullanarak birden fazla LLM sağlayıcısına (Claude, OpenAI, vb.) tek bir arayüzden erişmek.\n",
        "6.  LLM API parametrelerini (temperature, top_p, max_tokens, vb.) anlamak ve kullanmak.\n",
        "\n",
        "---\n",
        "\n",
        "## 1. Büyük Dil Modeli (LLM) Nedir?\n",
        "\n",
        "Bir Büyük Dil Modeli, devasa miktarda metin verisi üzerinde eğitilmiş, insan dilini anlama, yorumlama, özetleme, çevirme ve üretme konusunda olağanüstü yeteneklere sahip, çok büyük bir sinir ağıdır (genellikle Milyarlarca parametre içerir).\n",
        "\n",
        "**Geleneksel ML Modellerinden Farkları:**\n",
        "\n",
        "| Özellik | Geleneksel ML Modeli (örn. Churn Modeli) | Büyük Dil Modeli (LLM) |\n",
        "| :--- | :--- | :--- |\n",
        "| **Görev** | Tek bir, spesifik görev için eğitilir (örn. sınıflandırma, regresyon). | Çok geniş bir görev yelpazesini yerine getirebilir (genel amaçlı). |\n",
        "| **Girdi/Çıktı** | Genellikle yapısal veri (sayılar, kategoriler) alır, sayı veya etiket döndürür. | Genellikle yapısal olmayan metin alır, metin döndürür. |\n",
        "| **Eğitim** | Göreve özel, genellikle küçük/orta boyutlu veri seti. | İnternet ölçeğinde devasa metin külliyatı. |\n",
        "| **Kullanım** | Eğitilir ve tahmin için kullanılır (`.fit()`, `.predict()`). | Genellikle önceden eğitilmiştir, **prompt**'lar ile yönlendirilir. |\n",
        "\n",
        "---\n",
        "\n",
        "## 2. LLM lere Sezgisel bakış.\n",
        "\n",
        "LLM devrimini mümkün kılan temel mimari **Transformer**'dır. Transformer'ın kalbinde ise **Self-Attention (Öz-Dikkat)** mekanizması yatar.\n",
        "\n",
        "### 2.1 Temel Kavramlar\n",
        "\n",
        "- **Tokenization:** LLM'ler kelimelerle çalışmaz. Girdi metnini, `token` adı verilen daha küçük parçalara (kelimeler, kelime parçaları veya karakterler) ayırırlar. Her token, bir sayısal ID'ye eşlenir.\n",
        "  - Örnek: \"Merhaba dünya\" → [\"Mer\", \"haba\", \" dün\", \"ya\"] (yaklaşık)\n",
        "\n",
        "- **Embeddings:** Her token, anlamını ve bağlamını temsil eden yüksek boyutlu bir vektöre (embedding) dönüştürülür. \"Kral\" ve \"Kraliçe\" vektörleri birbirine yakınken, \"elma\" vektörü uzak olacaktır.\n",
        "\n",
        "- **Self-Attention:** Bu, Transformer mimarisinin en önemli kısmıdır. Modelin, bir kelimenin anlamını çözerken cümlenin diğer hangi kelimelerinin daha önemli olduğuna \"dikkat etmesini\" sağlar.\n",
        "  - *Örnek:* \"Kedi, mamasını yedi çünkü **o** açtı.\" cümlesinde, \"o\" zamirinin \"kedi\"ye mi yoksa \"mama\"ya mı atıfta bulunduğunu anlamak için attention mekanizması \"kedi\" kelimesine daha yüksek bir dikkat skoru atar.\n",
        "\n",
        "Bu mekanizma, LLM'lerin uzun metinlerdeki bağlamı çok iyi korumasını sağlar.\n",
        "\n",
        "---\n",
        "\n",
        "## 3. Prompt Mühendisliği: LLM ile \"Konuşma\" Sanatı\n",
        "\n",
        "Geleneksel modelleri kodla yönlendiririz. LLM'leri ise **doğal dil ile yönlendiririz**. Modele ne yapmasını istediğimizi anlattığımız bu girdi metnine **prompt** denir.\n",
        "\n",
        "**Prompt Mühendisliği**, belirli bir görevi yerine getirmesi için bir LLM'e en etkili ve doğru prompt'u tasarlama sürecidir. Çıktının kalitesi, doğrudan prompt'un kalitesine bağlıdır.\n",
        "\n",
        "### 3.1 Temel Prompting Teknikleri\n",
        "\n",
        "**a) Zero-Shot Prompting:** Modele, daha önce hiç görmediği bir görevi, sadece talimat vererek yaptırmak. Model, genel dünya bilgisine dayanarak görevi çözmeye çalışır.\n",
        "\n",
        "**b) Few-Shot Prompting:** Modele, görevi nasıl yapması gerektiğine dair birkaç örnek (`shot`) vererek onu yönlendirmek. Bu, modelin istenen çıktı formatını ve mantığını anlamasına yardımcı olur.\n",
        "\n",
        "**c) Chain-of-Thought (CoT) Prompting:** Karmaşık problemlerde modelden adım adım düşünmesini istemek. Bu yaklaşım, modelin mantık yürütme yeteneğini önemli ölçüde artırır.\n",
        "\n",
        "---\n",
        "\n",
        "## 4. LiteLLM Framework'ü: Nedir ve Neden Kullanıyoruz?\n",
        "\n",
        "### 4.1 LiteLLM Nedir?\n",
        "\n",
        "**LiteLLM**, farklı LLM sağlayıcılarına (OpenAI, Anthropic Claude, Google Gemini, HuggingFace, vb.) **tek bir tutarlı arayüzle** erişmenizi sağlayan bir Python kütüphanesidir.\n",
        "\n",
        "### 4.2 Neden LiteLLM Kullanıyoruz?\n",
        "\n",
        "| Özellik | LiteLLM ile | LiteLLM Olmadan |\n",
        "| :--- | :--- | :--- |\n",
        "| **Tek API Arayüzü** | Tüm sağlayıcılar için aynı `completion()` fonksiyonu | Her sağlayıcı için farklı SDK ve fonksiyonlar |\n",
        "| **Model Değiştirme** | Sadece model adını değiştir: `\"claude-3-opus-20240229\"` → `\"gpt-4\"` | Tüm kodu yeniden yaz |\n",
        "| **Hata Yönetimi** | Otomatik retry, fallback desteği | Manuel hata yönetimi gerekli |\n",
        "| **Maliyet Takibi** | Yerleşik maliyet hesaplama | Manuel hesaplama gerekli |\n",
        "| **Öğrenme Kolaylığı** | Bir kez öğren, her yerde kullan | Her API için ayrı dokümantasyon |\n",
        "\n",
        "### 4.3 Ne Yapıyoruz? Nasıl Yapıyoruz?\n",
        "\n",
        "**Ne Yapıyoruz:**\n",
        "- LiteLLM ile Claude (Anthropic) API'sine bağlanıyoruz\n",
        "- Farklı prompt teknikleri (zero-shot, few-shot, CoT) uyguluyoruz\n",
        "- API parametrelerini (temperature, top_p, vb.) test ediyor ve etkilerini gözlemliyoruz\n",
        "- Gerçek dünya senaryoları için örnek use case'ler geliştiriyoruz\n",
        "\n",
        "**Nasıl Yapıyoruz:**\n",
        "1. LiteLLM'i `pip install litellm` ile kuruyoruz\n",
        "2. API anahtarımızı güvenli bir şekilde (environment variable) tanımlıyoruz\n",
        "3. `litellm.completion()` fonksiyonunu kullanarak LLM'e sorgu gönderiyoruz\n",
        "4. Parametreleri değiştirerek farklı sonuçlar elde ediyoruz\n",
        "\n",
        "---\n",
        "\n",
        "## 5. LLM API Parametreleri: Detaylı Rehber\n",
        "\n",
        "LLM API'leri çağırırken kullandığımız parametreler, modelin davranışını ve çıktı kalitesini doğrudan etkiler. İşte en önemli parametreler:\n",
        "\n",
        "| Parametre | Ne İşe Yarar? | Ne Yapıyoruz? | Ne Yapmıyoruz? | Önerilen Değerler |\n",
        "| :--- | :--- | :--- | :--- | :--- |\n",
        "| **temperature** | Çıktının **rastgelelik/yaratıcılık** derecesini kontrol eder. Düşük değer → daha deterministik, yüksek değer → daha yaratıcı/çeşitli | **Yaratıcı görevler** (hikaye yazma, beyin fırtınası) için `0.7-1.0` kullanıyoruz. **Doğruluk gereken görevler** (kod, veri çıkarma) için `0.0-0.3` kullanıyoruz. | `1.0`'dan büyük değerler kullanmıyoruz (tutarsız sonuçlar). Mantıksal görevlerde yüksek temperature kullanmıyoruz. | Yaratıcı: `0.8`, Hassas: `0.2` |\n",
        "| **top_p** (nucleus sampling) | Token seçiminde kullanılan **kümülatif olasılık eşiği**. Örneğin `0.9`, en olası token'ların %90'ını içeren setten seçer. | `temperature` ile **birlikte değil, alternatif olarak** kullanıyoruz. Daha kontrollü çeşitlilik için `0.9-0.95` tercih ediyoruz. | `temperature` ve `top_p`'yi aynı anda optimize etmiyoruz (birini sabit tutuyoruz). | Genelde: `0.9-0.95` veya `1.0` (devre dışı) |\n",
        "| **max_tokens** | Model tarafından **üretilecek maksimum token sayısı** (kelime sayısı değil!). | Yanıt uzunluğunu **sınırlandırmak** için kullanıyoruz. Maliyeti kontrol etmek için belirli bir üst limit koyuyoruz. | Çok kısa (`max_tokens=10`) ayarlamıyoruz (yanıt kesilir). Gereksiz yere çok yüksek değerler kullanmıyoruz (maliyet artar). | Kısa: `256`, Orta: `1024`, Uzun: `4096` |\n",
        "| **stop** | Modelin çıktı üretmeyi **durdurması gereken** token/string dizisi. | Belirli bir formatta output almak için ayırıcılar kullanıyoruz (örn. `stop=[\"\\n\\n\", \"###\"]`). | Çok yaygın kelimeler kullanmıyoruz (output erken kesilir). | Özel: `[\"END\", \"---\"]` |\n",
        "| **presence_penalty** | Zaten **mevcut token'ların tekrar edilmesini** azaltır (`-2.0` ile `2.0` arası). Pozitif değer → tekrarları azaltır. | Tekrarlayan metinleri önlemek için `0.5-1.0` kullanıyoruz. | Negatif değerler kullanmıyoruz (tekrarları artırır, genelde istenmeyen). | Tekrar önleme: `0.6` |\n",
        "| **frequency_penalty** | Token'ların **frekansına göre** tekrar edilmesini azaltır. Daha agresif çeşitlilik sağlar. | Daha çeşitli kelime seçimi için `0.5-1.0` kullanıyoruz. | Çok yüksek değerler (`1.5+`) kullanmıyoruz (anlamsız kelime seçimleri). | Çeşitlilik: `0.5` |\n",
        "| **n** | **Kaç farklı yanıt** üretileceğini belirtir. | Birden fazla alternatif görmek için `n=3-5` kullanıyoruz. | Yüksek `n` değerleriyle yüksek `max_tokens` birleştirmiyoruz (çok pahalı). | Alternatifler: `3` |\n",
        "| **stream** | Yanıtın **token token (akış şeklinde)** gelmesini sağlar (ChatGPT gibi). | Kullanıcı deneyimi için gerçek zamanlı çıktı gösteriyoruz. | Stream'i senkron işlemlerde kullanmıyoruz (karmaşıklık). | Boolean: `True/False` |\n",
        "| **functions** / **tools** | Model için **kullanabileceği fonksiyonları** tanımlar (function calling). | API çağrıları, veritabanı sorguları için fonksiyon tanımlıyoruz. | Çok karmaşık fonksiyonlar tanımlamıyoruz (model yanılabilir). | JSON Schema formatında |\n",
        "| **response_format** | Çıktının **formatını** belirler (örn. JSON). | Yapısal veri çıkarma için `{\"type\": \"json_object\"}` kullanıyoruz. | JSON formatı zorunlu kılınca prompt'ta da bunu belirtmiyorsak hata alırız. | `{\"type\": \"json_object\"}` |\n",
        "\n",
        "### 5.1 Parametreler Arası İlişkiler\n",
        "\n",
        "- **`temperature` vs `top_p`:** İkisi de randomness kontrol eder. Genellikle birini varsaylanda bırakın.\n",
        "- **`max_tokens` vs Maliyet:** Daha fazla token = daha yüksek maliyet. İhtiyacınız kadar kullanın.\n",
        "- **`presence_penalty` vs `frequency_penalty`:** İkisi de tekrarları azaltır, ancak frequency daha agresif"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "from google.colab import drive\n",
        "drive.mount('/content/drive')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# Gerekli Kütüphanelerin Kurulumu\n",
        "# LiteLLM: Tek bir API ile birden fazla LLM sağlayıcısına erişim\n",
        "!pip install -q litellm python-dotenv"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 4. Daha İyi Promptlar için İpuçları: Rol Atama ve Adım Adım Düşünme\n",
        "\n",
        "**a) Rol Atama (Role Prompting):** Modele bir \"kişilik\" veya \"uzmanlık alanı\" atamak, genellikle daha odaklı ve kaliteli yanıtlar üretmesini sağlar.\n",
        "\n",
        "**b) Adım Adım Düşünme (Chain-of-Thought Prompting):** Karmaşık bir problemi çözerken, modelden doğrudan cevabı değil, cevaba giden adımları da düşünmesini istemek, modelin mantık yürütme yeteneğini önemli ölçüde artırır. Bu genellikle \"Let's think step by step.\" (Adım adım düşünelim.) ifadesi eklenerek yapılır.\n",
        "\n",
        "### Alıştırma: Kendi Promptlarınızı Tasarlayın\n",
        "\n",
        "1.  **Rol Atama Alıştırması:**\n",
        "    *   Bir metin bloğu oluşturun: `\"TechCorp, dün yaptığı açıklamada, yeni nesil yapay zeka çipi 'QuantumLeap'i piyasaya sürdüğünü duyurdu. Şirketin hisseleri duyurunun ardından %15 değer kazandı.\"`\n",
        "    *   **İlk Prompt (Rol Atamadan):** `\"\"\"Bu metinden şirket adını çıkar: [Metin Buraya]\"\"\"`\n",
        "    *   **İkinci Prompt (Rol Atamayla):** `\"\"\"Sen bir finansal analistsin. Görevin, aşağıdaki metindeki ana şirket adını çıkarmak. Metin: [Metin Buraya]\"\"\"`\n",
        "    *   İki prompt arasındaki yanıt farkını (veya kalitesini) gözlemleyin. (Simülasyon fonksiyonunu bu senaryoyu içerecek şekilde güncelleyebilirsiniz).\n",
        "\n",
        "2.  **Zero-Shot vs. Few-Shot Alıştırması:**\n",
        "    *   Göreviniz, İngilizce bir cümleyi Fransızcaya çevirmek.\n",
        "    *   **Zero-Shot Prompt:** `\"\"\"Translate this sentence to French: The cat is sitting on the mat.\"\"\"`\n",
        "    *   **Few-Shot Prompt:**\n",
        "        ```\n",
        "        Translate English to French.\n",
        "\n",
        "        English: \"Hello\" -> French: \"Bonjour\"\n",
        "        English: \"How are you?\" -> French: \"Comment ça va?\"\n",
        "        English: \"The cat is sitting on the mat.\" -> French:\n",
        "        ```\n",
        "    *   Modele örnekler vermenin, görevi daha iyi anlamasına nasıl yardımcı olduğunu tartışın."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "import os\n",
        "import sys\n",
        "from getpass import getpass\n",
        "import litellm\n",
        "from litellm import completion\n",
        "\n",
        "\"\"\"\n",
        "## 6. Kurulum ve API Anahtarı Yapılandırması\n",
        "\n",
        "Bu bölümde LiteLLM'i kuruyoruz ve API anahtarını yapılandırıyoruz.\n",
        "\n",
        "### 6.1 API Anahtarı Nasıl Alınır?\n",
        "\n",
        "1. **Claude API Key (Anthropic):** https://console.anthropic.com/\n",
        "   - Hesap oluşturun veya giriş yapın\n",
        "   - \"API Keys\" bölümüne gidin\n",
        "   - \"Create Key\" ile yeni bir anahtar oluşturun\n",
        "   - Anahtarınız `sk-ant-...` formatında başlar\n",
        "\n",
        "2. **OpenAI API Key:** https://platform.openai.com/api-keys\n",
        "   - Hesap oluşturun veya giriş yapın\n",
        "   - \"Create new secret key\" ile anahtar oluşturun\n",
        "   - Anahtarınız `sk-...` formatında başlar\n",
        "\n",
        "3. **Google Gemini API Key:** https://makersuite.google.com/app/apikey\n",
        "   - Google hesabınızla giriş yapın\n",
        "   - \"Create API key\" ile anahtar oluşturun\n",
        "\n",
        "4. **Cohere API Key:** https://dashboard.cohere.com/api-keys\n",
        "   - Hesap oluşturun veya giriş yapın\n",
        "   - API key oluşturun\n",
        "\n",
        "### 6.2 Güvenli API Anahtarı Yönetimi\n",
        "\n",
        "**ÖNEMLİ:** API anahtarlarınızı asla kodun içine yazmayın!\n",
        "Environment variable kullanın veya `.env` dosyası oluşturun.\n",
        "\"\"\"\n",
        "\n",
        "\n",
        "\n",
        "# --- Çıktı Görünümünü İyileştir ---\n",
        "litellm.set_verbose = False  # Debug log'larını kapat\n",
        "\n",
        "# --- API Anahtarını Yapılandırma ---\n",
        "# LiteLLM birden fazla sağlayıcıyı destekler. Environment variable'lardan kontrol et:\n",
        "# - ANTHROPIC_API_KEY: Claude modelleri için\n",
        "# - OPENAI_API_KEY: OpenAI modelleri için\n",
        "# - GEMINI_API_KEY veya GOOGLE_API_KEY: Google Gemini için (ÖNERİLEN - ücretsiz kullanım mevcut)\n",
        "# - COHERE_API_KEY: Cohere modelleri için\n",
        "\n",
        "# Ortam değişkenlerini kontrol et (LiteLLM bunları otomatik olarak kullanır)\n",
        "has_anthropic = os.environ.get(\"ANTHROPIC_API_KEY\") or os.environ.get(\"CLAUDE_API_KEY\")\n",
        "has_openai = os.environ.get(\"OPENAI_API_KEY\")\n",
        "has_gemini = os.environ.get(\"GEMINI_API_KEY\") or os.environ.get(\"GOOGLE_API_KEY\")\n",
        "has_cohere = os.environ.get(\"COHERE_API_KEY\")\n",
        "\n",
        "if not any([has_anthropic, has_openai, has_gemini, has_cohere]):\n",
        "    print(\"⚠️  API anahtarı bulunamadı!\")\n",
        "    print(\"\\nLütfen kullanmak istediğiniz sağlayıcının API anahtarını girin:\")\n",
        "    print(\"  - Gemini için (ÖNERİLEN): GEMINI_API_KEY\")\n",
        "    print(\"  - Claude için: ANTHROPIC_API_KEY\")\n",
        "    print(\"  - OpenAI için: OPENAI_API_KEY\")\n",
        "    print(\"  - Cohere için: COHERE_API_KEY\")\n",
        "\n",
        "    provider = input(\"\\nHangi sağlayıcıyı kullanacaksınız? (gemini/anthropic/openai/cohere): \").lower().strip()\n",
        "    api_key = getpass(\"API Key: \")\n",
        "\n",
        "    # Uygun environment variable'ı ayarla\n",
        "    if provider == \"anthropic\":\n",
        "        os.environ[\"ANTHROPIC_API_KEY\"] = api_key\n",
        "        has_anthropic = True\n",
        "    elif provider == \"openai\":\n",
        "        os.environ[\"OPENAI_API_KEY\"] = api_key\n",
        "        has_openai = True\n",
        "    elif provider == \"gemini\":\n",
        "        os.environ[\"GEMINI_API_KEY\"] = api_key\n",
        "        has_gemini = True\n",
        "    elif provider == \"cohere\":\n",
        "        os.environ[\"COHERE_API_KEY\"] = api_key\n",
        "        has_cohere = True\n",
        "    else:\n",
        "        print(\"⚠️  Geçersiz sağlayıcı. Gemini varsayılan olarak kullanılacak.\")\n",
        "        os.environ[\"GEMINI_API_KEY\"] = api_key\n",
        "        has_gemini = True\n",
        "\n",
        "\n",
        "# --- Varsayılan Model Seçimi ---\n",
        "# Ortamda hangi API key varsa ona uygun varsayılan modeli seç\n",
        "def get_default_model():\n",
        "    \"\"\"\n",
        "    Mevcut API anahtarlarına göre varsayılan model seçer.\n",
        "    \n",
        "    Öncelik sırası: Gemini > Anthropic > OpenAI > Cohere\n",
        "    (Gemini ücretsiz kullanım sunduğu için öğrenciler için varsayılan)\n",
        "    \n",
        "    Returns:\n",
        "        str: Varsayılan model adı (doğru prefix ile)\n",
        "    \"\"\"\n",
        "    if has_gemini:\n",
        "        # Gemini 2.5 Flash - Hızlı, güçlü ve ücretsiz kullanım mevcut\n",
        "        # ÖNEMLI: gemini/ prefix GEREKLİ!\n",
        "        return \"gemini/gemini-2.5-flash\"\n",
        "    elif has_anthropic:\n",
        "        # Claude Sonnet 4 - Güçlü ve dengeli (Mayıs 2025)\n",
        "        return \"claude-sonnet-4-20250514\"\n",
        "    elif has_openai:\n",
        "        # GPT-4o mini - Hızlı ve uygun maliyetli\n",
        "        return \"gpt-4o-mini\"\n",
        "    elif has_cohere:\n",
        "        # Command R - Dengeli model\n",
        "        # ÖNEMLI: cohere_chat/ prefix GEREKLİ!\n",
        "        return \"cohere_chat/command-r-08-2024\"\n",
        "    else:\n",
        "        # Hiçbir key yoksa, kullanıcıya uyarı verecek\n",
        "        return None\n",
        "\n",
        "DEFAULT_MODEL = get_default_model()\n",
        "\n",
        "if DEFAULT_MODEL:\n",
        "    print(f\"\\n✅ Varsayılan model: {DEFAULT_MODEL}\")\n",
        "else:\n",
        "    print(\"\\n⚠️  Hiçbir API anahtarı bulunamadı. Lütfen bir API anahtarı ekleyin.\")\n",
        "\n",
        "\n",
        "# --- Helper Fonksiyon: LLM Çağrısı ---\n",
        "def call_llm(messages, model=None, temperature=0.7, max_tokens=1024, **kwargs):\n",
        "    \"\"\"\n",
        "    LiteLLM ile LLM çağrısı yapar.\n",
        "\n",
        "    Args:\n",
        "        messages (list): Mesaj listesi [{\"role\": \"user\", \"content\": \"...\"}]\n",
        "        model (str, optional): Kullanılacak model adı. None ise varsayılan model kullanılır.\n",
        "            \n",
        "            ÖNEMLI - Model Adlandırma Kuralları:\n",
        "            =====================================\n",
        "            - Gemini: \"gemini/\" prefix GEREKLİ\n",
        "            - Cohere: \"cohere_chat/\" prefix GEREKLİ\n",
        "            - Anthropic/OpenAI: Prefix opsiyonel\n",
        "            \n",
        "            Desteklenen modeller (2025):\n",
        "            \n",
        "            Google Gemini (ÖNERİLEN - ücretsiz kullanım mevcut):\n",
        "            - \"gemini/gemini-2.5-flash\" - Hızlı ve güçlü (varsayılan)\n",
        "            - \"gemini/gemini-2.5-pro\" - Production için önerilen\n",
        "            - \"gemini/gemini-2.5-flash-lite\" - Mobil ve embedded için\n",
        "            - \"gemini/gemini-2.0-flash\" - Eski nesil flash\n",
        "            \n",
        "            Claude (Anthropic):\n",
        "            NOT: Model adlarında tarih soneki (YYYYMMDD) bulunmalıdır!\n",
        "            - \"claude-sonnet-4-5-20250929\" - En son flagship model (Eylül 2025)\n",
        "            - \"claude-opus-4-1-20250805\" - Kompleks görevler (Ağustos 2025)\n",
        "            - \"claude-sonnet-4-20250514\" - Dengeli model (Mayıs 2025)\n",
        "            - \"claude-3-7-sonnet-20250219\" - Hybrid reasoning (Şubat 2025)\n",
        "            - \"claude-3-5-sonnet-20241022\" - Önceki nesil (Ekim 2024)\n",
        "            - \"claude-3-haiku-20240307\" - Hızlı ve ekonomik\n",
        "            \n",
        "            OpenAI:\n",
        "            NOT: Bu modeller henüz yayınlanmamış olabilir. Mevcut modelleri kontrol edin:\n",
        "            - \"gpt-4o\" - En son multimodal model\n",
        "            - \"gpt-4o-mini\" - Hızlı ve ekonomik\n",
        "            - \"gpt-4-turbo\" - Güçlü model\n",
        "            - \"gpt-3.5-turbo\" - Ekonomik seçenek\n",
        "            \n",
        "            Cohere:\n",
        "            - \"cohere_chat/command-r-08-2024\" - Dengeli model\n",
        "            - \"cohere_chat/command-r-plus-08-2024\" - Daha güçlü\n",
        "            - \"cohere_chat/command-a-03-2025\" - En güçlü (111B params)\n",
        "            \n",
        "        temperature (float): Rastgelelik derecesi (0.0-1.0)\n",
        "        max_tokens (int): Maksimum token sayısı\n",
        "        **kwargs: Ek parametreler (top_p, stop, vb.)\n",
        "\n",
        "    Returns:\n",
        "        str: Model yanıtı\n",
        "    \"\"\"\n",
        "    # Model belirtilmemişse varsayılan modeli kullan\n",
        "    if model is None:\n",
        "        model = DEFAULT_MODEL\n",
        "        if model is None:\n",
        "            return \"❌ Hata: Hiçbir API anahtarı yapılandırılmamış. Lütfen bir API anahtarı ekleyin.\"\n",
        "    \n",
        "    try:\n",
        "        response = completion(\n",
        "            model=model,\n",
        "            messages=messages,\n",
        "            temperature=temperature,\n",
        "            max_tokens=max_tokens,\n",
        "            **kwargs\n",
        "        )\n",
        "        return response.choices[0].message.content\n",
        "    except Exception as e:\n",
        "        return f\"❌ Hata: {str(e)}\"\n",
        "\n",
        "\n",
        "# --- Test Çağrısı ---\n",
        "print(\"\\n🧪 API bağlantısı test ediliyor...\\n\")\n",
        "\n",
        "test_messages = [\n",
        "    {\"role\": \"user\", \"content\": \"Merhaba! Bu bir test mesajı. Sadece 'Test başarılı!' diye cevap ver.\"}\n",
        "]\n",
        "\n",
        "# Model parametresi belirtmeden çağır (varsayılan model kullanılacak)\n",
        "test_response = call_llm(test_messages, temperature=0.0, max_tokens=50)\n",
        "print(f\"Model Yanıtı: {test_response}\\n\")\n",
        "\n",
        "if \"❌\" not in test_response:\n",
        "    print(\"✅ LiteLLM başarıyla yapılandırıldı! Örneklere geçebiliriz.\\n\")\n",
        "    print(\"💡 İpucu: Farklı bir model kullanmak için call_llm() fonksiyonuna\")\n",
        "    print(\"   model parametresini ekleyin. Örnekler:\")\n",
        "    print(f\"   - call_llm(messages, model='gemini/gemini-2.5-flash')  # Gemini (ücretsiz!)\")\n",
        "    print(f\"   - call_llm(messages, model='claude-sonnet-4-20250514')  # Claude\")\n",
        "    print(f\"   - call_llm(messages, model='gpt-4o-mini')  # OpenAI\")\n",
        "    print(f\"\\n⚠️  NOT: Claude ve OpenAI model adlarını kullanmadan önce\")\n",
        "    print(f\"   yukarıdaki docstring'deki güncel model listesini kontrol edin!\")\n",
        "else:\n",
        "    print(\"⚠️  Bir sorun oluştu. API anahtarınızı kontrol edin.\\n\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "---\n",
        "\n",
        "## 7. Pratik Örnekler: Prompt Teknikleri\n",
        "\n",
        "Şimdi farklı prompt tekniklerini gerçek LLM çağrıları ile uygulayacağız.\n",
        "\n",
        "### 7.1 Zero-Shot Prompting\n",
        "\n",
        "**Ne yapıyoruz:** Modele hiç örnek vermeden, sadece talimat vererek görevi yaptırıyoruz.\n",
        "\n",
        "**Nasıl yapıyoruz:** Görev açıklamasını net ve açık bir şekilde yazıyoruz."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "\"\"\"\n",
        "ÖRNEK 1: Zero-Shot Duygu Analizi\n",
        "---------------------------------\n",
        "Görev: Bir Türkçe cümlenin duygusunu (pozitif/negatif/nötr) belirle.\n",
        "\"\"\"\n",
        "\n",
        "# Prompt oluştur\n",
        "zero_shot_prompt = \"\"\"\n",
        "Görev: Verilen Türkçe metnin duygusunu analiz et ve sadece \"Pozitif\", \"Negatif\" veya \"Nötr\" olarak cevap ver.\n",
        "\n",
        "Metin: \"Bu film kesinlikle harikaydı, oyunculuklar muhteşemdi ve hikaye çok etkileyiciydi!\"\n",
        "\n",
        "Duygu:\n",
        "\"\"\"\n",
        "\n",
        "# LLM'i çağır\n",
        "messages = [{\"role\": \"user\", \"content\": zero_shot_prompt}]\n",
        "\n",
        "print(\"=\" * 60)\n",
        "print(\"ZERO-SHOT PROMPTING ÖRNEĞİ\")\n",
        "print(\"=\" * 60)\n",
        "print(\"\\n📝 Prompt:\")\n",
        "print(zero_shot_prompt)\n",
        "print(\"\\n\" + \"-\" * 60)\n",
        "\n",
        "# Düşük temperature kullanıyoruz (hassas görev)\n",
        "response = call_llm(messages, temperature=0.2, max_tokens=50)\n",
        "\n",
        "print(f\"\\n🤖 Model Yanıtı:\\n{response}\")\n",
        "print(\"\\n\" + \"=\" * 60)\n",
        "\n",
        "# --- İkinci Örnek: Farklı Bir Cümle ---\n",
        "zero_shot_prompt_2 = \"\"\"\n",
        "Görev: Verilen Türkçe metnin duygusunu analiz et ve sadece \"Pozitif\", \"Negatif\" veya \"Nötr\" olarak cevap ver.\n",
        "\n",
        "Metin: \"Uçuşum 3 saat gecikti ve müşteri hizmetleri hiç yardımcı olmadı. Çok sinir bozucuydu!\"\n",
        "\n",
        "Duygu:\n",
        "\"\"\"\n",
        "\n",
        "messages_2 = [{\"role\": \"user\", \"content\": zero_shot_prompt_2}]\n",
        "response_2 = call_llm(messages_2, temperature=0.2, max_tokens=50)\n",
        "\n",
        "print(f\"\\n\\n🧪 İkinci Test:\")\n",
        "print(f\"Metin: 'Uçuşum 3 saat gecikti...'\")\n",
        "print(f\"Model Yanıtı: {response_2}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### 7.2 Few-Shot Prompting\n",
        "\n",
        "**Ne yapıyoruz:** Modele görevi örneklerle öğretiyoruz. Bu, modelin istediğimiz format ve mantığı anlamasına yardımcı olur.\n",
        "\n",
        "**Nasıl yapıyoruz:** Prompt içine 2-5 örnek ekliyoruz (input → output çiftleri)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "\"\"\"\n",
        "ÖRNEK 2: Few-Shot Duygu Analizi\n",
        "--------------------------------\n",
        "Aynı görevi şimdi few-shot yaklaşımı ile yapalım.\n",
        "\"\"\"\n",
        "\n",
        "few_shot_prompt = \"\"\"\n",
        "Aşağıdaki örneklere bakarak, son metnin duygusunu belirle.\n",
        "\n",
        "Metin: \"Yeni aldığım telefonu çok beğendim! Kamerası inanılmaz.\"\n",
        "Duygu: Pozitif\n",
        "\n",
        "Metin: \"Siparişim 2 hafta geç geldi ve ürün hasarlıydı. Çok hayal kırıklığına uğradım.\"\n",
        "Duygu: Negatif\n",
        "\n",
        "Metin: \"Bugün hava bulutlu.\"\n",
        "Duygu: Nötr\n",
        "\n",
        "Metin: \"Restoranda yediğimiz yemek berbattı, bir daha asla gitmem!\"\n",
        "Duygu:\n",
        "\"\"\"\n",
        "\n",
        "messages = [{\"role\": \"user\", \"content\": few_shot_prompt}]\n",
        "\n",
        "print(\"=\" * 60)\n",
        "print(\"FEW-SHOT PROMPTING ÖRNEĞİ\")\n",
        "print(\"=\" * 60)\n",
        "print(\"\\n📝 Prompt (Örneklerle):\")\n",
        "print(few_shot_prompt)\n",
        "print(\"\\n\" + \"-\" * 60)\n",
        "\n",
        "response = call_llm(messages, temperature=0.2, max_tokens=50)\n",
        "\n",
        "print(f\"\\n🤖 Model Yanıtı:\\n{response}\")\n",
        "print(\"\\n\" + \"=\" * 60)\n",
        "\n",
        "# --- Karşılaştırma: Zero-Shot vs Few-Shot ---\n",
        "print(\"\\n\\n📊 KARŞILAŞTIRMA: Zero-Shot vs Few-Shot\")\n",
        "print(\"=\" * 60)\n",
        "print(\"\\nAynı görevi iki farklı teknikle gerçekleştirdik:\")\n",
        "print(\"\\n1. Zero-Shot: Model, hiç örnek görmeden işlemi yaptı.\")\n",
        "print(\"2. Few-Shot: Modele 3 örnek gösterdik, sonra test ettik.\")\n",
        "print(\"\\n💡 Gözlem:\")\n",
        "print(\"   - Few-shot, modelin istediğimiz formatta (tek kelime) cevap vermesini sağladı.\")\n",
        "print(\"   - Zero-shot'ta model bazen daha detaylı açıklama yapabilir.\")\n",
        "print(\"   - Karmaşık görevlerde few-shot genellikle daha başarılıdır.\")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### 7.3 Chain-of-Thought (CoT) Prompting\n",
        "\n",
        "**Ne yapıyoruz:** Karmaşık problemlerde modelden adım adım düşünmesini istiyoruz. Bu, mantık yürütme gerektiren görevlerde başarı oranını önemli ölçüde artırır.\n",
        "\n",
        "**Nasıl yapıyoruz:** Prompt'a \"Adım adım düşün\" veya \"Let's think step by step\" ekliyoruz. Veya örneklerde düşünme sürecini gösteriyoruz."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "\"\"\"\n",
        "ÖRNEK 3: Chain-of-Thought Prompting\n",
        "------------------------------------\n",
        "Görev: Karmaşık bir matematik problemi çözmek.\n",
        "\"\"\"\n",
        "\n",
        "# Önce CoT OLMADAN deneyelim\n",
        "problem = \"\"\"\n",
        "Bir mağazada bir kitap 80 TL. Mağaza %25 indirim yapıyor.\n",
        "Daha sonra indirimli fiyat üzerinden %18 KDV ekliyor.\n",
        "Son fiyat ne kadar olur?\n",
        "\"\"\"\n",
        "\n",
        "# --- Test 1: CoT Olmadan ---\n",
        "prompt_without_cot = f\"\"\"\n",
        "Problemi çöz ve sadece final cevabı ver:\n",
        "\n",
        "{problem}\n",
        "\n",
        "Cevap:\n",
        "\"\"\"\n",
        "\n",
        "messages = [{\"role\": \"user\", \"content\": prompt_without_cot}]\n",
        "response_without_cot = call_llm(messages, temperature=0.0, max_tokens=100)\n",
        "\n",
        "print(\"=\" * 60)\n",
        "print(\"CHAIN-OF-THOUGHT ÖRNEĞİ\")\n",
        "print(\"=\" * 60)\n",
        "print(\"\\n🧪 Test 1: CoT Olmadan (Direkt Cevap İsteme)\")\n",
        "print(\"-\" * 60)\n",
        "print(f\"Model Yanıtı:\\n{response_without_cot}\")\n",
        "\n",
        "# --- Test 2: CoT İLE ---\n",
        "prompt_with_cot = f\"\"\"\n",
        "Aşağıdaki problemi adım adım çöz. Her adımda ne yaptığını açıkla:\n",
        "\n",
        "{problem}\n",
        "\n",
        "Adım adım düşünelim:\n",
        "\"\"\"\n",
        "\n",
        "messages_cot = [{\"role\": \"user\", \"content\": prompt_with_cot}]\n",
        "response_with_cot = call_llm(messages_cot, temperature=0.0, max_tokens=500)\n",
        "\n",
        "print(\"\\n\\n🧪 Test 2: CoT İle (Adım Adım Düşünme)\")\n",
        "print(\"-\" * 60)\n",
        "print(f\"Model Yanıtı:\\n{response_with_cot}\")\n",
        "\n",
        "print(\"\\n\" + \"=\" * 60)\n",
        "print(\"\\n💡 Gözlem:\")\n",
        "print(\"   - CoT OLMADAN: Model doğrudan cevabı vermeye çalışır.\")\n",
        "print(\"   - CoT İLE: Model tüm adımları gösterir ve mantık yürütür.\")\n",
        "print(\"   - Sonuç: CoT, karmaşık problemlerde daha güvenilir sonuçlar verir.\")\n",
        "print(\"\\n📐 Doğru Hesaplama:\")\n",
        "print(\"   1. İndirim sonrası: 80 - (80 × 0.25) = 60 TL\")\n",
        "print(\"   2. KDV eklenmiş: 60 + (60 × 0.18) = 70.80 TL\")\n",
        "print(\"=\" * 60)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "---\n",
        "\n",
        "## 8. API Parametrelerini Keşfetmek\n",
        "\n",
        "Şimdi farklı API parametrelerinin çıktı üzerindeki etkisini gözlemleyelim.\n",
        "\n",
        "### 8.1 Temperature: Yaratıcılık vs Tutarlılık"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "\"\"\"\n",
        "ÖRNEK 4: Temperature Parametresinin Etkisi\n",
        "-------------------------------------------\n",
        "Aynı prompt'u farklı temperature değerleriyle test edelim.\n",
        "\"\"\"\n",
        "\n",
        "creative_prompt = \"\"\"\n",
        "Bir kahve fincanı hakkında yaratıcı bir cümle yaz (maksimum 15 kelime).\n",
        "\"\"\"\n",
        "\n",
        "print(\"=\" * 70)\n",
        "print(\"TEMPERATURE PARAMETRESİ DENEYİ\")\n",
        "print(\"=\" * 70)\n",
        "print(f\"\\n📝 Prompt: {creative_prompt}\")\n",
        "print(\"\\n\" + \"=\" * 70)\n",
        "\n",
        "# Test edilecek temperature değerleri\n",
        "temperatures = [0.0, 0.3, 0.7, 1.0]\n",
        "\n",
        "for temp in temperatures:\n",
        "    print(f\"\\n🌡️  Temperature = {temp}\")\n",
        "    print(\"-\" * 70)\n",
        "\n",
        "    # Aynı prompt'u 3 kez çağır (çeşitliliği görmek için)\n",
        "    for i in range(3):\n",
        "        messages = [{\"role\": \"user\", \"content\": creative_prompt}]\n",
        "        response = call_llm(messages, temperature=temp, max_tokens=50)\n",
        "        print(f\"   Deneme {i+1}: {response}\")\n",
        "\n",
        "    print()\n",
        "\n",
        "print(\"=\" * 70)\n",
        "print(\"\\n💡 Gözlemler:\")\n",
        "print(\"   - Temperature = 0.0: Her çağrıda neredeyse aynı cevap (deterministik)\")\n",
        "print(\"   - Temperature = 0.3: Hafif varyasyonlar, tutarlı kalite\")\n",
        "print(\"   - Temperature = 0.7: Dengeli yaratıcılık, çeşitli cevaplar\")\n",
        "print(\"   - Temperature = 1.0: En yaratıcı, bazen beklenmedik sonuçlar\")\n",
        "print(\"\\n📌 Öneri:\")\n",
        "print(\"   - Kod üretme, veri çıkarma: 0.0 - 0.3\")\n",
        "print(\"   - Genel görevler: 0.5 - 0.7\")\n",
        "print(\"   - Yaratıcı yazı, brainstorming: 0.8 - 1.0\")\n",
        "print(\"=\" * 70)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### 8.2 Max Tokens: Yanıt Uzunluğunu Kontrol Etme"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "\"\"\"\n",
        "ÖRNEK 5: Max Tokens Parametresinin Etkisi\n",
        "------------------------------------------\n",
        "Aynı soruyu farklı max_tokens değerleriyle test edelim.\n",
        "\"\"\"\n",
        "\n",
        "summary_prompt = \"\"\"\n",
        "Yapay Zeka'nın tarihçesini ve önemli kilometre taşlarını anlat.\n",
        "\"\"\"\n",
        "\n",
        "print(\"=\" * 70)\n",
        "print(\"MAX_TOKENS PARAMETRESİ DENEYİ\")\n",
        "print(\"=\" * 70)\n",
        "print(f\"\\n📝 Prompt: {summary_prompt}\\n\")\n",
        "print(\"=\" * 70)\n",
        "\n",
        "# Test edilecek max_tokens değerleri\n",
        "token_limits = [50, 150, 500]\n",
        "\n",
        "for max_tok in token_limits:\n",
        "    print(f\"\\n🔢 Max Tokens = {max_tok}\")\n",
        "    print(\"-\" * 70)\n",
        "\n",
        "    messages = [{\"role\": \"user\", \"content\": summary_prompt}]\n",
        "    response = call_llm(messages, temperature=0.7, max_tokens=max_tok)\n",
        "\n",
        "    # Yaklaşık token sayısını hesapla (Türkçe için ~1 token ≈ 0.6 kelime)\n",
        "    word_count = len(response.split())\n",
        "    approx_tokens = int(word_count / 0.6)\n",
        "\n",
        "    print(response)\n",
        "    print(f\"\\n   📊 İstatistik: ~{word_count} kelime, ~{approx_tokens} token\")\n",
        "    print()\n",
        "\n",
        "print(\"=\" * 70)\n",
        "print(\"\\n💡 Gözlemler:\")\n",
        "print(\"   - max_tokens=50: Çok kısa, cevap kesiliyor\")\n",
        "print(\"   - max_tokens=150: Özet düzeyinde bilgi\")\n",
        "print(\"   - max_tokens=500: Detaylı açıklama\")\n",
        "print(\"\\n⚠️  Önemli:\")\n",
        "print(\"   - Token ≠ Kelime! 1 token ≈ 0.75 kelime (İngilizce)\")\n",
        "print(\"   - Türkçe'de kelime başına daha fazla token kullanılır\")\n",
        "print(\"   - max_tokens çok düşükse yanıt yarıda kesilir!\")\n",
        "print(\"=\" * 70)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### 8.3 Rol Atama (System Messages) ve Kişiselleştirme\n",
        "\n",
        "**System message**: Modelin davranışını ve kişiliğini belirleyen özel bir mesajdır. Bu, modele bir \"rol\" veya \"uzmanlık alanı\" atar."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "---\n",
        "\n",
        "## 10. Alıştırmalar: Kendi Promptlarınızı Tasarlayın\n",
        "\n",
        "Şimdi öğrendiklerinizi uygulama zamanı! Aşağıdaki alıştırmaları yaparak prompt mühendisliği becerilerinizi geliştirin.\n",
        "\n",
        "### Alıştırma 1: Rol Atama ile Veri Çıkarma\n",
        "\n",
        "**Görev:** Bir müşteri yorumundan şikayetin ana konusunu ve önem derecesini çıkarın.\n",
        "\n",
        "**Örnek Yorum:**\n",
        "\"Ürünü 2 hafta önce aldım. Kamera kalitesi berbat, akşamları hiçbir şey görünmüyor.\n",
        "Ayrıca batarya 3 saatten fazla gitmiyor. Müşteri hizmetlerine 5 kez mail attım,\n",
        "cevap bile vermediler. Paramı geri istiyorum!\"\n",
        "\n",
        "**Ne Yapmalısınız:**\n",
        "1. Bir \"Müşteri Hizmetleri Uzmanı\" rolü atayın\n",
        "2. Şikayet konularını (örn. kamera, batarya, destek) çıkarın\n",
        "3. Önem derecesini (Düşük/Orta/Yüksek/Kritik) belirleyin\n",
        "4. JSON formatında çıktı alın\n",
        "\n",
        "---\n",
        "\n",
        "### Alıştırma 2: Few-Shot ile Özel Format\n",
        "\n",
        "**Görev:** Teknik terimleri Türkçe'ye çevirin, ancak özel bir formatta.\n",
        "\n",
        "**Format:**\n",
        "EN: [İngilizce terim]\n",
        "TR: [Türkçe karşılık]\n",
        "AÇIKLAMA: [Kısa açıklama]\n",
        "ÖRNEK: [Kullanım örneği]\n",
        "\n",
        "**İstenen Çıktı:**\n",
        "- \"Machine Learning\"\n",
        "- \"API\"\n",
        "- \"Database\"\n",
        "\n",
        "**İpucu:** Few-shot kullanın, 1-2 örnek verin ve modelin formatı takip etmesini sağlayın.\n",
        "\n",
        "---\n",
        "\n",
        "### Alıştırma 3: Chain-of-Thought ile Problem Çözme\n",
        "\n",
        "**Görev:** Bir şirketin finansal kararını analiz edin.\n",
        "\n",
        "**Senaryo:**\n",
        "ABC Yazılım, yeni bir ürün geliştirmek için 500.000 TL yatırım yapma kararında.\n",
        "Pazar araştırması şu sonuçları gösterdi:\n",
        "- İlk yıl 1000 müşteri bekleniyor\n",
        "- Her müşteri yıllık 800 TL ödeyecek\n",
        "- Geliştirme maliyeti: 500.000 TL\n",
        "- Yıllık operasyon maliyeti: 200.000 TL\n",
        "- İkinci yılda müşteri sayısı %50 artacak\n",
        "\n",
        "Soru: Bu yatırım mantıklı mı? Kaç yılda geri döner?\n",
        "\n",
        "**Ne Yapmalısınız:**\n",
        "1. Chain-of-Thought kullanın (\"Adım adım analiz et\")\n",
        "2. Her adımı açıklayın\n",
        "3. Finansal hesaplamaları gösterin\n",
        "4. Karar ve gerekçe verin\n",
        "\n",
        "---\n",
        "\n",
        "### Alıştırma 4: Temperature Deneyi\n",
        "\n",
        "**Görev:** Aynı prompt'u 3 farklı temperature değeriyle test edin.\n",
        "\n",
        "**Prompt:** \"Bir yapay zeka asistanı için yaratıcı bir slogan yaz\"\n",
        "\n",
        "**Test Edilecek Değerler:**\n",
        "- temperature = 0.2\n",
        "- temperature = 0.7\n",
        "- temperature = 1.0\n",
        "\n",
        "**Gözlemleyin:**\n",
        "- Hangisi daha tutarlı?\n",
        "- Hangisi daha yaratıcı?\n",
        "- Hangisi bu görev için daha uygun?\n",
        "\n",
        "---\n",
        "\n",
        "### Alıştırma 5: Multi-Turn Conversation\n",
        "\n",
        "**Görev:** Çok turlu bir konuşma simüle edin.\n",
        "\n",
        "**Senaryo:** Bir Python öğrencisi olun ve \"for döngüsü\" konusunu öğrenmek isteyin.\n",
        "\n",
        "**Adımlar:**\n",
        "1. İlk mesajda: \"For döngüsü nedir?\" diye sorun\n",
        "2. İkinci mesajda: \"Range fonksiyonu ne işe yarar?\" diye sorun\n",
        "3. Üçüncü mesajda: \"1'den 10'a kadar olan sayıların toplamını nasıl bulurum?\" diye sorun\n",
        "\n",
        "**Önemli:** Her turda önceki mesajları da `messages` listesine ekleyin (bağlam korunsun).\n",
        "\n",
        "---\n",
        "\n",
        "### 💡 Bonus Challenge: Hepsini Birleştirin!\n",
        "\n",
        "Aşağıdaki gereksinimlerin hepsini karşılayan bir prompt tasarlayın:\n",
        "\n",
        "- **Rol:** Veri bilimci\n",
        "- **Teknik:** Few-shot + Chain-of-Thought\n",
        "- **Çıktı:** JSON formatında\n",
        "- **Görev:** Bir veri setindeki anomalileri tespit et ve açıkla\n",
        "\n",
        "**Örnek Veri:**\n",
        "Günlük Satış Verileri (son 7 gün):\n",
        "Pazartesi: 120 adet\n",
        "Salı: 115 adet\n",
        "Çarşamba: 118 adet\n",
        "Perşembe: 25 adet  (!)\n",
        "Cuma: 130 adet\n",
        "Cumartesi: 145 adet\n",
        "Pazar: 140 adet\n",
        "\n",
        "**Beklenen JSON:**"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "---\n",
        "\n",
        "\n",
        "\n",
        "#### 1. **LLM Temelleri**\n",
        "- LLM'ler, geleneksel ML modellerinden farklı çalışır (genel amaçlı vs. görev spesifik)\n",
        "- Transformer mimarisi ve Self-Attention mekanizması LLM'lerin temelini oluşturur\n",
        "- Tokenization: Metin → Token'lar → Embedding'ler\n",
        "\n",
        "#### 2. **LiteLLM Framework**\n",
        "- Tek bir API ile birden fazla LLM sağlayıcısına erişim\n",
        "- Kod taşınabilirliği: Model değiştirmek artık çok kolay\n",
        "- Yerleşik hata yönetimi ve maliyet takibi\n",
        "\n",
        "#### 3. **Prompt Mühendisliği Teknikleri**\n",
        "\n",
        "| Teknik | Ne Zaman Kullanılır | Başarı Faktörü |\n",
        "|:-------|:-------------------|:---------------|\n",
        "| **Zero-Shot** | Basit, genel görevler | Net ve açık talimatlar |\n",
        "| **Few-Shot** | Format/stil önemli, örnekler yardımcı | İyi seçilmiş örnekler |\n",
        "| **Chain-of-Thought** | Karmaşık, mantık gerektiren görevler | \"Adım adım düşün\" ifadesi |\n",
        "| **Role Prompting** | Ton/tarz/uzmanlık gerekli | İyi tanımlanmış system message |\n",
        "\n",
        "#### 4. **API Parametreleri Mastery**\n",
        "\n",
        "**Yaratıcılık Kontrolü:**\n",
        "- `temperature` ↓ → Daha tutarlı (kod, veri çıkarma)\n",
        "- `temperature` ↑ → Daha yaratıcı (hikaye, brainstorming)\n",
        "\n",
        "**Çıktı Kontrolü:**\n",
        "- `max_tokens`: Uzunluk ve maliyet kontrolü\n",
        "- `stop`: Belirli noktalarda durdurma\n",
        "- `response_format`: JSON gibi yapısal çıktılar\n",
        "\n",
        "**Çeşitlilik Kontrolü:**\n",
        "- `top_p`: Alternatif olarak temperature kullanılır\n",
        "- `presence_penalty`: Tekrarları azaltır\n",
        "- `frequency_penalty`: Daha agresif çeşitlilik\n",
        "\n",
        "#### 5. **Yapısal Veri Çıkarma**\n",
        "- Metinden JSON formatında veri çıkarma\n",
        "- Açık format tanımları ve örnekler kritik\n",
        "- `temperature=0.0` ve error handling şart\n",
        "\n",
        "---\n",
        "\n",
        "### 📊 Prompt Mühendisliği Best Practices\n",
        "\n",
        "#### ✅ YAP:\n",
        "- Açık, spesifik talimatlar verin\n",
        "- Beklenen formatı net belirtin\n",
        "- Karmaşık görevlerde örnekler gösterin (few-shot)\n",
        "- Mantık gerektiren işlemlerde CoT kullanın\n",
        "- Göreve uygun temperature seçin\n",
        "- System message ile rol/ton belirleyin\n",
        "\n",
        "#### ❌ YAPMA:\n",
        "- Belirsiz, muğlak ifadeler kullanma\n",
        "- Aynı anda hem `temperature` hem `top_p` optimize etme\n",
        "- `max_tokens`'i çok düşük ayarlama (yanıt kesilir)\n",
        "- JSON bekliyorsanız parse etmeden kullanma\n",
        "- Her görev için aynı parametreleri kullanma\n",
        "\n",
        "---\n",
        "\n",
        "### 🚀 Gerçek Dünya Kullanım Senaryoları\n",
        "\n",
        "1. **Müşteri Destek Otomasyonu**\n",
        "   - Ticket'ları kategorize et ve önceliklendir\n",
        "   - Otomatik yanıtlar oluştur\n",
        "   - Duygu analizi yap\n",
        "\n",
        "2. **Veri İşleme ve Çıkarma**\n",
        "   - PDF/metin belgelerinden yapısal veri çıkar\n",
        "   - Veri temizleme ve normalizasyon\n",
        "   - Çok dilli çeviri ve adaptasyon\n",
        "\n",
        "3. **Kod Yardımcısı**\n",
        "   - Code review ve bug bulma\n",
        "   - Dokümantasyon oluşturma\n",
        "   - Test case üretme\n",
        "\n",
        "4. **İçerik Üretimi**\n",
        "   - Blog yazıları ve sosyal medya içeriği\n",
        "   - Ürün açıklamaları\n",
        "   - E-posta taslakları\n",
        "\n",
        "---\n",
        "\n",
        "### 🔑 Anahtar Kavramlar Sözlüğü\n",
        "\n",
        "- **Token**: Metnin LLM tarafından işlenen en küçük birimi (~0.75 kelime)\n",
        "- **Embedding**: Bir token'ın anlamını temsil eden sayısal vektör\n",
        "- **Temperature**: Rastgelelik/yaratıcılık kontrolü (0.0-1.0+)\n",
        "- **Prompt**: LLM'e verilen talimat/sorgu metni\n",
        "- **System Message**: Modelin rolünü/kişiliğini tanımlayan özel mesaj\n",
        "- **Few-Shot**: Örneklerle öğretme yaklaşımı\n",
        "- **Chain-of-Thought**: Adım adım düşünme tekniği\n",
        "\n",
        "---\n",
        "\n",
        "### 📚 Sonraki Adımlar: Hafta 9 ve Ötesi\n",
        "\n",
        "Artık LLM'lerle nasıl temel düzeyde çalışacağınızı biliyorsunuz. Ancak hala cevapsız sorular var:\n",
        "\n",
        "1. **LLM'in bilmediği konularda ne yapacağız?**\n",
        "   - Örnek: Şirketin dün yayınlanan dahili belgeleri\n",
        "   - Çözüm: **RAG (Retrieval-Augmented Generation)**\n",
        "\n",
        "2. **LLM'i kendi özel görevimiz için nasıl optimize ederiz?**\n",
        "   - Örnek: Hukuki belgeleri analiz eden özel model\n",
        "   - Çözüm: **Fine-Tuning**\n",
        "\n",
        "3. **Maliyeti nasıl azaltırız?**\n",
        "   - Örnek: Günde binlerce çağrı yapıyoruz\n",
        "   - Çözüm: **Caching, Prompt Optimization, Smaller Models**\n",
        "\n",
        "4. **Güvenlik ve Etik?**\n",
        "   - Örnek: Hassas veriler, bias, halüsinasyonlar\n",
        "   - Çözüm: **Guardrails, Validation, Monitoring**\n",
        "\n",
        "**🔜 Hafta 9'da:** LLM'ler için Gelişmiş Teknikler: Fine-Tuning, RAG, ve Production Best Practices\n",
        "\n",
        "---\n",
        "\n",
        "### 💪 Kendinizi Geliştirmek İçin\n",
        "\n",
        "1. **Prompt Library Oluşturun**: Başarılı promptlarınızı kaydedin\n",
        "2. **Farklı Modeller Deneyin**: Claude, GPT-4, Gemini karşılaştırın\n",
        "3. **Real Project**: Kendi use case'iniz için bir LLM uygulaması geliştirin\n",
        "4. **Community**: Prompt mühendisliği toplulukları takip edin\n",
        "\n",
        "---\n",
        "\n",
        "### 🎓 Ek Kaynaklar\n",
        "\n",
        "- **LiteLLM Docs**: https://docs.litellm.ai/\n",
        "- **Claude API Docs**: https://docs.anthropic.com/\n",
        "- **Prompt Engineering Guide**: https://www.promptingguide.ai/\n",
        "- **OpenAI Cookbook**: https://cookbook.openai.com/\n",
        "\n",
        "---\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "source": "# Embeddings Örneği: Cümleler Arası Benzerlik  \n# Bu örnek, embeddings'in nasıl çalıştığını gösterir\n\nimport numpy as np\nfrom litellm import embedding\nimport os\n\n# GEMINI_API_KEY environment variable'ın daha önce ayarlandığını varsayıyoruz\n# Eğer ayarlanmadıysa, hafta başındaki setup cell'ini çalıştırın\n\ntry:\n    # API Key kontrolü\n    if not os.getenv(\"GEMINI_API_KEY\"):\n        print(\"⚠️  GEMINI_API_KEY ayarlanmamış. Lütfen hafta başındaki setup cell'ini çalıştırın.\")\n    else:\n        # Test cümleleri\n        sentences = [\n            \"Kedi çok sevimli bir hayvandır.\",\n            \"Kediler evde beslenir.\",\n            \"Python güçlü bir programlama dilidir.\"\n        ]\n        \n        print(\"=\"*70)\n        print(\"EMBEDDING ÖRNEĞİ: Cümleler Arası Benzerlik\")\n        print(\"=\"*70)\n        \n        # Cümleleri embedding'e çevir (LiteLLM ile)\n        response = embedding(\n            model=\"gemini/text-embedding-004\",  # Latest Gemini embedding model\n            input=sentences\n        )\n        \n        # Embedding'leri numpy array'e çevir\n        embeddings = np.array([item['embedding'] for item in response.data])\n        \n        print(f\"\\n✓ {len(sentences)} cümle embedding'e çevrildi\")\n        print(f\"✓ Her embedding boyutu: {embeddings.shape[1]}\\n\")\n        \n        # Cosine similarity hesapla (manuel)\n        def cosine_similarity(v1, v2):\n            \"\"\"İki vektör arasındaki cosine similarity'yi hesaplar\"\"\"\n            dot_product = np.dot(v1, v2)\n            norm_v1 = np.linalg.norm(v1)\n            norm_v2 = np.linalg.norm(v2)\n            return dot_product / (norm_v1 * norm_v2)\n        \n        print(\"📊 Benzerlik Skorları (Cosine Similarity):\")\n        print(\"-\"*70)\n        \n        # Cümle 1 ve Cümle 2 (ikisi de kedi hakkında)\n        sim_1_2 = cosine_similarity(embeddings[0], embeddings[1])\n        print(f\"\\nCümle 1: '{sentences[0]}'\")\n        print(f\"Cümle 2: '{sentences[1]}'\")\n        print(f\"Benzerlik: {sim_1_2:.4f} ✓ (Yüksek - ikisi de kedi hakkında)\")\n        \n        # Cümle 1 ve Cümle 3 (farklı konular)\n        sim_1_3 = cosine_similarity(embeddings[0], embeddings[2])\n        print(f\"\\nCümle 1: '{sentences[0]}'\")\n        print(f\"Cümle 3: '{sentences[2]}'\")\n        print(f\"Benzerlik: {sim_1_3:.4f} (Düşük - farklı konular)\")\n        \n        # Cümle 2 ve Cümle 3 (farklı konular)\n        sim_2_3 = cosine_similarity(embeddings[1], embeddings[2])\n        print(f\"\\nCümle 2: '{sentences[1]}'\")\n        print(f\"Cümle 3: '{sentences[2]}'\")\n        print(f\"Benzerlik: {sim_2_3:.4f} (Düşük - farklı konular)\")\n        \n        print(\"\\n\" + \"=\"*70)\n        print(\"\\n💡 Gözlem:\")\n        print(\"   - Kedi ile ilgili iki cümle yüksek benzerlik skoru aldı\")\n        print(\"   - Farklı konulardaki cümleler düşük skor aldı\")\n        print(\"   - Bu, embedding'lerin anlam benzerliğini yakaladığını gösterir\")\n        \n        print(\"\\n🔜 Sonraki Hafta:\")\n        print(\"   Hafta 9'da, bu embedding teknolojisini kullanarak:\")\n        print(\"   • Semantik arama sistemleri\")\n        print(\"   • RAG (Retrieval-Augmented Generation) pipeline'ları\")\n        print(\"   • Production-ready bilgi sistemleri inşa edeceğiz!\")\n        print(\"=\"*70)\n\nexcept ImportError:\n    print(\"⚠️  litellm kütüphanesi yüklü değil.\")\n    print(\"Kurulum için: !pip install -q litellm\")\nexcept Exception as e:\n    print(f\"❌ Hata: {str(e)}\")\n    print(\"\\nNot: Bu örneği çalıştırmak için GEMINI_API_KEY gereklidir.\")",
      "metadata": {},
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": "---\n\n## 9. Embeddings'e Giriş: LLM'lerin Anlamı Sayılara Dönüştürmesi\n\nŞimdiye kadar LLM'lerin metin üretmesini gördük. Ama LLM'lerin başka bir önemli yeteneği daha var: **metni sayısal vektörlere dönüştürmek**.\n\n### 9.1 Embedding Nedir?\n\n**Embedding**, bir kelime, cümle veya dokümanın **anlamını** temsil eden yüksek boyutlu bir sayı dizisidir (vektör).\n\n**Örnek:**\n```\n\"kedi\"     → [0.23, -0.45, 0.89, ..., 0.12]  # 768 boyutlu vektör\n\"köpek\"    → [0.25, -0.43, 0.87, ..., 0.15]  # Benzer vektör (yakın anlamlar)\n\"bilgisayar\" → [-0.82, 0.34, -0.12, ..., 0.76]  # Farklı vektör\n```\n\n**Anahtar Özellik:** Anlamsal olarak benzer kelimeler/cümleler, **vektör uzayında birbirine yakın** olurlar.\n\n### 9.2 Neden Önemli?\n\nEmbeddings, şu uygulamaları mümkün kılar:\n\n1. **Semantik Arama**: Kelimelerin birebir eşleşmesine değil, **anlam benzerliğine** göre arama\n   - Kullanıcı: \"Nasıl para biriktirebilirim?\"\n   - Bulunacak döküman: \"Tasarruf yöntemleri\" (kelime eşleşmesi yok ama anlam aynı!)\n\n2. **RAG (Retrieval-Augmented Generation)**: LLM'e dışarıdan bilgi besleme\n   - Önce embedding ile ilgili dokümanları bul\n   - Sonra LLM'e bunları kullanarak cevap ürettir\n\n3. **Kümeleme ve Sınıflandırma**: Metinleri otomatik gruplama\n   - Müşteri yorumlarını kategorilere ayırma\n   - Benzer soruları birleştirme\n\n### 9.3 Gemini Embeddings\n\nGoogle'ın Gemini modelleri, hem metin üretimi hem de embedding üretimi yapabilir.\n\n**Model:** `gemini-embedding-001`  \n**Boyut:** 768 (MRL - Matryoshka Representation Learning ile optimize edilmiş)  \n**Maliyet:** Çok düşük (ücretsiz kotalar mevcut)\n\n### 9.4 Cosine Similarity: Benzerlik Ölçümü\n\nİki vektörün ne kadar benzer olduğunu ölçmek için **cosine similarity** kullanılır:\n\n$$\n\\text{similarity}(A, B) = \\frac{A \\cdot B}{||A|| \\times ||B||} \\quad \\in [-1, 1]\n$$\n\n- **1.0**: Tamamen aynı anlam\n- **0.0**: İlgisiz\n- **-1.0**: Tamamen zıt anlam\n\n### 9.5 Basit Örnek\n\nAşağıdaki örnekte, üç cümleyi embedding'e çevirip benzerliklerini karşılaştıracağız.",
      "metadata": {}
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python (cpasa_env)",
      "language": "python",
      "name": "cpasa_env"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.11.2"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}