การสร้าง RAG Pipeline ตั้งแต่เริ่มต้น
ผมต้องการเพิ่มผู้ช่วย AI เข้าไปใน SmartQueue
SmartQueue คือ task queue ที่ผมสร้างขึ้นด้วย Go สำหรับจัดการตั๋ว IT support ผมไม่ได้ต้องการ AI แบบทั่วไป เพราะโมเดลทั่วไปจะไม่รู้กฎการรีเซ็ตรหัสผ่านเฉพาะของคุณ หรือ outage runbooks ของคุณ
ผมจำเป็นต้องใช้ Retrieval-Augmented Generation (RAG) ซึ่งจะดึงข้อเท็จจริงจากเอกสารของคุณออกมาก่อน จากนั้นจึงส่งข้อเท็จจริงเหล่านั้นให้โมเดลเพื่อใช้เป็นบริบท (context)
นี่คือสิ่งที่ผมได้เรียนรู้ระหว่างการสร้าง pipeline นี้
ความล้มเหลวในการ Deploy
เวอร์ชันแรกของผมใช้ ChromaDB สำหรับการทำ vector search ซึ่งใช้งานได้ดีในเครื่องตัวเอง (locally) แต่กลับล้มเหลวตอนนำไป deploy จริง
ผมรันทุกอย่างไว้ใน container เดียวกันบน Hugging Face Spaces ซึ่งประกอบไปด้วย Redis, Go API, workers, FastAPI service และ ChromaDB ทำให้มีถึง 5 process ที่ต้องแย่งชิงหน่วยความจำ (memory) และ CPU ที่มีจำกัด ส่งผลให้ ChromaDB เกิดปัญหา startup races และการทำงานล้มเหลวโดยไม่แจ้งเตือน (silent failures)
ผมจึงตัดสินใจถอด vector database ออก แล้วแทนที่ด้วยการค้นหาแบบ BM25 ง่ายๆ แทน
ทางเลือกที่เรียบง่าย
ตัวแทนใหม่นี้เขียนด้วย Python เพียง 50 บรรทัด ไม่มี external process และไม่มีการเรียกใช้งานผ่าน network โดยใช้สูตร Okapi BM25 ในการจับคู่คำสำคัญ (keywords) ภายในหน่วยความจำ
ข้อแลกเปลี่ยนนั้นชัดเจน:
- BM25 อาศัยการจับคู่คำที่ตรงกันเป๊ะๆ จึงอาจพลาดคำพ้องความหมาย (synonyms)
- สำหรับ IT runbooks สั้นๆ 10 ฉบับ เรื่องนี้ไม่ใช่ปัญหา เพราะผู้ใช้มักใช้คำเฉพาะเจาะจงอย่าง "VPN" หรือ "password reset" อยู่แล้ว
- ตอนนี้บริการสามารถเริ่มต้นทำงานได้อย่างเสถียรในทุกครั้ง
การปรับจูนระบบ
ผมได้ปรับจูนการตั้งค่าหลายอย่างเพื่อให้ระบบมีความเสถียร: • Retrieved docs (k): 4 เพื่อให้มีบริบทเพียงพอโดยไม่เกินขีดจำกัดของ token • Bot temperature: 0.2 การแก้ปัญหา (troubleshooting) ต้องการคำตอบที่ตรงไปตรงมา ไม่ใช่ความสร้างสรรค์ • Classifier temperature: 0.1 เพื่อให้มั่นใจว่าผลลัพธ์ JSON จะมีความแม่นยำและคาดเดาได้ • Session history: 10 turns ล่าสุด เพื่อให้การสนทนาต่อเนื่องโดยไม่ใช้หน่วยความจำมากเกินไป • Rate limits: 30 requests ต่อนาที เพื่อป้องกันโควตา API ของผม
การออกแบบที่ดีที่สุด คือการออกแบบที่ยอมให้ประสิทธิภาพลดลงได้
ผมสร้างทุก endpoint ให้มีระบบ fallback ที่ไม่ใช่ AI หากบริการ AI ขัดข้อง ระบบจะเปลี่ยนไปใช้การจับคู่คำสำคัญหรือตรรกะแบบ rule-based แทน ทำให้ระบบยังทำงานต่อไปได้แม้ประสิทธิภาพจะลดลง แทนที่จะล่มไปเลย
นี่ไม่ใช่การตั้งค่า RAG ที่ซับซ้อน ไม่มีการทำ re-ranking หรือ hybrid search แต่มันคือเครื่องมือขนาดเล็กที่ชาญฉลาด ซึ่งถูกสร้างขึ้นมาเพื่อรองรับขนาดการใช้งานที่เฉพาะเจาะจง
บทเรียนที่ได้รับ:
- ปรับแต่งให้เหมาะสมกับข้อจำกัดของคุณ ไม่ใช่ตามรูปแบบในตำรา
- ความน่าเชื่อถือมักจะสำคัญกว่าความแม่นยำในทางทฤษฎี
- ใช้ vector search เมื่อคุณมีเอกสารเป็นร้อยฉบับ และใช้ keyword search เมื่อคุณมีเพียงสิบฉบับ
ชุมชนการเรียนรู้เพิ่มเติม (ไม่บังคับ): https://t.me/GyaanSetuAi