0Pricing
AI Prompt Engineering · Pelajaran

Mengevaluasi Pipeline DSPy

Metrik, set pengembangan, dan fungsi evaluate() untuk penilaian otomatis.

Mengevaluasi Pipeline DSPy adalah pelajaran AI Prompt Engineering 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 Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.

Mengapa Evaluasi Penting dalam DSPy

Pengoptimalan DSPy hanya sebaik evaluasi Anda. Metrik yang lemah akan menghasilkan program terkompilasi yang mendapat skor tinggi berdasarkan metrik tersebut, tetapi gagal saat digunakan di lingkungan produksi. Perangkat evaluasi yang tepat memungkinkan Anda membandingkan program yang belum dioptimalkan dengan program yang sudah dioptimalkan, serta mendeteksi kemunduran saat Anda memperbarui alur pemrosesan.

Kelas dspy.Evaluate

dspy.Evaluate menjalankan program Anda pada sebuah kumpulan data, menerapkan metrik, dan melaporkan skor agregat. Fitur ini mendukung pemrosesan paralel melalui num_threads agar evaluasi pada kumpulan data besar berlangsung lebih cepat.

import dspy

# Build a devset of labeled examples
devset = [
    dspy.Example(question='What is 7 * 8?', answer='56').with_inputs('question'),
    dspy.Example(question='Name the largest planet.', answer='Jupiter').with_inputs('question'),
    # ... more examples
]

# Create evaluator
evaluate = dspy.Evaluate(
    devset=devset,
    metric=exact_match_metric,  # Your metric function
    num_threads=4,              # Parallel evaluation
    display_progress=True,      # Show progress bar
    display_table=True,         # Show per-example results
)

# Run
score = evaluate(my_program)
print(f'Overall score: {score:.1%}')

Menulis Fungsi Metrik

Fungsi metrik memiliki tanda tangan (example, prediction, trace=None) -> float. Fungsi ini membandingkan prediksi program dengan jawaban yang benar pada example.

Parameter trace bernilai non-None selama pengoptimalan, bukan evaluasi — Anda dapat menggunakannya untuk menerapkan logika yang berbeda selama kompilasi dan evaluasi.

import dspy

def exact_match_metric(example, prediction, trace=None):
    return float(
        example.answer.strip().lower() == prediction.answer.strip().lower()
    )

def contains_metric(example, prediction, trace=None):
    """Check if expected answer appears anywhere in prediction."""
    return float(example.answer.lower() in prediction.answer.lower())

def length_penalized_metric(example, prediction, trace=None):
    """Reward correct answers, penalize overly long ones."""
    correct = float(example.answer.lower() in prediction.answer.lower())
    length_ok = float(len(prediction.answer.split()) <= 20)
    return correct * (0.8 + 0.2 * length_ok)

# Use any of these as the metric parameter
evaluate = dspy.Evaluate(devset=devset, metric=contains_metric)

Pola Ambang Lulus/Gagal

Untuk metrik biner, Anda dapat menentukan ambang batas: sebuah prediksi dinyatakan “lulus” jika memenuhi standar kualitas minimum. Hal ini berguna untuk menyaring contoh few-shot selama pengoptimalan bootstrap.

import dspy

def quality_metric(example, prediction, trace=None):
    """
    Multi-factor metric with pass/fail threshold.
    Returns float 0.0 to 1.0.
    During compilation (trace is not None), DSPy uses this to decide
    which traces to bootstrap as demos.
    """
    score = 0.0

    # Factor 1: Factual correctness (0.6 weight)
    if example.answer.lower() in prediction.answer.lower():
        score += 0.6

    # Factor 2: Conciseness (0.4 weight)
    word_count = len(prediction.answer.split())
    if word_count <= 15:
        score += 0.4
    elif word_count <= 30:
        score += 0.2

    # During optimization: only use examples scoring >= 0.6
    if trace is not None:
        return score >= 0.6

    return score

Membagi Data: Pelatihan, Pengembangan, Pengujian

