Skip to content

LLM Test Stratejisi ve Değerlendirme Pipeline'ı (Testing Strategy)

Bu doküman, Humindx'in deterministik olmayan LLM çıktılarını nasıl test ettiğini, psikometrik motorun doğruluğunu nasıl doğruladığını ve CI/CD pipeline'ında prompt regresyonlarını nasıl yakaladığını tanımlar.

Kapsam Uyarısı: Bu doküman, test stratejisi ve eval pipeline'ını kapsar. LLM prompt mimarisi için ../psychometrics/llm-orchestration.md, scoring matematiği için ../psychometrics/scoring-algorithms.md dosyalarına bakınız.


1. Temel Zorluk: LLM'ler Deterministik Değildir

Geleneksel yazılımda assert(add(2, 3) == 5) yazarsın ve sonuç her zaman aynıdır. Ama bir LLM'e aynı transkripti 10 kez gönderdiğinde, 10 farklı shift_value alabilirsin.

Bu gerçeklik 3 test katmanı gerektirir:

  1. Deterministik Katman: LLM'e gitmeden önce ve sonra çalışan kod (Scoring Engine, Sanitization, RLS) — klasik unit/integration test.
  2. Stokastik Katman: LLM çıktılarının "makul aralıkta" olup olmadığını kontrol eden eval testleri.
  3. Regresyon Katmanı: Prompt değişikliklerinin mevcut davranışı bozup bozmadığını yakalayan CI kontrolleri.

2. Katman 1: Deterministik Testler (Unit & Integration)

LLM'e bağımlı olmayan tüm bileşenler klasik test yöntemleriyle test edilir.

2.1. Scoring Engine Unit Testleri

python
# test_scoring.py — EMA algoritması
def test_ema_basic():
    """shift_value doğru uygulanmalı"""
    old_score = 70.0
    shift = -2.5
    llm_confidence = 0.88
    w_context = 1.0  # [PRO] etiketi
    alpha = 0.6  # 50. etkileşim
    
    net_delta = shift * llm_confidence * w_context  # -2.2
    new_score = old_score + (alpha * net_delta)      # 68.68
    
    assert 68.0 < new_score < 69.0

def test_social_label_zero_impact():
    """[SOCIAL] etiketli skor PROFESSIONAL odayı ETKİLEMEMELİ"""
    w_context = 0.0  # [SOCIAL] etiketi
    net_delta = -5.0 * 0.95 * w_context  # 0.0
    assert net_delta == 0.0

def test_daily_cap():
    """Günlük shift limiti ±4.0 aşılmamalı"""
    daily_shifts = [2.0, 1.5, 1.5, 1.0]  # Toplam: 6.0
    capped = min(sum(daily_shifts), 4.0)
    assert capped == 4.0

def test_clipping():
    """Skor 0-100 dışına çıkmamalı"""
    assert max(0, min(100, 105.3)) == 100
    assert max(0, min(100, -3.2)) == 0

2.2. RLS İzolasyon Testleri (Integration)

python
# test_rls.py — Veritabanı seviyesinde izolasyon
def test_b2b_cannot_see_social_room(db_connection):
    """B2B gateway rolü SOCIAL odayı görmemeli"""
    db_connection.execute("SET ROLE b2b_gateway_role")
    results = db_connection.execute(
        "SELECT * FROM trait_scores WHERE room_id IN "
        "(SELECT id FROM context_rooms WHERE room_type = 'SOCIAL')"
    )
    assert len(results) == 0  # RLS 0 satır döndürmeli

def test_audit_events_immutable(db_connection):
    """audit_events tablosuna UPDATE yapılamamalı"""
    with pytest.raises(InsufficientPrivilegeError):
        db_connection.execute(
            "UPDATE audit_events SET payload = '{}' WHERE event_id = 'test'"
        )

2.3. PII Sanitization Testleri

python
# test_sanitization.py
def test_ner_redaction():
    """Kişi ve şirket isimleri maskelenmeli"""
    raw = "Yöneticim Ali Bey beni zorladı, Microsoft'taki kariyerim bitiyor."
    sanitized = sanitize(raw)
    assert "Ali" not in sanitized
    assert "Microsoft" not in sanitized
    assert "[PERSON_1]" in sanitized
    assert "[COMPANY_1]" in sanitized

3. Katman 2: LLM Eval Testleri (Stokastik Doğrulama)

LLM çıktıları deterministik değildir — ama makul bir aralıkta olmalıdır. Bu testler, "Golden Dataset" (Altın Veri Seti) üzerinden çalışır.

3.1. Golden Dataset Yapısı

Psikometri uzmanları tarafından etiketlenmiş 50-100 örnek transkript:

Not — Temsil Gücü ve Fairness Yönetişimi: Bu bölüm golden dataset'in teknik yapısını tanımlar. Dataset'in kimi temsil ettiği (demografik denge, slice eksenleri, sapma toleransı), nasıl versiyonlandığı (semver + PR review) ve slice-by-slice raporlama için kanonik referans: golden-dataset-governance.md. Aşağıdaki eval metrikleri (§3.2) aggregate olarak hesaplanır; ayrıca governance §6 uyarınca her slice için ayrıca raporlanır ve disparate impact eşikleri CI'da kontrol edilir.

Not — Adversarial / Red-Team Eval: Golden dataset fonksiyonel doğruluğu (Direction Accuracy, Hallucination vb.) ölçer. Güvenlik regresyonu (prompt injection, membership inference, RAG leakage) ayrı bir pipeline'dadır — kanonik referans: ../security/adversarial-eval-suite.md. İki pipeline eşzamanlı çalışır; eşikleri bağımsızdır ama her ikisinin yeşili PR merge için zorunludur.

