زمانی که صحبت از Production کردن LLM میشه، دوتا قاتل اصلی داریم: هزینه و Latency. اکثر ماژولهای هوش مصنوعی الان دارن بخش عظیمی از Context Window رو با System Promptهای طولانی و Few-Shot Exampleهای تکراری پر میکنن. این یعنی هر بار داریم پول میدیم که مدل همون دستورالعملهای تکراری رو بخونه تا فقط یک تسک خاص رو انجام بده.
تکنیک PromptIntern دقیقا دست گذاشته روی همین نقطه درد. ایده اصلی اینه: به جای اینکه هر بار پرامپت رو به مدل بدیم (In-Context Learning) یا پرامپت رو فشرده کنیم (Prompt Compression) که باعث افت دقت میشه، بیایم دانشِ داخل پرامپت رو بفرستیم توی وزنهای مدل (Model Weights).
مفهوم اصلی اینجا Internalizing هست. توی روشهای معمول Fine-tuning، ما معمولا Input/Output خام رو میدیم. اما این مقاله میگه اگر مدل رو با پرامپت کامل Fine-tune کنیم و به مرور زمان در طول پروسه آموزش، پرامپت رو حذف کنیم، مدل "یاد میگیره" که اون کانتکست رو درونیسازی کنه.
معماری و پایپلاین PromptIntern روی سه مرحله سوار شده که بهش میگن Progressive Fine-tuning:
مرحله اول (Full Context): مدل با پرامپت کامل شامل Template (دستورالعملها) و Examples (چند شات) آموزش میبینه.
مرحله دوم (Fading Out): با یک برنامه زمانی (Schedule) خطی، شروع میکنیم به فشردهسازی Template و کم کردن تعداد Exampleها. یعنی مدل کمکم داره عصا رو از زیر بغلش میندازه.
مرحله سوم (Internalized): در انتهای آموزش، مدل فقط با Query کاربر آموزش میبینه و تمام کانتکست قبلی رو حذف میکنیم.
نتیجه این روش روی تسکهای NL2Code (مثل تبدیل متن به کد پایتون یا Bash) وحشتناک خوب بوده. کاهش بیش از ۹۰ درصدی توکنهای ورودی و افزایش سرعت Inference تا ۴.۲ برابر. نکته جالب اینجاست که دقت مدل (Accuracy) نه تنها افت نکرده، بلکه از روشهای Prompt Compression مثل LLMLingua هم خیلی بهتر عمل کرده و به دقت مدل با پرامپت کامل رسیده.
به نظر من، این روش عملاً پیادهسازی Curriculum Learning روی فضای Prompt Engineering هست. ما داریم با مدل مثل یک کارآموز (Intern) رفتار میکنیم؛ اولش داکیومنت کامل میدیم، بعد کمکم راهنمایی رو کم میکنیم تا خودش مسلط بشه.
نکته فنی مهم برای پیادهسازی:
کلید ماجرا توی Schedule هست. مقاله نشون داده که کاهش خطی (Linear Decay) برای حذف Template و Exampleها بهترین نتیجه رو میده. اگر یهویی حذف کنید (Step decay) مدل گیج میشه و اگر خیلی کند حذف کنید (Exponential) مدل Overfit میشه روی پرامپت. برای پیادهسازی کافیه توی لوپ ترینینگ LoRA، دیتالودر رو داینامیک کنید که بر اساس Epoch جاری، بخشهایی از پرامپت رو Mask یا حذف کنه.
این روش برای کسانی که دارن روی Agentهای تخصصی کار میکنن (مثلاً ایجنت SQL Generator یا Code Reviewer) که همیشه یک پرامپت ثابتِ سنگین دارن، الزامیه. برای Chatbotهای عمومی شاید خیلی کاربرد نداشته باشه چون پرامپت دائم عوض میشه.
📃 لینک مقاله: PromptIntern: Saving Inference Costs by Internalizing Recurrent Prompt
https://arxiv.org/abs/2404.14256
🛠 Join @LLMEngineers Community
Post #257
1.36K