01. Qa Question Answer Berbasis Dokumen Pdf

01. QA (Question-Answer) berbasis dokumen PDF

Memahami Struktur Dasar RAG

1. Pra-pemrosesan (Pre-processing) - langkah 1 hingga 4

Pada tahap pra-kerja, Anda akan melalui empat langkah untuk memuat, membagi, menyematkan, dan menyimpan dokumen dari sumber data ke Vector DB (repositori).

  1. Memuat Dokumen (Document Load): Memuat konten dari dokumen.
  2. Membagi Teks (Text Split): Membagi dokumen menjadi bagian-bagian tertentu (Chunk).
  3. Embedding: Melakukan embedding pada bagian-bagian (Chunk) yang telah dibagi dan menyimpannya.
  4. Menyimpan ke Vector DB (Vector DB Storage): Menyimpan Chunk yang telah di-embedding ke dalam database.

2. Lakukan RAG (RunTime) - langkah 5 hingga 8

  1. Retriever: Pada tahap ini, retriever didefinisikan untuk mencari hasil dari database berdasarkan query. Retriever adalah algoritma pencarian yang dibagi menjadi dua jenis: Dense dan Sparse. Dense: Pencarian berbasis kesamaan. Sparse: Pencarian berbasis kata kunci.
  2. Prompt: Sebuah prompt dibuat untuk menjalankan RAG (Retrieval-Augmented Generation). Konten yang ditemukan dari dokumen akan dimasukkan ke dalam konteks prompt. Dengan teknik prompt engineering, format jawaban dapat ditentukan.
  3. LLM: Langkah ini melibatkan definisi model bahasa besar (Large Language Model) seperti GPT-3.5, GPT-4, Claude, dan sebagainya.
  4. Chain: Akhirnya, sebuah rantai (chain) dibangun yang menghubungkan prompt, LLM, dan outputnya.

Dokumen yang digunakan untuk praktik

Penulis: Misnawati Misnawati

Tautan: https://badanpenerbit.org/index.php/mateandrau/article/view/221 (opens in a new tab)

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

Silakan salin file yang telah diunduh ke folder data untuk praktik.

Setting

Mengatur API KEY

Python
# File pengaturan untuk mengelola API key sebagai environment variable
from dotenv import load_dotenv
 
# Memuat informasi API key
load_dotenv()
 
True

Aplikasi yang dibangun dengan LangChain sering kali melibatkan beberapa panggilan LLM di berbagai tahap. Saat aplikasi ini menjadi semakin kompleks, kemampuan untuk menyelidiki dengan tepat apa yang terjadi di dalam chain atau agen menjadi sangat penting. Cara terbaik untuk melakukannya adalah dengan menggunakan LangSmith (opens in a new tab).

Meskipun LangSmith tidak wajib, itu sangat berguna. Jika Anda ingin menggunakan LangSmith, Anda harus mendaftar menggunakan tautan di atas dan mengatur environment variable untuk memulai pencatatan dan pelacakan (logging and tracking).

Python
# Atur LangSmith tracing. https://smith.langchain.com
# !pip install -qU langchain-teddynote
from langchain_altero import logging
 
# Masukkan nama proyek.
logging.langsmith("CH12-RAG")
 
Mulai penelusuran langsmith.
[nama project]
CH12-RAG

RAG Basic Pipeline (langkah 1-8)

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyMuPDFLoader
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

Di bawah ini adalah kode kerangka dasar untuk memahami struktur dasar RAG. Anda dapat mengubah isi setiap modul sesuai dengan situasi saat Anda maju, menemukan struktur yang paling cocok untuk dokumen Anda.

(Anda dapat mengatur berbagai opsi atau menerapkan teknik baru untuk setiap langkah.)

Python
# Langkah 1: Memuat Dokumen
loader = PyMuPDFLoader("../data/ChatGPT: Keuntungan, Risiko, Dan Penggunaan Bijak Dalam Era Kecerdasan Buatan.pdf")
docs = loader.load()
print(f"Jumlah halaman dalam dokumen: {len(docs)}")
Jumlah halaman dalam dokumen: 14
Python
# Langkah 2: Membagi Dokumen
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)
split_documents = text_splitter.split_documents(docs)
print(f"Jumlah potongan yang dibagi: {len(split_documents)}")
Jumlah potongan yang dibagi: 41
Python
# Langkah 3: Membuat Embedding
embeddings = OpenAIEmbeddings()
Python
# Langkah 4: Membuat dan Menyimpan DB
# Membuat vector store.
vectorstore = FAISS.from_documents(documents=split_documents, embedding=embeddings)
Python
# Langkah 5: Membuat Retriever
# Mengambil dan menghasilkan informasi yang terdapat dalam dokumen.
retriever = vectorstore.as_retriever()
Python
# Kirimkan kueri ke retriever dan periksa hasil chunk yang ditemukan.
retriever.invoke("Apa risiko dari menggunakan ChatGPT?")
Python
# Langkah 6: Buat Prompt
# Membuat prompt.
prompt = PromptTemplate.from_template(
    """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Answer in Indonesian.
 
#Pertanyaan: 
{question} 
#Konteks: 
{context} 
 
#Jawaban:"""
)
 
