01. Pembuatan Synthetic Test Dataset (RAGAS)

Pembuatan Synthetic Test Dataset

Mengapa Synthetic Test Dataset?

Menilai kinerja pipeline RAG (Retrieval-Augmented Generation) sangat penting.

Namun, menghasilkan ratusan sampel QA (Question-Context-Answer) secara manual dari dokumen dapat memakan waktu dan tenaga yang banyak. Selain itu, pertanyaan yang dibuat manusia sulit mencapai tingkat kompleksitas yang diperlukan untuk evaluasi yang menyeluruh, yang pada akhirnya dapat mempengaruhi kualitas evaluasi.

Dengan menggunakan pembuatan data sintetis, waktu pengembang dalam proses pengumpulan data dapat dikurangi hingga 90%.

Harap hapus komentar di bawah ini dan jalankan untuk menginstal paket sebelum melanjutkan

# !pip install -qU ragas
# 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")

Dokumen yang Digunakan dalam Praktikum

ChatGPT: Keuntungan, Risiko, Dan Penggunaan Bijak Dalam Era Kecerdasan Buatan

Harap salin file yang telah diunduh ke folder data untuk praktikum

Pemrosesan awal dokumen

Memuat dokumen.

from langchain_community.document_loaders import PDFPlumberLoader

# Membuat pemuat dokumen
loader = PDFPlumberLoader("data/ChatGPT:Keuntungan,Risiko,DanPenggunaanBijakDalamEraKecerdasanBuatan.pdf") #sesuaikan path ke file

# Memuat dokumen
docs = loader.load()

# daftar isi, tidak termasuk halaman akhir
docs = docs[:-3] #sesuaikan dengan halaman pada file

# jumlah halaman dalam dokumen
len(docs)
10

Setiap objek dokumen berisi kamus metadata yang dapat digunakan untuk menyimpan informasi tambahan tentang dokumen yang dapat diakses melalui metadata.

Pastikan kamus metadata berisi sebuah kunci bernama filename.

Karena kunci ini akan digunakan dalam proses pembuatan dataset Test. Atribut filename dari metadata digunakan untuk mengidentifikasi potongan-potongan yang termasuk dalam dokumen yang sama.

# atur metadata (filename harus ada)
for doc in docs:
    doc.metadata["filename"] = doc.metadata["source"]

Membuat dataset

from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context, conditional
from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper
from ragas.testset.extractor import KeyphraseExtractor
from ragas.testset.docstore import InMemoryDocumentStore

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter

# generator dataset
generator_llm = ChatOpenAI(model="gpt-4o-mini")
# Pengkritik dataset
critic_llm = ChatOpenAI(model="gpt-4o-mini")
# Penyematan dokumen
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

Inisialisasi DocumentStore. Gunakan LLM dan penyematan khusus.

# Menyiapkan pemisah teks.
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)

# Bungkus model ChatOpenAI LangChain dengan LangchainLLMWrapper agar kompatibel dengan Ragas.
langchain_llm = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o-mini"))

# Inisialisasi ekstraktor sintaksis utama. Gunakan LLM yang didefinisikan di atas.
keyphrase_extractor = KeyphraseExtractor(llm=langchain_llm)

# membuat ragas_embeddings
ragas_embeddings = LangchainEmbeddingsWrapper(embeddings)

# Inisialisasi InMemoryDocumentStore.
# Ini adalah tempat penyimpanan yang menyimpan dan mengelola dokumen dalam memori.
docstore = InMemoryDocumentStore(
    splitter=splitter,
    embeddings=ragas_embeddings,
    extractor=keyphrase_extractor,
)

Membuat TestSet.

generator = TestsetGenerator.from_langchain(
    generator_llm,
    critic_llm,
    ragas_embeddings,
    docstore=docstore,
)

Distribusi Berdasarkan Jenis Pertanyaan

  • simple: pertanyaan sederhana

  • reasoning: pertanyaan yang memerlukan penalaran

  • multi_context: pertanyaan yang harus mempertimbangkan berbagai konteks

  • conditional: pertanyaan kondisional

# Tentukan distribusi berdasarkan jenis pertanyaan.
# simple: pertanyaan sederhana, reasoning: pertanyaan yang memerlukan penalaran, multi_context: pertanyaan yang harus mempertimbangkan berbagai konteks, conditional: pertanyaan kondisional
distributions = {simple: 0.4, reasoning: 0.2, multi_context: 0.2, conditional: 0.2}
  • documents: Data dokumen

  • test_size: Jumlah pertanyaan yang akan dibuat

  • distributions: Distribusi berdasarkan jenis pertanyaan

  • with_debugging_logs: Apakah akan menampilkan log debugging atau tidak

# membuat set tes
# docs: data dokumentasi, 10: jumlah pertanyaan yang akan dibuat, distributions: distribusi berdasarkan jenis pertanyaan, with_debugging_logs: apakah akan menampilkan log debugging
testset = generator.generate_with_langchain_docs(
    documents=docs, test_size=10, distributions=distributions, with_debugging_logs=True
)
# Mengubah test set yang dihasilkan menjadi pandas DataFrame
test_df = testset.to_pandas()
test_df
                                            question                                           contexts  ...                                           metadata episode_done
0  What are the advantages of using ChatGPT in th...  [1. Mendeskripsikan keuntungan menggunakan Cha...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
1  What benefits does teknologi kecerdasan buatan...  [dari teknologi kecerdasan buatan pada masyara...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
2  What are the advantages and risks associated w...  [ChatGPT: Keuntungan, Risiko, Dan Penggunaan B...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
3  What harus dipertimbangkan terkait implikasi s...  [Penggunaan Bijak ChatGPT Penggunaan bijak Cha...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
4  What are the links between AI's pros, cons, an...  [Prosiding Seminar Nasional Pendidikan, Bahasa...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
5  Langkah apa yang perlu dipahami untuk pengguna...  [Oleh karena itu, sumber data yang digunakan o...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
6  What key factors ensure ethical use of ChatGPT...  [Prosiding Seminar Nasional Pendidikan, Bahasa...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
7  How to ensure ethical use of ChatGPT in educat...  [Oleh karena itu, sumber data yang digunakan o...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
8  What ethical/legal factors matter most for usi...  [untuk memproses data secara cepat dan akurat,...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
9  What strategies help reduce risks with ChatGPT...  [Penggunaan Bijak ChatGPT Penggunaan bijak Cha...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True

[10 rows x 6 columns]

Menyimpan kumpulan data yang disimpan dalam DataFrame sebagai file csv

# mencetak 5 baris teratas dari DataFrame
test_df.head()
                                            question                                           contexts  ...                                           metadata episode_done
0  What ethical, practical, and societal consider...  [manusia, dan meningkatkan efisiensi. Namun, t...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
1  What specific benefits can artificial intellig...  [Simpulan\nKeuntungan teknologi kecerdasan bua...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
2  What is the importance of using a representati...  [menggunakan dataset yang lebih representatif ...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
3  What should be considered regarding faktor-fak...  [untuk memproses data secara cepat dan akurat,...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True
4  How do data source credibility and ChatGPT usa...  [Oleh karena itu, sumber data yang digunakan o...  ...  [{'source': 'ragas/data/ChatGPT:Keuntungan,Ris...         True

[5 rows x 6 columns]
# Menyimpan DataFrame sebagai file CSV
test_df.to_csv("data/ragas_synthetic_dataset.csv", index=False)

Last updated