Appearance
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.mddosyaları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:
- Deterministik Katman: LLM'e gitmeden önce ve sonra çalışan kod (Scoring Engine, Sanitization, RLS) — klasik unit/integration test.
- Stokastik Katman: LLM çıktılarının "makul aralıkta" olup olmadığını kontrol eden eval testleri.
- 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)) == 02.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 sanitized3. 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
| Metrik | Tanım | Eşik |
|---|---|---|
| Direction Accuracy | LLM'in önerdiği shift yönü (+ veya -) beklenen yönle eşleşiyor mu? | > %85 |
| Range Compliance | shift_value, beklenen min-max aralığında mı? | > %75 |
| Label Accuracy | Önerilen senaryo etiketi ([PRO]/[SOCIAL]/[NEUTRAL]) doğru mu? | > %90 |
| Hallucination Rate | LLM, sistemde tanımlı olmayan bir trait_id üretmiş mi? | < %2 |
| Confidence Calibration | LLM'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).jsonHer 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.024.2. PR Merge Kuralları
| Kontrol | Koşul | Başarısız Olursa |
|---|---|---|
| Deterministik testler | Tümü geçmeli | PR merge edilemez |
| Direction Accuracy | > %85 | PR merge edilemez |
| Hallucination Rate | < %2 | PR merge edilemez |
| Range Compliance | > %75 | Uyarı (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 Cap5.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
| Ortam | LLM | Veritabanı | Amaç |
|---|---|---|---|
| Lokal (Dev) | Mock LLM (sabit JSON döner) | Docker PostgreSQL + seed data | Hızlı geliştirme, deterministik testler |
| CI (GitHub Actions) | Gerçek LLM (1 run) | Geçici PostgreSQL konteyner | Regresyon kontrolü |
| Staging | Gerç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ı.