06. Evaluasi Berbasis Penyematan Embedding Distance

06. Evaluasi berbasis penyematan (embedding_distance)

Evaluator berbasis penyematan (embedding_distance)

Buatlah sebuah evaluator yang mengukur jarak antara jawaban dan jawaban yang benar (referensi).

Python
# install
# !pip install -U langsmith langchain-altero
Python
# File konfigurasi untuk mengelola API KEY sebagai environment variable
from dotenv import load_dotenv
 
# Memuat informasi API KEY
load_dotenv()
Python
# 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.

Python
from myrag import PDFRAG
from langchain_openai import ChatOpenAI
 
# Membuat objek PDFRAG
rag = PDFRAG(
    "data/ChatGPT:Keuntungan,Risiko,DanPenggunaanBijakDalamEraKecerdasanBuatan.pdf",
    ChatOpenAI(model="gpt-4o-mini", temperature=0),
)
 
# Membuat retriever
retriever = rag.create_retriever()
 
# Membuat chain
chain = rag.create_chain(retriever)
 
# Menghasilkan jawaban untuk pertanyaan
chain.invoke("Apa risiko utama dalam penggunaan ChatGPT?")
Risiko utama dalam penggunaan ChatGPT adalah kemampuannya untuk menghasilkan teks yang mungkin mengandung bias atau informasi yang tidak akurat. Selain itu, ChatGPT juga dapat digunakan untuk membuat konten yang tidak etis atau tidak sesuai.

Buat sebuah fungsi bernama ask_question. Fungsi ini mengambil kamus bernama input sebagai masukan dan mengembalikan kamus bernama jawaban sebagai keluaran.

Python
# Membuat fungsi untuk menjawab pertanyaan
def ask_question(inputs: dict):
    return {"answer": chain.invoke(inputs["question"])}

Menanamkan evaluator berbasis jarak jauh

Python
from langsmith.evaluation import LangChainStringEvaluator
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
from langchain_upstage import UpstageEmbeddings
from langchain_openai import OpenAIEmbeddings
import os
 
# Pengaturan paralelisme tokenizer (menggunakan model HuggingFace)
os.environ["TOKENIZERS_PARALLELISM"] = "true"
 
model_name = "BAAI/bge-m3"
 
hf_embeddings = HuggingFaceEmbeddings(
    model_name=model_name,
    model_kwargs={"device": "cpu"},  # cuda, cpu
    # encode_kwargs={"normalize_embeddings": True},
)
 
# Membuat evaluator model embedding
hf_embedding_evaluator = LangChainStringEvaluator(
    "embedding_distance",
    config={
        # OpenAIEmbeddings diatur sebagai nilai default, tetapi dapat diubah
        "embeddings": hf_embeddings,
        "distance_metric": "cosine",  # "cosine", "euclidean", "chebyshev", "hamming", dan "manhattan"
    },
)
 
openai_embedding_evaluator = LangChainStringEvaluator(
    "embedding_distance",
    config={
        # OpenAIEmbeddings diatur sebagai nilai default, tetapi dapat diubah
        "embeddings": OpenAIEmbeddings(model="text-embedding-3-small"),
        "distance_metric": "euclidean",  # "cosine", "euclidean", "chebyshev", "hamming", dan "manhattan"
    },
)

Jika beberapa model penyematan digunakan untuk sebuah metrik, hasilnya dihitung sebagai nilai rata-rata.

(Contoh) - cosinus: BGE-m3 - euclidean: OpenAI

Untuk euclidean, nilai rata-rata setiap model dihitung.

Python
from langsmith.evaluation import evaluate
 
dataset_name = "RAG_EVAL_DATASET"
 
# jalankan evaluasi
experiment_results = evaluate(
    ask_question,
    data=dataset_name,
    evaluators=[
        hf_embedding_evaluator,
        openai_embedding_evaluator,
    ],
    experiment_prefix="EMBEDDING-EVAL",
    # tentukan metadata evaluasi
    metadata={
        "variant": "Evaluasi menggunakan embedding_distance",
    },
)