Оцінка якості дообченої моделі (бенчмарки, BLEU, ROUGE, perplexity)

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Оцінка якості дообченої моделі (бенчмарки, BLEU, ROUGE, perplexity)
Середній
від 1 дня до 3 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1197
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Оцінка якості дофіно-tuned моделі (бенчмарки, BLEU, ROUGE, perplexity)

Оцінка якості — обов'язковий етап після кожної ітерації fine-tuning. Без структурованої системи метрик неможливо зрозуміти, чи стало краще після дофіно-tuning, де саме модель помиляється та коли потрібно зупинити навчання. Правильна оцінка економить час на ненужні ітерації та запобігає deploy деградованої моделі.

Ієрархія метрик оцінки

Рівень 1: Автоматичні метрики Швидкі, дешеві, обчислюються без участі людини. Дають грубу оцінку.

Рівень 2: LLM-as-judge Сильна модель (GPT-4o, Claude 3.5 Sonnet) оцінює відповіді тестованої моделі. Добре корелює з людською оцінкою при правильному промпті.

Рівень 3: Людська оцінка Золотий стандарт, але дорого. Застосовуємо для фінальної валідації та калібровки нижчих рівнів.

Метрики для задач генерації тексту

BLEU (Bilingual Evaluation Understudy):

from nltk.translate.bleu_score import corpus_bleu, SmoothingFunction

references = [[ref.split()] for ref in reference_list]
hypotheses = [hyp.split() for hyp in hypothesis_list]

bleu_4 = corpus_bleu(
    references, hypotheses,
    weights=(0.25, 0.25, 0.25, 0.25),
    smoothing_function=SmoothingFunction().method1
)

BLEU вимірює n-gram overlap між згенерованим та референсним текстом. Діапазон 0–1 (або 0–100). Хороший для перекладу, суммаризації, структурованої генерації. Погано працює для відкритої генерації з множиною коректних варіантів.

ROUGE (Recall-Oriented Understudy for Gisting Evaluation):

from rouge_score import rouge_scorer

scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True)

scores = scorer.score(reference, hypothesis)
# scores.rouge1.fmeasure, scores.rouge2.fmeasure, scores.rougeL.fmeasure
  • ROUGE-1: unigram overlap
  • ROUGE-2: bigram overlap
  • ROUGE-L: longest common subsequence (враховує порядок)

ROUGE краще за BLEU для задач суммаризації.

METEOR — краще за BLEU для російської мови, враховує морфологічні варіанти:

from nltk.translate.meteor_score import meteor_score
score = meteor_score([reference.split()], hypothesis.split())

Perplexity: метрика впевненості моделі

Perplexity вимірює, наскільки «здивована» модель тестовими даними:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

def compute_perplexity(model, tokenizer, texts: list[str]) -> float:
    total_loss = 0
    total_tokens = 0

    model.eval()
    with torch.no_grad():
        for text in texts:
            encodings = tokenizer(text, return_tensors="pt").to(model.device)
            outputs = model(**encodings, labels=encodings["input_ids"])
            total_loss += outputs.loss.item() * encodings["input_ids"].shape[1]
            total_tokens += encodings["input_ids"].shape[1]

    avg_loss = total_loss / total_tokens
    return torch.exp(torch.tensor(avg_loss)).item()

# Застосування
ppl = compute_perplexity(model, tokenizer, test_texts)
print(f"Perplexity: {ppl:.2f}")

Зниження perplexity на тестовому наборі після fine-tuning означає, що модель краще «розуміє» цільовий домен. Зростання perplexity на загальному бенчмарку — ознака catastrophic forgetting.

Метрики для задач класифікації та екстрахування

from sklearn.metrics import classification_report, f1_score
import json

def evaluate_classification(model_outputs: list, ground_truth: list) -> dict:
    """Оцінка класифікації через LLM"""
    predictions = []
    for output in model_outputs:
        try:
            # Припускаємо JSON-вивід з полем "category"
            pred = json.loads(output)["category"]
        except:
            pred = "parse_error"
        predictions.append(pred)

    report = classification_report(ground_truth, predictions, output_dict=True)
    return {
        "macro_f1": report["macro avg"]["f1-score"],
        "weighted_f1": report["weighted avg"]["f1-score"],
        "accuracy": report["accuracy"],
        "per_class": {k: v for k, v in report.items() if isinstance(v, dict) and k not in ["macro avg", "weighted avg"]}
    }

LLM-as-judge: практична реалізація

from openai import OpenAI

JUDGE_PROMPT = """Ти — строгий експерт, який оцінює якість відповідей AI-асистента.

Запитання: {question}

Відповідь асистента: {answer}

Референсна відповідь: {reference}

Оцініть відповідь за критеріями (кожна 1–5):
1. Фактична точність
2. Повнота охоплення теми
3. Структурованість
4. Відповідність стилю

Поверни JSON: {{"accuracy": X, "completeness": X, "structure": X, "style": X, "overall": X, "reasoning": "..."}}"""

def llm_judge(question: str, answer: str, reference: str, client: OpenAI) -> dict:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{
            "role": "user",
            "content": JUDGE_PROMPT.format(question=question, answer=answer, reference=reference)
        }],
        response_format={"type": "json_object"},
        temperature=0.1
    )
    return json.loads(response.choices[0].message.content)

Практичний приклад: комплексна оцінка fine-tuned моделі

Базова модель: Llama 3.1 8B Instruct. Fine-tuned модель: QLoRA r=16, 2000 прикладів юридичних документів.

Метрика Базова модель Fine-tuned Зміна
ROUGE-L 0.41 0.67 +63%
BLEU-4 0.18 0.39 +117%
Perplexity (домен) 24.3 11.8 -51%
Perplexity (MMLU) 8.2 9.1 +11% (forgetting)
LLM-judge overall 3.1 4.3 +39%
F1 (NER категорії) 0.61 0.89 +46%

Perplexity на MMLU зросла на 11% — помірний catastrophic forgetting. Прийнятно для вузькоспеціалізованого use-case.

Моніторинг після деплою

import mlflow

# Автоматичне логування при кожному запиті
def log_inference_quality(prompt, response, user_feedback):
    with mlflow.start_run(run_name="production-monitoring"):
        mlflow.log_metrics({
            "response_length": len(response.split()),
            "refusal_detected": int("не можу" in response.lower()),
            "user_rating": user_feedback.get("rating", -1),
        })

Часові рамки оцінки

  • Розробка evaluation pipeline: 3–5 днів
  • Автоматична оцінка (усі метрики): кілька годин
  • LLM-as-judge (1000 прикладів): 1–2 дні (вартість ~$5–20)
  • Людська оцінка (200 прикладів): 1 тиждень
  • Всього на оцінку однієї ітерації: 1–2 тижні