Yapay Zekâ & Altyapı
Semantic Cache ile RAG Maliyetlerini Düşürmek — Bölüm 3: Test Ortamını Kuruyoruz
Önceki bölümde test ortamımı ve hipotezlerimi paylaşmıştım. Bu bölümde söylediklerimi yapıyoruz: her bileşeni sıfırdan kurup, tüm bağlantıların çalıştığını doğrulayacağız.
Bölümün sonunda elimizde GPU hızlandırmalı bir embedding motoru, vektör araması yapabilen bir Redis instance'ı ve gerçek bir LLM bağlantısı olacak.
Kurulum Sırası
Sıra önemli. Önce temel araçlar, sonra veritabanı, son olarak Python ortamı. Bu şekilde bağımlılık çakışmalarının önüne geçiyoruz.
Adım 1 — Homebrew: Mac'te paket yönetimi için temel araç. Adım 2 — Python 3.11+: Tüm scriptlerin çalışacağı ortam. Adım 3 — Docker Desktop: Redis Stack'i izole çalıştırmak için. Adım 4 — Redis Stack: Hem cache hem vector DB — tek container, iki görev. Adım 5 — Python venv: Sistem Python'unu kirletmeden izole ortam. Adım 6 — Kütüphaneler: sentence-transformers, openai SDK, tiktoken ve diğerleri. Adım 7 — Bağlantı testi: Her şeyin senkronize çalıştığının doğrulanması.
Adım 1 — Homebrew
Terminal'i aç (Cmd + Space → "Terminal") ve önce kurulu olup olmadığını kontrol et:
brew --version
Kurulu değilse:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Kurulum sırasında şifren istenecek, admin yetkisi gerekiyor. 2-5 dakika sürebilir.
Adım 2 — Python
Önce mevcut versiyonu kontrol et:
python3 --version
Python 3.10 veya üzeri varsa devam et. Yoksa:
brew install python@3.11
Adım 3 — Docker Desktop
Redis Stack'i bir container içinde çalıştıracağız. Docker kurulu mu kontrol et:
docker --version
Kurulu değilse https://www.docker.com/products/docker-desktop adresinden Apple Silicon sürümünü indir, .dmg dosyasını aç ve Applications klasörüne sürükle. İlk açılışta macOS izin isteyecek — izin ver.
Kurulumu doğrulamak için:
docker run hello-world
"Hello from Docker!" çıktısını görüyorsan hazır.
Adım 4 — Redis Stack
Redis Stack, klasik Redis'in üzerine RediSearch ve RedisJSON modüllerini ekler. Böylece hem key-value cache hem de vektör benzerlik araması aynı container'dan çalışır — iki ayrı servis kurmak yerine tek komutla hallediyoruz.
docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 -v redis-data:/data redis/redis-stack:latest
Port 6379 Python scriptimizin bağlanacağı nokta. Port 8001 ise RedisInsight arayüzü — tarayıcıdan http://localhost:8001 adresine girerek cache entry'lerinin dolduğunu canlı olarak izleyebilirsin.
Container'ın çalıştığını doğrulamak için:
docker exec -it redis-stack redis-cli ping
"PONG" çıktısı geliyorsa Redis hazır.
Container yönetimi için kısa komutlar: docker stop redis-stack, docker start redis-stack, docker logs redis-stack -f.
Adım 5 — Python Virtual Environment
Proje klasörünü oluştur ve venv'i aktive et:
mkdir ~/semantic-cache-lab && cd ~/semantic-cache-lab python3 -m venv venv source venv/bin/activate
Terminal satırının başında (venv) görüyorsan izole ortamdasın. Terminali her kapattığında venv deaktive olur — yeni oturumda tekrar source ~/semantic-cache-lab/venv/bin/activate çalıştırman gerekir.
Adım 6 — Kütüphaneler
Venv aktifken requirements.txt dosyasını oluştur:
openai>=1.0.0 sentence-transformers>=2.7.0 torch>=2.0.0 redis>=5.0.0 tiktoken>=0.7.0 pypdf>=4.0.0 langchain>=0.2.0 langchain-community>=0.2.0 pandas>=2.0.0 matplotlib>=3.8.0 python-dotenv>=1.0.0 tqdm>=4.0.0
Ardından kur:
pip install -r requirements.txt
sentence-transformers ve torch büyük paketler — internet hızına göre 5-15 dakika sürebilir. M5 Max'te MPS (Metal Performance Shaders) desteği otomatik algılanır, GPU hızlandırması için ek kurulum gerekmez.
MPS'in aktif olduğunu doğrulamak için:
python3 -c "import torch; print('MPS:', torch.backends.mps.is_available())"
True görüyorsan embedding hesaplamaları Apple GPU'sunda çalışacak — CPU'ya göre 3-5x daha hızlı.
Adım 7 — Bağlantı Testi
Önce .env dosyasını oluştur (OpenRouter API key'ini https://openrouter.ai/keys adresinden alabilirsin):
OPENROUTER_API_KEY=sk-or-v1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx LLM_MODEL=google/gemini-2.0-flash-lite-001 REDIS_HOST=localhost REDIS_PORT=6379
.env dosyasını asla git'e commit etme. .gitignore'a ekle:
.env venv/ __pycache__/ data/ results/
Ardından test scriptini çalıştır. Dikkat edilmesi gereken bir nokta: OpenRouter yanıtlarını işlerken choices bir liste döner, response.choices[0].message.content şeklinde indeksle erişilmesi gerekir — aksi takdirde "list object has no attribute message" hatası alırsın.
Beklenen çıktı:
================================================== BAĞLANTI TESTİ ==================================================
[1/4] Redis bağlantısı... ✅ Redis: OK
[2/4] Embedding modeli yükleniyor... ✅ Embedding: OK (dim=384, device=mps)
[3/4] OpenRouter LLM bağlantısı... ✅ OpenRouter: OK Cevap: Evet! Token kullanımı: 27
[4/4] Token sayımı... ✅ tiktoken: OK "Bu bir test cümlesidir." = 7 token
================================================== TÜM BAĞLANTILAR BAŞARILI ==================================================
Sık Karşılaşılan Sorunlar
docker: command not found → Docker Desktop uygulamasının açık olduğundan emin ol. Connection refused (Redis) → docker start redis-stack komutuyla container'ı başlat. ModuleNotFoundError → source venv/bin/activate ile venv'i aktive et. MPS: False → Hata değil; CPU'da çalışır, sadece biraz daha yavaş. 401 Unauthorized → .env dosyasındaki API key'i kontrol et.
Sıradaki Bölüm
Altyapı hazır. Bölüm 4'te RAG pipeline'ını kuruyoruz: WEF raporunu parçalara ayıracak (chunking), Redis'e vektör olarak yükleyecek ve ilk anlamsal aramaları gerçekleştireceğiz.