0Pricing
AI Engineering Academy · Pelajaran

Membangun Sistem Evaluasi Otomatis

Buat alur evaluasi berulang yang menjalankan seluruh sistem RAG terhadap set pengujian, menghitung semua metrik, dan menghasilkan laporan agar Anda dapat melacak peningkatan dari waktu ke waktu.

Membangun Sistem Evaluasi Otomatis adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Apa Itu Kerangka Evaluasi?

Kerangka evaluasi adalah alur kerja otomatis yang dapat diulang, yang menjalankan seluruh sistem RAG Anda terhadap set pengujian standar, menghitung semua metrik, dan menghasilkan laporan. Kata kuncinya adalah dapat diulang: setiap kali Anda mengubah strategi pemotongan, model embedding, perintah, atau LLM, Anda menjalankan kerangka yang sama dan membandingkan hasilnya dengan tolok ukur. Hal ini mengubah pengembangan RAG dari eksperimen subjektif menjadi rekayasa berbasis data.

Arsitektur Kerangka Evaluasi

Kerangka evaluasi yang dirancang dengan baik memiliki empat lapisan: pengelolaan data pengujian (memuat dan membuat versi set data acuan), eksekusi alur kerja (menjalankan setiap pertanyaan pengujian melalui seluruh alur kerja RAG), penghitungan metrik (menghitung semua metrik pengambilan dan pembuatan), serta pembuatan laporan (menyimpan hasil dengan informasi versi dan menghasilkan perbandingan dengan tolok ukur sebelumnya). Setiap lapisan harus dapat diuji dan dikonfigurasi secara independen.

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 metrics

Menjalankan Setiap Kasus Pengujian

Untuk setiap pertanyaan dalam set data acuan, jalankan seluruh alur kerja RAG dan catat semua keluaran perantara: ID dan skor potongan yang diambil, konteks yang telah diformat, jawaban yang dihasilkan, serta jumlah token. Menyimpan nilai-nilai perantara ini sangat penting untuk menelusuri kegagalan — ketika suatu pertanyaan memperoleh skor buruk, Anda dapat memeriksa dengan tepat potongan mana yang diambil dan mengapa jawabannya salah tanpa menjalankan ulang alur kerja yang mahal.

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)
    }

Menghitung Semua Metrik dalam Satu Proses

Setelah mengumpulkan semua keluaran kasus pengujian, hitung seluruh rangkaian metrik dalam satu proses terhadap hasil tersebut. Pisahkan metrik pengambilan (dihitung dari ID potongan) dari metrik pembuatan (dihitung dengan memanggil LLM penilai). Kelompokkan pemanggilan LLM penilai untuk memaksimalkan efisiensi — kelompokkan evaluasi kesetiaan dan kirimkan secara paralel dengan asyncio, bukan secara berurutan. Catat kemajuan karena metrik pembuatan dapat memerlukan waktu beberapa menit untuk lebih dari 100 kasus pengujian.

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 metrics

Menyimpan Hasil dengan Informasi Versi

Setiap proses evaluasi harus disimpan dengan metadata versi agar Anda dapat membandingkan hasil antar-konfigurasi. Sertakan hash commit git kode, parameter konfigurasi (model embedding, ukuran potongan, K, ambang, model LLM), stempel waktu, dan deskripsi proses yang mudah dipahami manusia. Simpan hasil dalam berkas JSON Lines atau tabel basis data. Dengan demikian, Anda memiliki riwayat permanen tentang perkembangan sistem Anda.

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))

Membandingkan dengan Tolok Ukur

Setelah setiap proses, lakukan perbandingan otomatis dengan tolok ukur sebelumnya dan tandai regresi. Regresi adalah metrik apa pun yang turun melebihi ambang tertentu (misalnya, 2 poin persentase). Cetak tabel perbandingan yang menampilkan perubahan metrik. Jika ada metrik yang mengalami regresi secara signifikan, proses evaluasi harus gagal dengan kode keluar bukan nol, yang akan menyebabkan alur kerja CI/CD memblokir penerapan perubahan tersebut.

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) == 0

Mengintegrasikan ke CI/CD

Kerangka evaluasi paling bermanfaat jika diintegrasikan ke dalam alur kerja CI/CD Anda. Konfigurasikan agar berjalan otomatis pada setiap permintaan penggabungan yang mengubah logika pemotongan, konfigurasi model embedding, templat perintah, atau parameter pengambilan. Alur kerja hanya berhasil jika semua metrik memenuhi ambang minimum dan tidak ada metrik yang mengalami regresi dari tolok ukur cabang utama. Hal ini mencegah regresi kualitas yang tidak disengaja dikirim ke produksi.

