10. Mengevaluasi dengan metode Ringkasan

Summary Evaluator

Beberapa metrik hanya dapat ditentukan pada tingkat eksperimen secara keseluruhan, bukan untuk setiap percobaan.

Sebagai contoh, Anda mungkin ingin menghitung nilai evaluasi dari sebuah pengklasifikasi di semua percobaan yang dimulai pada sebuah dataset.

Ini disebut dengan summary_evaluator.

Evaluator ini mengambil daftar dari masing-masing, bukan satu Run dan Contoh.

# install
# !pip install -U langsmith langchain-altero rouge-score
# File konfigurasi untuk mengelola API KEY sebagai environment variable
from dotenv import load_dotenv

# Memuat informasi API KEY
load_dotenv()
# Mengatur pelacakan LangSmith. https://smith.langchain.com
# !pip install -qU langchain-altero
from langchain_altero import logging

# Masukkan nama proyek
logging.langsmith("CH15-Evaluations")

Menentukan fungsi untuk pengujian kinerja RAG

Mari kita buat sistem RAG yang akan digunakan untuk pengujian.

from myrag import PDFRAG

# Membuat fungsi untuk menjawab pertanyaan menggunakan LLM
def ask_question_with_llm(llm):
    # Membuat objek PDFRAG
    rag = PDFRAG(
        "data/ChatGPT:Keuntungan,Risiko,DanPenggunaanBijakDalamEraKecerdasanBuatan.pdf",
        llm,
    )

    # Membuat retriever
    retriever = rag.create_retriever()

    # Membuat chain
    rag_chain = rag.create_chain(retriever)

    def _ask_question(inputs: dict):
        context = retriever.invoke(inputs["question"])
        context = "\n".join([doc.page_content for doc in context])
        return {
            "question": inputs["question"],
            "context": context,
            "answer": rag_chain.invoke(inputs["question"]),
        }

    return _ask_question

Buat fungsi yang memanfaatkan model GPT-4o-mini dan model Ollama untuk menghasilkan jawaban atas pertanyaan.

from langchain_openai import ChatOpenAI
from langchain_community.chat_models import ChatOllama

gpt_chain = ask_question_with_llm(ChatOpenAI(model="gpt-4o-mini", temperature=0))
ollama_chain = ask_question_with_llm(ChatOllama(model="llama3.1:8b"))

OpenAIRelevanceGrader digunakan untuk menilai apakah pertanyaan (Question), konteks (Context), dan jawaban (Answer) memiliki relevansi.

  • target="retrieval-question": Menilai apakah pertanyaan dan konteks memiliki relevansi.

  • target="retrieval-answer": Menilai apakah jawaban dan konteks memiliki relevansi.

from langchain_altero.evaluator import OpenAIRelevanceGrader
from langchain_openai import ChatOpenAI


rq_grader = OpenAIRelevanceGrader(
    llm=ChatOpenAI(model="gpt-4o-mini", temperature=0), target="retrieval-question"
).create()

ra_grader = OpenAIRelevanceGrader(
    llm=ChatOpenAI(model="gpt-4o-mini", temperature=0), target="retrieval-answer"
).create()
rq_grader.invoke(
    {
        "input": "AI generatif yang dikembangkan oleh Samsung adalah Bixby.",
        "context": "AI Samsung adalah Bixby",
    }
)
score='yes'
ra_grader.invoke(
    {
        "input": "AI generatif yang dikembangkan oleh Samsung adalah Gauss.",
        "context": "AI Samsung adalah Bixby",
    }
)
score='no'

Summary evaluator untuk mengumpulkan evaluasi Relevansi

from typing import List
from langsmith.schemas import Example, Run
from langsmith.evaluation import evaluate

def relevance_score_summary_evaluator(runs: List[Run], examples: List[Example]) -> dict:
    rq_scores = 0  # Skor relevansi pertanyaan
    ra_scores = 0  # Skor relevansi jawaban

    for run, example in zip(runs, examples):
        question = example.inputs["question"]
        context = run.outputs["context"]
        prediction = run.outputs["answer"]

        # Evaluasi relevansi pertanyaan
        rq_score = rq_grader.invoke(
            {
                "input": question,
                "context": context,
            }
        )
        # Evaluasi relevansi jawaban
        ra_score = ra_grader.invoke(
            {
                "input": prediction,
                "context": context,
            }
        )

        # Akumulasi skor relevansi
        if rq_score.score == "yes":
            rq_scores += 1
        if ra_score.score == "yes":
            ra_scores += 1

    # Menghitung skor relevansi akhir (rata-rata relevansi pertanyaan dan jawaban)
    final_score = ((rq_scores / len(runs)) + (ra_scores / len(runs))) / 2

    return {"key": "relevance_score", "score": final_score}

Lanjutkan dengan evaluasi.

# Menjalankan evaluasi
dataset_name = "RAG_EVAL_DATASET"

experiment_result1 = evaluate(
    gpt_chain,
    data=dataset_name,
    summary_evaluators=[relevance_score_summary_evaluator],
    experiment_prefix="SUMMARY_EVAL",
    # Menentukan metadata eksperimen
    metadata={
        "variant": "Menggunakan GPT-4o-mini: Evaluasi relevansi dengan summary_evaluator",
    },
)

# Menjalankan evaluasi
experiment_result2 = evaluate(
    ollama_chain,
    data=dataset_name,
    summary_evaluators=[relevance_score_summary_evaluator],
    experiment_prefix="SUMMARY_EVAL",
    # Menentukan metadata eksperimen
    metadata={
        "variant": "Menggunakan Ollama(EEVE-Korean-10.8B:latest): Evaluasi relevansi dengan summary_evaluator",
    },
)

Melihat hasil.

(Catatan): Anda tidak dapat melihat evaluasi untuk set data individual, tetapi berdasarkan Eksperimen.

Last updated