Soulwise'ın temel zorluğu şu: kullanıcının doğum haritası, içinde bulunduğumuz günün gökyüzü ve kullanıcının o anki ruh hali — bu üçünü tek bir anlamlı içgörüye dönüştürmek. Astroloji, deterministik bir alan değil; ama Soulwise'ın çıktısı her gün tutarlı, kişisel ve harekete geçirilebilir olmak zorunda.
Ne saf LLM, ne saf efemeris
Saf LLM çözümü ilk başta çekici görünür: GPT'ye "bugünün burcumla ilgili öneri ver" dersin, hazır. Pratikte iki sorun var: (1) LLM'in halüsinasyon riski astrolojide spesifik tarihlerle uyumsuz cevaplar üretir ("Mars bugün Aslan'da" doğru olmayabilir); (2) her kullanıcı için tutarlı bir kişiselleştirme katmanı kurulamaz — model neyin kişisel olduğunu bilmez.
Saf efemeris çözümü: Swiss Ephemeris kullanıp tüm gezegenlerin konumunu hesaplar, deterministik kurallara göre yorum üretir. Bu da farklı bir tuzağa düşürür: çıktı kuru ve mekanik olur, kullanıcının "benimle konuşan" hissini yakalayamaz.
Üç katmanlı motor
Soulwise'ın içerik motoru üç katmandan oluşur:
1. Efemeris katmanı (deterministik)
Kaynak doğruluğu için Swiss Ephemeris kullanıyoruz. Her gün 00:00 UTC'de bir scheduled job tüm major gezegen pozisyonlarını, ev cuspları ve ana açıları (konjonksiyon, opozisyon, kare, üçgen, sekstil) hesaplar. Veri tabanına bir sky_statesatırı yazılır. Hesaplama saniyenin altında, deterministik ve cache'lenebilir.
2. Kural motoru (yorum sözlüğü)
Klasik astrolojinin temel yorumlarını kurallar olarak kodluyoruz:
- Transit kuralı: "Eğer Satürn doğum haritandaki Güneş'e kare yapıyorsa, sorumlulukların arttığı bir dönem" → kullanıcının haritasında bu transit var mı diye kontrol edilir.
- Ay döngüsü: yeni ay / dolunay / kara ay dönemlerine göre niyet kurma / bırakma önerileri.
- Burç uyumu: kullanıcının yükselen / ay / güneş kombinasyonu hangi günlere daha duyarlı.
Bu katman saf TypeScript; testlerle kapsanabilir, predictable, her kullanıcı için aynı şekilde işler. Çıktı yapılandırılmış: { slot: "energy", level: 0.85, hints: ["mars-trine-sun", "moon-cancer"] }
3. LLM kompozisyon katmanı
Yapılandırılmış çıktıyı doğal, sıcak ve kullanıcının diline uygun bir günlük içgörüye dönüştürmek için LLM kullanıyoruz. Anahtar kısıt: LLM yeni astroloji bilgisi üretmez. Yalnızca kural motorunun verdiği yapılandırılmış ipuçlarını ifadeye dönüştürür. System prompt'ta açık olarak belirtilmiştir: "Sana verilen hintsdışında astrolojik iddiada bulunma. Tonu şefkatli ama teşhisçi değil tut."
Halüsinasyon kontrolü
Her LLM çıktısı bir post-processor'dan geçer: çıkıştaki gezegen + burç + ev kombinasyonlarını efemeris katmanından gelen sky_state ile karşılaştırır. Mismatch varsa çıktı reddedilir, model tekrar çağrılır. Üç başarısız denemenin ardından kullanıcıya kural motorundan üretilen düz fallback metin gösterilir — bu kuru ama doğrudur.
Kullanıcının ruh hali
Üçüncü değişken: kullanıcının "bugün nasıl hissediyorsun?" sorusuna verdiği cevap. Bu, üç başlık altında toplanır:open / cautious / sad. Bu durum, LLM kompozisyon katmanının ton ayarına etki eder: aynı astrolojik çıktı, "cautious" bir kullanıcı için daha yumuşak, "open" bir kullanıcı için daha cesurca ifade edilir.
Performans
Efemeris ve kural katmanları her kullanıcı için günde bir kez hesaplanır (tetikleyici: kullanıcının yerel saatinde 00:00'da queue'ya bir job düşer). LLM kompozisyonu kullanıcı uygulamayı açtığında ya da bildirimle tetiklendiğinde çalışır. Bu hibrit yaklaşım: deterministik kısımları cache'leriz, yaratıcı kısmı talep üzerine çağırırız — token harcamasını minimumda tutar.
Soulwise neden RAG değil?
Astrolojide RAG (retrieval-augmented generation) cazip görünür: klasik metinleri vector DB'ye koy, sorgula, model cevabını bunlara dayandırsın. Pratikte yararı sınırlı çünkü:
- Klasik astroloji metinleri çoğunlukla genel — kullanıcının spesifik haritasına uyarlanmamış.
- Soulwise'ın kişiselleştirme talebi RAG retrieval katmanından çok deterministik kural motoruyla daha iyi çözülür.
- RAG ile gelen klasik metinler bazen modern dile uymayan ifadeler içerir; LLM kompozisyon katmanı her zaman zaten modern, sıcak, açık tona dönüştürür.
Açık konular
- Çok sayıda kullanıcı için günlük içerik üretiminin LLM maliyet eğrisi — caching ve deterministik fallback'in oranını optimize etmek.
- Tarot okumalarında kart çekimi: deterministik mi (örn. kullanıcı + tarih hash'i) yoksa gerçekten rastgele mi? Felsefi karar.
- Saat dilimi sınırları: gezegen pozisyonları UTC; kullanıcı deneyimi yerel saat. "Yarın" kelimesinin Türkiye + Hawaii için aynı anlama gelmesini sağlamak.
Soulwise'ın erken sürümünde bu motoru gerçek kullanım verisiyle ölçeceğiz. Hangi katmanın daha çok güvenildiğini, hangi kuralların kullanıcılarla rezonansa girdiğini öğreneceğiz — sonuçları yine bu blogda paylaşacağız.