Engin Şahin
← Blog

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.

← Blog