# 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 }}

Menghasilkan Laporan yang Mudah Dipahami Manusia

Selain berkas metrik mentah, buat laporan HTML atau Markdown yang mudah dipahami manusia yang dapat ditinjau tim Anda dalam komentar permintaan penggabungan. Sertakan tabel ringkasan semua metrik, daftar kasus pengujian yang gagal beserta pertanyaan, jawaban yang diharapkan, jawaban yang dihasilkan, dan potongan yang diambil, serta grafik tren yang menampilkan metrik selama 10 proses terakhir. Laporan visual membantu pemangku kepentingan nonteknis memahami apakah sistem mengalami peningkatan.

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)

Melacak Biaya Setiap Proses Evaluasi

Proses evaluasi membutuhkan biaya — proses ini memanggil API embedding, API LLM, dan LLM penilai. Lacak biaya setiap proses evaluasi bersama metrik kualitas. Evaluasi komprehensif terhadap 100 kasus pengujian biasanya berbiaya $0.50 hingga $2.00, bergantung pada model yang digunakan. Gunakan model yang lebih murah untuk pemanggilan penilai (GPT-4o-mini untuk penilaian kesetiaan) dan simpan model mahal untuk pembuatan. Sertakan perkiraan biaya proses dalam laporan tersimpan agar Anda dapat menganggarkan evaluasi dalam siklus pengembangan.

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

Evaluasi Terjadwal untuk Pemantauan Produksi

Selain evaluasi CI/CD saat terjadi perubahan kode, jalankan kerangka evaluasi secara terjadwal di produksi — setiap hari atau setiap minggu — dengan menguji kueri pengguna nyata yang diambil dari catatan Anda. Hal ini mendeteksi pergeseran data: seiring berkembangnya kumpulan dokumen dan berubahnya pola kueri pengguna, kualitas sistem dapat menurun tanpa perubahan kode apa pun. Jadwalkan proses evaluasi mingguan yang mengambil sampel 50 kueri pengguna terbaru, mengevaluasinya, dan secara otomatis mengirimkan ringkasan kualitas ke kanal Slack tim Anda.

# 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)

Memvisualisasikan Tren Metrik dari Waktu ke Waktu

Angka mentah dalam berkas JSONL sulit dipahami secara sekilas. Buat visualisasi tren sederhana yang memplot setiap metrik selama 20 proses evaluasi terakhir pada grafik garis. Gunakan stempel waktu proses sebagai sumbu x dan skor metrik sebagai sumbu y. Plot garis horizontal pada ambang minimum yang dapat diterima. Ketika suatu metrik turun di bawah garis ambang, masalah tersebut langsung terlihat tanpa perlu membaca data mentah. Alat seperti Matplotlib atau dasbor web sederhana (Grafana, Streamlit) cocok digunakan untuk hal ini.

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}')

Pemeriksaan Singkat

Uji pemahaman Anda tentang konsep Rekayasa AI dari pelajaran ini.

Ringkasan Pelajaran

Dalam pelajaran ini Anda mempelajari: cara menyusun kerangka evaluasi lengkap dengan pengelolaan data pengujian, eksekusi alur kerja, penghitungan metrik, dan pembuatan laporan, cara membandingkan proses dengan tolok ukur dan menggagalkan CI/CD saat terjadi regresi, cara menghasilkan laporan yang mudah dipahami manusia untuk ditinjau tim, serta cara menjalankan pemantauan produksi terjadwal untuk mendeteksi pergeseran data tanpa perubahan kode. Kini Anda memiliki dasar yang lengkap untuk membangun dan mengevaluasi sistem RAG produksi.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membangun Sistem Evaluasi Otomatis” gratis?

Ya — teks lengkap “Membangun Sistem Evaluasi Otomatis” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Membangun Sistem Evaluasi Otomatis”?

Buat alur evaluasi berulang yang menjalankan seluruh sistem RAG terhadap set pengujian, menghitung semua metrik, dan menghasilkan laporan agar Anda dapat melacak peningkatan dari waktu ke waktu. Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?

Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Membangun Sistem Evaluasi Otomatis” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?

Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengapa Evaluasi Penting dalam RAG
  2. Metrik Pengambilan: Hit Rate, MRR, dan NDCG
  3. Metrik Pembuatan: Kesetiaan dan Relevansi Jawaban
  4. Membangun Sistem Evaluasi Otomatis
← Kembali ke AI Engineering Academy