هوش مصنوعی و تهدید؟ یا هوش مصنوعی و فرصت؟ بسته به دیدگاهمون، هر دو عبارت میتونن درست باشن. ولی یه جملهٔ معروف که این روزها دست به دست میشه اینه که:
AI قرار نیست جایگزین انسانها بشه. ولی انسانهایی که از AI استفاده میکنن جایگزین انسانهایی خواهند شد که از AI استفاده نمیکنن.
که معنای کلیتر این جمله همیشه درست بوده و توی سراسر تاریخ انسانهایی که مایل به استفاده از تکنولوژی نبودن، به مرور کنار گذاشته میشدن. بنابراین چاره چیه؟ به نظرم باید مایل باشیم که تغییر کنیم و یاد بگیریم که چطوری از تکنولوژی به نفع خودمون استفاده کنیم. امروزه چه فرصتها و عملکردهای فوقالعادهای میتونیم داشته باشیم اگه بتونیم از AI به نفع خودمون استفاده کنیم. این مقاله درباره Prompt Engineering هست که کمک میکنه چطوری و به شکل بهتری بتونیم با AI ارتباط برقرار کنیم و نتیجهٔ دلخواه برسیم.
Prompt Engineering؟ 🤔
نگران نباشین! این یک شاخه جدید مهندسی نیست. و اصلاً مهندسی نیست. بلکه صرفاً یک مهارت و تکنیک برای برقراری ارتباط بهتر با مدلهای Generative AI هست.
مدل Generative AI به نوعی از هوش مصنوعی گفته میشه که توانایی تولید انواع مختلف محتوا مثل متن و تصویر و ویدئو رو داره. مثل ChatGPT یا GitHub Copilot
وقتی با ابزاری مثل ChatGPT کار میکنیم، در واقع داریم با استفاده از زبان خودمون با اون ارتباط برقرار میکنیم تا به جواب دلخواهمون برسیم. اینکه جواب تا چه اندازهای بتونه برامون راضیکننده باشه، تا حد زیادی بستگی به نحوهٔ تعامل ما با اون ابزار داره، و به قول معروف Prompt ما چقدر بهینه و مناسب هست. Prompt Engineering کمک میکنه ویژگیها، قابلیتها و محدودیتهای ابزارهای Generative AI رو بشناسیم و مهارتهایی رو در اختیار ما قرار میده تا بتونیم به شکل مؤثرتری با AI ارتباط برقرار کنیم و به بهترین جواب ممکن برسیم.
Prompt به زبان ساده همون دستوری هست که به ابزار هوش مصنوعی مثل ChatGPT برای رسیدن به جواب مد نظر میدیم.

همونطور که میبینیم به ChatGPT صرفاً گفتیم «The sky is» و اون براساس دانش و فرضیات خودش چنین پاسخی داد. اما این پاسخ مد نظر ما نبود. برای مثال ما میخواستیم پاسخی کوتاهتر و توی یک جمله داشته باشیم. اینجاست که مهارت Prompt Engineering به کارمون میاد. کافیه Prompt رو کمی بهبود بدیم:

میبینیم که ChatGPT اینبار توی یک جمله پاسخ داد. توی این پست با چنین تکنیکهایی بیشتر آشنا خواهیم شد.
چرا Prompt Engineering؟
همونطور که گفتیم، توی این انقلاب هوش مصنوعی، خواسته یا ناخواسته با ابزارهای مختلفی سر و کار خواهیم داشت. این مهارتها به ما کمک میکنن یاد بگیریم ابزارهای Generative AI چطوری کار میکنن و باعث میشن خیلی سریعتر به جواب دلخواه برسیم و در نتیجه خلاقیت و عملکردمون رو افزایش بدیم. بهعلاوه همونطور که میدونیم بیشتر این ابزارها رایگان نیستن و با یادگیری چنین تکنیکهایی میتونیم بهطور قابل توجهی توی هزینهها صرفهجویی کنیم.
خب، بریم که با چند تکنیک آشنا بشیم. به این تکنیکها به اصلاح Prompting Techniques هم گفته میشه.
تکنیکهای Prompt نویسی
میخوایم یاد بگیریم چطوری میتونیم پرامپتهای بهتری بنویسیم تا بتونیم حرفهای تر با ابزارهای Generative AI کار کنیم. برای نوشتن یک پرامپت خوب تکنیکهای مختلفی وجود داره که توی ادامه با چند تا از رایجترین اونها آشنا میشیم.
تکنیک Zero-Shot Prompting
توی این تکنیک ما از مدل مستقیماً سوالمون رو میپرسیم بدون اینکه برای اون مثالهایی به منظور مشخص کردن فرمت پاسخ ذکر کنیم. این مثال رو ببینید:

