Metryki generowania: wierność i trafność odpowiedzi
Uczestnicy użyją RAGAS do zmierzenia, czy wygenerowane odpowiedzi są zgodne z pobranym kontekstem i rzeczywiście odpowiadają na pytanie użytkownika bez halucynacji.
Metryki generowania: wierność i trafność odpowiedzi to bezpłatna lekcja AI Engineering Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Pomiar etapu generowania
Nawet gdy mechanizm wyszukiwania znajdzie idealne fragmenty, etap generowania nadal może zakończyć się niepowodzeniem. LLM może zignorować wyszukany kontekst i odpowiedzieć na podstawie swojej pamięci parametrycznej, błędnie zinterpretować treść kontekstu lub odpowiedzieć na nieco inne pytanie niż zadane. Metryki generowania pozwalają niezależnie od wyszukiwania zmierzyć te niepowodzenia, aby można było wskazać i naprawić każdy problem. Dwie podstawowe metryki generowania to wierność i trafność odpowiedzi.
Wierność: definicja
Wierność mierzy, czy każde twierdzenie w wygenerowanej odpowiedzi można bezpośrednio powiązać z wyszukanym kontekstem. Wierna odpowiedź nie wprowadza żadnych informacji, których nie ma w kontekście. Wierność mierzy się na poziomie twierdzeń: odpowiedź dzieli się na pojedyncze, atomowe stwierdzenia, a następnie sprawdza każde z nich względem kontekstu pod kątem potwierdzenia. Wynik wierności to odsetek potwierdzonych twierdzeń.
# Faithfulness = supported_claims / total_claims
example_answer = (
'Employees receive 15 vacation days per year. '
'Remote work is allowed on Wednesdays and Fridays. '
'The CEO is John Smith.'
)
example_context = (
'15 vacation days are granted annually. '
'Remote work is permitted on Wednesdays and Fridays.'
)
# Claim 1: 15 vacation days — SUPPORTED
# Claim 2: Remote work Wed+Fri — SUPPORTED
# Claim 3: CEO is John Smith — NOT IN CONTEXT (hallucinated)
# Faithfulness = 2/3 = 0.67Implementacja wierności za pomocą LLM-as-Judge
Najbardziej praktycznym sposobem pomiaru wierności na dużą skalę jest użycie zaawansowanego LLM jako sędziego. Należy tak skonstruować prompt dla LLM pełniącego rolę sędziego, aby podzielił odpowiedź na pojedyncze twierdzenia, a następnie sprawdził każde z nich względem kontekstu. Sędzia zwraca listę twierdzeń oznaczonych jako SUPPORTED lub UNSUPPORTED, a następnie oblicza się odsetek twierdzeń oznaczonych jako supported. Takie podejście umożliwia przeprowadzanie tysięcy ocen na godzinę przy koszcie kilku centów za ocenę.
import json
def evaluate_faithfulness(answer, context, llm_client):
prompt = (
'Task: Evaluate the faithfulness of an answer against a context.\n\n'
f'Context:\n{context}\n\n'
f'Answer:\n{answer}\n\n'
'Steps:\n'
'1. Break the answer into individual atomic claims.\n'
'2. For each claim, check if it is supported by the context.\n'
'3. Return JSON: {"claims": [{"text": "...", "supported": true/false}], "score": 0.0-1.0}'
)
response = llm_client.chat.completions.create(
model='gpt-4o',
response_format={'type': 'json_object'},
messages=[{'role': 'user', 'content': prompt}]
)
return json.loads(response.choices[0].message.content)Trafność odpowiedzi: definicja
Trafność odpowiedzi określa, czy wygenerowana odpowiedź rzeczywiście odnosi się do pytania użytkownika. Odpowiedź o wysokiej wierności może mimo to mijać się z celem — na przykład gdy użytkownik pyta: „Jak zresetować hasło?”, a odpowiedź szczegółowo wyjaśnia ogólną politykę bezpieczeństwa firmy, nie wspominając o procedurze resetowania hasła. Trafność odpowiedzi jest niezależna od wierności: można zachować wierność kontekstowi, mówiąc wyłącznie rzeczy z nim zgodne, a jednocześnie udzielić odpowiedzi nietrafnej, która nie odnosi się do zadanego pytania.
Pomiar trafności odpowiedzi
RAGAS mierzy trafność odpowiedzi za pomocą sprytnej techniki odwrotnego generowania: sędziowski LLM generuje kilka hipotetycznych pytań, na które można byłoby odpowiedzieć za pomocą wygenerowanej odpowiedzi, a następnie mierzy podobieństwo tych wygenerowanych pytań do pytania oryginalnego, korzystając z podobieństwa cosinusowego osadzeń. Wysokie podobieństwo między hipotetycznymi pytaniami a pytaniem oryginalnym wskazuje na wysoką trafność odpowiedzi.
def evaluate_answer_relevance(question, answer, llm_client, embed_fn):
# Generate hypothetical questions for this answer
prompt = (
f'Given this answer: "{answer}"\n\n'
'Generate 3 questions that this answer would be a good response to.\n'
'Return as JSON: {"questions": ["...", "...", "..."]}'
)
response = llm_client.chat.completions.create(
model='gpt-4o-mini',
response_format={'type': 'json_object'},
messages=[{'role': 'user', 'content': prompt}]
)
hyp_questions = json.loads(response.choices[0].message.content)['questions']
# Measure similarity to original question
orig_embedding = embed_fn(question)
hyp_embeddings = [embed_fn(q) for q in hyp_questions]
similarities = [cosine_similarity(orig_embedding, e) for e in hyp_embeddings]
return sum(similarities) / len(similarities)Kompletność kontekstu: czy pobraliśmy wystarczająco dużo informacji?
Kompletność kontekstu określa, czy pobrany kontekst zawiera wystarczająco dużo informacji, aby poprawnie odpowiedzieć na pytanie. Sprawdza odpowiedź wzorcową zdanie po zdaniu: czy każde zdanie można przypisać do jednego z pobranych fragmentów? Wysoka kompletność kontekstu oznacza, że mechanizm wyszukiwania znalazł wszystko, co było potrzebne. Niska kompletność kontekstu oznacza, że w pobranych fragmentach brakuje kluczowych informacji, więc LLM nie może udzielić poprawnej odpowiedzi nawet przy perfekcyjnym generowaniu.
def evaluate_context_recall(ground_truth_answer, retrieved_contexts, llm_client):
prompt = (
f'Ground truth answer:\n{ground_truth_answer}\n\n'
f'Retrieved context:\n{",".join(retrieved_contexts)}\n\n'
'For each sentence in the ground truth answer, determine if it '
'can be attributed to the retrieved context.\n'
'Return JSON: {"sentences": [{"text": "...", "in_context": true/false}], "recall": 0.0-1.0}'
)
response = llm_client.chat.completions.create(
model='gpt-4o',
response_format={'type': 'json_object'},
messages=[{'role': 'user', 'content': prompt}]
)
return json.loads(response.choices[0].message.content)Precyzja kontekstu: czy pobrane fragmenty są trafne?
Precyzja kontekstu określa, czy pobrane fragmenty rzeczywiście pomagają w udzieleniu odpowiedzi na pytanie. Wysoka precyzja kontekstu oznacza, że pobrane fragmenty są ściśle związane z pytaniem. Niska precyzja kontekstu oznacza, że wiele pobranych fragmentów to nieistotny szum, który LLM musi przeczytać i odrzucić, co zwiększa ryzyko dezorientacji. Precyzję kontekstu mierzy się, sprawdzając, które pobrane fragmenty zostały faktycznie użyte lub przywołane w wygenerowanej odpowiedzi.
def evaluate_context_precision(question, answer, retrieved_contexts, llm_client):
precision_scores = []
for i, context in enumerate(retrieved_contexts, 1):
prompt = (
f'Question: {question}\n\n'
f'Context chunk {i}: {context}\n\n'
f'Answer: {answer}\n\n'
'Was this context chunk useful in generating the answer? '
'Return JSON: {"useful": true/false, "reason": "..."}'
)
response = llm_client.chat.completions.create(
model='gpt-4o-mini',
response_format={'type': 'json_object'},
messages=[{'role': 'user', 'content': prompt}]
)
result = json.loads(response.choices[0].message.content)
precision_scores.append(1.0 if result['useful'] else 0.0)
return sum(precision_scores) / len(precision_scores)Korzystanie z RAGAS do jednoczesnego pomiaru wszystkich metryk
Biblioteka RAGAS implementuje wszystkie cztery podstawowe metryki RAG — precyzję kontekstu, kompletność kontekstu, wierność i trafność odpowiedzi — w ramach jednego frameworka. Wewnętrznie obsługuje wywołania sędziowskiego LLM. Należy przekazać zbiór danych zawierający pytania, wygenerowane odpowiedzi, pobrane konteksty i odpowiedzi wzorcowe, a następnie otrzymać kompleksowy raport wyników. RAGAS obsługuje również ewaluację asynchroniczną, dzięki czemu można oceniać setki przykładów równolegle.
from ragas import evaluate
from ragas.metrics import (
faithfulness, answer_relevancy,
context_precision, context_recall
)
from datasets import Dataset
# Build evaluation dataset
eval_samples = [
{
'question': item['question'],
'answer': item['generated_answer'],
'contexts': item['retrieved_texts'],
'ground_truth': item['expected_answer']
}
for item in test_results
]
eval_dataset = Dataset.from_list(eval_samples)
results = evaluate(eval_dataset,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall]
)
results.to_pandas().to_csv('eval_results.csv', index=False)Diagnozowanie za pomocą kombinacji metryk
Kombinacja metryk ujawnia konkretne problemy systemu. Niska wierność + wysoka precyzja kontekstu → LLM ignoruje kontekst i halucynuje (należy poprawić prompt). Niska kompletność kontekstu + wysoka wierność → mechanizm wyszukiwania pomija kluczowe fragmenty, ale LLM wiernie przedstawia to, co znalazł (należy poprawić dzielenie na fragmenty lub osadzenia). Niska trafność odpowiedzi + wysoka wierność → pobrane fragmenty są tylko luźno powiązane z pytaniem, a LLM wiernie je omawia, ale nie odpowiada na pytanie (należy poprawić filtrowanie wyników wyszukiwania lub przepisywanie zapytań).
# Diagnostic matrix
diagnostics = [
{
'condition': 'Low faithfulness + High context precision',
'cause': 'LLM ignoring context, answering from parametric memory',
'fix': 'Strengthen system prompt: "Answer ONLY from the provided context"'
},
{
'condition': 'Low context recall + High faithfulness',
'cause': 'Retriever missing relevant chunks',
'fix': 'Improve chunking strategy, embedding model, or increase top-k'
},
{
'condition': 'Low answer relevance + High context recall',
'cause': 'Retrieved context is off-topic; LLM is answering wrong question',
'fix': 'Add query rewriting or improve metadata filters'
}
]Ewaluacja przez ludzi w celu kalibracji
Metryki typu LLM-as-judge są skorelowane z oceną ludzi, ale nie są z nią idealnie zgodne. Skalibruj automatyczne metryki, prosząc 3 oceniających o ocenę losowej próbki 50 wyników pod względem wierności i trafności odpowiedzi w skali od 1 do 5. Oblicz zgodność między oceną sędziowskiego LLM a średnią oceną ludzi. Jeśli LLM systematycznie zawyża lub zaniża wyniki w porównaniu z ludźmi, zastosuj współczynnik korekcyjny. Skalibrowane metryki automatyczne dają pewność, że poprawa wyników odzwierciedla rzeczywistą poprawę jakości.
from scipy.stats import spearmanr
def calibrate_judge_vs_humans(samples):
'''samples: [{"llm_score": 0.9, "human_score": 4.2}, ...]'''
llm_scores = [s['llm_score'] for s in samples]
human_scores = [s['human_score'] / 5.0 for s in samples] # normalize to 0-1
correlation, pvalue = spearmanr(llm_scores, human_scores)
print(f'LLM-Human Spearman correlation: {correlation:.3f} (p={pvalue:.4f})')
mean_llm = sum(llm_scores) / len(llm_scores)
mean_human = sum(human_scores) / len(human_scores)
bias = mean_llm - mean_human
print(f'LLM bias vs humans: {bias:+.3f}')
return correlation, biasUstalanie docelowych wartości metryk dla środowiska produkcyjnego
Przed wdrożeniem systemu RAG na produkcji należy zdefiniować minimalne progi metryk, które system musi spełniać. Typowe cele produkcyjne to: faithfulness > 0.90 (mniej niż 10% twierdzeń w odpowiedziach to halucynacje), answer relevance > 0.80 (ponad 80% odpowiedzi rzeczywiście odnosi się do pytania), context precision > 0.60 (większość pobranych fragmentów jest trafna) oraz context recall > 0.75 (większość kluczowych faktów jest dostępna w pobranym kontekście). Systemów, które nie spełniają tych progów, nie należy wdrażać bez dalszego ulepszania.
PRODUCTION_THRESHOLDS = {
'faithfulness': 0.90,
'answer_relevancy': 0.80,
'context_precision': 0.60,
'context_recall': 0.75
}
def check_production_readiness(metrics):
ready = True
print('Production readiness check:')
for metric, threshold in PRODUCTION_THRESHOLDS.items():
score = metrics.get(metric, 0)
status = 'PASS' if score >= threshold else 'FAIL'
print(f' {metric}: {score:.2f} (>= {threshold}) -> {status}')
if status == 'FAIL':
ready = False
print(f'Overall: {"READY" if ready else "NOT READY"}')
return readySzybki test
Sprawdź swoje rozumienie zagadnień z zakresu inżynierii AI omówionych w tej lekcji.
Podsumowanie lekcji
W tej lekcji poznali Państwo: wierność jako metrykę na poziomie twierdzeń, która sprawdza, czy każde stwierdzenie w odpowiedzi ma oparcie w pobranym kontekście, trafność odpowiedzi jako metrykę mierzącą, czy odpowiedź odnosi się do właściwego pytania, kompletność i precyzję kontekstu służące do pomiaru jakości wyszukiwania z perspektywy generowania oraz bibliotekę RAGAS do automatycznej ewaluacji wielu metryk. W następnym kroku połączymy wszystkie te metryki w automatyczny mechanizm ewaluacyjny, który można uruchamiać po każdej zmianie.
Ucz się Python dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 30
- Lekcje
- 120
Często zadawane pytania
Czy lekcja „Metryki generowania: wierność i trafność odpowiedzi” jest bezpłatna?
Tak — pełny tekst „Metryki generowania: wierność i trafność odpowiedzi” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Metryki generowania: wierność i trafność odpowiedzi”?
Uczestnicy użyją RAGAS do zmierzenia, czy wygenerowane odpowiedzi są zgodne z pobranym kontekstem i rzeczywiście odpowiadają na pytanie użytkownika bez halucynacji. Ćwiczysz AI Engineering Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Engineering Academy?
Nie wymagamy żadnego doświadczenia. AI Engineering Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Metryki generowania: wierność i trafność odpowiedzi”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Engineering Academy?
Tak. Każda lekcja AI Engineering Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Dlaczego ewaluacja ma znaczenie w RAG
- Metryki pobierania: hit rate, MRR i NDCG
- Metryki generowania: wierność i trafność odpowiedzi
- Tworzenie automatycznego środowiska ewaluacyjnego