สร้าง RAG AI Agent จำได้ยาวด้วย Ollama + Qdrant + Llama 3.2 สำหรับ PDPA ไทย
เอเจนต์ AI ที่ค้นเอกสารภายในองค์กรและตอบพร้อมอ้างอิงแหล่งที่มา โดยไม่ส่งข้อมูลออกไปข้างนอกเลย เหมาะกับองค์กรที่ต้องเคารพ PDPA ไทย
สารบัญ
ลองนึกภาพสถานการณ์นี้: พนักงานใหม่เปิดเอกสารนโยบายบริษัท 50 หน้า แล้วถามว่า "ลาพักร้อนปีแรกได้กี่วัน?" ถ้าเป็นเมื่อก่อน เขาต้องอ่านทั้งหมดเอง แต่วันนี้เราจะสร้าง AI Agent ที่ตอบได้ทันที พร้อมบอกว่าคำตอบมาจากหน้าไหน ย่อหน้าไหน — และที่สำคัญที่สุด: ไม่ส่งข้อมูลออกไปข้างนอกองค์กรแม้แต่บิตเดียว
ทำไมต้องออฟไลน์ 100%?
พระราชบัญญัติคุ้มครองข้อมูลส่วนบุคคล (PDPA) ของไทยบังคับใช้มาสักพักแล้ว หนึ่งในข้อกังวลใหญ่ที่สุดขององค์กรคือการส่งข้อมูลภายในไปยัง API ของ LLM สาธารณะ เช่น OpenAI หรือ Anthropic แม้จะมีสัญญาคุ้มครองข้อมูล (DPA) แต่หลายองค์กรโดยเฉพาะกลุ่มการเงิน การแพทย์ และภาครัฐ ก็ยังไม่สามารถยอมรับความเสี่ยงนี้ได้
ทางออกที่ปลอดภัยที่สุดคือการสร้าง RAG (Retrieval-Augmented Generation) pipeline ที่รันทุกอย่างบนเครื่องของเราเอง (On-Premise) ครบทั้งโมเดลภาษาและฐานข้อมูลเวกเตอร์ วันนี้เราจะมาสร้างมันขึ้นมากัน
สถาปัตยกรรมรวมของระบบ
สแต็กที่เราจะใช้ในบทความนี้ประกอบด้วย 3 เครื่องมือหลักที่ทำงานร่วมกัน:
- Ollama: เครื่องมือรัน LLM ในเครื่อง เบา เร็ว ติดตั้งง่ายมาก
- Llama 3.2: โมเดลล่าสุดจาก Meta รองรับ context ยาว เหมาะกับงาน RAG
- Qdrant: vector database โอเพนซอร์ส รองรับ metadata filtering และ hybrid search
- LangChain: เฟรมเวิร์กสำหรับเชื่อมทุกชิ้นเข้าด้วยกัน
ขั้นตอนที่ 1: ติดตั้ง Ollama และดึงโมเดล Llama 3.2
ขั้นแรกเลย ให้ดาวน์โหลดและติดตั้ง Ollama จากเว็บไซต์หลัก (ollama.com) เมื่อติดตั้งเสร็จแล้ว เปิด Terminal แล้วพิมพ์คำสั่งนี้เพื่อดึงโมเดล Llama 3.2 มาไว้ในเครื่อง
ollama pull llama3.2
นอกจากนี้ เรายังต้องการโมเดลสำหรับทำ Embedding ด้วย เราจะใช้ nomic-embed-text ซึ่งเบาและทำงานได้ดีเยี่ยม
ollama pull nomic-embed-text
ขั้นตอนที่ 2: ตั้งค่า Qdrant ด้วย Docker
Qdrant สามารถรันผ่าน Docker ได้ง่ายๆ ด้วยคำสั่งเดียว สร้างไฟล์ docker-compose.yml ดังนี้:
version: '3.8'
services:
qdrant:
image: qdrant/qdrant:latest
ports:
- "6333:6333"
- "6334:6334"
volumes:
- ./qdrant_data:/qdrant/storage
จากนั้กรันคำสั่ง docker-compose up -d เพียงเท่านี้ Qdrant ของเราก็พร้อมทำงานแล้ว
ขั้นตอนที่ 3: เขียนโค้ด RAG Pipeline ด้วย Python
เริ่มจากการติดตั้งไลบรารีที่จำเป็น:
pip install langchain langchain-community qdrant-client sentence-transformers pypdf
3.1 โหลดและแบ่งเอกสาร (Chunking)
สมมติว่าเรามีไฟล์ PDF นโยบายบริษัท เราจะใช้ PyPDFLoader ในการอ่าน แล้วแบ่งเป็น chunk ย่อยๆ
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = PyPDFLoader("company_policy.pdf")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = text_splitter.split_documents(docs)
3.2 สร้าง Vector Store และเก็บข้อมูล
เราจะเชื่อมต่อกับ Qdrant และใช้ Ollama ในการสร้าง embedding
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Qdrant
embeddings = OllamaEmbeddings(model="nomic-embed-text")
qdrant = Qdrant.from_documents(
chunks,
embeddings,
url="http://localhost:6333",
collection_name="company_docs"
)
3.3 สร้าง AI Agent และตั้งค่า Prompt
ตอนนี้ข้อมูลเราพร้อมแล้ว ขั้นต่อไปคือการเชื่อม Qdrant เข้ากับ Llama 3.2 โดยเราจะตั้งค่า prompt ให้ AI อ้างอิงแหล่งที่มาด้วย
from langchain_community.llms import Ollama
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
llm = Ollama(model="llama3.2")
prompt_template = """ใช้ข้อมูลจาก context ด้านล่างเพื่อตอบคำถาม หากไม่มีข้อมูลให้ตอบว่าไม่ทราบ และอย่างลืมอ้างอิงว่าคำตอบมาจากเอกสารใด
Context: {context}
คำถาม: {question}
คำตอบ:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=qdrant.as_retriever(search_kwargs={"k": 3}),
chain_type_kwargs={"prompt": PROMPT},
return_source_documents=True
)
ขั้นตอนที่ 4: ทดสอบการถามตอบ
ลองถามคำถามเกี่ยวกับนโยบายบริษัทดู
query = "ลาพักร้อนปีแรกได้กี่วัน?"
response = qa_chain({"query": query})
print("คำตอบ:", response["result"])
print("\nแหล่งอ้างอิง:")
for doc in response["source_documents"]:
print(f"- หน้า {doc.metadata['page']}: {doc.page_content[:100]}...")
เมื่อรันโค้ดนี้ AI จะค้นหาเอกสารที่เกี่ยวข้องจาก Qdrant นำมาป้อนให้ Llama 3.2 สรุปคำตอบ และแสดงแหล่งที่มาให้เราเห็นชัดเจน ทุกอย่างเกิดขึ้นในเครื่องของคุณ ไม่มีข้อมูลรั่วไหลออกไปภายนอก
สรุปและก้าวต่อไป
การสร้าง RAG AI Agent แบบออฟไลน์ด้วย Ollama, Qdrant และ Llama 3.2 ไม่ใช่เรื่องยากอย่างที่คิด มันช่วยให้องค์กรสามารถใช้ประโยชน์จาก AI ได้อย่างเต็มที่โดยไม่ต้องกังวลเรื่อง PDPA ลองนำโค้ดนี้ไปปรับใช้กับเอกสารในองค์กรของคุณดู และอย่าลืมเขียน UI ที่สวยงามด้วย Streamlit หรือ Gradio เพื่อให้เพื่อนร่วมงานใช้งานได้ง่ายขึ้น หากบทความนี้มีประโยชน์ อย่าลืมแชร์ให้เพื่อนนักพัฒนาด้วยกัน แล้วติดตามบทความหน้าสำหรับการปรับแต่ง RAG ให้ทรงพลังยิ่งขึ้น!
เนื้อหาที่จัดทำโดยมี AI ช่วยจะมีป้ายกำกับ "เรียบเรียงโดยมี AI ช่วย" เพื่อให้คุณทราบอย่างชัดเจน เราถือว่าความโปร่งใสเรื่องการใช้ AI เป็นสิ่งสำคัญต่อความไว้วางใจของผู้อ่าน
ความคิดเห็น (0)
ยังไม่มีความคิดเห็น — มาเป็นคนแรกกันเถอะ!