9 خرداد 1403

مهندسی خط فرمان – Prompt Engineering

مهدی مهریزی

در بین انواع مدل‌های هوش مصنوعی، مدل‌های زبانی امروزه بسیار محبوب و مورد توجه هستند. شرکت OpenAI با ارائه سرویس چت ساده و قابل دسترس برای همه، سهم زیادی در کسب این محبوبیت و توجه جهانی داشته است.

با پیشرفت مدل‌های زبانی بزرگ (LLM) مانند ChatGPT، بسیاری از استارت‌آپ‌ها و محصولات شروع به استفاده از این مدل‌ها برای افزایش کارآیی خود کرده‌اند. وقتی با یکی از این مدل‌ها چت می‌کنیم، اگر در مرحله‌ای از نتیجه ارائه شده رضایت نداشته باشیم، می‌توانیم با تعامل بیشتر و توضیح بهتر، پاسخ دقیق‌تری دریافت کنیم. اما وقتی از APIها برای ارسال دستور و دریافت پاسخ استفاده می‌کنیم، هوش انسانی وجود ندارد تا در صورت غلط بودن یا ناقص بودن پاسخ، دوباره تلاش کند. به همین دلیل، هنگام استفاده از APIها باید درخواست‌هایمان را به گونه‌ای مطرح کنیم که در همان بار اول به نتیجه مطلوب برسیم. به این فرایند، نحوه پرسش از هوش مصنوعی یا مهندسی خط فرمان (Prompt Engineering) گفته می‌شود.

روش عملکرد

وقتی یک درخواست (prompt) وارد ChatGPT می‌شود، فرآیند زیر اتفاق می‌افتد:

  1. تبدیل به توکن (tokenization): ابتدا متن ورودی به واحدهای کوچکتری به نام توکن‌ها شکسته می‌شود. این توکن‌ها می‌توانند کلمات، زیرکلمات یا حروف باشند، بسته به زبان و الگوریتم خاص توکنیزاسیون (tokenization) استفاده شده. برای زبان انگلیسی و بسیاری زبان‌های دیگر، توکنیزاسیون (tokenization) معمولاً شامل شکستن متن در فضاها و علامت‌های نگارشی است، در حالی که برای زبان‌هایی مانند فارسی ممکن است شامل قوانین پیچیده‌تری برای در نظر گرفتن خط و ساختار کلمات باشد.
  2. کدگذاری (encoding): هر توکن سپس به یک نمایش عددی تبدیل می‌شود که مدل بتواند آن را پردازش کند. این کدگذاری (encoding) از یک واژگان از پیش تعریف‌شده استفاده می‌کند که توکن‌ها را به اعداد نگاشت می‌دهد.
  3. پردازش توسط مدل: توکن‌های کدگذاری شده به مدل ChatGPT، که یک شبکه عصبی بزرگ است، تغذیه می‌شوند. مدل این توکن‌ها را از طریق لایه‌های متعدد پردازش می‌کند، با استفاده از داده‌های آموزشی و الگوهای یادگرفته شده برای تولید یک پاسخ مرتبط و منسجم.
  4. رمزگشایی (decoding): خروجی مدل یک دنباله از شناسه‌های توکن است که سپس به متن قابل خواندن برای انسان تبدیل می‌شود. این شامل نگاشت توکن‌های عددی به کلمات یا حروف متناظر در زبان خروجی است.
  5. تولید پاسخ: متن نهایی پاسخ با پیوند دادن این توکن‌های رمزگشایی شده تشکیل می‌شود.

شارژ بر اساس توکن (token-based charging): کاربران بر اساس تعداد توکن‌های پردازش شده، که شامل هم توکن‌های ورودی در درخواست و هم توکن‌های تولید شده در پاسخ است، هزینه می‌پردازند. هر توکن نمایانگر یک بخش کوچک از متن است و هزینه معمولاً به ازای هر توکن محاسبه می‌شود. برای مثال، اگر کاربر یک درخواست وارد کند که به ۲۰ توکن شکسته شود و مدل پاسخی شامل ۵۰ توکن تولید کند، تعداد کل توکن‌ها ۷۰ توکن خواهد بود.

البته علاوه بر روند کلی فوق که در مورد مدل های زبانی عمل می‌کند، سرویس ارایه شده توسط openAI خود از بعضی تکنیک های مهندسی خط فرمان استفاده می‌کند.

هر روز بهتر از دیروز

اولین باری که عنوان prompt engineering را شنیدم (حدودا ۲ سال پیش) OpenAi نسخه ۳ ChatGPT را منتشر کرده بود. در همین مدت اندک با به روز رسانی ChatGPT، توانمندی این سرویس در ارایه پاسخ های مورد قبول به صورت چشمگیری بهبود یافته است. به علاوه سرویس ChatGPT بسیاری از تکنیک‌های مهندسی خط فرمان را خود پیاده‌سازی می‌کند. انتخاب زبان مناسب برای ارسال به مدل که در قسمت بعد توضیح داده شده است یکی از این موارد است.

انتخاب زبان