از ChatGPT پرسیدیم که کیفیت جملهٔ مد نظر ما رو با کلمات positive (مثبت)، neutral (خنثی) و negative (منفی) مشخص کن. جواب مدل درست بود، ولی نه دقیقاً طبق فرمت مد نظر ما. برای مثال ما میخواستیم یک پاسخ با حروف کوچیک داشته باشیم. همونطور که توی سوال مشخص کردیم. یعنی neutral، نه Neutral. اگه چنین نتیجهای برای ما اهمیت داره، ناچار هستیم توی یک پرامپت دیگه از مدل بخوایم لطفاً با حروف کوچیک جواب بده. که این روش بهینه نیست و برای حل چنین موضوعی یک تکنیک دیگه ابداع شد به اسم Few-Shot Prompting.
تکنیک Few-Shot Prompting
همونطور که احتمالاً حدس زدین، توی این تکنیک ما برای رسیدن به یک پاسخ بهتر، توی پرامپت برای مدل مثالهایی رو از پاسخ قابل انتظار مشخص میکنیم. این مثال رو در نظر بگیرید:

اینجا توی خط ۲ و ۳ برای مدل یک مثال از پاسخ قابل انتظار مشخص کردیم. و میبینیم که پاسخ مدل شباهت داشت با چیزی که انتظار داشتیم. منظور از Shot توی این تکنیک، همون مثالهایی هست که ما مشخص میکنیم. در واقع میتونیم چندین مثال از پاسخ قابل انتظار مشخص کنیم. به همین دلیل به این تکنیک گفته میشه Few-Shot Prompting.
البته این تکنیک دوای همهٔ مشکلات نیست. به این مثال دقت کنین:

ما برای ChatGPT گروهی از اعداد رو مشخص کردیم و گفتیم اعداد فرد رو با هم جمع کن، اگه حاصل جمع یک عدد زوج بود، بهمون True برگردون و در غیر این صورت False. همونطور که میبینیم، برای مدل چند مثال مشخص کردیم و ظاهر پاسخ هم طبق فرمت مد نظر ما بود. اما جدا از ظاهر، خود پاسخ اشتباه بود. توی سوال، جمع اعداد فرد میشه 41. که یک عدد فرد هست. اما پاسخ مدل True بود به این معنی که حاصل اون جمع، یک عدد زوج هست. پس اینجا نتونستیم به جواب درست برسیم. ما با استفاده از یک تکنیک دیگه میتونیم چنین محدودیتی رو برطرف کنیم.
تکنیک Chain-of-Thought Prompting
توی این تکنیک ما برای مدل نحوهٔ تصمیمگیری و استدلال برای حل مسئله رو مشخص میکنیم. به مثال زیر دقت کنین. ما اینجا با استفاده از تکنیک Few-Shot Prompting و با چند تا مثال نحوهٔ رویارویی و حل این مسئله رو به مدل توضیح دادیم:

همونطور که میبینیم این بار مدل تونست به درستی با مسئله مواجه بشه و جواب درستی داد.
اینها رایجترین تکنیکهایی بودن که میتونیم ازشون برای گرفتن پاسخ درست و بهینه استفاده کنیم. هر چند کلی تکنیک دیگه برای حل مسائل پیچیدهتر وجود داره مثل:
- Self-Consistency
- Generate Knowledge Prompting
- Tree of Thoughts
- Retrieval Augmented Generation
- Automatic Reasoning and Tool-use
- Automatic Prompt Engineer
- Active-Prompt
- Directional Stimulus Prompting
- ReAct
- Multimodal CoT
- Graph Prompting
برای اینکه بتونیم به بهترین پاسخ ممکن از AI برسیم، نوشتن یک پرامپت خوب لازمه اما کافی نیست. در واقع یکسری پارامتر و ملاک و معیاری دیگهای وجود داره که بالا و پایین شدن این اونها بهطور کلی روی کیفیت پاسخ تأثیر میذاره. بنابراین خوبه که بررسی کنیم که چه ملاکها و پارامترهایی رو کیفیت پاسخ تاثیرگذار هست.
چه پارامترهایی روی کیفیت پاسخ Generative AI تأثیر داره؟
هر دستوری که وارد میکنیم، جدا از کیفیت اون دستور، ملاکها و پارامترهای مختلفی روی کیفیت پاسخ نهایی تأثیرگذار هستن. مثل Temperature، Top_p و Max length که توی ادامه با بعضی از اونها آشنا میشیم. نکتهای که باید در نظر داشته باشیم اینه که این پارامترها معمولاً توسط کسی که ابزار هوش مصنوعی رو مدیریت میکنه (نه کسی که از اون استفاده میکنه) تنظیم میشه و بنابراین، کیفیت پاسخ فارغ از اینکه Prompt ما چقدر دقیق هست کاملاً بستگی به اندازهٔ این پارامترها داره. این پارامترها شامل موارد زیر میشن:
- Temperature
- Top_p
- Max Length
- Stop Sequences
- Presence Penalty
- Frequency Penalty
این پارامترها رو میتونیم با LLM Settings هم بشناسیم که توی ادامه با چند تا از اونها آشنا میشیم.
Temperature
مقدار این پارامتر معمولاً بین صفر و ۱ تنظیم میشه. هر چی مقدار این پارامتر به ۱ نزدیکتر باشه، خروجی ما خلاقانهتر، متنوعتر و غیر قابل پیشبینیتر میشه. و بلعکس، با نزدیک شدن به عدد صفر، خروجیِ قابل پیشبینی و با تنوع کمتری خواهیم داشت. Randomness یا Variability واژههای دیگهای هستن که میتونیم برای این پارامتر در نظر بگیریم.
برای مثال از ChatGPT میخوایم که جمله The sky is ... رو یک بار با Temerature بالا و یک بار با Temperature پایین کامل کنه:

