ผมลองเพิ่ม 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)?