AI AgentRAGKnowledge BaseVector DBEmbeddings

AI Agent + RAG — สอนสร้าง Agent ตอบข้อมูลบริษัท

สร้าง AI Agent ด้วย RAG ให้ตอบข้อมูลบริษัทแบบ real-time — ครอบคลุม Architecture, Vector DB, Embeddings, ภาษาไทย Tips พร้อม Code ดู Pricing

AI Unlocked Team
14/07/2569
AI Agent + RAG — สอนสร้าง Agent ตอบข้อมูลบริษัท

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 tokensSpeed
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/TestChromaฟรี, ติดตั้งง่าย, local
มี PostgreSQL อยู่แล้วpgvectorไม่ต้องระบบใหม่
Production scalePinecone / WeaviateManaged, fast, reliable
Self-host enterpriseQdrant / 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 หรือ OpenAI text-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 Starterongoing$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 ที่ต้องการความแม่นยำ:

  1. Document Loader → รับเอกสารทุก format
  2. Smart Chunking → ตัด context อย่างฉลาด รักษาความหมาย
  3. Multilingual Embedding → Cohere/Voyage สำหรับภาษาไทย
  4. Vector DB → Chroma สำหรับ dev, Pinecone/pgvector สำหรับ production
  5. Hybrid Retrieval + Rerank → เพิ่ม precision สำหรับ production
  6. 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