سعی کردم چت هوش مصنوعی را به اپلیکیشن خود اضافه کنم و به بنبست خوردم
سعی کردم یک دستیار چت هوش مصنوعی به ابزار مدیریت پروژه خود اضافه کنم. میخواستم کاربران بتوانند درباره وظایف عقبافتاده یا یادداشتهای جلسات سوال بپرسند. ساده به نظر میرسید. فکر میکردم فقط کافی است یک API را فراخوانی کنم و تمام. اشتباه میکردم.
بعد از ۱۵ پیام، هوش مصنوعی کند و نامفهوم شد. به دلیل طولانی شدن بیش از حد مکالمه، API شروع به دادن خطا کرد. من از GPT-4 با محدودیت ۸ هزار توکن استفاده میکردم. هر پیام شامل توضیحات و یادداشتهای طولانی بود. تاریخچه خیلی سریع رشد میکرد.
سه راهکار مختلف را امتحان کردم:
- کوتاه کردن تاریخچه (Truncating history): فقط چند پیام آخر را نگه میداشتم. این کار باعث افزایش سرعت میشد اما هوش مصنوعی بقیه موارد را فراموش میکرد.
- خلاصهسازی (Summarization): از هوش مصنوعی میخواستم هر ۵ پیام یکبار چت را خلاصه کند. این کار به حافظه کمک میکرد اما هزینهها و تأخیر (latency) را افزایش میداد.
- امتیازدهی به میزان مرتبط بودن (Relevance scoring): سعی کردم فقط مرتبطترین پیامها را نگه دارم. این کار نیاز به یک vector store داشت و پیچیدگی زیادی اضافه میکرد.
متوجه شدم که به استراتژی بهتری نیاز دارم. در نهایت روی دو روش تصمیم گرفتم: streaming و یک context window ثابت.
قابلیت streaming باعث میشود اپلیکیشن سریع به نظر برسد. کاربران به جای انتظار برای پاسخ کامل، میبینند که متن بلافاصله ظاهر میشود. من از Server-Sent Events استفاده کردم تا تکههای متن را به محض رسیدن ارسال کنم.
همچنین context خود را به سه بخش تقسیم کردم:
- System prompt: مجموعهای ثابت از دستورالعملها.
- Dynamic context: بهروزرسانیهای اخیر پروژه و وضعیت وظایف.
- Conversation history: یک پنجره لغزان (sliding window) از پیامهای اخیر.
من هر بار کل تاریخچه را ارسال نمیکنم. فقط به اندازهای که برای پاسخ به سوال فعلی لازم است ارسال میکنم. این کار حجم payload را ۴۰٪ کاهش داد. باعث صرفهجویی در هزینهها و بهبود سرعت شد.
اگر ویژگیهای هوش مصنوعی میسازید، به یاد داشته باشید: streaming سرعت را برای شما فراهم میکند. یک استراتژی خوب برای context، هوشمندی را برای شما فراهم میکند.
شما چگونه حافظه مکالمه را در اپلیکیشنهای خود مدیریت میکنید؟ آیا از sliding windows استفاده میکنید یا خلاصهسازی؟