คุณเคยอยากให้คอมพิวเตอร์อ่านเอกสารแล้วตอบคำถามได้แบบมนุษย์ไหม? บทความนี้จะสอนคุณทำระบบ Document Q&A ตั้งแต่เริ่มจากศูนย์ ไม่ต้องมีประสบการณ์เขียนโค้ดมาก่อนก็ทำได้!
RAG คืออะไร? ทำไมต้องรู้?
RAG ย่อมาจาก Retrieval-Augmented Generation เป็นเทคนิคที่ทำให้ AI สามารถตอบคำถามโดยอ้างอิงจากเอกสารที่เรามี สมมติคุณมีคู่มือการใช้งาน 100 หน้า ถ้าถามว่า "วิธีรีเซ็ตรหัสผ่านทำอย่างไร?" ระบบ RAG จะไปค้นหาข้อมูลที่เกี่ยวข้องก่อน แล้วค่อยส่งให้ AI ตอบ
เตรียมพร้อมก่อนเริ่มต้น
สิ่งที่ต้องมี
- บัญชี HolySheep AI — สมัครได้ที่ สมัครที่นี่ รับเครดิตฟรีเมื่อลงทะเบียน
- Python 3.8+ — ดาวน์โหลดได้ที่ python.org
- เอกสารที่จะใช้ทดสอบ — ไฟล์ PDF หรือ Text
ทำไมต้องใช้ HolySheep API?
ปกติแล้วการใช้ OpenAI หรือ Anthropic โดยตรงมีค่าใช้จ่ายสูง HolySheep เป็น API Proxy ที่ช่วยให้คุณเข้าถึงโมเดล AI หลายตัวผ่าน API เดียว ราคาประหยัดมากกว่า 85% เช่น DeepSeek V3.2 ราคาเพียง $0.42 ต่อล้าน token
ขั้นตอนที่ 1: ติดตั้งโปรแกรมที่จำเป็น
เปิด Terminal (หรือ Command Prompt) แล้วพิมพ์คำสั่งนี้:
pip install openai langchain-community langchain-openai faiss-cpu pypdf2 tiktoken
- openai — ไลบรารีสำหรับเรียกใช้ API
- langchain-community — เครื่องมือสำหรับสร้างระบบ RAG
- faiss-cpu — ฐานข้อมูลสำหรับค้นหาความคล้ายคลึง
- pypdf2 — อ่านไฟล์ PDF
ขั้นตอนที่ 2: สร้างโค้ดระบบ RAG พื้นฐาน
สร้างไฟล์ใหม่ชื่อ document_qa.py แล้วเขียนโค้ดดังนี้:
import os
from openai import OpenAI
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
ตั้งค่า API Key จาก HolySheep
os.environ["OPENAI_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY"
สร้าง client เชื่อมต่อกับ HolySheep
client = OpenAI(
api_key=os.environ["OPENAI_API_KEY"],
base_url="https://api.holysheep.ai/v1"
)
def โหลดเอกสาร(พาธไฟล์):
"""โหลดเอกสาร PDF และแบ่งเป็นส่วนๆ"""
โหลด = PyPDFLoader(พาธไฟล์)
เอกสาร = โหลด.load()
# แบ่งข้อความเป็นส่วนเล็กๆ
ตัดแบ่ง = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=100
)
ส่วนข้อความ = ตัดแบ่ง.split_documents(เอกสาร)
return ส่วนข้อความ
def สร้างคลังเวกเตอร์(ส่วนข้อความ):
"""สร้างคลังข้อมูลสำหรับค้นหา"""
เวกเตอร์ = OpenAIEmbeddings(
model="text-embedding-ada-002",
openai_api_base="https://api.holysheep.ai/v1",
openai_api_key=os.environ["OPENAI_API_KEY"]
)
คลัง = FAISS.from_documents(ส่วนข้อความ, เวกเตอร์)
return คลัง
เริ่มต้นใช้งาน
print("กำลังโหลดเอกสาร...")
เอกสาร = โหลดเอกสาร("คู่มือ.pdf")
print(f"โหลดเอกสารเสร็จแล้ว มี {len(เอกสาร)} ส่วน")
print("กำลังสร้างคลังเวกเตอร์...")
คลัง = สร้างคลังเวกเตอร์(เอกสาร)
print("พร้อมใช้งานแล้ว!")
ถามคำถาม
คำถาม = input("\nพิมพ์คำถามของคุณ: ")
คำตอบ = คลัง.similarity_search(คำถาม, k=3)
print("\nข้อมูลที่เกี่ยวข้อง:")
for i, ข้อ in enumerate(คำตอบ):
print(f"{i+1}. {ข้อ.page_content[:200]}...")
ขั้นตอนที่ 3: เพิ่มฟังก์ชันถาม-ตอบด้วย AI
ต่อไปเราจะเพิ่มความสามารถให้ระบบตอบคำถามเป็นภาษาธรรมชาติ โดยใช้ DeepSeek หรือ GPT:
def ถามAI(คำถาม, คลัง, client):
"""ค้นหาข้อมูลแล้วถาม AI ตอบ"""
# ค้นหาข้อมูลที่เกี่ยวข้อง 3 อันดับแรก
เอกสารที่เกี่ยวข้อง = คลัง.similarity_search(คำถาม, k=3)
# รวมข้อมูลที่ค้นหาได้
บริบท = "\n\n".join([doc.page_content for doc in เอกสารที่เกี่ยวข้อง])
# สร้างคำถามสำหรับ AI
ระบบ = """คุณคือผู้ช่วยที่ตอบคำถามจากเอกสารที่ให้มา
ถ้าคำตอบอยู่ในเอกสาร ให้ตอบตามข้อมูลในเอกสาร
ถ้าไม่แน่ใจ ให้บอกว่าไม่พบข้อมูล"""
ผู้ใช้ = f"อ้างอิงจากข้อมูลนี้:\n{บริบท}\n\nคำถาม: {คำถาม}"
# เรียกใช้ API
การตอบกลับ = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": ระบบ},
{"role": "user", "content": ผู้ใช้}
],
temperature=0.7,
max_tokens=500
)
return การตอบกลับ.choices[0].message.content
วนลูปถาม-ตอบ
while True:
คำถาม = input("\n🦊 คุณ: ")
if คำถาม.lower() == "ออก":
print("ขอบคุณที่ใช้บริการ!")
break
คำตอบ = ถามAI(คำถาม, คลัง, client)
print(f"\n🤖 AI: {คำตอบ}")
ขั้นตอนที่ 4: ทดสอบระบบ
รันโปรแกรมด้วยคำสั่ง:
python document_qa.py
ผลลัพธ์ที่คาดหวัง:
กำลังโหลดเอกสาร...
โหลดเอกสารเสร็จแล้ว มี 45 ส่วน
กำลังสร้างคลังเวกเตอร์...
พร้อมใช้งานแล้ว!
🦊 คุณ: วิธีการสมัครสมาชิกทำอย่างไร?
🤖 AI: จากเอกสารที่ค้นหา การสมัครสมาชิกทำได้โดย...
ปรับปรุงประสิทธิภาพ
เพิ่มการแคชข้อมูล
ถ้าต้องใช้งานบ่อย ควรบันทึกคลังเวกเตอร์ไว้:
# บันทึกคลังเวกเตอร์
คลัง.save_local("คลังเอกสาร")
โหลดคลังที่บันทึกไว้
def โหลดคลังที่บันทึกไว้():
เวกเตอร์ = OpenAIEmbeddings(
model="text-embedding-ada-002",
openai_api_base="https://api.holysheep.ai/v1",
openai_api_key=os.environ["OPENAI_API_KEY"]
)
return FAISS.load_local(
"คลังเอกสาร",
เวกเตอร์,
allow_dangerous_deserialization=True
)
ปรับขนาดส่วนข้อความ
- chunk_size ใหญ่ขึ้น — เหมาะกับเอกสารที่มีบริบทต่อเนื่อง
- chunk_size เล็กลง — เหมาะกับการค้นหาข้อมูลเฉพาะเจาะจง
- chunk_overlap — ควรอยู่ที่ 10-20% ของ chunk_size