RAG คืออะไร?
RAG (Retrieval Augmented Generation) คือเทคนิคที่รวม:
- Retrieval: ค้นหาข้อมูลที่เกี่ยวข้อง
- Generation: ใช้ LLM สร้างคำตอบ
แทนที่จะให้ LLM ตอบจากความรู้ที่ train มา RAG จะค้นหาข้อมูลจริงมาให้ LLM ก่อน แล้วค่อยสร้างคำตอบ
🤔 ทำไมต้องใช้ RAG?
ปัญหาของ LLM แบบธรรมดา:
- ❌ Hallucination: แต่งคำตอบ ไม่รู้ก็บอกว่ารู้
- ❌ Outdated Knowledge: ข้อมูลเก่า ไม่ทันสมัย
- ❌ No Private Data: ไม่รู้ข้อมูลภายในบริษัท
- ❌ No Source: ไม่รู้ว่าตอบมาจากไหน
RAG แก้ปัญหาได้:
- ✅ ตอบจากข้อมูลจริง ไม่แต่ง
- ✅ ข้อมูลเป็น real-time
- ✅ ใช้ข้อมูลส่วนตัวได้
- ✅ มี source อ้างอิงได้
🏗️ RAG ทำงานอย่างไร?
1. Indexing Phase (ครั้งแรก)
Documents → Chunking → Embedding → Vector Store
Example:
"รายงานประจำปี 2023.pdf" →
Split เป็นชิ้นเล็กๆ →
แปลงเป็น vectors →
เก็บใน vector database
2. Retrieval Phase (เมื่อมีคำถาม)
Query → Embedding → Search Vector Store → Top K Results
Example:
"ยอดขายปี 2023 เท่าไหร่?" →
แปลงคำถามเป็น vector →
หาข้อมูลที่เกี่ยวข้อง →
ได้ 3-5 ชิ้นที่ match
3. Generation Phase
Query + Retrieved Docs → LLM → Answer
Example:
Prompt: "ตอบคำถามจากข้อมูลนี้:
[ข้อมูลที่ค้นหามา]
คำถาม: ยอดขายปี 2023 เท่าไหร่?"
LLM: "ยอดขายปี 2023 คือ 50 ล้านบาท ตามที่ระบุในรายงานประจำปี"
🔧 Components ของ RAG
1. Document Loaders
โหลดข้อมูลจากหลายแหล่ง:
- PDF, Word, Excel
- Websites, APIs
- Databases
- Google Docs, Notion
2. Text Splitters
แบ่งเอกสารเป็นชิ้นเล็กๆ:
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = splitter.split_documents(documents)
3. Embeddings
แปลงข้อความเป็นตัวเลข (vectors):
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vector = embeddings.embed_query("ยอดขายปี 2023")
4. Vector Stores
เก็บและค้นหา vectors:
- Pinecone: Managed, scalable
- Chroma: Open-source, local
- FAISS: Fast, Facebook
- Weaviate: Full-featured
5. Retrievers
ค้นหาข้อมูลที่เกี่ยวข้อง:
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 3}
)
docs = retriever.get_relevant_documents("ยอดขายปี 2023")
📝 ตัวอย่างโค้ด
Basic RAG Pipeline:
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 1. Load documents
loader = PyPDFLoader("annual_report.pdf")
documents = loader.load()
# 2. Split into chunks
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = text_splitter.split_documents(documents)
# 3. Create embeddings
embeddings = OpenAIEmbeddings()
# 4. Create vector store
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings
)
# 5. Create QA chain
qa = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
# 6. Ask questions
answer = qa.run("ยอดขายปี 2023 เท่าไหร่?")
🎯 RAG Use Cases
1. Customer Support
ตอบคำถามจาก knowledge base:
- คู่มือใช้งาน
- FAQ
- Documentation
2. Internal Knowledge Management
ค้นหาข้อมูลในองค์กร:
- Policy documents
- Meeting notes
- Project docs
3. Research Assistant
วิเคราะห์เอกสาร research:
- Academic papers
- Market reports
- Legal documents
4. Code Assistant
ค้นหาและอธิบาย code:
- Code documentation
- API references
- Best practices
⚡ Advanced RAG Techniques
1. Hybrid Search
รวม semantic search + keyword search:
# Semantic: ความหมายคล้ายกัน
# Keyword: คำตรงกัน
# → ได้ผลลัพธ์ดีกว่า
2. Re-ranking
จัดอันดับผลลัพธ์ใหม่:
ค้นหาได้ 10 documents →
Re-rank ด้วย cross-encoder →
เลือก 3 อันดับแรก →
ส่งให้ LLM
3. Query Expansion
ขยาย query ให้หลากหลาย:
Original: "ยอดขาย 2023"
Expanded:
- "ยอดขายปี 2023"
- "รายได้ปี 2023"
- "รายรับปี พ.ศ. 2566"
4. Self-Query
LLM แยก filter จาก query:
Query: "บทความเรื่อง AI ที่เขียนหลังปี 2023"
LLM แยกเป็น:
- Search: "AI articles"
- Filter: year > 2023
🚀 Optimization Tips
1. Chunk Size
- เล็กเกินไป: ขาด context
- ใหญ่เกินไป: มี noise มาก
- แนะนำ: 500-1000 characters
2. Overlap
- ทำให้ chunks เชื่อมต่อกัน
- ไม่ตัดข้อมูลกลางประโยค
- แนะนำ: 10-20% ของ chunk size
3. Number of Retrieved Docs
- น้อยเกินไป: ขาดข้อมูล
- มากเกินไป: LLM งง, ช้า, แพง
- แนะนำ: 3-5 documents
4. Embedding Model
- OpenAI: ดี แต่แพง
- Sentence Transformers: ฟรี รันเองได้
- Cohere: multilingual ดี
⚠️ Challenges & Limitations
1. Cost
- Embedding API costs
- Vector database costs
- LLM API costs
2. Latency
- Retrieval takes time
- More context = slower LLM
3. Quality
- ขึ้นกับคุณภาพข้อมูล
- Retrieval ผิด → คำตอบผิด
- ต้อง monitor และปรับปรุง
🛠️ Tools & Frameworks
LangChain
from langchain.chains import RetrievalQA
# Easy to use, many integrations
LlamaIndex
from llama_index import VectorStoreIndex
# Specialized for RAG
Haystack
from haystack.pipelines import Pipeline
# Production-ready
📊 Evaluation
Metrics:
- Retrieval Quality: ค้นหาถูกไหม?
- Answer Relevance: ตอบตรงคำถามไหม?
- Faithfulness: ตอบตามข้อมูลไหม ไม่แต่ง?
- Latency: เร็วแค่ไหน?
สรุป
RAG เป็นเทคนิคสำคัญที่ทำให้ LLM:
- ✅ ตอบจากข้อมูลจริง
- ✅ ไม่แต่งคำตอบ
- ✅ ใช้ข้อมูลเป็น real-time ได้
- ✅ มี source อ้างอิง
เหมาะสำหรับ applications ที่ต้องการความแม่นยำและ up-to-date!