RAG Tingkat Lanjut - Membangun Retrieval-Augmented Generation Kelas Produksi
Daftar Isi
Pendahuluan
Retrieval-Augmented Generation (RAG) telah menjadi pendekatan standar untuk mendasarkan Large Language Models (LLM) pada pengetahuan domain-spesifik. Meskipun sistem RAG dasar mudah dibangun, RAG kelas produksi membutuhkan teknik canggih untuk menangani nuansa pencarian informasi dunia nyata.
Keterbatasan RAG dasar yang ditangani oleh teknik lanjutan:
- Kesenjangan semantik: Embedding dense melewatkan pencocokan leksikal; retrieval sparse melewatkan kesamaan semantik
- Noise retrieval: Hasil top-k sering menyertakan dokumen yang tidak relevan
- Ambiguitas query: Query pengguna mungkin samar, multi-aspek, atau terbentuk buruk
- Fragmentasi konteks: Chunk berukuran tetap kehilangan struktur dan konteks dokumen
- Pengukuran kualitas: Tidak ada cara sistematis untuk mengevaluasi performa pipeline RAG
Dalam tutorial ini, Anda akan mempelajari teknik RAG lanjutan yang secara signifikan meningkatkan kualitas retrieval, akurasi jawaban, dan keandalan sistem secara keseluruhan. Setiap teknik telah teruji di produksi dan dapat dikombinasikan untuk efektivitas maksimal.
Prasyarat
- Python 3.10 atau lebih tinggi
- Pemahaman dasar arsitektur RAG (embedding, vector store, LLM)
- Keakraban dengan LangChain atau framework serupa
- Kunci API OpenAI (atau penyedia LLM lain)
- RAM 8GB+ direkomendasikan untuk model embedding lokal
Instalasi dan Pengaturan
# Dependensi inti
pip install langchain langchain-openai langchain-community
pip install chromadb faiss-cpu
pip install sentence-transformers
pip install rank-bm25
Untuk evaluasi
pip install ragas
Untuk reranking cross-encoder
pip install transformers torch
Utilitas tambahan
pip install tiktoken numpy pandas
Pengaturan lingkungan:
import os
os.environ["OPENAIAPIKEY"] = "kunci-api-anda"
from langchainopenai import ChatOpenAI, OpenAIEmbeddings
from langchain.textsplitter import RecursiveCharacterTextSplitter
from langchaincommunity.vectorstores import Chroma, FAISS
Verifikasi pengaturan
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
print("Pengaturan selesai.")
Pencarian Hybrid: Retrieval Dense + Sparse
Pencarian hybrid menggabungkan kekuatan retrieval vektor dense (pemahaman semantik) dengan retrieval sparse (pencocokan kata kunci eksak) untuk retrieval dokumen yang lebih kokoh.
import numpy as np
from rankbm25 import BM25Okapi
from langchainopenai import OpenAIEmbeddings
from langchaincommunity.vectorstores import FAISS
from langchain.schema import Document
from typing import List, Tuple
class RetrieverPencarianHybrid:
"""
Menggabungkan retrieval dense (embedding) dan sparse (BM25)
dengan bobot fusi yang dapat dikonfigurasi.
"""
def init(
self,
dokumen: List[Document],
embeddings,
bobotdense: float = 0.6,
bobotsparse: float = 0.4,
):
self.dokumen = dokumen
self.bobotdense = bobotdense
self.bobotsparse = bobotsparse
# Bangun indeks dense
self.vectorstore = FAISS.fromdocuments(dokumen, embeddings)
# Bangun indeks sparse (BM25)