اگر چه مدل های زبانی معمولا با چندین زبان آموزش دیده اند و ترجمه کردن متون یکی از قابلیت های آنان است، معمولا حجم داده هایی که در انگلیسی آموزش دیده اند بسیار بیشتر از سایر زبان هاست. بر همین اساس اگر شما مساله ای مثلا به زبان فارسی دارید، اگر آن را به انگلیسی ترجمه کنید و با مدل زبانی مدنظر، انگلیسی درخواست بدهید، جواب دقیقتری دریافت خواهید کرد. این تکنیک توسط ChatGPT استفاده میشود و لذا اگر از این سرویس استفاده می‌کنید این کار به صورت خودکار انجام می‌شود.

شرح کامل درخواست

یکی از قابلیت هایی که شرکت openAI به خوبی در سرویس خود ارایه می‌دهد این امکن است که مدل در یک جلسه کاری پرسش و پاسخ های آن جلسه را یادآوری می‌کند. به عبارتی اگر شما یک درخواست به هوش بدهید و بعد از دریافت پاسخ بخواهید پاسخی متفاوت تر دریافت کنید، تنها لازم است تا تغییرات مد نظر را از او بخواهید و نیاز نیست درخواست اولیه را مجدد تکرار کنید چون مدل درخواست اولیه را فراموش نکرده است.

اگر چه این قابلیت (Session-based Memory) بسیار کاربردی است اما همانگونه که در روش عملکرد توضیح داده شد، در مدل های غیر رایگان ChatGPT شما به مقداری که مدل برای شما متن تولید می‌کند هزینه می‌دهید و اگر یک درخواست را در چندین دستور بدهید هزینه بیشتری باید بدهید.

بر همین اساس مهمترین مهندسی خط فرمانی که باید مد نظر داشته باشید توضیح کامل با تمام جزیات از درخواستی هست که دارید. تمام جزیات را در پرامت بگنجانید. از خلاصه کردن درخواست در یک جمله بپرهیزید و در جملات متعدد ریز درخواست های خود را بدهید. به طور مثال بجای پرامپت “برنامه ای بنویس که لیست ماه‌های سال را تا یکسال آینده لیست کند” به صورت کاملتر از این پرامپت استفاده کنید:
“برنامه ای به زبان پایتون بنویس که به صورت خودکار ماه‌های سال از ماه جاری تا یک سال دیگر را لیست کند. خروجی لیست باید به صورت آرایه از json باشد”

درخواست بررسی پاسخ

Why AI Is Incredibly Smart and Shockingly Stupid

Yejin Choi | TED

اگر عنوان بالا را گوگل کنید صحبت های خانم Choi را و مثال هایی از اینکه گاهی مدل‌ها پاسخ سوالات بسیار ساده را اشتباه می‌دهند، ارایه می‌دهد. به علاوه در صحبتی دیگر Greg Brockman هم بنیانگزار OpenAI توضیح می‌دهد که برای بعضی از این موارد بسیار ساده که ChatGPT اشتباه پاسخ میدهد، به صورت خاص آموزش دیده است. این ویدیو را در لینک زیر می‌توانید پیدا کنید:

https://www.ted.com/talks/greg_brockman_the_inside_story_of_chatgpt_s_astonishing_potential?language=en

نمونه ای از این اشتباهات شوکه کننده درخواست ساده جمع دو عدد می‌باشد. در نسخه ۳ ChatGPT من خودم به این ایرادات برخورده بودم و وقتی از مدل میخواستم تا برایم یک متن با ۳ پاراگراف تولید کند، گاهی ۴ پاراگراف تولید می‌کرد. یکی از روش هایی که می‌توانید در چنین مواردی از مدل بخواهید این است که پاسخ خود را بررسی و کنترل کند. مثلا از او بخواهید بعد از نوشتن کد یک برنامه، برنامه را با یکسری ورودی تست کند.

zero-shot و multi-shot

زمانی که یک درخواست از هوش مصنوعی داریم میتوانیم آن را بدون تمرین قبلی توضیح بدهیم و درخواست کنیم. فرض کنید یک مدل هوش مصنوعی دارید و می‌خواهید آن را بدون ارائه هیچ مثالی برای دسته‌بندی نظرات مشتریان به احساسات مثبت، خنثی یا منفی بکار ببرید. برای اینکار می‌توان درخواست زیر را ارسال کرد:

پرامپت:

احساس این نظر را دسته‌بندی کن: 'کیفیت محصول فوق‌العاده است و هر روز از استفاده از آن لذت می‌برم.'

پاسخ مدل: “مثبت”

اگرچه مدل های پیشرفته این درخواست را معمولا به خوبی انجام می‌دهند اما اگر دسته بندی های خاصی مد نظر داشته باشیم میتوانیم به صورت multi-shot درخواست را بدهیم. اکنون چندین مثال از نظرات دسته‌بندی شده را قبل از درخواست دسته‌بندی یک نظر جدید به مدل ارائه می‌دهید. این کمک می‌کند مدل وظیفه را بهتر بفهمد:

پرامپت:

احساس نظرات زیر را دسته‌بندی کن:
'از خدمات بسیار ناراضی هستم.' - منفی
'محصول به خوبی کار می‌کند، اما چیز خاصی نیست.' - خنثی
'تجربه فوق‌العاده، قطعاً دوباره خرید خواهم کرد!' - مثبت
اکنون احساس این نظر را دسته‌بندی کن: 'کیفیت محصول فوق‌العاده است و هر روز از استفاده از آن لذت می‌برم.'

پاسخ مدل: “مثبت”

اخبار و گزارش‌ها

موضوعات مرتبط