توی پاسخ با Temperature بالا میتونیم ببینیم که خروجی چقدر غیر قابل پیشبینی و خلاقانهتر بود. بلعکس، پاسخ با Temerature پایین تقریباً قابل پیشبینی بود. بنابراین اگه پاسخهای حقیقتمحور و مستند مثل اطلاعات درباره یک موضوع علمی میخوایم باید از Temperature پایین و اگه پاسخهای خلاقانهتر مثل کامل کردن مصرع دوم یک شعر میخوایم، از Temperature بالا استفاده میکنیم.
باید این نکته رو در نظر داشته باشیم که ما نمیتونیم مستقیماً مقدار Temperature توی ChatGPT رو مشخص کنیم و پاسخ ChatGPT صرفاً یک پاسخ شبیهسازی شده بود.
Top_p
این پارامتر هم معمولاً عددی بین صفر تا ۱ در گرفته میشه و تقریباً کاربردی مشابه Temperature داره و برای مشخص کردن وسعت تنوع و پیشبینیپذیری پاسخ به کار میره. به بیان ساده، Top_p برای مشخص کردن دایره واژگانی هست که انتظار داریم توی پاسخ داشته باشیم. برای مثال اگه به ChatGPT بگیم "گربهٔ خوابآلود" رو تصور و سپس جملهٔ "گربه در حال ..." رو کامل کن، با یک Top_p پایین، میتونه به صورت "گربه در حال خوابیدن هست" کامل بشه و با یک Top_p بالا میتونه به صورت "گربه در حال دیدن رویایی از ماه و ستاره هست". چیزی که اینجا مشخصه، هر دو جمله مفهوم "خوابیدن" رو میرسونن و تفاوت توی نحوهٔ توصیف این مفهوم هست.
تفاوت Top_p و Temperature اینه که بالا بردن Temperature باعث میشه جوابهای ما کمتر قابل پیشبینی، بیربط و از مفهوم اصلی دور باشه. اما یک Top_p بالا باعث میشه جوابهای ما خلاقیت و تنوع بیشتری داشته باشن، هر چند همه جوابها یک مفهوم رو میرسونن. برای مثال شما یک دوست قدیمی رو توی خیابون میبینید. اگه Temperature شما پایین و نزدیک به صفر باشه، ممکنه ایشون رو با «سلام محمد» خطاب کنین. ولی با یک Temperature بالا و بیش از حد، ممکنه ایشون رو با واژگانی کاملاً بیربط مثل «سلام useState(false)» خطاب کنین. و اگه از Top_p پایین استفاده کنین، ایشون رو «سلام دوست قدیمی» صدا خواهید زد (قابل پیشبینی، خلاقیت کم) و با Top_p بالا ممکنه طبع شاعرانه شما باعث گفتن چنین جملهای بشه: «سلام ای پادشاه جادههای رویایی خاطرات زنگزده». همونطور که میبینیم، هر دو جمله مفهوم دوست قدیمی رو میرسونن.
پس با Top_p بالا، ما برای مدل مشخص میکنیم که میتونی دسترسی گستردهتری به دیکشنری لغات داشته باشی و در نتیجه کیفیت پاسخ، خلاقانهتر اما در هر صورت مرتبط با Prompt خواهد بود.
Max Length
این پارامتر برای مشخص کردن تعداد توکنها یا به زبان ساده، کلماتی هست که یک مدل میتونه تولید کنه. برای مثال اگه مقدار این پارامتر رو برابر با 5 بذاریم و به عنوان کاربر از مدل بخوایم «یک داستان از روز بارونی تعریف کن»، ممکنه پاسخ به این صورت باشه: «روزی روزگاری در یک شهر» که میبینیم به نظر جمله ناتمام هست. در واقع این پارامتر کمک میکنه بتونیم طول پاسخها و نهایتاً هزینهها رو کنترل کنیم.

خب دوستان امیدوارم از این پست و نکتههایی که بررسی کردیم استفاده کرده باشین. بهتره که بدونیم این نکتهها همهٔ چیزی نیست که میتونیم بدونیم و در واقع با علمهای خیلی گستردهتر مواجه هستیم. پس بهتره خودمون رو با تکنولوژیهای مفید وفق بدیم. هر چند با تلاشهای خیلی کوچیک! روزتون خوش 😉👋
