Sedang mengikuti modul ini?
Modul 16 · Halaman 17 daripada 20 · 9 bahagian
Retrieval-Augmented Generation (RAG) dalam LangChain
Pandangan RAG yang disatukan: seni bina, langkah aliran kerja, pilihan pangkalan data vektor, contoh dengan FAISS dan Chroma kekal, parameter utama dan amalan terbaik.
Apa itu RAG?
- RAG menggabungkan retrieval (mencari dokumen relevan) dengan penjanaan (LLM) untuk menghasilkan jawapan yang tepat dan kontekstual.
- Ia membantu LLM menggunakan data peribadi anda dan bukan hanya bergantung pada pengetahuan pralatih.
- Mengurangkan halusinasi dan memberi jawapan berasaskan sumber.
- Digunakan secara meluas dalam chatbot, sistem soal jawab, carian dokumen dan sistem pengetahuan perusahaan.
Mengapa Menggunakan RAG?
- Memberi maklumat tepat dan terkini daripada dokumen anda sendiri.
- Mengurangkan halusinasi dengan mengasaskan jawapan pada data sebenar.
- Berfungsi dengan PDF, laman web, pangkalan data dan lain-lain.
- Menyokong petikan sumber (dari mana maklumat datang).
- Penting untuk aplikasi perusahaan dan pengetahuan khusus domain (polisi, manual, FAQ, dsb.).
Seni Bina RAG dengan LangChain
Sumber DataPDF, TXT, web, pangkalan data
Document Loader + Text SplitterMuat dan pecah kepada chunk
EmbeddingsOpenAI / HuggingFace
Pangkalan Data VektorFAISS / Chroma / Pinecone / Qdrant
RetrieverCari chunk relevan
LLMJana jawapan menggunakan konteks
Respons AkhirDengan sumber
Langkah Aliran Kerja RAG
- 1Muat dokumen daripada pelbagai sumber (PDF, laman web, DB, dsb.).
- 2Pecahkan dokumen kepada chunk lebih kecil.
- 3Cipta embeddings dan simpan dalam pangkalan data vektor.
- 4Apabila pengguna bertanya, dapatkan chunk yang relevan.
- 5Hantar konteks yang diperoleh + pertanyaan kepada LLM.
- 6Jana jawapan akhir dengan maklumat sumber.
Pangkalan Data Vektor Popular untuk RAG
| Vector DB | Jenis | Ciri Utama | Kes Penggunaan |
|---|---|---|---|
| FAISS | Dalam memori (oleh Meta) | Pantas, mudah, sumber terbuka | Pembangunan setempat, data kecil hingga sederhana |
| Chroma | Terbenam | Mudah digunakan, storan kekal | Projek mudah, prototaip |
| Pinecone | Awan (SaaS) | Terurus, boleh skala, prestasi tinggi | Pengeluaran, aplikasi berskala besar |
| Qdrant | Dihoskan sendiri / Awan | Prestasi tinggi, penapisan, payload | Pengeluaran, kegunaan perusahaan |
| Weaviate | Dihoskan sendiri / Awan | Carian hibrid, GraphQL, skema | Carian lanjutan, aplikasi perusahaan |
Contoh: RAG Mudah dengan FAISS
python
from langchain.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.vectorstores import FAISS from langchain.embeddings import OpenAIEmbeddings from langchain.chains import RetrievalQA from langchain.chat_models import ChatOpenAI # 1. Load and split document loader = PyPDFLoader("data/company_policy.pdf") docs = loader.load() splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) chunks = splitter.split_documents(docs) # 2. Create embeddings and store in FAISS embeddings = OpenAIEmbeddings() vectorstore = FAISS.from_documents(chunks, embeddings) # 3. Create retriever and QA chain retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) qa_chain = RetrievalQA.from_chain_type( llm=ChatOpenAI(model="gpt-3.5-turbo", temperature=0.2), retriever=retriever ) # 4. Ask a question response = qa_chain.invoke({"query": "What is the leave policy?"}) print(response["result"])
Contoh: RAG dengan Chroma (Kekal)
python
from langchain.document_loaders import DirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.chains import RetrievalQA from langchain.chat_models import ChatOpenAI # 1. Load documents loader = DirectoryLoader("data/") docs = loader.load() splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) chunks = splitter.split_documents(docs) # 2. Create embeddings and store in Chroma (persistent) embeddings = OpenAIEmbeddings() vectorstore = Chroma.from_documents( documents=chunks, embedding=embeddings, persist_directory="chroma_db" ) # 3. Create QA chain retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) qa_chain = RetrievalQA.from_chain_type(llm=ChatOpenAI(), retriever=retriever) # 4. Query response = qa_chain.invoke({"query": "Summarize this document."}) print(response["result"])
Parameter Utama dalam RAG
| Parameter | Penerangan | Contoh |
|---|---|---|
| chunk_size | Saiz setiap chunk (dalam aksara/token) | 1000 |
| chunk_overlap | Pertindihan antara chunk | 200 |
| search_kwargs (k) | Bilangan chunk relevan untuk diperoleh | 3 |
| temperature | Mengawal kerawakan dalam respons LLM | 0.0 - 0.5 |
| model_name | Model LLM untuk digunakan | gpt-3.5-turbo |
Amalan Terbaik dan Pengajaran Utama
- Gunakan dokumen yang berkualiti tinggi dan bersih.
- Pilih saiz chunk dan pertindihan yang sesuai.
- Gunakan pangkalan data vektor yang boleh dipercayai berdasarkan skala dan kes penggunaan anda.
- Gabungkan RAG dengan penapisan metadata untuk hasil lebih baik.
- Sertakan petikan sumber dalam respons akhir.
- Laras parameter retriever dan LLM untuk jawapan yang tepat.
- RAG penting untuk membina chatbot perusahaan, pangkalan pengetahuan dan sistem soal jawab dokumen.