ผมลองเพิ่ม AI Chat ลงในแอปของผม แล้วก็เจอกับทางตัน

ผมพยายามจะเพิ่มผู้ช่วยแชท AI ลงในเครื่องมือจัดการโปรเจกต์ของผม ผมอยากให้ผู้ใช้สามารถถามคำถามเกี่ยวกับงานที่เกินกำหนดหรือบันทึกการประชุมได้ มันดูเหมือนจะง่าย ผมคิดว่าแค่เรียกใช้ API ก็จบแล้ว แต่ผมคิดผิด

หลังจากผ่านไป 15 ข้อความ AI ก็เริ่มช้าลงและตอบไม่รู้เรื่อง API เริ่มส่งข้อผิดพลาดออกมาเพราะบทสนทนายาวเกินไป ผมใช้ GPT-4 ที่มีขีดจำกัด 8k tokens ทุกๆ ข้อความประกอบไปด้วยคำอธิบายและบันทึกที่ยาวมาก ประวัติการสนทนาจึงเพิ่มขึ้นเร็วเกินไป

ผมลองแก้ไขด้วยสามวิธีที่แตกต่างกัน:

  • การตัดประวัติทิ้ง (Truncating history): ผมเก็บไว้เพียงไม่กี่ข้อความล่าสุด วิธีนี้ช่วยเรื่องความเร็ว แต่ AI ก็จะลืมข้อมูลอื่นๆ ทั้งหมด
  • การสรุปความ (Summarization): ผมให้ AI สรุปการแชททุกๆ 5 ข้อความ วิธีนี้ช่วยเรื่องความจำ แต่ก็ทำให้ค่าใช้จ่ายและความหน่วง (latency) เพิ่มสูงขึ้น
  • การให้คะแนนความเกี่ยวข้อง (Relevance scoring): ผมพยายามเก็บไว้เฉพาะข้อความที่เกี่ยวข้องที่สุด ซึ่งต้องใช้ vector store และทำให้ระบบซับซ้อนเกินไป

ผมตระหนักได้ว่าผมต้องการกลยุทธ์ที่ดีกว่านี้ ผมจึงตัดสินใจเลือกใช้สองวิธี คือ streaming และการกำหนด context window แบบคงที่

การทำ streaming ช่วยให้แอปดูรวดเร็ว ผู้ใช้จะเห็นข้อความปรากฏขึ้นทันที แทนที่จะต้องรอจนกว่าคำตอบทั้งหมดจะส่งมาครบ ผมใช้ Server-Sent Events เพื่อส่งข้อความทีละส่วน (chunks) ทันทีที่มาถึง

นอกจากนี้ ผมยังแบ่ง context ออกเป็นสามส่วน:

  • System prompt: ชุดคำสั่งที่กำหนดไว้ตายตัว
  • Dynamic context: ข้อมูลอัปเดตโปรเจกต์และสถานะงานล่าสุด
  • Conversation history: หน้าต่างการสนทนาแบบเลื่อน (sliding window) ของข้อความล่าสุด

ผมไม่ได้ส่งประวัติทั้งหมดไปทุกครั้ง ผมส่งไปเพียงพอแค่สำหรับการตอบคำถามปัจจุบันเท่านั้น วิธีนี้ช่วยลดขนาด payload ลงได้ถึง 40% มันช่วยประหยัดเงินและเพิ่มความเร็วให้มากขึ้น

หากคุณกำลังสร้างฟีเจอร์ AI โปรดจำไว้ว่า: Streaming ช่วยให้คุณได้ความเร็ว กลยุทธ์ context ที่ดีช่วยให้คุณได้ความฉลาด

คุณจัดการหน่วยความจำการสนทนาในแอปของคุณอย่างไร? คุณใช้ sliding windows หรือการสรุปความ (summarization)?

ที่มา: https://dev.to/__c1b9e06dc90a7e0a676b/i-tried-to-add-ai-chat-to-my-app-and-hit-a-wall-with-context-tokens-459b