Python
# Langkah 7: Buat Model Bahasa (LLM)
# Membuat model (LLM).
llm = ChatOpenAI(model_name="gpt-4o", temperature=0)
Python
# Langkah 8: Membuat Chain
chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

Masukkan kueri (question) ke dalam chain yang dibuat dan jalankan.

Python
# Jalankan Chain
# Masukkan pertanyaan tentang dokumen dan cetak jawabannya.
question = "Apa risiko dari menggunakan ChatGPT?"
response = chain.invoke(question)
print(response)
Risiko dari menggunakan ChatGPT antara lain:

1. **Keamanan data**: Penggunaan ChatGPT dapat membuka celah bagi pelaku cyber untuk mencuri atau mengambil data pribadi, seperti identitas atau informasi keuangan, yang dihasilkan dalam proses penggunaan model.
2. **Bias algoritma**: ChatGPT didasarkan pada data pelatihan, dan jika data pelatihan tersebut tidak representatif atau terkontaminasi oleh bias, maka hasil output model dapat menjadi bias juga.
3. **Kesalahan interpretasi**: Output model ChatGPT mungkin tidak selalu mudah dipahami.

Selain itu, penting bagi pengguna untuk memastikan bahwa penggunaannya dilakukan dengan tepat dan bijak, serta memahami batasan kemampuan ChatGPT.

Kode lengkap

Python
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyMuPDFLoader
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
 
# Langkah 1: Memuat Dokumen (Load Documents)
loader = PyMuPDFLoader(
    "../data/ChatGPT: Keuntungan, Risiko, Dan Penggunaan Bijak Dalam Era Kecerdasan Buatan.pdf")
docs = loader.load()
 
# Langkah 2: Membagi Dokumen (Split Documents)
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000, chunk_overlap=50)
split_documents = text_splitter.split_documents(docs)
 
# Langkah 3: Membuat Embedding (Embedding)
embeddings = OpenAIEmbeddings()
 
# Langkah 4: Membuat dan Menyimpan DB (Create DB)
# Membuat vectorstore.
vectorstore = FAISS.from_documents(
    documents=split_documents, embedding=embeddings)
 
# Langkah 5: Membuat Pencari (Retriever)
# Mencari dan menghasilkan informasi yang terkandung dalam dokumen.
retriever = vectorstore.as_retriever()
 
# Langkah 6: Membuat Prompt (Create Prompt)
# Membuat prompt.
prompt = PromptTemplate.from_template(
    """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Answer in Indonesian.
 
#Pertanyaan: 
{question} 
#Konteks: 
{context} 
 
#Jawaban:"""
)
 
# Langkah 7: Membuat Model Bahasa (LLM)
# Membuat model bahasa (LLM).
llm = ChatOpenAI(model_name="gpt-4o", temperature=0)
 
# Langkah 8: Membuat Chain (Chain)
chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)
Python
# Menjalankan Chain (Run Chain)
# Memasukkan pertanyaan tentang dokumen dan mencetak jawabannya.
question = "Apa risiko dari menggunakan ChatGPT?"
response = chain.invoke(question)
print(response)
Risiko dari menggunakan ChatGPT antara lain:

1. **Keamanan data**: Penggunaan ChatGPT dapat membuka celah bagi pelaku cyber untuk mencuri atau mengambil data pribadi, seperti identitas atau informasi keuangan, yang dihasilkan dalam proses penggunaan model.
2. **Bias algoritma**: ChatGPT didasarkan pada data pelatihan, dan jika data pelatihan tersebut tidak representatif atau terkontaminasi oleh bias, maka hasil output model dapat menjadi bias juga.
3. **Kesalahan interpretasi**: Output model ChatGPT mungkin tidak selalu mudah dipahami.

Selain itu, penting bagi pengguna untuk memastikan bahwa penggunaannya dilakukan dengan tepat dan bijak, serta memahami batasan kemampuan ChatGPT.