คุณเคยอยากให้คอมพิวเตอร์อ่านเอกสารแล้วตอบคำถามได้แบบมนุษย์ไหม? บทความนี้จะสอนคุณทำระบบ Document Q&A ตั้งแต่เริ่มจากศูนย์ ไม่ต้องมีประสบการณ์เขียนโค้ดมาก่อนก็ทำได้!

RAG คืออะไร? ทำไมต้องรู้?

RAG ย่อมาจาก Retrieval-Augmented Generation เป็นเทคนิคที่ทำให้ AI สามารถตอบคำถามโดยอ้างอิงจากเอกสารที่เรามี สมมติคุณมีคู่มือการใช้งาน 100 หน้า ถ้าถามว่า "วิธีรีเซ็ตรหัสผ่านทำอย่างไร?" ระบบ RAG จะไปค้นหาข้อมูลที่เกี่ยวข้องก่อน แล้วค่อยส่งให้ AI ตอบ

เตรียมพร้อมก่อนเริ่มต้น

สิ่งที่ต้องมี

ทำไมต้องใช้ 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

ขั้นตอนที่ 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 )

ปรับขนาดส่วนข้อความ

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

1.