حاولت إضافة دردشة ذكاء اصطناعي إلى تطبيقي وواجهت عقبة
حاولت إضافة مساعد دردشة يعمل بالذكاء الاصطناعي إلى أداة إدارة المشاريع الخاصة بي. أردت أن يتمكن المستخدمون من طرح أسئلة حول المهام المتأخرة أو ملاحظات الاجتماعات. بدا الأمر سهلاً. ظننت أنني سأقوم فقط باستدعاء API وينتهي الأمر. لكنني كنت مخطئاً.
بعد 15 رسالة، أصبح الذكاء الاصطناعي بطيئاً وغير مترابط. بدأت الـ API في إظهار أخطاء لأن المحادثة كانت طويلة جداً. استخدمت GPT-4 بحد أقصى 8k token. كانت كل رسالة تتضمن أوصافاً وملاحظات طويلة. نما سجل المحادثة بسرعة كبيرة جداً.
جربت ثلاثة حلول مختلفة:
- تقليص السجل (Truncating history): احتفظت فقط بآخر بضع رسائل. هذا وفر السرعة ولكن الذكاء الاصطناعي نسي كل شيء آخر.
- التلخيص (Summarization): طلبت من الذكاء الاصطناعي تلخيص الدردشة كل 5 رسائل. ساعد هذا في الذاكرة ولكنه زاد من التكاليف وزمن الاستجابة (latency).
- تقييم الصلة (Relevance scoring): حاولت الاحتفاظ بالرسائل الأكثر صلة فقط. تطلب هذا استخدام مخزن متجه (vector store) وأضاف الكثير من التعقيد.
أدركت أنني بحاجة إلى استراتيجية أفضل. استقررت على طريقتين: البث (streaming) ونافذة سياق ثابتة (fixed context window).
البث (Streaming) يجعل التطبيق يبدو سريعاً. يرى المستخدمون النص يظهر فوراً بدلاً من انتظار الرد الكامل. استخدمت Server-Sent Events لإرسال أجزاء من النص فور وصولها.
قمت أيضاً بتقسيم السياق الخاص بي إلى ثلاثة أجزاء:
- تعليمات النظام (System prompt): مجموعة ثابتة من التعليمات.
- السياق الديناميكي (Dynamic context): تحديثات المشروع الأخيرة وحالات المهام.
- سجل المحادثة (Conversation history): نافذة منزلقة (sliding window) من الرسائل الأخيرة.
أنا لا أرسل السجل بالكامل في كل مرة. أرسل فقط ما يكفي للإجابة على السؤال الحالي. أدى ذلك إلى تقليل حجم الحمولة (payload) بنسبة 40%. وفر لي المال وحسّن السرعة.
إذا كنت تبني ميزات ذكاء اصطناعي، تذكر: البث يمنحك السرعة. استراتيجية السياق الجيدة تمنحك الذكاء.
كيف تدير ذاكرة المحادثة في تطبيقاتك؟ هل تستخدم النوافذ المنزلقة أم التلخيص؟