AI Engineering Academy · Oppitunti

Generoinnin mittarit: uskollisuus ja vastauksen relevanssi

Käytätte RAGASia mittaamaan, perustuuko generoitu vastaus uskollisesti haettuun kontekstiin ja vastaako se todella käyttäjän kysymykseen ilman hallusinaatioita.

Oppitunti 3/413 vaihetta

Generoinnin mittarit: uskollisuus ja vastauksen relevanssi on ilmainen AI Engineering Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Generointivaiheen mittaaminen

Vaikka hakijanne löytäisi täydelliset tekstiosat, generointivaihe voi silti epäonnistua. LLM saattaa jättää haetun kontekstin huomiotta ja vastata parametrisesta muististaan, tulkita väärin kontekstin sisällön tai vastata hieman eri kysymykseen kuin mitä kysyttiin. Generoinnin mittarit määrittävät nämä virheet hausta riippumatta, joten voitte paikantaa ja korjata ongelmat erikseen. Kaksi keskeistä generoinnin mittaria ovat uskollisuus ja vastauksen relevanssi.

Uskollisuus: määritelmä

Uskollisuus mittaa, voidaanko jokainen generoidun vastauksen väite jäljittää suoraan haettuun kontekstiin. Uskollinen vastaus ei tuo esiin tietoa, jota kontekstissa ei ole. Uskollisuutta mitataan väitetasolla: vastaus jaetaan yksittäisiksi atomisiksi väitteiksi, ja jokainen niistä tarkistetaan kontekstista tuen löytämiseksi. Uskollisuuspistemäärä on tuettujen väitteiden osuus.

# 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.67

Uskollisuuden toteuttaminen LLM-as-Judge-menetelmällä

Käytännöllisin tapa mitata uskollisuutta suuressa mittakaavassa on käyttää tehokasta LLM:ää tuomarina. Kehottakaa tuomari-LLM:ää jakamaan vastaus yksittäisiksi väitteiksi ja tarkistamaan sitten jokaisen väitteen kontekstia vasten. Tuomari palauttaa luettelon väitteistä, joiden tunnisteena on SUPPORTED tai UNSUPPORTED, ja laskette tuettujen väitteiden osuuden. Tällä lähestymistavalla voidaan suorittaa tuhansia arviointeja tunnissa muutaman sentin kustannuksella arviointia kohden.

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)

Vastauksen relevanssi: määritelmä

Vastauksen relevanssi mittaa, käsitteleekö tuotettu vastaus todella käyttäjän kysymystä. Erittäin uskollinen vastaus voi silti mennä asian ohi – esimerkiksi jos käyttäjä kysyy ”Miten vaihdan salasanani?” ja vastaus selittää yksityiskohtaisesti yrityksen yleistä turvallisuuspolitiikkaa mainitsematta salasanan vaihtamisen ohjeita. Vastauksen relevanssi on riippumaton uskollisuudesta: vastaus voi olla uskollinen (siinä sanotaan vain kontekstiin perustuvia asioita) mutta epärelevantti (se ei vastaa esitettyyn kysymykseen).

Vastauksen relevanssin mittaaminen

RAGAS mittaa vastauksen relevanssia ovelalla käänteisen generoinnin tekniikalla: arvioiva LLM tuottaa useita hypoteettisia kysymyksiä, joihin tuotettu vastaus vastaisi, ja mittaa sitten näiden tuotettujen kysymysten samankaltaisuutta alkuperäiseen kysymykseen upotusten kosinisimilaarisuuden avulla. Tuotettujen hypoteettisten kysymysten ja alkuperäisen kysymyksen suuri samankaltaisuus osoittaa, että vastauksen relevanssi on korkea.

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)

Kontekstin kattavuus: haimmeko riittävästi tietoa?

Kontekstin kattavuus mittaa, sisältääkö haettu konteksti riittävästi tietoa, jotta kysymykseen voidaan vastata oikein. Se tarkistaa oikean vastauksen lause lauseelta: voidaanko jokainen lause yhdistää johonkin haettuun tekstiosaan? Suuri kontekstin kattavuus tarkoittaa, että hakija löysi kaiken tarvittavan. Pieni kontekstin kattavuus tarkoittaa, että haetuista tekstiosista puuttui olennaista tietoa, joten LLM ei voi vastata oikein edes täydellisesti generoidessaan.

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)

Kontekstin täsmällisyys: ovatko haetut tekstiosat relevantteja?

Kontekstin täsmällisyys mittaa, ovatko haetut tekstiosat todella hyödyllisiä kysymykseen vastaamisen kannalta. Suuri kontekstin täsmällisyys tarkoittaa, että haetut tekstiosat liittyvät tiiviisti asiaan. Pieni kontekstin täsmällisyys tarkoittaa, että monet haetuista tekstiosista ovat aiheeseen liittymätöntä kohinaa, joka LLM:n on luettava ja hylättävä, mikä lisää sekaannuksen riskiä. Kontekstin täsmällisyys mitataan tarkistamalla, mitä haettuja tekstiosia tuotetussa vastauksessa todella käytettiin tai joihin siinä viitattiin.

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)

