Mengevaluasi dan Menerapkan Model yang Disetel Halus
Jalankan evaluasi kuantitatif yang membandingkan model dasar dan model yang disetel halus pada kasus pengujian yang disisihkan, konversikan ke GGUF untuk inferensi lokal, lalu sajikan melalui llama.cpp atau vLLM.
Mengevaluasi dan Menerapkan Model yang Disetel Halus 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.
Mengapa Evaluasi Harus Dilakukan Sebelum Penerapan
Model yang telah disempurnakan dan berkinerja baik pada data pelatihan bisa saja berkinerja lebih buruk daripada model dasar pada kasus penggunaan produksi Anda yang sebenarnya. Satu-satunya cara untuk mengetahuinya adalah melalui evaluasi yang ketat. Fine-tuning dapat menyebabkan catastrophic forgetting (hilangnya kemampuan yang dimiliki model dasar), spesialisasi berlebihan (berkinerja baik pada tugas Anda tetapi lebih buruk pada tugas yang berdekatan), atau penurunan kecil yang sulit terlihat dalam perilaku keselamatan. Jangan pernah menerapkan model yang telah disempurnakan tanpa mengevaluasinya terhadap model dasar menggunakan set pengujian yang representatif.
Membangun Set Pengujian yang Disisihkan
Set pengujian Anda harus sepenuhnya terpisah dari data pelatihan dan validasi — berisi contoh yang belum pernah dilihat model selama tahap pelatihan apa pun. Set pengujian harus mewakili distribusi lengkap masukan produksi: kasus umum, kasus batas, dan masukan adversarial. Untuk tugas mengikuti instruksi, sertakan contoh yang mengharuskan model mengikuti semua aspek instruksi, bukan hanya aspek yang paling umum. Set pengujian yang terdiri dari 100–500 contoh biasanya sudah cukup untuk evaluasi yang andal.
import json
from typing import TypedDict
class TestCase(TypedDict):
input: str # the user message
expected_output: str # the ideal response
category: str # e.g., 'format', 'accuracy', 'edge_case'
evaluation_method: str # 'exact_match', 'json_schema', 'llm_judge'
# Load test set (never used during training)
def load_test_set(path: str) -> list[TestCase]:
cases = []
with open(path) as f:
for line in f:
data = json.loads(line.strip())
cases.append({
'input': data['messages'][-2]['content'], # user message
'expected_output': data['messages'][-1]['content'], # assistant response
'category': data.get('metadata', {}).get('category', 'general'),
'evaluation_method': data.get('metadata', {}).get('eval_method', 'llm_judge')
})
return cases
test_set = load_test_set('test.jsonl')
print(f'Test set loaded: {len(test_set)} examples')Metrik Kuantitatif untuk Evaluasi Khusus Tugas
Pilih metrik evaluasi yang sesuai dengan tugas Anda. Untuk ekstraksi JSON, ukur tingkat kepatuhan terhadap skema dan akurasi pada tingkat bidang. Untuk klasifikasi, ukur akurasi, presisi, dan perolehan untuk setiap kelas. Untuk pembuatan teks, gunakan penilaian LLM sebagai juri untuk mengukur kualitas. Untuk kepatuhan format, ukur tingkat kepatuhan terhadap format yang persis. Jalankan setiap metrik pada model dasar dan model yang telah disempurnakan agar Anda dapat mengukur perubahan peningkatannya.
import json
def evaluate_json_extraction(model_output: str, expected: str, schema: dict) -> dict:
metrics = {'valid_json': False, 'schema_compliant': False, 'field_accuracy': 0.0}
try:
parsed = json.loads(model_output.strip())
metrics['valid_json'] = True
# Check schema compliance
required_fields = schema.get('required', [])
all_present = all(field in parsed for field in required_fields)
correct_types = all(
isinstance(parsed.get(field), schema['properties'][field]['expected_type'])
for field in required_fields if field in parsed
)
metrics['schema_compliant'] = all_present and correct_types
# Field-level accuracy against expected output
expected_parsed = json.loads(expected)
correct_fields = sum(1 for k in expected_parsed if parsed.get(k) == expected_parsed[k])
metrics['field_accuracy'] = correct_fields / len(expected_parsed) if expected_parsed else 0.0
except json.JSONDecodeError:
pass # valid_json stays False
return metricsEvaluasi LLM sebagai Juri
Untuk tugas pembuatan teks terbuka, gunakan LLM sebagai juri untuk menilai keluaran model yang telah disempurnakan berdasarkan keluaran yang diharapkan. Beri GPT-4o perintah untuk bertindak sebagai evaluator, berikan masukan, keluaran yang diharapkan, dan keluaran model, lalu minta model tersebut menilai ketepatan, kelengkapan, dan kepatuhan format pada skala 1–5. Hitung rata-rata skor di seluruh set pengujian untuk memperoleh penilaian kualitas keseluruhan. Bandingkan skor model yang telah disempurnakan dengan skor model dasar pada set pengujian yang sama.
from openai import OpenAI
client = OpenAI()
def llm_judge_score(instruction: str, expected: str, actual: str) -> dict:
judge_prompt = f'''Evaluate the quality of an AI assistant response.
Instruction given to assistant:
{instruction}
Expected ideal response:
{expected}
Actual response from model being evaluated:
{actual}
Rate the actual response on these criteria (1=poor, 5=excellent):
1. Correctness: Is the information accurate?
2. Format compliance: Does it follow the expected output format?
3. Completeness: Does it address all parts of the instruction?
Return JSON: {{"correctness": N, "format": N, "completeness": N, "overall": N, "reason": "brief explanation"}}'''
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': judge_prompt}],
response_format={'type': 'json_object'}
)
return json.loads(response.choices[0].message.content)Menjalankan Evaluasi Perbandingan
Jalankan evaluasi head-to-head yang membandingkan model dasar, model yang telah disempurnakan (dan, jika diinginkan, baseline dengan perintah yang kuat) pada semua kasus pengujian. Hasilkan keluaran dari setiap model untuk setiap kasus pengujian, lalu nilai semua keluaran menggunakan metrik evaluasi Anda. Buat tabel perbandingan yang menampilkan skor metrik, simpangan baku, serta contoh ketika model yang telah disempurnakan mengungguli atau kalah dari baseline.
def run_full_evaluation(test_set: list, models: dict, system_prompt: str) -> dict:
results = {name: {'scores': [], 'errors': 0} for name in models}
for i, test_case in enumerate(test_set):
print(f'Evaluating test case {i+1}/{len(test_set)}')
for model_name, model_fn in models.items():
try:
output = model_fn(test_case['input'], system_prompt)
score = llm_judge_score(
test_case['input'],
test_case['expected_output'],
output
)
results[model_name]['scores'].append(score['overall'])
except Exception as e:
results[model_name]['errors'] += 1
results[model_name]['scores'].append(0)
# Summarize
summary = {}
for name, data in results.items():
scores = data['scores']
summary[name] = {
'mean_score': sum(scores) / len(scores),
'errors': data['errors']
}
print(f'{name}: mean={summary[name]["mean_score"]:.2f}, errors={data["errors"]}')
return summaryPengujian Regresi untuk Catastrophic Forgetting
Fine-tuning dapat menurunkan kemampuan umum model, suatu fenomena yang disebut catastrophic forgetting. Jalankan rangkaian pengujian regresi pada model dasar dan model yang telah disempurnakan, yang mencakup tugas-tugas penting di luar tugas target Anda: menjawab pertanyaan umum, penalaran, pembuatan kode, dan mengikuti instruksi. Jika skor model yang telah disempurnakan jauh lebih rendah pada tugas-tugas tersebut, peringkat LoRA Anda mungkin terlalu tinggi atau Anda melatih model terlalu banyak epoch.
REGRESSION_TEST_CASES = [
# General QA
{'input': 'What is the capital of France?', 'expected_substring': 'Paris'},
{'input': 'What is 17 * 23?', 'expected_substring': '391'},
# Instruction following
{'input': 'List 3 planets. Format as: 1. Planet Name', 'expected_pattern': r'^1\. '},
# Reasoning
{'input': 'If all A are B and all B are C, are all A also C?', 'expected_substring': 'yes'},
]
def run_regression_tests(model_fn, test_cases: list) -> float:
passed = 0
for test in test_cases:
output = model_fn(test['input'], '')
if 'expected_substring' in test:
if test['expected_substring'].lower() in output.lower():
passed += 1
elif 'expected_pattern' in test:
import re
if re.search(test['expected_pattern'], output):
passed += 1
rate = passed / len(test_cases)
print(f'Regression test pass rate: {rate:.1%} ({passed}/{len(test_cases)})')
return rateMengonversi ke GGUF untuk Inferensi Lokal
Untuk penerapan lokal tanpa infrastruktur GPU yang mahal, konversikan model yang telah digabungkan ke format GGUF dan jalankan inferensi dengan llama.cpp. GGUF mendukung berbagai tingkat kuantisasi: Q4_K_M (4-bit, keseimbangan kualitas/kecepatan yang baik), Q8_0 (8-bit, kualitas yang hampir setara dengan presisi penuh), dan Q2_K (2-bit, sangat cepat tetapi kualitas lebih rendah). Model 7B terkuantisasi Q4 hanya memerlukan sekitar 4 GB RAM dan dapat berjalan pada CPU dengan kecepatan 1–5 token per detik.
# Step 1: Convert merged HuggingFace model to GGUF
# git clone https://github.com/ggerganov/llama.cpp
# python llama.cpp/convert_hf_to_gguf.py ./merged-model --outtype f16 --outfile model-f16.gguf
# Step 2: Quantize to 4-bit
# ./llama.cpp/llama-quantize model-f16.gguf model-q4.gguf Q4_K_M
# Step 3: Run inference with llama.cpp Python bindings
# pip install llama-cpp-python
from llama_cpp import Llama
llm = Llama(
model_path='./model-q4.gguf',
n_ctx=4096, # context window
n_threads=8, # CPU threads
n_gpu_layers=0 # set > 0 to offload layers to GPU
)
output = llm.create_chat_completion(
messages=[{'role': 'user', 'content': 'What is the capital of France?'}],
temperature=0.1
)
print(output['choices'][0]['message']['content'])Menyediakan Layanan dengan vLLM untuk Produksi
Untuk menyediakan layanan model yang telah disempurnakan dalam skala produksi, vLLM saat ini merupakan standar. vLLM menggunakan PagedAttention untuk mengelompokkan beberapa permintaan secara efisien, sehingga secara signifikan meningkatkan throughput GPU. vLLM mendukung titik akhir API yang kompatibel dengan OpenAI, sehingga dapat langsung menggantikan API OpenAI. Satu GPU A100 yang menjalankan vLLM dengan model 7B yang telah disempurnakan dapat menangani ratusan permintaan per menit.
# Start vLLM server (run from command line)
# pip install vllm
# python -m vllm.entrypoints.openai.api_server \
# --model ./merged-model \
# --host 0.0.0.0 \
# --port 8000 \
# --max-model-len 4096 \
# --tensor-parallel-size 1
# Use with OpenAI client (drop-in replacement)
from openai import OpenAI
client = OpenAI(
base_url='http://localhost:8000/v1',
api_key='not-needed' # vLLM doesn't require auth by default
)
response = client.chat.completions.create(
model='merged-model', # model name matches the path you passed to vLLM
messages=[{'role': 'user', 'content': 'Extract JSON from: "Alice, 30, NYC"'}]
)
print(response.choices[0].message.content)Pengujian A/B pada Model yang Telah Disempurnakan
Sebelum sepenuhnya beralih ke model yang telah disempurnakan dalam produksi, jalankan pengujian A/B: arahkan sebagian lalu lintas produksi (mulai dengan 5–10%) ke model yang telah disempurnakan, sementara sebagian besar lalu lintas tetap menggunakan model dasar atau pendekatan perintah yang ada. Pantau skor kualitas, latensi, dan metrik kepuasan pengguna untuk kedua kelompok. Tingkatkan porsi lalu lintas model yang telah disempurnakan hanya jika pengujian A/B mengonfirmasi adanya peningkatan setelah jumlah permintaan yang signifikan secara statistik tercapai.
import random
class ModelRouter:
def __init__(self, fine_tuned_traffic_fraction=0.1):
self.ft_fraction = fine_tuned_traffic_fraction
self.metrics = {'base': {'count': 0, 'quality_sum': 0}, 'fine_tuned': {'count': 0, 'quality_sum': 0}}
def route(self, user_id: str, request: str) -> dict:
# Deterministic routing by user_id (same user always goes to same model)
use_fine_tuned = (hash(user_id) % 100) < (self.ft_fraction * 100)
model_group = 'fine_tuned' if use_fine_tuned else 'base'
response = call_model(request, use_fine_tuned=use_fine_tuned)
return {'response': response, 'model_group': model_group}
def record_quality(self, model_group: str, quality_score: float):
self.metrics[model_group]['count'] += 1
self.metrics[model_group]['quality_sum'] += quality_score
def ab_test_summary(self) -> dict:
summary = {}
for group, data in self.metrics.items():
avg = data['quality_sum'] / data['count'] if data['count'] > 0 else 0
summary[group] = {'avg_quality': avg, 'n': data['count']}
return summaryMemelihara Model yang Telah Disempurnakan dari Waktu ke Waktu
Model yang telah disempurnakan memerlukan pemeliharaan berkelanjutan. Saat model dasar diperbarui (versi GPT-4o baru, rilis Mistral baru), bobot adaptor Anda mungkin tidak kompatibel dan Anda mungkin perlu melakukan pelatihan ulang. Saat persyaratan tugas berubah, Anda perlu memperbarui data pelatihan dan melakukan pelatihan ulang. Saat menemukan mode kegagalan baru dalam produksi, tambahkan contoh ke set pelatihan Anda. Rencanakan pelatihan ulang berkala sebagai bagian dari alur kerja operasi ML produksi Anda.
Matriks Keputusan Penerapan
Memilih strategi penerapan untuk model yang telah disetel bergantung pada skala dan batasan infrastruktur Anda. Untuk volume rendah (kurang dari 1000 permintaan/hari), API penyetelan OpenAI adalah pilihan paling sederhana. Untuk volume sedang (1000–100.000/hari), pertimbangkan vLLM pada satu instans GPU. Untuk aplikasi dengan volume tinggi atau yang sensitif terhadap latensi, gunakan vLLM dengan beberapa GPU, pertimbangkan paralelisme tensor, dan tambahkan lapisan caching di bagian depan. Untuk data yang sensitif terhadap privasi, host sendiri pada infrastruktur Anda menggunakan GGUF/llama.cpp atau vLLM.
Pemeriksaan Singkat
Uji pemahaman Anda tentang evaluasi dan penerapan model yang telah disetel dari pelajaran ini.
Rangkuman Pelajaran
Dalam pelajaran ini, Anda mempelajari bahwa evaluasi prapenerapan yang ketat dengan membandingkan model yang telah disetel dengan model dasar menggunakan kasus uji yang disisihkan adalah hal yang wajib dilakukan, pengujian regresi mendeteksi hilangnya kemampuan umum secara drastis akibat spesialisasi berlebihan, dan opsi penerapan berkisar dari API penyetelan terkelola OpenAI untuk kesederhanaan hingga vLLM untuk penyajian produksi berthroughput tinggi serta GGUF/llama.cpp untuk inferensi lokal berbasis CPU. Selamat karena telah menyelesaikan jalur Rekayasa AI!
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengevaluasi dan Menerapkan Model yang Disetel Halus” gratis?
Ya — teks lengkap “Mengevaluasi dan Menerapkan Model yang Disetel Halus” 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 “Mengevaluasi dan Menerapkan Model yang Disetel Halus”?
Jalankan evaluasi kuantitatif yang membandingkan model dasar dan model yang disetel halus pada kasus pengujian yang disisihkan, konversikan ke GGUF untuk inferensi lokal, lalu sajikan melalui llama.c… 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 “Mengevaluasi dan Menerapkan Model yang Disetel Halus” 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
- Kapan Penyetelan Halus Mengungguli Pemberian Perintah
- Menyiapkan Kumpulan Data Pelatihan Berkualitas Tinggi
- Penyetelan Halus LoRA dengan Hugging Face PEFT
- Mengevaluasi dan Menerapkan Model yang Disetel Halus