ผมสร้างแอป RAG ขึ้นมา แล้วลองถามมันว่าผมชอบรถยี่ห้ออะไร แต่มันกลับไม่รู้

ผมกำลังสร้างเครื่องมือแชทกับเอกสารที่ชื่อว่า Kenning ซึ่งใช้ RAG (Retrieval-Augmented Generation) เพื่อให้ผู้ใช้สามารถถามคำถามเกี่ยวกับไฟล์ที่อัปโหลดขึ้นไปได้

ผมสร้าง pipeline ทั้งหมดขึ้นมาใหม่ตั้งแต่ต้นโดยใช้:

  • Java 21 และ Spring Boot
  • Spring AI
  • PostgreSQL พร้อม pgvector
  • Ollama (รัน llama3.2:3b และ nomic-embed-text)
  • Docker Compose

Pipeline ทำงานดังนี้: อัปโหลดไฟล์ → สกัดข้อความ (Extract text) → แบ่งข้อความเป็นส่วนๆ (Chunk text) → แปลง chunk เป็น vector → เก็บใน pgvector → ค้นหา chunk ที่คล้ายกัน → ส่ง chunk + คำถามไปยัง model → รับคำตอบพร้อมแหล่งอ้างอิง

ระบบทำงานได้ แต่ผมเจอความล้มเหลวสองรูปแบบที่แตกต่างกัน แม้ว่าผลลัพธ์จะดูคล้ายกัน แต่สาเหตุนั้นต่างกัน

ความล้มเหลวที่ 1: Model เกิดความสับสน ผมถามว่า: "โปรเจกต์นี้ใช้ embedding model อะไร?" ในเอกสารระบุคำตอบไว้อย่างชัดเจน และ model ก็ดึงข้อความที่ถูกต้องออกมาได้ แต่ทว่า มันกลับตอบว่าไม่รู้ ทั้งที่ในประโยคถัดมามันดันระบุชื่อ model ที่ถูกต้องออกมาด้วยซ้ำ

สมมติฐานของผม: Model ขนาด 3B นั้นเล็กเกินไป มันดึงข้อมูลที่ถูกต้องมาได้ แต่ไม่สามารถตัดสินใจตอบได้อย่างมั่นใจ การใช้ model ที่ใหญ่กว่านี้น่าจะช่วยแก้ปัญหานี้ได้

ความล้มเหลวที่ 2: Model หาอะไรไม่เจอเลย ผมถามว่า: "ผมชอบรถยี่ห้ออะไร?" ในเอกสารมีการระบุว่าผมชอบ BMW แต่ระบบกลับไม่คืนผลลัพธ์ใดๆ เลย เนื่องจากค่า similarity score ต่ำเกินกว่าเกณฑ์ที่ผมตั้งไว้

สมมติฐานของผม: การเจือจางของ chunk (Chunk dilution) เอกสารทดสอบของผมค่อนข้างสั้น มันมีการผสมผสานหลายหัวข้อเข้าด้วยกัน เช่น Spring AI, OAuth2 และความชอบเรื่องรถของผมไว้ใน chunk เดียวกัน ทำให้ vector ของ chunk นั้นถูกเจือจางไปกับหัวข้อต่างๆ คำถามที่เฉพาะเจาะจงเรื่องรถจึงสูญเสียความโดดเด่นเมื่อเทียบกับ chunk ที่มีเนื้อหาหลากหลายเกินไป การใช้กลยุทธ์การทำ chunking ที่ดีกว่านี้จะช่วยแก้ปัญหานี้ได้

บทเรียนที่ได้รับ:

  • Model ขนาดเล็กมีข้อจำกัดด้านการใช้เหตุผล
  • การทำ chunking แบบพื้นๆ (Naive chunking) ส่งผลต่อความแม่นยำในการดึงข้อมูล
  • การ debug เพื่อหา "สาเหตุ" สำคัญกว่าแค่การแก้ไข error

โครงสร้างสถาปัตยกรรมนี้ใช้งานได้จริง แม้จะช้าและบางครั้งก็ผิดพลาด แต่กระบวนการทำงาน (loop) นั้นสมบูรณ์แล้ว

Source: https://dev.to/mido-dev/i-built-a-rag-app-then-asked-it-what-car-i-like-it-didnt-know-583n

Optional learning community: https://t.me/GyaanSetuAi