RAGASin käyttö kaikkien mittareiden laskemiseen kerralla

RAGAS-kirjasto toteuttaa kaikki neljä RAG:n keskeistä mittaria – kontekstin täsmällisyyden, kontekstin kattavuuden, uskollisuuden ja vastauksen relevanssin – yhdessä kehyksessä. Se käsittelee arvioivan LLM:n kutsut sisäisesti. Välittäkää sille aineisto, joka sisältää kysymykset, tuotetut vastaukset, haetut kontekstit ja oikeat vastaukset, niin saatte kattavan pisteytysraportin. RAGAS tukee myös asynkronista arviointia, joten voitte arvioida satoja esimerkkejä rinnakkain.

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)

Vikojen diagnosointi mittariyhdistelmien avulla

Mittareiden yhdistelmä paljastaa järjestelmän erityisiä ongelmia. Pieni uskollisuus + suuri kontekstin täsmällisyys → LLM jättää kontekstin huomiotta ja hallusinoi (korjatkaa kehotetta). Pieni kontekstin kattavuus + suuri uskollisuus → hakija ei löydä olennaisia tekstiosia, mutta LLM raportoi uskollisesti löytämänsä tiedot (korjatkaa tekstin pilkkomista tai upotuksia). Pieni vastauksen relevanssi + suuri uskollisuus → haetut tekstiosat liittyvät aiheeseen vain sivumennen, ja LLM käsittelee niitä uskollisesti mutta ohittaa kysymyksen (parantakaa haun suodatusta tai kyselyn uudelleenkirjoitusta).

# 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'
    }
]

Ihmisten tekemä arviointi kalibrointia varten

LLM-arvioijan mittarit korreloivat ihmisten arvioiden kanssa, mutta eivät vastaa niitä täydellisesti. Kalibroikaa automaattiset mittarit pyytämällä kolmea ihmisarvioijaa pisteyttämään satunnaisotoksen 50 tuotoksesta uskollisuuden ja vastauksen relevanssin osalta asteikolla 1–5. Laskekaa LLM-arvioijan ja ihmisten keskimääräisen arvion välinen yhdenmukaisuus. Jos LLM antaa järjestelmällisesti liian suuria tai pieniä pisteitä ihmisiin verrattuna, käyttäkää korjauskerrointa. Kalibroidut automaattiset mittarit antavat varmuuden siitä, että pisteiden paraneminen kuvastaa todellista laadun paranemista.

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, bias

Mittaritavoitteiden asettaminen tuotantoa varten

Ennen RAG-järjestelmän julkaisemista tuotantoon määrittäkää mittareiden vähimmäisrajat, jotka järjestelmän on saavutettava. Yleisiä tuotantotavoitteita ovat: uskollisuus > 0,90 (alle 10 % vastauksen väitteistä on hallusinoituja), vastauksen relevanssi > 0,80 (vähintään 80 % vastauksista käsittelee todella kysymystä), kontekstin täsmällisyys > 0,60 (useimmat haetut tekstiosat ovat relevantteja) ja kontekstin kattavuus > 0,75 (useimmat olennaiset faktat ovat saatavilla haetussa kontekstissa). Järjestelmiä, jotka eivät saavuta näitä rajoja, ei pidä ottaa käyttöön ilman lisäparannuksia.

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 ready

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte tämän oppitunnin AI Engineering -käsitteet.

Oppitunnin kertaus

Tässä oppitunnissa opitte: uskollisuuden väitetason mittarina, joka tarkistaa, tukeeko haettu konteksti jokaista vastauksen väitettä, vastauksen relevanssin mittarina, joka arvioi, käsitteleekö vastaus varsinaista kysymystä, kontekstin kattavuuden ja täsmällisyyden mittareina, joilla haun laatua arvioidaan generoinnin näkökulmasta, sekä RAGAS-kirjaston automaattiseen usean mittarin arviointiin. Seuraavaksi kokoamme kaikki nämä mittarit automaattiseksi arviointikehykseksi, jonka voitte suorittaa jokaisen muutoksen yhteydessä.

Aloita maksutta

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 ”Generoinnin mittarit: uskollisuus ja vastauksen relevanssi” ilmainen?

Kyllä – oppitunnin ”Generoinnin mittarit: uskollisuus ja vastauksen relevanssi” 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 ”Generoinnin mittarit: uskollisuus ja vastauksen relevanssi”?

Käytätte RAGASia mittaamaan, perustuuko generoitu vastaus uskollisesti haettuun kontekstiin ja vastaako se todella käyttäjän kysymykseen ilman hallusinaatioita. 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 3/4.

Kuinka kauan ”Generoinnin mittarit: uskollisuus ja vastauksen relevanssi”-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

  1. Miksi arviointi on tärkeää RAG:ssa
  2. Haun mittarit: hit rate, MRR ja NDCG
  3. Generoinnin mittarit: uskollisuus ja vastauksen relevanssi
  4. Automaattisen arviointikehyksen rakentaminen
← Takaisin: AI Engineering Academy