Ikuti praktik standar pembagian data ML dalam DSPy:

  • Trainset: Digunakan oleh pengoptimal untuk melakukan bootstrap pada demo (20–200 contoh)
  • Devset: Digunakan oleh pengoptimal untuk validasi selama pencarian
  • Testset: Dipisahkan sepenuhnya — hanya digunakan untuk evaluasi akhir
import random

# All labeled examples
all_examples = load_examples()  # Returns list of dspy.Example
random.shuffle(all_examples)

total = len(all_examples)
train_end = int(total * 0.6)
dev_end   = int(total * 0.8)

trainset = all_examples[:train_end]    # 60% for optimization
devset   = all_examples[train_end:dev_end]  # 20% for validation
testset  = all_examples[dev_end:]      # 20% held out

print(f'Train: {len(trainset)}, Dev: {len(devset)}, Test: {len(testset)}')

Membandingkan Program yang Dioptimalkan dan Belum Dioptimalkan

Selalu lakukan tolok ukur pada program terkompilasi Anda dengan membandingkannya dengan program dasar (yang belum dikompilasi) menggunakan kumpulan pengujian yang sama. Hal ini membuktikan bahwa pengoptimalan benar-benar memberikan manfaat dan mengukur besarnya peningkatan.

import dspy

evaluate = dspy.Evaluate(
    devset=testset,
    metric=exact_match_metric,
    num_threads=4,
    display_progress=True,
)

# Baseline: unoptimized program
baseline_score = evaluate(unoptimized_program)
print(f'Baseline (no optimization): {baseline_score:.1%}')

# BootstrapFewShot compiled
bs_score = evaluate(bootstrap_compiled_program)
print(f'BootstrapFewShot compiled:  {bs_score:.1%}')

# MIPRO compiled
mipro_score = evaluate(mipro_compiled_program)
print(f'MIPRO compiled:             {mipro_score:.1%}')

# Pick the winner
print(f'Best improvement: +{max(bs_score, mipro_score) - baseline_score:.1%}')

Pemrosesan Paralel dengan num_threads

Kumpulan evaluasi yang besar dapat memerlukan waktu berjam-jam jika dijalankan secara berurutan. num_threads dalam dspy.Evaluate menjalankan prediksi secara paralel sehingga waktu nyata yang diperlukan berkurang secara proporsional.

Sesuaikan num_threads dengan batas laju API Anda — terlalu banyak utas akan memicu kesalahan batas laju.

import dspy
import time

devset = [...]  # 200 examples

# Sequential evaluation
start = time.time()
evaluate_seq = dspy.Evaluate(devset=devset, metric=metric, num_threads=1)
score_seq = evaluate_seq(program)
print(f'Sequential: {time.time()-start:.0f}s')

# Parallel evaluation (4 threads)
start = time.time()
evaluate_par = dspy.Evaluate(devset=devset, metric=metric, num_threads=4)
score_par = evaluate_par(program)
print(f'Parallel (4 threads): {time.time()-start:.0f}s')
# Typically ~4x faster — same score, less wait time

Menafsirkan Keluaran Evaluasi

Saat display_table=True, DSPy menampilkan tabel terperinci yang berisi setiap contoh, prediksi, dan informasi apakah contoh tersebut lulus berdasarkan metrik. Fitur ini sangat membantu untuk mendiagnosis pola kegagalan.

Perhatikan hal-hal berikut: kegagalan sistematis pada jenis pertanyaan tertentu, kasus khusus pada metrik, atau contoh yang tidak tercakup dalam kumpulan pelatihan Anda.

import dspy

evaluate = dspy.Evaluate(
    devset=devset,
    metric=exact_match_metric,
    num_threads=2,
    display_progress=True,
    display_table=10,  # Show first 10 rows of results table
    return_outputs=True,  # Return (score, outputs) tuple
)

score, outputs = evaluate(program, return_all_scores=True)

# Find failing examples
failures = [
    (ex, pred, s)
    for ex, pred, s in outputs
    if s == 0.0
]
print(f'Failures: {len(failures)}/{len(devset)}')
for ex, pred, _ in failures[:3]:
    print(f'Q: {ex.question}')
    print(f'Expected: {ex.answer}')
    print(f'Got: {pred.answer}')

Menggunakan Metrik yang Dinilai LLM

