
AI Agent + RAG — สอนสร้าง Agent ตอบข้อมูลบริษัท
ทีมงานของคุณมีเอกสาร Policy หลายร้อยหน้า, FAQ ลูกค้า, Product Manual อัพเดตรายเดือน — แต่พอถาม AI ว่า "เงื่อนไขการคืนสินค้าคืออะไร" มันตอบผิดหรือบอกว่า "ไม่มีข้อมูล" เพราะ LLM ไม่รู้จักข้อมูลภายในองค์กรของคุณเลย
RAG (Retrieval-Augmented Generation) คือกุญแจที่ทำให้ AI Agent เชื่อมกับ Knowledge Base บริษัทได้อย่างแม่นยำ และนี่คือ tutorial ที่จะพาคุณสร้างระบบนั้นตั้งแต่ต้นจนจบ
RAG คืออะไร — Retrieve + Augment + Generate
RAG ไม่ใช่ model ใหม่ แต่เป็น architecture pattern ที่เชื่อมสามขั้นตอนเข้าด้วยกัน:
คำถาม → [Retrieve] → [Augment] → [Generate] → คำตอบ
1. Retrieve — ค้นหาข้อมูลที่เกี่ยวข้อง เมื่อผู้ใช้ถามอะไรบางอย่าง ระบบจะแปลงคำถามเป็น vector แล้วค้นหา "เอกสารที่ใกล้เคียงที่สุด" จาก Vector Database
2. Augment — เติมข้อมูลลงใน Prompt นำเอกสารที่ค้นหาได้มาใส่เป็น context ใน prompt ก่อนส่งให้ LLM
3. Generate — สร้างคำตอบ LLM อ่าน context ที่ให้ไว้ แล้วสร้างคำตอบที่อิงจากข้อมูลจริงของบริษัท ไม่ใช่ hallucination
ความต่างจาก Fine-tuning คือ RAG ไม่ต้อง train model ใหม่ — เพียงแค่เพิ่มข้อมูลลงใน Vector DB ก็อัพเดตความรู้ Agent ได้ทันที
ทำไม RAG คือ Magic ของ Enterprise AI
LLM ทั่วไปมีปัญหาหลักสามอย่างสำหรับการใช้งานองค์กร:
| ปัญหา | ผลกระทบ | RAG แก้อย่างไร |
|---|---|---|
| Knowledge cutoff | ข้อมูลล้าสมัย | ดึง real-time จาก DB |
| No private data | ไม่รู้ข้อมูลบริษัท | Inject ผ่าน context |
| Hallucination | ตอบผิดอย่างมั่นใจ | อิง source document จริง |
สำหรับ SME ไทยหรือ Enterprise ที่มีเอกสารมาก RAG ช่วยให้:
- ลูกค้าได้คำตอบจาก Policy จริงของบริษัท ไม่ใช่ LLM คาดเดา
- Support agent ค้นหา SOP ได้ภายใน 2 วินาที แทนที่จะเปิดเอกสาร
- HR Bot ตอบคำถาม payroll, สวัสดิการ จาก handbook จริง
ถ้าต้องการเข้าใจ RAG ในบริบทกว้างขึ้น อ่านต่อที่ RAG: Retrieval Augmented Generation คืออะไร
RAG Architecture แบบละเอียด
1. Document Loader — รับเอกสารทุกรูปแบบ
from langchain.document_loaders import (
PyPDFLoader,
UnstructuredMarkdownLoader,
UnstructuredHTMLLoader,
DirectoryLoader
)
# โหลด PDF เช่น SOP, Manual, Policy
pdf_loader = PyPDFLoader("company_policy.pdf")
docs = pdf_loader.load()
# โหลดทั้งโฟลเดอร์
dir_loader = DirectoryLoader(
"./knowledge_base/",
glob="**/*.pdf",
loader_cls=PyPDFLoader
)
all_docs = dir_loader.load()
รองรับ format หลัก: PDF, Markdown, HTML, DOCX, TXT, CSV และ Web scraping
2. Chunking Strategy — ตัดเอกสารอย่างฉลาด
การตัด chunk ผิดคือสาเหตุหลักที่ RAG ตอบผิด ต้องเลือก strategy ให้เหมาะ:
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=512, # ขนาด chunk (tokens)
chunk_overlap=64, # overlap ป้องกัน context ขาด
separators=["\n\n", "\n", "。", ".", " ", ""]
)
chunks = splitter.split_documents(docs)
print(f"จำนวน chunks: {len(chunks)}")
Rules of thumb สำหรับ chunk size:
- เอกสาร FAQ สั้น ๆ: 256–512 tokens
- Manual/Policy ยาว: 512–1024 tokens
- เอกสารภาษาไทย: ลด chunk_size 20% เพราะ tokenization หนักกว่า
3. Embeddings — แปลงข้อความเป็น Vector
from langchain_openai import OpenAIEmbeddings
from langchain_community.embeddings import CohereEmbeddings
# OpenAI text-embedding-3-small (ราคาถูก, ดีพอ)
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small",
dimensions=1536
)
# Cohere embed-multilingual-v3.0 (รองรับภาษาไทยดีกว่า)
cohere_embeddings = CohereEmbeddings(
model="embed-multilingual-v3.0"
)
เปรียบเทียบ Embedding Models สำหรับภาษาไทย:
| Model | ภาษาไทย | ราคา/1M tokens | Speed |
|---|---|---|---|
| OpenAI text-embedding-3-small | ดี | $0.02 | เร็ว |
| OpenAI text-embedding-3-large | ดีมาก | $0.13 | ปานกลาง |
| Cohere embed-multilingual-v3.0 | ดีที่สุด | $0.10 | เร็ว |
| Voyage voyage-multilingual-2 | ดีมาก | $0.06 | เร็ว |
สำหรับภาษาไทยโดยเฉพาะ Cohere และ Voyage ให้ผลดีกว่า OpenAI เพราะ train บน multilingual corpus มากกว่า
อ่านรายละเอียดเพิ่มเติมที่ Embedding Vectors — คู่มือสำหรับนักพัฒนาไทย
4. Vector Database — เก็บและค้นหา Vector
# Option 1: pgvector (ถ้ามี PostgreSQL อยู่แล้ว)
from langchain_community.vectorstores import PGVector
CONNECTION_STRING = "postgresql://user:pass@localhost/mydb"
vectorstore = PGVector.from_documents(
documents=chunks,
embedding=embeddings,
connection_string=CONNECTION_STRING,
collection_name="company_knowledge"
)
# Option 2: Chroma (local, ฟรี, ดี dev/test)
from langchain_community.vectorstores import Chroma
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
# Option 3: Pinecone (managed cloud, production-ready)
from langchain_pinecone import PineconeVectorStore
vectorstore = PineconeVectorStore.from_documents(
documents=chunks,
embedding=embeddings,
index_name="company-kb"
)
เลือก Vector DB อย่างไร:
| Use Case | แนะนำ | เหตุผล |
|---|---|---|
| Dev/Test | Chroma | ฟรี, ติดตั้งง่าย, local |
| มี PostgreSQL อยู่แล้ว | pgvector | ไม่ต้องระบบใหม่ |
| Production scale | Pinecone / Weaviate | Managed, fast, reliable |
| Self-host enterprise | Qdrant / Weaviate | ควบคุมข้อมูลเอง |
อ่านเปรียบเทียบเพิ่มเติม: Vector Database สำหรับ AI — เลือกอะไรดี
5. Retrieval + Re-ranking
# Basic retriever
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 5} # ดึง top-5 chunks
)
# MMR retriever (Maximum Marginal Relevance — หลีกเลี่ยง duplicate)
retriever_mmr = vectorstore.as_retriever(
search_type="mmr",
search_kwargs={"k": 5, "fetch_k": 20}
)
# Hybrid Search (keyword + semantic) — แนะนำสำหรับ production
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
bm25 = BM25Retriever.from_documents(chunks)
bm25.k = 5
ensemble = EnsembleRetriever(
retrievers=[bm25, retriever],
weights=[0.4, 0.6] # ให้ semantic weight มากกว่า
)
Re-ranking เพิ่มความแม่นยำหลัง retrieve:
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
compressor = CohereRerank(
model="rerank-multilingual-v3.0",
top_n=3
)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=ensemble
)
6. LLM Generation — สร้างคำตอบ
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# Prompt template ภาษาไทย
THAI_RAG_PROMPT = """คุณเป็นผู้ช่วย AI ของบริษัท ตอบคำถามจากข้อมูลที่ให้ไว้เท่านั้น
ถ้าไม่มีข้อมูลในเอกสาร ให้บอกว่า "ไม่มีข้อมูลในฐานความรู้" อย่าเดา
เอกสารอ้างอิง:
{context}
คำถาม: {question}
คำตอบ (ภาษาไทย):"""
prompt = PromptTemplate(
template=THAI_RAG_PROMPT,
input_variables=["context", "question"]
)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=compression_retriever,
chain_type_kwargs={"prompt": prompt},
return_source_documents=True # แสดง source ด้วย
)
# ทดสอบ
result = qa_chain.invoke({"query": "เงื่อนไขการคืนสินค้าคืออะไร"})
print(result["result"])
print("\nSource:", result["source_documents"][0].metadata)
Step-by-step สร้าง RAG ภาษาไทยแบบ End-to-End
Step 1: เตรียม Environment
pip install langchain langchain-openai langchain-community
pip install chromadb pypdf unstructured
pip install cohere langchain-cohere # optional สำหรับ multilingual
Step 2: เตรียม Knowledge Base
สร้างโฟลเดอร์ knowledge_base/ แล้วใส่เอกสาร:
knowledge_base/
├── product_faq.pdf
├── return_policy.md
├── shipping_guide.pdf
└── company_handbook.docx
Step 3: Ingest Pipeline
import os
from pathlib import Path
from langchain.document_loaders import DirectoryLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# 1. Load
loader = DirectoryLoader("./knowledge_base/", glob="**/*.pdf", loader_cls=PyPDFLoader)
docs = loader.load()
print(f"โหลดได้ {len(docs)} หน้า")
# 2. Chunk
splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=64)
chunks = splitter.split_documents(docs)
print(f"ตัดได้ {len(chunks)} chunks")
# 3. Embed + Store
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
print("บันทึก Vector DB เรียบร้อย")
Step 4: Query Pipeline
# โหลด vectorstore ที่มีอยู่แล้ว
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=embeddings
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o-mini", temperature=0),
retriever=retriever,
return_source_documents=True
)
# ทดสอบ query ภาษาไทย
queries = [
"นโยบายคืนสินค้าภายในกี่วัน",
"ค่าจัดส่งต่างจังหวัดเท่าไหร่",
"วันลาพักร้อนได้กี่วันต่อปี"
]
for q in queries:
res = qa_chain.invoke({"query": q})
print(f"Q: {q}")
print(f"A: {res['result']}\n")
Tips สำคัญสำหรับ RAG ภาษาไทย
1. Tokenization ภาษาไทย — ปัญหาและวิธีแก้
ภาษาไทยไม่มี space ระหว่างคำ ทำให้ tokenizer ตัดผิด แนะนำใช้ pythainlp ช่วย:
from pythainlp.tokenize import word_tokenize
def thai_splitter(text: str) -> list[str]:
"""ตัดคำภาษาไทยก่อน chunk"""
tokens = word_tokenize(text, engine="newmm")
return tokens
# หรือใช้ TextSplitter ที่รองรับ Thai
from langchain.text_splitter import RecursiveCharacterTextSplitter
thai_separators = ["\n\n", "\n", ".", "!", "?", ",", " ", ""]
splitter = RecursiveCharacterTextSplitter(
chunk_size=400, # เล็กกว่า English เล็กน้อย
chunk_overlap=50,
separators=thai_separators
)
2. เลือก Embedding Model ให้เหมาะกับ Use Case
- เอกสารไทยล้วน: Cohere
embed-multilingual-v3.0ดีที่สุด - เอกสารผสม EN-TH: Voyage
voyage-multilingual-2หรือ OpenAItext-embedding-3-large - Budget จำกัด: OpenAI
text-embedding-3-smallยังใช้งานได้ดี
3. Metadata Filtering ลด Noise
# เพิ่ม metadata ตอน ingest
for doc in docs:
doc.metadata["department"] = "hr" # แผนก
doc.metadata["year"] = 2026 # ปีเอกสาร
doc.metadata["lang"] = "th" # ภาษา
# Filter ตอน retrieve
retriever = vectorstore.as_retriever(
search_kwargs={
"k": 5,
"filter": {"department": "hr"} # ดึงเฉพาะ HR docs
}
)
4. Chunk Overlap สำหรับเอกสาร Policy
Policy ไทยมักมีคำขยายความในประโยคถัดไป ให้ใช้ overlap สูงกว่าปกติ:
policy_splitter = RecursiveCharacterTextSplitter(
chunk_size=600,
chunk_overlap=120, # 20% overlap
)
Evaluation — วัดผล RAG ให้แม่นยำ
RAG ที่ดีต้องวัดผลสามมิติ:
1. Retrieval Quality
- Precision@K: ใน K chunks ที่ดึงมา มีกี่ chunks ที่ relevant จริง
- Recall@K: chunks ที่ relevant ทั้งหมด ดึงมาได้กี่ % ใน K อันดับแรก
# ใช้ RAGAS library สำหรับ automated evaluation
from ragas import evaluate
from ragas.metrics import context_precision, context_recall
results = evaluate(
dataset=eval_dataset,
metrics=[context_precision, context_recall]
)
print(results)
2. Generation Quality
- Faithfulness: คำตอบอิงจาก context จริงหรือ hallucinate
- Answer Relevancy: คำตอบตรงกับคำถามแค่ไหน
3. End-to-End
สร้าง test set จากคำถามจริงที่ลูกค้าหรือพนักงานถาม แล้วให้ human expert ให้คะแนน 1–5:
คำถาม | คำตอบ Agent | Source | Human Score
"คืนสินค้าได้ภายในกี่วัน" | "30 วัน..." | policy_v3.pdf, p.12 | 5/5
"ค่าส่งต่างจังหวัด" | "ไม่มีข้อมูล" | — | 2/5 (ควรหาได้)
Cost Optimization
RAG มี cost สองส่วน: Embedding (ทำครั้งเดียว) และ LLM (ทุก query)
ลด Embedding Cost
# Batch embed แทนทีละ chunk
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small",
chunk_size=500 # batch size สูงสุด
)
# Cache embeddings ที่ compute แล้ว
from langchain.storage import InMemoryByteStore
from langchain.embeddings import CacheBackedEmbeddings
import pickle
store = InMemoryByteStore()
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
embeddings, store, namespace="company_kb"
)
ลด LLM Cost ต่อ Query
# ใช้ gpt-4o-mini แทน gpt-4o สำหรับ FAQ ทั่วไป
# ประหยัด ~15x ราคา แต่คุณภาพยังดีมากสำหรับ Q&A
llm_cheap = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# Limit context window — ส่ง top-3 แทน top-5
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
ประมาณ Cost จริง
| Component | ปริมาณ | ราคา/เดือน |
|---|---|---|
| Embedding 1,000 หน้า PDF | ครั้งเดียว | ~$0.10 |
| 500 queries/วัน × gpt-4o-mini | ต่อเดือน | ~$15–30 |
| Chroma (self-host) | ongoing | ฟรี |
| Pinecone Starter | ongoing | $70/เดือน |
ต่อยอด RAG Agent ให้ฉลาดขึ้น
พอมี RAG พื้นฐานแล้ว ขั้นต่อไปคือ integrate เข้ากับ AI Agent จริง:
- Tool-based RAG: ให้ Agent เรียก RAG เป็น tool หนึ่งในหลาย tools
- Conversational RAG: จำ history ของบทสนทนาก่อนหน้า
- Multi-KB RAG: หลาย Knowledge Base แยกตาม department
from langchain.tools import Tool
from langchain.agents import create_openai_tools_agent
rag_tool = Tool(
name="company_knowledge_base",
description="ค้นหาข้อมูลจาก Knowledge Base บริษัท เช่น Policy, FAQ, SOP",
func=lambda q: qa_chain.invoke({"query": q})["result"]
)
agent = create_openai_tools_agent(
llm=llm,
tools=[rag_tool],
prompt=agent_prompt
)
อ่านต่อเรื่องการสร้าง AI Agent แบบเต็มได้ที่ คู่มือสร้าง AI Agent ภาษาไทย 2026
Use Cases จริงในธุรกิจไทย
1. HR Knowledge Bot พนักงานถาม "ลาคลอดได้กี่วัน", "สวัสดิการรักษาพยาบาลครอบคลุมอะไร" — Agent ดึงจาก Employee Handbook ตอบได้ทันที ลด HR ticket 60%
2. Customer Service บน Line OA ลูกค้าถามเรื่อง product spec, การรับประกัน, ขั้นตอน claim — ดูตัวอย่างเพิ่มเติมที่ สอนสร้าง AI Agent Customer Service ภาษาไทย
3. E-Commerce Auto Reply ตอบคำถามสินค้าจาก product catalog อัตโนมัติ — อ่านกรณีศึกษา AI Agent E-Commerce ตอบลูกค้าอัตโนมัติ
4. Sales Enablement ทีมขายถามข้อมูล competitor, pricing, proposal template — Agent ตอบได้จาก internal docs
สรุป
RAG คือ foundation ที่ขาดไม่ได้สำหรับ Enterprise AI ที่ต้องการความแม่นยำ:
- Document Loader → รับเอกสารทุก format
- Smart Chunking → ตัด context อย่างฉลาด รักษาความหมาย
- Multilingual Embedding → Cohere/Voyage สำหรับภาษาไทย
- Vector DB → Chroma สำหรับ dev, Pinecone/pgvector สำหรับ production
- Hybrid Retrieval + Rerank → เพิ่ม precision สำหรับ production
- Evaluation → วัดผลด้วย RAGAS ก่อน deploy
เริ่มต้นง่าย ๆ ด้วย Chroma + OpenAI embeddings + gpt-4o-mini ค่า infrastructure เดือนแรกแทบไม่เกิน $10 แต่ให้คุณค่ามหาศาลเมื่อ Agent ตอบข้อมูลบริษัทได้ถูกต้อง
ต้องการเรียนสร้าง RAG Agent แบบมีครูสอน มี community ช่วย และ workshop ลงมือทำจริง? ดูแพ็กเกจได้ที่ AI Unlocked Pricing — มีทั้ง Gold รายเดือนและ Diamond Lifetime
อยู่ในเชียงใหม่? เรามี คอร์ส AI ในเชียงใหม่ 2026 ที่ครอบคลุม RAG และ Agent ด้วย
เขียนโดย
AI Unlocked Team
บทความอื่นๆ ที่น่าสนใจ
เรียน AI เชียงใหม่ vs ออนไลน์ — ROI เปรียบเทียบ 2026
เรียน AI เชียงใหม่ vs online ต่างกันอย่างไรในแง่ ROI? เปรียบค่าใช้จ่าย ผลลัพธ์ และ profile ที่เหมาะกับแต่ละแบบ เพื่อตัดสินใจให้ถูกต้องในปี 2026
Vibe Coding Mobile App — Cursor + Expo สำหรับ React Native
สร้าง mobile app ด้วย vibe coding mobile ใน 1 ชั่วโมง! Cursor + Expo + Claude — ตั้งแต่ติดตั้งจนถึง App Store ไม่ต้องเขียนโค้ดเองทุกบรรทัด
AI ทำวิดีโอภาษาไทย Pronunciation — เครื่องมือไหนพูดเป๊ะ
เปรียบเทียบ 5 เครื่องมือ AI วิดีโอภาษาไทย ElevenLabs, HeyGen, Botnoi, Google TTS, Microsoft Speech — ดูตารางคะแนน Pronunciation + ราคา แล้วเลือกให้เหมาะกับงาน
