- 3
- เมษายน
Ollama Series EP.4 — จาก EP.3 ที่เราเรียนรู้วิธีเลือก Model และสร้าง Modelfile ตอนนี้เราจะก้าวไปอีกขั้น — สร้าง AI ที่ ตอบคำถามจากเอกสารขององค์กรได้จริง ไม่ใช่แค่ตอบจากความรู้ทั่วไป แต่ตอบจากคู่มือบริษัท ระเบียบองค์กร รายงานการเงิน หรือเอกสารที่คุณป้อนให้ ทั้งหมดนี้ทำได้ด้วยเทคนิคที่เรียกว่า RAG (Retrieval-Augmented Generation) และที่สำคัญ — ข้อมูลทุกอย่างอยู่ในเครื่องของคุณ ไม่ส่งออกนอกองค์กร
สรุปสั้น — RAG คืออะไร ทำไมต้องใช้?
- RAG = Retrieval-Augmented Generation — เทคนิคที่ให้ AI "ค้นหา" ข้อมูลจากเอกสารก่อนตอบ
- AI ปกติตอบจาก "ความรู้ทั่วไป" ที่ถูก Train มา — ไม่รู้เรื่องเฉพาะขององค์กรคุณ
- RAG ทำให้ AI ตอบจาก เอกสารจริงขององค์กร ได้ — คู่มือ ระเบียบ รายงาน สัญญา ฯลฯ
- ใช้ร่วมกับ Ollama = ข้อมูลไม่ออกนอกเครื่อง
- เครื่องมือหลัก: Ollama + LangChain (หรือ LlamaIndex) + ChromaDB
- บทความนี้มี Code ตัวอย่างครบ ทำตามได้ทันที
RAG คืออะไร? — ทำไม AI ธรรมดาตอบจากเอกสารไม่ได้
ลองนึกภาพว่าคุณถาม ChatGPT ว่า "ระเบียบการลาของบริษัทเรา พนักงานทดลองงานลาได้กี่วัน?" — ChatGPT ตอบไม่ได้ เพราะมันไม่เคยเห็นระเบียบบริษัทคุณ มันรู้แค่ข้อมูลทั่วไปที่ถูก Train มา
RAG (Retrieval-Augmented Generation) แก้ปัญหานี้โดยเพิ่มขั้นตอน "ค้นหา" ก่อนที่ AI จะตอบ:
| ขั้นตอน | AI ธรรมดา | AI + RAG |
|---|---|---|
| 1. รับคำถาม | รับคำถาม | รับคำถาม |
| 2. ค้นหาข้อมูล | ❌ ไม่ค้นหา ตอบจากความจำ | ✅ ค้นหาเอกสารที่เกี่ยวข้อง |
| 3. สร้างคำตอบ | ตอบจาก Training Data (อาจมั่วได้) | ตอบจากเอกสารจริง + อ้างอิงแหล่งที่มา |
| ความแม่นยำ | ต่ำ (สำหรับข้อมูลเฉพาะองค์กร) | สูง (ตอบจากเอกสารจริง) |
| Hallucination | สูง — อาจแต่งข้อมูลขึ้นมา | ต่ำ — มีเอกสารอ้างอิง |
เทคนิค RAG ถูกเสนอครั้งแรกโดย Patrick Lewis และทีมจาก Facebook AI Research (FAIR) ในปี 2020 ผ่าน Paper ชื่อ "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" (arXiv:2005.11401) ปัจจุบัน RAG เป็นเทคนิคมาตรฐานที่แทบทุกบริษัท AI ใช้ — ทั้ง ChatGPT, Claude, Gemini ล้วนใช้ RAG ในรูปแบบต่างๆ เมื่อทำ Knowledge Retrieval
RAG ทำงานอย่างไร? — 5 ขั้นตอน
เมื่อเข้าใจหลักการแล้ว มาดูว่า RAG ทำงานจริงๆ อย่างไรในเชิงเทคนิค:
| ขั้นตอน | ทำอะไร | เครื่องมือ |
|---|---|---|
| 1. Load | โหลดเอกสาร (PDF, Word, TXT, CSV, HTML) | LangChain Document Loaders |
| 2. Split | แบ่งเอกสารเป็น Chunks ย่อยๆ (500-1,000 ตัวอักษร) | RecursiveCharacterTextSplitter |
| 3. Embed | แปลงข้อความเป็น Vector (ตัวเลข) เพื่อให้ค้นหาตาม "ความหมาย" ได้ | Ollama Embeddings (nomic-embed-text) |
| 4. Store | เก็บ Vectors ไว้ใน Vector Database | ChromaDB / FAISS / Qdrant |
| 5. Retrieve + Generate | เมื่อมีคำถาม → ค้นหา Chunks ที่เกี่ยวข้อง → ส่งให้ LLM สร้างคำตอบ | Ollama LLM (qwen2.5 / llama3.1) |
Embedding คืออะไร? — หัวใจของ RAG
Embedding คือการแปลงข้อความเป็น "พิกัดในมิติสูง" (Vector) เพื่อให้คอมพิวเตอร์เข้าใจ "ความหมาย" ของข้อความได้ ตัวอย่างเช่น ข้อความ "ลาป่วย" กับ "ขอหยุดเพราะไม่สบาย" จะถูกแปลงเป็น Vector ที่อยู่ใกล้กัน แม้จะใช้คำต่างกัน
Ollama มี Embedding Model ในตัว ที่นิยมใช้คือ nomic-embed-text — ขนาดเล็ก (274 MB) แต่คุณภาพดี รองรับ 8,192 Tokens ต่อ Chunk และที่สำคัญ ทำงาน Local ทั้งหมด ไม่ส่งข้อมูลออกนอก
# ดาวน์โหลด Embedding Model
ollama pull nomic-embed-text
# ทดสอบ Embedding
curl http://localhost:11434/api/embeddings -d '{
"model": "nomic-embed-text",
"prompt": "ระเบียบการลาของบริษัท"
}'
# จะได้ Array ตัวเลข 768 มิติ เช่น [0.123, -0.456, 0.789, ...]
Vector Database คืออะไร?
Vector Database คือฐานข้อมูลที่ออกแบบมาเพื่อเก็บและค้นหา Vectors — แทนที่จะค้นหาด้วย keyword เหมือน PostgreSQL ปกติ มันค้นหาด้วย "ความคล้ายคลึงทางความหมาย" (Semantic Similarity) ตัวที่นิยมใช้กับ Ollama:
| Vector DB | ประเภท | จุดเด่น | เหมาะกับ |
|---|---|---|---|
| ChromaDB | Open-source, ฝังในแอปได้ | ติดตั้งง่ายที่สุด pip install chromadb |
เริ่มต้น, Prototype, องค์กรขนาดเล็ก |
| FAISS | Library จาก Meta | เร็วมาก รองรับข้อมูลหลายล้าน Vectors | ข้อมูลเยอะ ต้องการความเร็ว |
| Qdrant | Open-source, Docker | มี REST API, Filter ซับซ้อนได้ | Production, องค์กรขนาดกลาง-ใหญ่ |
| pgvector | Extension ของ PostgreSQL | ใช้ร่วมกับ PostgreSQL ที่มีอยู่แล้วได้ | องค์กรที่ใช้ PostgreSQL อยู่แล้ว |
ลงมือทำ — สร้าง RAG ด้วย Ollama + LangChain + ChromaDB
มาลงมือสร้าง RAG Pipeline จริงๆ กัน — ตัวอย่างนี้จะป้อนเอกสาร PDF ให้ AI แล้วถามคำถามจากเอกสารนั้น:
ขั้นตอนที่ 1: ติดตั้ง Dependencies
# ติดตั้ง Python packages
pip install langchain langchain-community langchain-ollama
pip install chromadb
pip install pypdf
# ดาวน์โหลด Models ใน Ollama
ollama pull qwen2.5
ollama pull nomic-embed-text
ขั้นตอนที่ 2: เขียน RAG Pipeline
# file: rag_demo.py
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_ollama import OllamaEmbeddings, ChatOllama
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# 1. Load - โหลดเอกสาร PDF
loader = PyPDFLoader("company-policy.pdf")
documents = loader.load()
print(f"โหลดเอกสาร {len(documents)} หน้า")
# 2. Split - แบ่งเป็น Chunks
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # ขนาดแต่ละ Chunk (ตัวอักษร)
chunk_overlap=200, # ซ้อนทับกัน 200 ตัวอักษร (ไม่ให้ขาดบริบท)
separators=["\n\n", "\n", ".", " "]
)
chunks = text_splitter.split_documents(documents)
print(f"แบ่งเป็น {len(chunks)} Chunks")
# 3. Embed + Store - แปลงเป็น Vector แล้วเก็บใน ChromaDB
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db" # เก็บลง Disk
)
print("สร้าง Vector Database เสร็จ")
# 4. สร้าง RAG Chain
llm = ChatOllama(model="qwen2.5", temperature=0.2)
prompt_template = PromptTemplate(
template="""จากข้อมูลต่อไปนี้ ให้ตอบคำถามเป็นภาษาไทย:
ข้อมูล:
{context}
คำถาม: {question}
คำตอบ (ตอบจากข้อมูลที่ให้เท่านั้น ถ้าไม่มีข้อมูลให้บอกว่าไม่พบ):""",
input_variables=["context", "question"]
)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(
search_kwargs={"k": 4} # ดึง 4 Chunks ที่เกี่ยวข้องที่สุด
),
chain_type_kwargs={"prompt": prompt_template},
return_source_documents=True
)
# 5. ถามคำถาม!
result = qa_chain.invoke({
"query": "พนักงานทดลองงานลาป่วยได้กี่วัน?"
})
print("\n=== คำตอบ ===")
print(result["result"])
print("\n=== แหล่งที่มา ===")
for doc in result["source_documents"]:
print(f"- หน้า {doc.metadata.get('page', '?')}: {doc.page_content[:100]}...")
ขั้นตอนที่ 3: รัน
python rag_demo.py
# ผลลัพธ์ตัวอย่าง:
# โหลดเอกสาร 45 หน้า
# แบ่งเป็น 128 Chunks
# สร้าง Vector Database เสร็จ
#
# === คำตอบ ===
# ตามระเบียบบริษัท หมวดที่ 3 ข้อ 3.2
# พนักงานทดลองงานมีสิทธิลาป่วยได้ไม่เกิน 15 วันทำการต่อปี
# โดยต้องแจ้งหัวหน้างานภายในวันที่ลา
# หากลาป่วยติดต่อกัน 3 วันขึ้นไป ต้องมีใบรับรองแพทย์
#
# === แหล่งที่มา ===
# - หน้า 12: หมวดที่ 3 การลา 3.2 การลาป่วย พนักงานทดลองงาน...
ข้อมูลอยู่ที่ไหน?
- เอกสารต้นฉบับ → อยู่ในเครื่องคุณ
- Embedding (Vector) → เก็บใน ChromaDB บนเครื่องคุณ (โฟลเดอร์
./chroma_db) - LLM (qwen2.5) → รันบน Ollama ในเครื่องคุณ
- ไม่มีอะไรออกนอกเครื่อง ทั้ง Process — เหมาะกับข้อมูลลับระดับ ความเสี่ยงองค์กร
รองรับเอกสารหลายรูปแบบ
LangChain มี Document Loader สำหรับไฟล์หลายประเภท — ไม่จำกัดแค่ PDF:
| ประเภทไฟล์ | Loader | ต้องติดตั้ง |
|---|---|---|
PyPDFLoader |
pip install pypdf |
|
| Word (.docx) | Docx2txtLoader |
pip install docx2txt |
| Excel (.xlsx) | UnstructuredExcelLoader |
pip install unstructured openpyxl |
| CSV | CSVLoader |
มาพร้อม LangChain |
| Text (.txt) | TextLoader |
มาพร้อม LangChain |
| HTML | BSHTMLLoader |
pip install beautifulsoup4 |
| โฟลเดอร์ทั้งหมด | DirectoryLoader |
มาพร้อม LangChain |
ทางลัด — ใช้ Open WebUI ทำ RAG โดยไม่ต้องเขียนโค้ด
สำหรับคนที่ไม่อยากเขียน Python — Open WebUI มีฟีเจอร์ RAG ในตัว แค่ลากไฟล์แนบเข้าไปในแชท:
- ติดตั้ง Open WebUI ตามที่สอนใน EP.2
- เปิด Chat ใหม่ เลือก Model (เช่น qwen2.5)
- กดไอคอน 📎 (แนบไฟล์) แล้วเลือกไฟล์ PDF, TXT, หรือ DOCX
- Open WebUI จะประมวลผลเอกสารเป็น Chunks + Embedding อัตโนมัติ
- ถามคำถาม — AI จะตอบจากเอกสารที่แนบ พร้อมอ้างอิงแหล่งที่มา
วิธีนี้เหมาะมากสำหรับ ผู้ใช้ทั่วไปที่ไม่ใช่ Developer — เช่น ฝ่ายบัญชีที่ต้องการถาม AI เกี่ยวกับ มาตรฐาน TFRS หรือ ฝ่ายบุคคลที่ต้องการถามเรื่องระเบียบองค์กร
RAG สำหรับงาน ERP — Use Cases จริง
สำหรับองค์กรที่ใช้ระบบ ERP อยู่แล้ว RAG เปิดโอกาสมากมาย:
| Use Case | เอกสารที่ป้อน | คำถามตัวอย่าง |
|---|---|---|
| ถามระเบียบบริษัท | ระเบียบบริษัท, คู่มือพนักงาน | "สิทธิลาคลอดมีกี่วัน?", "ค่าล่วงเวลาคำนวณอย่างไร?" |
| ช่วยงาน บัญชี | มาตรฐาน TFRS, ผังบัญชี | "สินทรัพย์ถาวรต้องบันทึกอย่างไรตาม TFRS?", "ผังบัญชีหมวด 5 มีอะไรบ้าง?" |
| สรุปรายงาน | รายงานการเงิน, งบประมาณ | "สรุปรายจ่ายที่เกินงบในไตรมาสนี้", "แนวโน้ม ต้นทุนการผลิต เป็นอย่างไร?" |
| คู่มือใช้งาน ERP | คู่มือ ERP, SOP | "วิธีสร้าง ใบสั่งซื้อ ในระบบ?", "ขั้นตอนการปิดงบเดือน?" |
| ตรวจสอบสัญญา | สัญญาจ้าง, สัญญาซื้อขาย | "เงื่อนไขการยกเลิกสัญญาคืออะไร?", "ค่าปรับส่งงานล่าช้าเท่าไหร่?" |
| รักษา องค์ความรู้ | บันทึกการประชุม, Best Practices | "เราเคยแก้ปัญหา stock ไม่ตรงอย่างไร?", "ผลสรุปการประชุมเรื่อง ISO ครั้งล่าสุด?" |
เทคนิคสำคัญ — ทำ RAG ให้แม่นยำ
- Chunk Size ที่เหมาะสม: ใช้ 500-1,000 ตัวอักษร — เล็กเกินไป AI จะขาดบริบท ใหญ่เกินไป AI จะเจอ noise เยอะ ตั้ง overlap 100-200 ตัวอักษร เพื่อไม่ให้ข้อมูลขาดตรงรอยต่อ
- เลือก k (จำนวน Chunks ที่ดึง) ให้พอดี: เริ่มที่ k=3-5 — น้อยเกินอาจพลาดข้อมูลสำคัญ มากเกินจะส่ง noise เข้าไปให้ AI สับสน
- ใช้ Prompt ที่ดี: บอก AI ชัดเจนว่า "ตอบจากข้อมูลที่ให้เท่านั้น ถ้าไม่มีข้อมูลให้บอกว่าไม่พบ" — ลด Hallucination ได้มาก
- ทำความสะอาดเอกสารก่อน: ลบ Header/Footer ซ้ำๆ ลบหน้าว่าง ลบ Watermark — ข้อมูลสะอาดให้ผลลัพธ์ดีกว่า
- ทดสอบด้วยคำถามที่รู้คำตอบ: เริ่มจากถามคำถามที่คุณรู้คำตอบอยู่แล้ว เพื่อตรวจสอบว่า RAG ดึงข้อมูลถูกต้องหรือไม่
ข้อจำกัดของ RAG ที่ต้องรู้:
- ไม่ใช่ Fine-tuning: RAG ไม่ได้ "สอน" AI ใหม่ — แค่ให้ข้อมูลเพิ่มเติมตอนตอบ ถ้าเอกสารไม่ดี คำตอบก็ไม่ดี
- ขึ้นอยู่กับคุณภาพเอกสาร: เอกสาร Scan ที่ OCR ไม่ดี ตาราง Excel ที่ Format ซับซ้อน อาจให้ผลไม่ดี
- Context Window มีจำกัด: แม้ดึง Chunks มาได้ แต่ LLM มี Context Window จำกัด (4K-128K Tokens) ส่งข้อมูลมากเกินจะ error
- ภาษาไทยอาจต้องเลือก Model ดีๆ: Embedding ภาษาไทยบาง Model ยังไม่ดีนัก — ใช้
nomic-embed-textหรือmxbai-embed-largeจะดีกว่า
Saeree ERP + RAG:
Saeree ERP กำลังพัฒนา AI Assistant ที่ใช้เทคนิค RAG เพื่อให้ผู้ใช้ถาม-ตอบข้อมูลในระบบ ERP ได้ด้วยภาษาธรรมชาติ — เช่น "ยอดขายเดือนที่แล้วเท่าไหร่?" หรือ "ใบสั่งซื้อที่ยังไม่อนุมัติมีกี่รายการ?" สนใจ ปรึกษาทีมงานฟรี
Ollama Series — อ่านต่อ
Ollama Series — 6 ตอนครบจบ Local AI:
- EP.1: Ollama คืออะไร? — รัน AI บนเครื่องตัวเอง
- EP.2: ติดตั้ง Ollama ทุก OS — macOS / Windows / Linux
- EP.3: ใช้งาน Ollama จริงจัง — เลือก Model, เขียน Prompt และสร้าง Modelfile
- EP.4: Ollama + RAG — สร้าง AI ที่ตอบจากเอกสารองค์กร (บทความนี้)
- EP.5: Ollama API — เชื่อมต่อ AI กับแอปและระบบขององค์กร
- EP.6: Self-Host AI อย่างปลอดภัย — Security & Best Practices
"RAG คือเทคนิคที่เปลี่ยน AI จาก 'รู้ทุกอย่างแต่ไม่รู้เรื่องของคุณ' เป็น 'ผู้เชี่ยวชาญในเอกสารขององค์กรคุณ' — และด้วย Ollama ทุกอย่างอยู่ภายในรั้วของคุณเอง"
- ทีมงาน Saeree ERP