Untuk keluaran terbuka yang tidak dapat dinilai dengan pencocokan persis, gunakan LLM untuk menilai kualitasnya. DSPy memudahkan hal ini — fungsi metrik Anda sendiri dapat memanggil prediktor DSPy.

import dspy

class GradeAnswer(dspy.Signature):
    """Grade whether the predicted answer is correct given the reference."""
    question: str = dspy.InputField()
    reference_answer: str = dspy.InputField()
    predicted_answer: str = dspy.InputField()
    is_correct: bool = dspy.OutputField(
        desc='True if the predicted answer is semantically correct'
    )

grader = dspy.Predict(GradeAnswer)

def llm_graded_metric(example, prediction, trace=None):
    result = grader(
        question=example.question,
        reference_answer=example.answer,
        predicted_answer=prediction.answer,
    )
    return float(result.is_correct)

# Use this metric when answers can vary in phrasing
evaluate = dspy.Evaluate(devset=devset, metric=llm_graded_metric)

Pengujian Regresi dengan Evaluasi

Perlakukan rangkaian evaluasi DSPy seperti rangkaian pengujian. Setiap kali Anda memperbarui tanda tangan, arsitektur modul, atau data pelatihan, jalankan kembali evaluasi dan bandingkan skornya untuk mendeteksi kemunduran.

import json
import dspy

def run_and_save_evaluation(program, program_name, testset, metric):
    evaluate = dspy.Evaluate(
        devset=testset,
        metric=metric,
        num_threads=4,
    )
    score = evaluate(program)

    # Save score to history file
    history_file = 'eval_history.json'
    try:
        with open(history_file) as f:
            history = json.load(f)
    except FileNotFoundError:
        history = []

    history.append({'program': program_name, 'score': score})
    with open(history_file, 'w') as f:
        json.dump(history, f, indent=2)

    print(f'{program_name}: {score:.1%}')
    return score

Praktik Terbaik Evaluasi

Prinsip utama evaluasi untuk alur pemrosesan DSPy:

  • Pastikan testset benar-benar dipisahkan — jangan pernah mengoptimalkan berdasarkan testset
  • Gunakan setidaknya 50–100 contoh pengujian agar skor dapat diandalkan
  • Sesuaikan metrik dengan tujuan produksi yang sebenarnya
  • Bandingkan beberapa pengoptimal — hasilnya berbeda-beda menurut tugas
  • Lacak skor dari waktu ke waktu untuk mendeteksi kemunduran
  • Periksa kegagalan secara manual untuk meningkatkan data pelatihan

Pemeriksaan Pengetahuan: Parameter Trace pada Fungsi Metrik

Dalam fungsi metrik DSPy, apa yang ditunjukkan oleh parameter trace yang bernilai non-None?

Ringkasan: Mengevaluasi Alur Pemrosesan DSPy

dspy.Evaluate menjalankan program Anda pada devset berlabel, menerapkan fungsi metrik, dan melaporkan skor agregat. Fungsi metrik mengikuti pola (example, prediction, trace=None) -> float. Gunakan num_threads untuk evaluasi paralel dan display_table=True untuk mendiagnosis kegagalan. Selalu bandingkan program yang dioptimalkan dengan program yang belum dioptimalkan menggunakan testset yang dipisahkan. Untuk keluaran terbuka, metrik yang dinilai LLM lebih unggul daripada pencocokan string secara persis.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengevaluasi Pipeline DSPy” gratis?

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

Apa yang akan aku pelajari di “Mengevaluasi Pipeline DSPy”?

Metrik, set pengembangan, dan fungsi evaluate() untuk penilaian otomatis. Kamu berlatih AI Prompt Engineering 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 Prompt Engineering?

Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering 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 “Mengevaluasi Pipeline DSPy” 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 Prompt Engineering ini?

Ya. Setiap pelajaran AI Prompt Engineering 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. Pengantar Framework DSPy
  2. Mendefinisikan Signature dan Modul
  3. Mengompilasi dan Mengoptimalkan Prompt
  4. Mengevaluasi Pipeline DSPy
← Kembali ke AI Prompt Engineering