สร้าง Local RAG Chatbot ภายใน 30 นาที
ผมอัปโหลดเอกสาร API spec จำนวน 40 หน้าไปยังแชทบอทในเครื่องของผม แล้วลองถามเกี่ยวกับ rate limit ของ endpoint หนึ่ง
บอทตอบกลับภายใน 3 วินาที พร้อมทั้งอ้างอิงส่วนที่ระบุไว้ในเอกสารได้อย่างแม่นยำ
ส่วนที่ดีที่สุดคืออะไรน่ะหรือ? มันไม่มีค่าใช้จ่ายเลยแม้แต่ดอลลาร์เดียว ทุกอย่างรันบนแล็ปท็อปของผมโดยใช้ .NET 8, Ollama และ React โดยไม่มีข้อมูลใดๆ หลุดออกจากเครื่องของผมเลย
บทเรียนส่วนใหญ่มักจะแนะนำให้ใช้ OpenAI ซึ่งมันอาจจะใช้ได้ดีสำหรับการทำ Demo แต่สำหรับการทำงานจริงนั้นมีข้อจำกัดเพราะ:
- ความเป็นส่วนตัว: คุณคงไม่ต้องการให้ข้อมูลที่ละเอียดอ่อนของบริษัทหลุดเข้าไปอยู่ในกระบวนการเทรนโมเดลบนคลาวด์
- ค่าใช้จ่าย: การส่งไฟล์ขนาดใหญ่ไปยัง LLM ทำให้ค่าใช้จ่ายพุ่งสูงขึ้นอย่างรวดเร็ว
- อาการหลอน (Hallucinations): โมเดลมักจะลืมข้อมูลที่อยู่ช่วงกลางของเอกสารที่มีความยาว
ทางออกคือ RAG (Retrieval-Augmented Generation) แทนที่จะส่งไฟล์ PDF ทั้งหมดไป คุณจะส่งไปเพียงแค่ส่วน (chunks) ที่เกี่ยวข้องเท่านั้น
นี่คือวิธีที่ผมสร้าง pipeline นี้ขึ้นมา:
• Text Extraction: ผมใช้ PdfPig ในการดึงข้อความออกจากไฟล์ PDF • Chunking: ผมแบ่งข้อความเป็นส่วนๆ ส่วนละ 500 คำ โดยมีส่วนที่ซ้อนทับกัน (overlap) 50 คำ การซ้อนทับนี้ช่วยให้มั่นใจว่าโมเดลจะไม่พลาดคำตอบที่คาบเกี่ยวกันระหว่างสองส่วน • Embeddings: ผมใช้โมเดล nomic-embed-text ผ่าน Ollama เพื่อเปลี่ยนข้อความเป็นเวกเตอร์ (vectors) • Vector Store: ผมสร้าง list แบบ in-memory ง่ายๆ โดยใช้ cosine similarity เพื่อค้นหาข้อมูลที่ตรงกันที่สุด • Generation: ผมใช้ llama3.2 ในการตอบคำถามโดยอ้างอิงจากส่วนที่ค้นพบเท่านั้น
3 บทเรียนที่ผมได้รับระหว่างการสร้าง:
- ใช้ timeout ที่นานขึ้น: โมเดลที่รันในเครื่องต้องใช้เวลาในการโหลดเข้าหน่วยความจำ ผมจึงตั้งค่า HttpClient timeout ไว้ที่ 5 นาที เพื่อหลีกเลี่ยงข้อผิดพลาดในช่วง cold starts
- Prompt engineering คือหัวใจสำคัญ: ผมสั่งให้โมเดลตอบคำถามโดยใช้ "เฉพาะ" บริบทที่ให้มาเท่านั้น วิธีนี้ช่วยลดอาการหลอน (hallucinations) ได้ถึง 80%
- การแบ่งส่วน (Chunking) มีความสำคัญ: ผมแบ่งส่วนตามจำนวนคำแทนที่จะเป็นจำนวนตัวอักษร เพื่อให้ขนาดของข้อมูลคาดเดาได้และอยู่ในขีดจำกัดของโมเดล
คุณสามารถรัน stack ทั้งหมดนี้ได้ในเครื่องของคุณเอง มันคือเครื่องมือระดับมืออาชีพที่ใช้งบประมาณเป็นศูนย์
ดูบันทึกการสร้างและโค้ดฉบับเต็มได้ที่นี่:
Optional learning community: https://t.me/GyaanSetuAi
