ประสบการณ์สร้าง Production RAG จากการประมวลผลเอกสารมากกว่า 5 ล้านรายการ
(blog.abdellatif.io)- ตลอด 8 เดือนของโครงการ RAG (Retrieval-Augmented Generation) ได้แยกแยะได้ว่าแนวทางใดได้ผลจริง และแนวทางใดเป็นการเสียเวลา
- ในช่วงแรกใช้ Langchain และ Llamaindex เพื่อทำต้นแบบให้เสร็จอย่างรวดเร็ว แต่เมื่อได้รับฟีดแบ็กจากผู้ใช้จริงก็พบข้อจำกัดด้านประสิทธิภาพ
- ปัจจัยที่ส่งผลต่อการปรับปรุงประสิทธิภาพการค้นหาเอกสารมากที่สุดคือ การสร้างคิวรี, reranking, กลยุทธ์การทำ chunking, การใช้ metadata และ query routing
- ในงานจริงมีการเลือกใช้ vector database, embedding, reranking, LLM ฯลฯ อย่างยืดหยุ่น และสร้าง custom pipeline ขึ้นมา
- ได้รวบรวมประสบการณ์และองค์ความรู้ทั้งหมดไว้ใน โอเพนซอร์สโปรเจกต์(agentset-ai/agentset) และเผยแพร่สู่สาธารณะ
ภาพรวมประสบการณ์สร้าง Production RAG ตลอด 8 เดือน
- แชร์ประสบการณ์ การสร้างและดูแลระบบ RAG บนชุดข้อมูลขนาดใหญ่ เช่น รวม 9 ล้านหน้า (Usul AI) และ 4 ล้านหน้า (บริษัท AI ด้านกฎหมายที่ไม่เปิดเผยชื่อแห่งหนึ่ง)
- ในช่วงแรกทำตาม YouTube tutorial แล้วเริ่มจาก Langchain ก่อนย้ายไป Llamaindex จนสร้างต้นแบบเสร็จในไม่กี่วัน แต่เมื่อ deploy จริงกลับพบปัญหา ประสิทธิภาพต่ำที่มีเพียงผู้ใช้เท่านั้นที่สังเกตได้
- หลังจากใช้เวลาหลายเดือนค่อย ๆ ปรับองค์ประกอบของระบบเป็นส่วน ๆ ก็สามารถไปถึงประสิทธิภาพที่เหมาะสมที่สุดได้
องค์ประกอบที่ช่วยเพิ่มประสิทธิภาพได้จริง (เรียงตาม ROI)
-
การสร้างคิวรี (Query Generation)
- เนื่องจากคิวรีสุดท้ายของผู้ใช้ไม่สามารถบรรจุบริบททั้งหมดได้ จึงใช้ LLM ตรวจสอบบทสนทนาแล้วสร้างทั้ง semantic query และ keyword query หลายชุด
- นำคิวรีเหล่านี้ไปประมวลผลแบบขนาน แล้วส่งต่อให้ reranker เพื่อให้ได้ผลทั้ง การขยายขอบเขตการค้นหาและการชดเชยอคติของ hybrid search
-
Reranking
- reranking ที่ทำได้ด้วยโค้ดราว 5 บรรทัดสามารถส่งผลต่อประสิทธิภาพได้มากกว่าที่คาดมาก
- ในกรณีที่ป้อน chunk จำนวนมาก (เช่น 50 ชิ้น) ขั้นตอนการจัดลำดับใหม่และคัดเลือกเฉพาะ chunk ส่วนบน (เช่น 15 ชิ้น) ให้ ROI สูงที่สุด
- เพียงแค่ reranking อย่างเดียวก็สามารถชดเชยข้อบกพร่องของ pipeline ที่ออกแบบไม่ดีได้มากพอสมควร
-
กลยุทธ์การทำ Chunking (Chunking Strategy)
- เป็นส่วนที่ ใช้เวลามากที่สุด ตลอดกระบวนการพัฒนา
- ต้องเข้าใจโครงสร้างและแพตเทิร์นของข้อมูลอย่างแม่นยำ ทำ chunking ตามหน่วยเชิงตรรกะ และตรวจด้วยตนเองว่าไม่มีการตัดกลางคำหรือกลางประโยค
- แต่ละ chunk ควรคงความหมายได้อย่างเป็นอิสระ
-
การใช้ Metadata ในอินพุตของ LLM
- แทนที่จะส่งเฉพาะข้อความของ chunk เข้าไปใน LLM ก็เพิ่ม metadata (title, author เป็นต้น) เข้าไปด้วย ซึ่งช่วยปรับปรุงบริบทและคุณภาพคำตอบได้อย่างมาก
-
Query Routing
- สำหรับประเภทคำถามที่ RAG ไม่สามารถตอบได้ (เช่น การสรุปบทความ หรือการขอข้อมูลผู้เขียน) มีการใช้ router แบบเบา เพื่อแยกคิวรีเหล่านั้นไปยังเส้นทางประมวลผลแบบ API+LLM
สแตกที่ใช้จริง (Our stack)
- Vector database: Azure → Pinecone → Turbopuffer (ราคาถูกและรองรับ keyword search โดยพื้นฐาน)
- การดึงข้อมูลเอกสาร: ใช้วิธีแบบ custom
- เครื่องมือสำหรับ chunking: โดยพื้นฐานใช้ Unstructured.io ส่วน pipeline ระดับองค์กรเป็น custom (มีเสียงชื่นชมว่า Chonkie ก็ดี)
- Embedding model: ใช้ text-embedding-large-3 (ยังไม่ได้ทดสอบรุ่นอื่น)
- Reranker: None → Cohere 3.5 → Zerank (ไม่ค่อยเป็นที่นิยม แต่ใช้งานจริงแล้วดีมาก)
- LLM: GPT 4.1 → GPT 5 → GPT 4.1 (ส่วนใหญ่ใช้ Azure credits)
การเปิดเป็นโอเพนซอร์สและบทสรุป
- สรุปผลการเรียนรู้และประสบการณ์ใช้งานจริงทั้งหมดไว้ใน โอเพนซอร์สโปรเจกต์agentset-ai/agentset
- เผยแพร่ภายใต้ MIT license จึงสามารถใช้งานได้อย่างอิสระและติดต่อสอบถามได้ (มีข้อมูลติดต่อให้)
1 ความคิดเห็น
ความเห็นจาก Hacker News