Hienosäädetyn mallin arviointi ja käyttöönotto
Suorita määrälliset arvioinnit vertaamalla perusmallia ja hienosäädettyä mallia erillisillä testitapauksilla, muunna malli GGUF-muotoon paikallista päättelyä varten ja tarjoa se llama.cpp:n tai vLLM:n kautta.
Hienosäädetyn mallin arviointi ja käyttöönotto on ilmainen AI Engineering Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu AI Engineering Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. AI Engineering Academy-kurssilla on yhteensä 4 oppituntia.
Miksi arviointi on tehtävä ennen käyttöönottoa?
Koulutusaineistolla hyvin toimiva hienosäädetty malli saattaa suoriutua todellisessa tuotantokäyttötapauksessanne perusmallia huonommin. Ainoa tapa selvittää asia on perusteellinen arviointi. Hienosäätö voi aiheuttaa katastrofaalista unohtamista (perusmallin kyvykkyyksien menettämistä), ylikohdentumista (hyvä suorituskyky omassa tehtävässänne mutta heikompi lähitehtävissä) tai hienovaraisia taantumia turvallisuuskäyttäytymisessä. Älkää koskaan ottako hienosäädettyä mallia käyttöön vertaamatta sitä arvioinnissa perusmalliin edustavalla testijoukolla.
Erillisen testijoukon rakentaminen
Testijoukon on oltava täysin erillinen koulutus- ja validointiaineistoista — sen esimerkkejä mallille ei ole näytetty missään koulutuksen vaiheessa. Testijoukon tulee edustaa tuotantosyötteiden koko jakaumaa: yleisiä tapauksia, poikkeustapauksia ja vastakkaisasetteluun tarkoitettuja syötteitä. Ohjeiden noudattamista koskevissa tehtävissä mukaan tulee ottaa esimerkkejä, jotka edellyttävät ohjeen kaikkien osien noudattamista, eivät vain yleisimpien. Luotettavaan arviointiin riittää yleensä 100–500 esimerkin testijoukko.
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')Määrälliset mittarit tehtäväkohtaiseen arviointiin
Valitkaa tehtäväänne sopivat arviointimittarit. JSON-poiminnassa mitatkaa skeemanmukaisuutta ja kenttäkohtaista tarkkuutta. Luokittelussa mitatkaa tarkkuutta, precisionia ja recallia luokittain. Tekstin generoinnissa käyttäkää laadun arviointiin LLM-as-judge-pisteytystä. Muodon noudattamisessa mitatkaa täsmällisen muodon noudattamisastetta. Suorittakaa jokainen mittaus sekä perusmallilla että hienosäädetyllä mallilla, jotta voitte mitata parannuksen suuruuden.
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 metricsLLM-as-judge-arviointi
Avoimesti määritellyissä generointitehtävissä käyttäkää LLM-as-judge-arvioijaa pisteyttämään hienosäädetyn mallin tulokset suhteessa odotettuihin tuloksiin. Pyytäkää GPT-4oa toimimaan arvioijana, antakaa sille syöte, odotettu tulos ja mallin tulos ja pyytäkää sitä arvioimaan oikeellisuus, kattavuus ja muodonmukaisuus asteikolla 1–5. Laskekaa testijoukon pisteiden keskiarvo yleiseksi laatuarvioksi. Verratkaa hienosäädetyn mallin pistemäärää perusmallin pistemäärään samalla testijoukolla.
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)Vertailuarvioinnin suorittaminen
Suorittakaa vastakkainen arviointi, jossa vertaatte perusmallia, hienosäädettyä mallia ja halutessanne vahvaa kehotusperustaa kaikissa testitapauksissa. Tuottakaa jokaiselle testitapaukselle tulos kustakin mallista ja pisteyttäkää kaikki tulokset arviointimittareillanne. Laaditte vertailutaulukon, jossa näkyvät mittarien pisteet, keskihajonnat sekä esimerkit tilanteista, joissa hienosäädetty malli päihittää vertailukohdan tai häviää sille.
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 summaryRegressiotestaus katastrofaalisen unohtamisen varalta
Hienosäätö voi heikentää mallin yleisiä kyvykkyyksiä; tätä ilmiötä kutsutaan katastrofaaliseksi unohtamiseksi. Suorittakaa sekä perusmallilla että hienosäädetyllä mallilla regressiotestisarja, joka kattaa kohdetehtävän lisäksi teille tärkeät tehtävät: yleisen kysymyksiin vastaamisen, päättelyn, koodin generoinnin ja ohjeiden noudattamisen. Jos hienosäädetyn mallin pisteet ovat näissä tehtävissä merkittävästi heikommat, LoRA-rankinne saattaa olla liian suuri tai olette kouluttaneet mallia liian monen epookin ajan.
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 rateMuuntaminen GGUF-muotoon paikallista päättelyä varten
Jos haluatte ottaa mallin käyttöön paikallisesti ilman kallista näytönohjaininfrastruktuuria, muuntakaa yhdistetty mallinne GGUF-muotoon ja suorittakaa päättely llama.cpp:llä. GGUF tukee useita kvantisointitasoja: Q4_K_M (4-bittinen, hyvä laadun ja nopeuden tasapaino), Q8_0 (8-bittinen, lähes täysi laatu) ja Q2_K (2-bittinen, erittäin nopea mutta heikkolaatuisempi). Q4-kvantisoitu 7B-malli tarvitsee vain noin 4 Gt RAM-muistia, ja sitä voi käyttää suorittimella nopeudella 1–5 tokenia sekunnissa.
# 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'])Tarjoilu vLLM:n avulla tuotannossa
Hienosäädetyn mallin tuotantotason tarjoiluun suuressa mittakaavassa vLLM on tällä hetkellä standardi. vLLM käyttää PagedAttention-menetelmää useiden pyyntöjen tehokkaaseen eräajoon, mikä kasvattaa näytönohjaimen läpimenoa huomattavasti. Se tukee OpenAI-yhteensopivia API-päätepisteitä, joten se voi korvata OpenAI API:n suoraan. Yksi A100-näytönohjain, jolla ajetaan vLLM:ää hienosäädetyllä 7B-mallilla, voi käsitellä satoja pyyntöjä minuutissa.
# 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)Hienosäädetyn mallin A/B-testaus
Ennen kuin vaihdatte tuotannossa kokonaan hienosäädettyyn malliin, suorittakaa A/B-testi: ohjatkaa osa tuotantoliikenteestä (aloittakaa 5–10 prosentista) hienosäädetylle mallille samalla, kun enemmistö käyttää edelleen perusmallia tai nykyistä kehotemenetelmää. Seuratkaa molempien ryhmien laatupisteitä, viivettä ja käyttäjätyytyväisyyttä kuvaavia mittareita. Kasvattakaa hienosäädetyn mallin liikenneosuutta vasta, jos A/B-testi vahvistaa parannuksen tilastollisesti merkitsevän pyyntömäärän jälkeen.
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 summaryHienosäädettyjen mallien ylläpito ajan mittaan
Hienosäädetyt mallit vaativat jatkuvaa ylläpitoa. Kun perusmalli päivittyy (uusi GPT-4o-versio tai uusi Mistral-julkaisu), sovittimen painot eivät ehkä ole yhteensopivia, ja saatatte joutua kouluttamaan mallin uudelleen. Kun tehtävän vaatimukset muuttuvat, koulutusaineisto on päivitettävä ja malli koulutettava uudelleen. Kun tuotannossa havaitaan uusia virhetilanteita, lisätkää esimerkkejä koulutusaineistoon. Suunnitelkaa määräajoin toistettava uudelleenkoulutus osaksi tuotannon ML-toimintojen työnkulkua.
Käyttöönottopäätöksen matriisi
Hienosäädetyn mallin käyttöönottostrategian valinta riippuu mittakaavasta ja infrastruktuurin rajoitteista. Pienellä volyymilla (alle 1000 pyyntöä päivässä) OpenAI:n fine-tuning API on yksinkertaisin vaihtoehto. Keskisuurella volyymilla (1000–100 000 pyyntöä päivässä) kannattaa harkita vLLM:ää yhdellä GPU-instanssilla. Suurella volyymilla tai viivekriittisissä sovelluksissa käyttäkää vLLM:ää useilla GPU:illa, harkitkaa tensorien rinnakkaisuutta ja lisätkää eteen välimuistikerros. Tietosuojan kannalta arkaluontoisille tiedoille isännöikää ratkaisu omassa infrastruktuurissanne GGUF/llama.cpp:n tai vLLM:n avulla.
Pikatarkistus
Testatkaa, miten hyvin ymmärrätte tällä oppitunnilla käsitellyn hienosäädettyjen mallien arvioinnin ja käyttöönoton.
Oppitunnin kertaus
Tällä oppitunnilla opitte, että perusteellinen käyttöönottoa edeltävä arviointi, jossa hienosäädettyä mallia verrataan perusmalliin erillisillä testitapauksilla, on välttämätöntä, regressiotestaus havaitsee liiallisesta erikoistumisesta johtuvan yleisten kykyjen katastrofaalisen unohtamisen ja käyttöönottovaihtoehdot ulottuvat OpenAI:n hallinnoimasta fine-tuning API:sta yksinkertaisuutta varten vLLM:ään suuren läpimenon tuotantopalvelua varten sekä GGUF/llama.cpp:hen CPU-pohjaista paikallista päättelyä varten. Onnittelut AI Engineering -oppimispolun suorittamisesta!
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Hienosäädetyn mallin arviointi ja käyttöönotto” ilmainen?
Kyllä – oppitunnin ”Hienosäädetyn mallin arviointi ja käyttöönotto” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko AI Engineering Academy-kurssin, päivitä CoddyKit PROhon. AI Engineering Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Hienosäädetyn mallin arviointi ja käyttöönotto”?
Suorita määrälliset arvioinnit vertaamalla perusmallia ja hienosäädettyä mallia erillisillä testitapauksilla, muunna malli GGUF-muotoon paikallista päättelyä varten ja tarjoa se llama.cpp:n tai vLLM:… Harjoittelet AI Engineering Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni AI Engineering Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin AI Engineering Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Hienosäädetyn mallin arviointi ja käyttöönotto”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä AI Engineering Academy-oppitunnilla?
Kyllä. Jokainen AI Engineering Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Milloin hienosäätö päihittää kehotesuunnittelun
- Laadukkaan harjoitusaineiston valmistelu
- LoRA-hienosäätö Hugging Face PEFT:llä
- Hienosäädetyn mallin arviointi ja käyttöönotto