json
{
  "scenario_id": "golden_001",
  "transcript": "Müşteri baskı yapınca sessiz kaldım ve planı değiştirdim...",
  "expected_traits": [
    { "trait_id": "bigfive_agreeableness", "expected_direction": "negative", "min_shift": -1.0, "max_shift": -5.0 },
    { "trait_id": "bigfive_conscientiousness", "expected_direction": "positive", "min_shift": 0.5, "max_shift": 3.0 }
  ],
  "expected_label": "[PRO]"
}

3.2. Eval Metrikleri

MetrikTanımEşik
Direction AccuracyLLM'in önerdiği shift yönü (+ veya -) beklenen yönle eşleşiyor mu?> %85
Range Complianceshift_value, beklenen min-max aralığında mı?> %75
Label AccuracyÖnerilen senaryo etiketi ([PRO]/[SOCIAL]/[NEUTRAL]) doğru mu?> %90
Hallucination RateLLM, sistemde tanımlı olmayan bir trait_id üretmiş mi?< %2
Confidence CalibrationLLM'in yüksek güvenle verdiği çıkarımlar gerçekten doğru mu?Korelasyon > 0.7

3.3. Eval Çalıştırma

bash
# Golden dataset üzerinden eval çalıştır
python eval/run_eval.py \
  --dataset eval/golden_dataset.json \
  --model claude-3.5-sonnet \
  --runs 3 \
  --output eval/results/$(date +%Y%m%d).json

Her Golden transkript 3 kez çalıştırılır (stokastik varyansı ölçmek için). Sonuçlar JSON olarak saklanır ve trend analizi yapılabilir.


4. Katman 3: CI/CD Regresyon Pipeline'ı

Prompt değişiklikleri (system_prompts/ klasörü) veya scoring algoritması değişiklikleri (scoring-algorithms.md), mevcut davranışı bozmamalıdır.

4.1. CI Pipeline Adımları

yaml
# .github/workflows/psychometric-ci.yml
name: Psychometric Regression
on:
  pull_request:
    paths:
      - 'services/psychometric-engine/**'
      - 'prompts/**'

jobs:
  deterministic-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Unit Tests (Scoring, Sanitization, RLS)
        run: pytest tests/ -v --tb=short

  llm-eval:
    runs-on: ubuntu-latest
    needs: deterministic-tests
    steps:
      - name: Run Golden Dataset Eval
        run: python eval/run_eval.py --dataset eval/golden_dataset.json --runs 1
      - name: Check Thresholds
        run: python eval/check_thresholds.py --min-direction-accuracy 0.85 --max-hallucination 0.02

4.2. PR Merge Kuralları

KontrolKoşulBaşarısız Olursa
Deterministik testlerTümü geçmeliPR merge edilemez
Direction Accuracy> %85PR merge edilemez
Hallucination Rate< %2PR merge edilemez
Range Compliance> %75Uyarı (warning) — review gerekli

5. Özel Test Senaryoları

5.1. Manipülasyon Direnci Testi

Kullanıcının "ideal profil" çizmeye çalışması simüle edilir:

python
def test_gaming_resistance():
    """Aynı trait'i 20 kez pozitif shift etmeye çalış"""
    score = 50.0
    for i in range(20):
        alpha = max(0.2, 1.0 - 0.008 * (i + 50))  # 50. etkileşimden başla
        net_delta = min(2.0, 4.0 - accumulated_daily)  # Daily cap
        score = max(0, min(100, score + alpha * net_delta))
    
    # 20 ardışık pozitif shift bile skoru 100'e çıkaramamalı
    assert score < 85  # EMA direnci + Daily Cap

5.2. Bağlam Odaları Sızıntı Testi

RAG pipeline'ının SOCIAL vektörleri çekip çekmediğini doğrular:

python
def test_rag_social_exclusion():
    """RAG sorgusu SOCIAL oda vektörlerini getirmemeli"""
    results = rag_query(
        genome_id="test-user-1",
        query_text="eşimle kavga",
        allowed_labels=["PRO", "NEUTRAL"]  # SOCIAL hariç
    )
    for result in results:
        assert result.source_label != "SOCIAL"

6. Test Ortamı ve Veri Yönetimi

OrtamLLMVeritabanıAmaç
Lokal (Dev)Mock LLM (sabit JSON döner)Docker PostgreSQL + seed dataHızlı geliştirme, deterministik testler
CI (GitHub Actions)Gerçek LLM (1 run)Geçici PostgreSQL konteynerRegresyon kontrolü
StagingGerçek LLM (3 run)Staging DB (anonimleştirilmiş veri)Golden Dataset eval, performans

Mock LLM: Lokal geliştirmede her seferinde API maliyeti oluşmaması için, services/psychometric-engine/mocks/ klasöründe sabit JSON yanıtlar dönen bir mock servis çalışır. Gerçek LLM testleri sadece CI ve staging'de yapılır.


Son Güncelleme: 2026-04-16 — §3.1'e adversarial eval suite pointer'ı eklendi (bkz. ../security/adversarial-eval-suite.md). Önceki: 2026-04-16 — golden dataset temsil gücü / fairness yönetişim pointer'ı. Önceki: 2026-04-15 — 3 katmanlı test stratejisi, Golden Dataset yapısı ve CI pipeline tanımı.

Simetri tarafından inşa ediliyor.