Otomatik Değerlendirme Düzeneği Oluşturma
Tam RAG sisteminizi bir test kümesine karşı çalıştıran, tüm ölçütleri hesaplayan ve zaman içindeki gelişmeleri izlemenizi sağlayan bir rapor oluşturan tekrarlanabilir bir değerlendirme işlem hattı oluşturun.
Otomatik Değerlendirme Düzeneği Oluşturma, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.
Değerlendirme Düzeneği Nedir?
Değerlendirme düzeneği, RAG sisteminizin tamamını standartlaştırılmış bir sınama kümesine karşı çalıştıran, tüm ölçütleri hesaplayan ve bir rapor oluşturan tekrarlanabilir, otomatik bir işlem hattıdır. Buradaki temel sözcük tekrarlanabilirdir: Parçalama stratejinizde, gömme modelinizde, isteminizde veya LLM'nizde her değişiklik yaptığınızda aynı düzeneği çalıştırır ve sonuçları bir temel değerle karşılaştırırsınız. Bu yaklaşım, RAG geliştirmesini öznel denemelerden veri odaklı mühendisliğe dönüştürür.
Düzenek Mimarisi
İyi tasarlanmış bir değerlendirme düzeneğinin dört katmanı vardır: Sınama verisi yönetimi (altın veri kümesini yükleme ve sürümleme), işlem hattı yürütme (her sınama sorusunu RAG işlem hattının tamamından geçirme), ölçüt hesaplama (tüm getirme ve üretim ölçütlerini hesaplama) ve rapor oluşturma (sonuçları sürüm bilgileriyle kaydetme ve önceki temel değere göre fark raporu oluşturma). Her katman bağımsız olarak sınanabilir ve yapılandırılabilir olmalıdır.
class RAGEvaluationHarness:
def __init__(self, retriever, llm_client, config):
self.retriever = retriever
self.llm_client = llm_client
self.config = config # chunk_size, top_k, model, threshold, etc.
self.results = []
def run(self, golden_dataset):
for item in golden_dataset:
result = self._evaluate_single(item)
self.results.append(result)
metrics = self._compute_metrics()
self._save_report(metrics)
return metricsHer Sınama Durumunu Çalıştırma
Altın veri kümesindeki her soru için RAG işlem hattının tamamını çalıştırın ve tüm ara çıktıları kaydedin: getirilen parça kimlikleri ve puanları, biçimlendirilmiş bağlam, oluşturulan yanıt ve belirteç sayısı. Bu ara değerleri saklamak, hataları ayıklamak için gereklidir; bir soru düşük puan aldığında, maliyetli işlem hattını yeniden çalıştırmadan tam olarak hangi parçaların getirildiğini ve yanıtın neden yanlış olduğunu inceleyebilirsiniz.
import time
def _evaluate_single(self, item):
start = time.perf_counter()
query_vector = embed_query(item['question'])
chunks = self.retriever.retrieve(query_vector, top_k=self.config['top_k'])
filtered_chunks = filter_by_score(chunks, self.config['threshold'])
context = format_context(filtered_chunks)
answer_result = generate_answer(item['question'], context, self.llm_client)
latency_ms = (time.perf_counter() - start) * 1000
return {
'question': item['question'],
'expected_answer': item['answer'],
'generated_answer': answer_result['answer'],
'retrieved_chunk_ids': [c['id'] for c in filtered_chunks],
'retrieved_scores': [c['score'] for c in filtered_chunks],
'relevant_chunk_ids': item['relevant_chunk_ids'],
'context_texts': [c['text'] for c in filtered_chunks],
'tokens_used': answer_result['tokens_used'],
'latency_ms': round(latency_ms)
}Tüm Ölçütleri Tek Geçişte Hesaplama
Tüm sınama durumu çıktılarını topladıktan sonra sonuçlar üzerinde tek geçişte eksiksiz ölçüt kümesini hesaplayın. Getirme ölçütlerini (parça kimliklerinden hesaplananlar) üretim ölçütlerinden (değerlendirici LLM çağrılarak hesaplananlar) ayırın. Verimliliği en üst düzeye çıkarmak için değerlendirici LLM çağrılarını toplu olarak gönderin; sadakat değerlendirmelerini gruplayın ve bunları sırayla değil, asyncio kullanarak paralel gönderin. Üretim ölçütlerinin 100'den fazla sınama durumu için birkaç dakika sürebileceği için ilerlemeyi günlüğe kaydedin.
def _compute_metrics(self):
# Retrieval metrics (no LLM calls needed)
hit_rates = []
mrr_scores = []
for r in self.results:
retrieved = r['retrieved_chunk_ids']
relevant = set(r['relevant_chunk_ids'])
hit = any(rid in relevant for rid in retrieved)
hit_rates.append(1.0 if hit else 0.0)
for rank, rid in enumerate(retrieved, 1):
if rid in relevant:
mrr_scores.append(1.0 / rank)
break
else:
mrr_scores.append(0.0)
metrics = {
'hit_rate_at_5': sum(hit_rates) / len(hit_rates),
'mrr': sum(mrr_scores) / len(mrr_scores),
'mean_latency_ms': sum(r['latency_ms'] for r in self.results) / len(self.results),
'mean_tokens': sum(r['tokens_used'] for r in self.results) / len(self.results)
}
return metricsSonuçları Sürüm Bilgileriyle Kaydetme
Yapılandırmalar arasındaki sonuçları karşılaştırabilmek için her değerlendirme çalıştırması sürüm üst verileriyle kaydedilmelidir. Kodun git işleme özetini, yapılandırma parametrelerini (gömme modeli, parça boyutu, K, eşik, LLM modeli), zaman damgasını ve insanların okuyabileceği bir çalıştırma açıklamasını ekleyin. Sonuçları JSONL dosyasında veya veritabanı tablosunda saklayın. Böylece sisteminizin nasıl geliştiğine ilişkin kalıcı bir geçmiş oluşturulur.
import json
import subprocess
from datetime import datetime
def _save_report(self, metrics):
git_hash = subprocess.check_output(
['git', 'rev-parse', '--short', 'HEAD']
).decode().strip()
report = {
'run_id': datetime.utcnow().strftime('%Y%m%d_%H%M%S'),
'git_commit': git_hash,
'config': self.config,
'metrics': metrics,
'n_test_cases': len(self.results),
'timestamp': datetime.utcnow().isoformat()
}
with open('eval_history.jsonl', 'a') as f:
f.write(json.dumps(report) + '\n')
print(f'Saved evaluation run: {report["run_id"]}')
print(json.dumps(metrics, indent=2))Temel Değerle Karşılaştırma
Her çalıştırmadan sonra otomatik olarak önceki temel değerle karşılaştırın ve gerilemeleri işaretleyin. Gerileme, herhangi bir ölçütün bir eşikten (örneğin 2 yüzde puanından) daha fazla düşmesidir. Ölçütlerdeki değişiklikleri gösteren bir fark tablosu yazdırın. Herhangi bir ölçüt önemli ölçüde gerilerse değerlendirme çalıştırması sıfır olmayan bir çıkış koduyla başarısız olmalıdır; bu da CI/CD işlem hattının ilgili değişikliğin dağıtımını engellemesine neden olur.
def compare_to_baseline(current_metrics, baseline_file='best_eval.json'):
import json
from pathlib import Path
if not Path(baseline_file).exists():
print('No baseline yet. Saving current as baseline.')
Path(baseline_file).write_text(json.dumps(current_metrics, indent=2))
return True
baseline = json.loads(Path(baseline_file).read_text())
regressions = []
print('\nMetric comparison (current vs baseline):')
for metric, current_val in current_metrics.items():
baseline_val = baseline.get(metric, 0)
delta = current_val - baseline_val
status = 'OK' if delta >= -0.02 else 'REGRESSION'
print(f' {metric}: {current_val:.3f} vs {baseline_val:.3f} ({delta:+.3f}) {status}')
if status == 'REGRESSION':
regressions.append(metric)
return len(regressions) == 0CI/CD'ye Entegrasyon
Değerlendirme düzeneği, CI/CD işlem hattınıza entegre edildiğinde en güçlü hâline ulaşır. Parçalama mantığını, gömme modeli yapılandırmasını, istem şablonlarını veya getirme parametrelerini değiştiren her çekme isteğinde otomatik olarak çalışacak şekilde yapılandırın. İşlem hattı yalnızca tüm ölçütler asgari eşikleri karşılar ve hiçbir ölçüt ana dalın temel değerine göre gerilemezse başarılı olur. Bu, kalite gerilemelerinin yanlışlıkla üretime taşınmasını önler.
# GitHub Actions workflow (eval.yml)
# on:
# pull_request:
# paths:
# - 'rag/**'
# - 'prompts/**'
# - 'config/**'
# jobs:
# evaluate:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v3
# - name: Install dependencies
# run: pip install -r requirements.txt
# - name: Run evaluation harness
# run: |
# python eval/run_harness.py \
# --test-set eval/golden_dataset.json \
# --config config/rag_config.yaml \
# --fail-on-regression
# env:
# OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}İnsanların Okuyabileceği Raporlar Oluşturma
Ham ölçüt dosyalarına ek olarak, ekibinizin çekme isteği yorumlarında inceleyebileceği insanların okuyabileceği bir HTML veya Markdown raporu oluşturun. Tüm ölçütlerin özet tablosunu, soruyu, beklenen yanıtı, oluşturulan yanıtı ve getirilen parçaları içeren başarısız sınama durumlarının listesini ve son 10 çalıştırmadaki ölçütleri gösteren bir eğilim grafiğini ekleyin. Görsel raporlar, teknik olmayan paydaşların sistemin iyileşip iyileşmediğini anlamasına yardımcı olur.
def generate_markdown_report(metrics, failed_cases, run_id):
lines = [
f'# RAG Evaluation Report — {run_id}\n',
'## Summary Metrics',
'| Metric | Score | Target |',
'|--------|-------|--------|',
f'| Hit Rate@5 | {metrics["hit_rate_at_5"]:.1%} | > 80% |',
f'| MRR | {metrics["mrr"]:.3f} | > 0.70 |',
f'| Mean Latency | {metrics["mean_latency_ms"]:.0f}ms | < 500ms |',
'',
f'## Failed Cases ({len(failed_cases)} failures)'
]
for case in failed_cases[:10]: # show first 10
lines += [
f'**Q:** {case["question"]}',
f'**Expected:** {case["expected_answer"]}',
f'**Generated:** {case["generated_answer"]}\n'
]
return '\n'.join(lines)Değerlendirme Çalıştırması Başına Maliyeti İzleme
Değerlendirme çalıştırmaları maliyetlidir; gömme API'sini, LLM API'sini ve değerlendirici LLM'yi çağırırlar. Her değerlendirme çalıştırmasının maliyetini kalite ölçütleriyle birlikte izleyin. 100 sınama durumuna ilişkin kapsamlı bir değerlendirme, kullanılan modellere bağlı olarak genellikle 0,50 ila 2,00 ABD dolarına mal olur. Değerlendirici çağrıları için daha ucuz modeller kullanın (sadakat puanlaması için GPT-4o-mini) ve pahalı modelleri üretim için ayırın. Değerlendirme maliyetini geliştirme döngünüze göre bütçelendirebilmek için tahmini çalıştırma maliyetini kaydedilen rapora ekleyin.
def estimate_run_cost(results, config):
# Embedding cost
embed_tokens = sum(len(r['question'].split()) * 1.3 for r in results)
embed_cost = (embed_tokens / 1_000_000) * 0.02 # $0.02/1M tokens
# Generation cost
total_gen_tokens = sum(r['tokens_used'] for r in results)
gen_cost = (total_gen_tokens / 1_000_000) * 5.0 # gpt-4o approx
# Judge cost (faithfulness evals)
judge_cost = len(results) * 0.001 # ~$0.001 per eval with gpt-4o-mini
total = embed_cost + gen_cost + judge_cost
print(f'Evaluation cost estimate: ${total:.2f}')
print(f' Embedding: ${embed_cost:.3f}')
print(f' Generation: ${gen_cost:.3f}')
print(f' Judgment: ${judge_cost:.3f}')
return totalÜretim İzleme İçin Zamanlanmış Değerlendirme
Kod değişikliklerindeki CI/CD değerlendirmesinin yanı sıra düzeneği üretimde belirli bir zamanlamayla — günlük veya haftalık — günlüklerinizden örneklenen gerçek kullanıcı sorguları üzerinde çalıştırın. Bu, veri kaymasını tespit eder: belge derlemi geliştikçe ve kullanıcı sorgusu kalıpları değiştikçe, hiçbir kod değişikliği olmadan sistem kalitesi düşebilir. Son 50 kullanıcı sorgusundan örnek alıp bunları değerlendiren ve kalite özetini ekibinizin Slack kanalına otomatik olarak gönderen haftalık değerlendirme çalıştırmaları zamanlayın.
# Example scheduled evaluation (cron job or scheduled cloud function)
import random
def sample_production_queries(query_log_file, n=50):
with open(query_log_file) as f:
all_queries = [json.loads(line) for line in f]
sample = random.sample(all_queries, min(n, len(all_queries)))
# Convert to golden dataset format (without expected answers — use LLM judge)
return [
{'question': q['user_question'], 'relevant_chunk_ids': []}
for q in sample
]
# Run weekly evaluation against production queries
if __name__ == '__main__':
prod_queries = sample_production_queries('/var/log/rag_queries.jsonl')
harness = RAGEvaluationHarness(retriever, llm_client, config)
metrics = harness.run(prod_queries)
send_slack_digest(metrics)Ölçüt Eğilimlerini Zaman İçinde Görselleştirme
JSONL dosyasındaki ham sayıları bir bakışta yorumlamak zordur. Son 20 değerlendirme çalıştırmasındaki her ölçütü çizgi grafiğinde gösteren basit bir eğilim görselleştirmesi oluşturun. X ekseni olarak çalıştırma zaman damgasını, Y ekseni olarak ölçüt puanını kullanın. Kabul edilebilir asgari eşikte yatay bir çizgi çizin. Bir ölçüt eşik çizgisinin altına düştüğünde, sorun ham verileri okumaya gerek kalmadan hemen görünür. Matplotlib gibi araçlar veya basit bir web panosu (Grafana, Streamlit) bu iş için uygundur.
import json
import matplotlib.pyplot as plt
from pathlib import Path
def plot_metric_trends(history_file='eval_history.jsonl', metric='hit_rate_at_5'):
records = [
json.loads(line)
for line in Path(history_file).read_text().strip().split('\n')
]
timestamps = [r['timestamp'][:10] for r in records[-20:]]
scores = [r['metrics'].get(metric, 0) for r in records[-20:]]
plt.figure(figsize=(10, 4))
plt.plot(timestamps, scores, marker='o', label=metric)
plt.axhline(y=0.80, color='r', linestyle='--', label='Min threshold')
plt.title(f'{metric} over last 20 evaluations')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig(f'eval_trend_{metric}.png')
print(f'Saved trend chart for {metric}')Hızlı Kontrol
Bu dersteki Yapay Zekâ Mühendisliği kavramlarını anlayıp anlamadığınızı sınayın.
Ders Özeti
Bu derste şunları öğrendiniz: sınama verisi yönetimi, işlem hattı yürütme, ölçüt hesaplama ve rapor oluşturma özelliklerine sahip eksiksiz bir değerlendirme düzeneğinin nasıl yapılandırılacağını; çalıştırmaların bir temel değerle nasıl karşılaştırılacağını ve gerilemelerde CI/CD'nin nasıl başarısız kılınacağını; ekip incelemesi için insanların okuyabileceği raporların nasıl oluşturulacağını; kod değişiklikleri olmadan veri kaymasını tespit etmek için zamanlanmış üretim izlemesinin nasıl çalıştırılacağını. Artık üretim RAG sistemleri oluşturmak ve değerlendirmek için eksiksiz bir temele sahipsiniz.
Sıkça Sorulan Sorular
“Otomatik Değerlendirme Düzeneği Oluşturma” dersi ücretsiz mi?
Evet — “Otomatik Değerlendirme Düzeneği Oluşturma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.
“Otomatik Değerlendirme Düzeneği Oluşturma” dersinde ne öğreneceğim?
Tam RAG sisteminizi bir test kümesine karşı çalıştıran, tüm ölçütleri hesaplayan ve zaman içindeki gelişmeleri izlemenizi sağlayan bir rapor oluşturan tekrarlanabilir bir değerlendirme işlem hattı ol… AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Otomatik Değerlendirme Düzeneği Oluşturma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- RAG'de Değerlendirmenin Önemi
- Geri Getirme Ölçütleri: İsabet Oranı, MRR ve NDCG
- Oluşturma Ölçütleri: Sadakat ve Yanıt Uygunluğu
- Otomatik Değerlendirme Düzeneği Oluşturma