این ماژول مفاهیم و تکنیکهای اساسی برای ایجاد پرامپتهای مؤثر در مدلهای هوش مصنوعی مولد را پوشش میدهد. نحوه نوشتن پرامپت برای یک LLM نیز اهمیت دارد. یک پرامپت با دقت طراحیشده میتواند کیفیت پاسخ بهتری را به همراه داشته باشد. اما دقیقاً اصطلاحاتی مانند پرامپت و مهندسی پرامپت به چه معنا هستند؟ و چگونه میتوانم ورودی پرامپت را که به LLM ارسال میکنم بهبود دهم؟ اینها سوالاتی هستند که سعی میکنیم در این فصل و فصل بعدی به آنها پاسخ دهیم.
هوش مصنوعی مولد قادر است محتوای جدیدی (مانند متن، تصاویر، صدا، کد و غیره) در پاسخ به درخواستهای کاربران ایجاد کند. این کار را با استفاده از مدلهای زبانی بزرگ مانند سری GPT ("Generative Pre-trained Transformer") شرکت OpenAI انجام میدهد که برای استفاده از زبان طبیعی و کد آموزش دیدهاند.
اکنون کاربران میتوانند بدون نیاز به تخصص فنی یا آموزش، با این مدلها از طریق الگوهای آشنایی مانند چت تعامل داشته باشند. این مدلها مبتنی بر پرامپت هستند - کاربران یک ورودی متنی (پرامپت) ارسال میکنند و پاسخ هوش مصنوعی (تکمیل) را دریافت میکنند. سپس میتوانند در مکالمات چند مرحلهای به صورت تکراری با هوش مصنوعی "چت کنند" و پرامپت خود را اصلاح کنند تا پاسخ مطابق با انتظاراتشان باشد.
"پرامپتها" اکنون به رابط اصلی برنامهنویسی برای اپلیکیشنهای هوش مصنوعی مولد تبدیل شدهاند، که به مدلها میگویند چه کاری انجام دهند و کیفیت پاسخهای بازگشتی را تحت تأثیر قرار میدهند. "مهندسی پرامپت" یک حوزه مطالعاتی در حال رشد سریع است که بر طراحی و بهینهسازی پرامپتها برای ارائه پاسخهای با کیفیت و سازگار در مقیاس بزرگ تمرکز دارد.
در این درس، یاد میگیریم که مهندسی پرامپت چیست، چرا اهمیت دارد و چگونه میتوانیم پرامپتهای مؤثرتری برای یک مدل و هدف اپلیکیشن خاص طراحی کنیم. مفاهیم اصلی و بهترین روشها برای مهندسی پرامپت را درک خواهیم کرد - و درباره یک محیط "sandbox" تعاملی در Jupyter Notebooks یاد خواهیم گرفت که در آن میتوانیم این مفاهیم را در مثالهای واقعی اعمال کنیم.
در پایان این درس قادر خواهیم بود:
- توضیح دهیم که مهندسی پرامپت چیست و چرا اهمیت دارد.
- اجزای یک پرامپت را توصیف کنیم و نحوه استفاده از آنها را توضیح دهیم.
- بهترین روشها و تکنیکهای مهندسی پرامپت را یاد بگیریم.
- تکنیکهای آموختهشده را در مثالهای واقعی، با استفاده از یک نقطه پایانی OpenAI اعمال کنیم.
مهندسی پرامپت: تمرین طراحی و اصلاح ورودیها برای هدایت مدلهای هوش مصنوعی به سمت تولید خروجیهای مطلوب. توکنسازی: فرآیند تبدیل متن به واحدهای کوچکتر، به نام توکنها، که یک مدل میتواند آنها را درک و پردازش کند. مدلهای زبانی بزرگ تنظیمشده با دستورالعمل: مدلهای زبانی بزرگ (LLMs) که با دستورالعملهای خاص تنظیم شدهاند تا دقت و ارتباط پاسخهایشان بهبود یابد.
مهندسی پرامپت در حال حاضر بیشتر یک هنر است تا علم. بهترین راه برای بهبود شهود در این زمینه، تمرین بیشتر و اتخاذ رویکرد آزمون و خطا است که تخصص در حوزه کاربرد را با تکنیکهای توصیهشده و بهینهسازیهای خاص مدل ترکیب میکند.
Jupyter Notebook همراه این درس یک محیط sandbox فراهم میکند که در آن میتوانید آنچه را که یاد میگیرید امتحان کنید - در حین پیشرفت یا به عنوان بخشی از چالش کدنویسی در پایان. برای اجرای تمرینها، به موارد زیر نیاز دارید:
- کلید API Azure OpenAI - نقطه پایانی سرویس برای یک LLM مستقر.
- محیط اجرایی پایتون - که در آن Notebook اجرا شود.
- متغیرهای محیطی محلی - مراحل SETUP را اکنون کامل کنید تا آماده شوید.
این Notebook با تمرینهای آغازین ارائه میشود - اما شما تشویق میشوید که بخشهای Markdown (توضیحات) و Code (درخواستهای پرامپت) خود را اضافه کنید تا مثالها یا ایدههای بیشتری را امتحان کنید - و شهود خود را برای طراحی پرامپت بسازید.
آیا میخواهید قبل از شروع، تصویر کلی از آنچه این درس پوشش میدهد داشته باشید؟ این راهنمای تصویری را بررسی کنید که به شما حس موضوعات اصلی پوشش دادهشده و نکات کلیدی برای تفکر در مورد هر یک از آنها را میدهد. نقشه راه درس شما را از درک مفاهیم و چالشهای اصلی به حل آنها با تکنیکها و بهترین روشهای مرتبط با مهندسی پرامپت هدایت میکند. توجه داشته باشید که بخش "تکنیکهای پیشرفته" در این راهنما به محتوایی اشاره دارد که در فصل بعدی این برنامه آموزشی پوشش داده شده است.
حالا بیایید درباره اینکه چگونه این موضوع به مأموریت استارتاپ ما برای آوردن نوآوری هوش مصنوعی به آموزش مرتبط است صحبت کنیم. ما میخواهیم اپلیکیشنهای هوش مصنوعی برای یادگیری شخصیسازیشده بسازیم - پس بیایید فکر کنیم که چگونه کاربران مختلف اپلیکیشن ما ممکن است پرامپتها را "طراحی" کنند:
- مدیران ممکن است از هوش مصنوعی بخواهند که دادههای برنامه درسی را برای شناسایی شکافهای موجود در پوشش تحلیل کند. هوش مصنوعی میتواند نتایج را خلاصه کند یا آنها را با کد به صورت تصویری نمایش دهد.
- آموزگاران ممکن است از هوش مصنوعی بخواهند که یک برنامه درس برای یک مخاطب هدف و موضوع خاص تولید کند. هوش مصنوعی میتواند برنامه شخصیسازیشده را در قالب مشخصی ایجاد کند.
- دانشآموزان ممکن است از هوش مصنوعی بخواهند که در یک موضوع دشوار به آنها آموزش دهد. هوش مصنوعی اکنون میتواند دانشآموزان را با درسها، نکات و مثالهایی که به سطح آنها مناسب است راهنمایی کند.
این فقط نوک کوه یخ است. پرامپتها برای آموزش را بررسی کنید - یک کتابخانه پرامپت متنباز که توسط کارشناسان آموزش گردآوری شده است - تا دید گستردهتری از امکانات به دست آورید! برخی از این پرامپتها را در sandbox یا با استفاده از OpenAI Playground اجرا کنید تا ببینید چه اتفاقی میافتد!
این درس را با تعریف مهندسی پرامپت به عنوان فرآیند طراحی و بهینهسازی ورودیهای متنی (پرامپتها) برای ارائه پاسخهای سازگار و با کیفیت (تکمیلها) برای یک هدف اپلیکیشن خاص و مدل آغاز کردیم. میتوانیم این فرآیند را به دو مرحله تقسیم کنیم:
- طراحی پرامپت اولیه برای یک مدل و هدف خاص
- اصلاح پرامپت به صورت تکراری برای بهبود کیفیت پاسخ
این فرآیند به طور ضروری یک فرآیند آزمون و خطا است که نیاز به شهود و تلاش کاربر دارد تا به نتایج بهینه برسد. اما چرا این موضوع مهم است؟ برای پاسخ به این سوال، ابتدا باید سه مفهوم را درک کنیم:
- توکنسازی = نحوه "دیدن" پرامپت توسط مدل
- مدلهای پایه = نحوه "پردازش" پرامپت توسط مدل پایه
- مدلهای تنظیمشده با دستورالعمل = نحوه "دیدن" وظایف توسط مدل
یک LLM پرامپتها را به عنوان یک دنبالهای از توکنها میبیند که مدلهای مختلف (یا نسخههای یک مدل) میتوانند یک پرامپت مشابه را به روشهای مختلف توکنسازی کنند. از آنجا که LLMها بر اساس توکنها (و نه متن خام) آموزش دیدهاند، نحوه توکنسازی پرامپتها تأثیر مستقیمی بر کیفیت پاسخ تولیدشده دارد.
برای درک نحوه کار توکنسازی، ابزارهایی مانند OpenAI Tokenizer را امتحان کنید. پرامپت خود را کپی کنید - و ببینید چگونه به توکنها تبدیل میشود، به نحوه برخورد با کاراکترهای فاصله و علامتهای نگارشی توجه کنید. توجه داشته باشید که این مثال یک مدل قدیمیتر (GPT-3) را نشان میدهد - بنابراین امتحان کردن این مورد با یک مدل جدیدتر ممکن است نتیجه متفاوتی داشته باشد.
پس از توکنسازی پرامپت، عملکرد اصلی "مدل پایه" پیشبینی توکن در آن دنباله است. از آنجا که LLMها بر اساس مجموعه دادههای متنی عظیم آموزش دیدهاند، آنها درک خوبی از روابط آماری بین توکنها دارند و میتوانند این پیشبینی را با اطمینان انجام دهند. توجه داشته باشید که آنها معنی کلمات در پرامپت یا توکن را درک نمیکنند؛ فقط الگویی را میبینند که میتوانند با پیشبینی بعدی خود "تکمیل" کنند. آنها میتوانند پیشبینی دنباله را تا زمانی که کاربر مداخله کند یا یک شرط از پیش تعیینشده وجود داشته باشد ادامه دهند.
میخواهید ببینید چگونه تکمیل مبتنی بر پرامپت کار میکند؟ پرامپت بالا را با تنظیمات پیشفرض در Chat Playground Azure OpenAI Studio وارد کنید. سیستم به گونهای پیکربندی شده است که پرامپتها را به عنوان درخواستهای اطلاعاتی در نظر بگیرد - بنابراین باید یک تکمیل را ببینید که این زمینه را برآورده میکند.
اما اگر کاربر بخواهد چیزی خاصی را ببیند که معیارها یا هدف وظیفهای را برآورده کند، چه؟ اینجاست که مدلهای تنظیمشده با دستورالعمل وارد تصویر میشوند.
یک مدل تنظیمشده با دستورالعمل با مدل پایه شروع میشود و آن را با مثالها یا جفتهای ورودی/خروجی (مانند "پیامهای" چند مرحلهای) که میتوانند دستورالعملهای واضحی داشته باشند - و پاسخ از تلاش هوش مصنوعی برای پیروی از آن دستورالعمل تنظیم میکند.
این کار از تکنیکهایی مانند یادگیری تقویتی با بازخورد انسانی (RLHF) استفاده میکند که میتواند مدل را آموزش دهد تا دستورالعملها را دنبال کند و از بازخورد یاد بگیرد تا پاسخهایی تولید کند که برای کاربردهای عملی مناسبتر و به اهداف کاربر مرتبطتر باشند.
بیایید امتحان کنیم - پرامپت بالا را دوباره بررسی کنید، اما اکنون پیام سیستم را تغییر دهید تا دستورالعمل زیر را به عنوان زمینه ارائه دهد:
محتوایی که به شما ارائه شده است را برای یک دانشآموز کلاس دوم خلاصه کنید. نتیجه را به یک پاراگراف با 3-5 نکته محدود کنید.
ببینید چگونه نتیجه اکنون تنظیم شده است تا هدف و قالب مورد نظر را منعکس کند؟ یک آموزگار اکنون میتواند مستقیماً از این پاسخ در اسلایدهای کلاس خود استفاده کند.
اکنون که میدانیم پرامپتها چگونه توسط LLMها پردازش میشوند، بیایید درباره چرا به مهندسی پرامپت نیاز داریم صحبت کنیم. پاسخ در این واقعیت نهفته است که LLMهای فعلی تعدادی چالش ایجاد میکنند که دستیابی به تکمیلهای قابل اعتماد و سازگار را بدون تلاش در ساخت و بهینهسازی پرامپت دشوارتر میکند. برای مثال:
-
پاسخهای مدل تصادفی هستند. همان پرامپت احتمالاً پاسخهای متفاوتی با مدلهای مختلف یا نسخههای مدل مختلف تولید میکند. و حتی ممکن است با همان مدل در زمانهای مختلف نتایج متفاوتی تولید کند. تکنیکهای مهندسی پرامپت میتوانند به ما کمک کنند تا این تغییرات را با ارائه محافظهای بهتر به حداقل برسانیم.
-
مدلها ممکن است پاسخهای ساختگی تولید کنند. مدلها با مجموعه دادههای بزرگ اما محدود آموزش دیدهاند، به این معنی که آنها دانش مفاهیم خارج از محدوده آموزش را ندارند. در نتیجه، آنها ممکن است تکمیلهایی تولید کنند که نادرست، خیالی یا مستقیماً متناقض با حقایق شناختهشده باشند. تکنیکهای مهندسی پرامپت به کاربران کمک میکنند تا چنین ساختگیهایی را شناسایی و کاهش دهند، مثلاً با درخواست استناد یا استدلال از هوش مصنوعی.
-
قابلیتهای مدلها متفاوت خواهد بود. مدلهای جدیدتر یا نسلهای مدل قابلیتهای غنیتری خواهند داشت اما همچنین ویژگیهای منحصر به فرد و معاوضههایی در هزینه و پیچیدگی به همراه خواهند آورد. مهندسی پرامپت میتواند به ما کمک کند تا بهترین روشها و جریانهای کاری را توسعه دهیم که تفاوتها را انتزاع کنند و به نیازهای خاص مدل به روشهای مقیاسپذیر و یکپارچه سازگار شوند.
بیایید این را در عمل در OpenAI یا Azure OpenAI Playground ببینیم:
- از همان پرامپت با استقرارهای مختلف LLM (مانند OpenAI، Azure OpenAI، Hugging Face) استفاده کنید - آیا تغییرات را مشاهده کردید؟
- از همان پرامپت به طور مکرر با همان استقرار LLM (مانند Azure OpenAI Playground) استفاده کنید - این تغییرات چگونه متفاوت بودند؟
در این دوره، ما از اصطلاح "ساختگی" برای اشاره به پدیدهای استفاده میکنیم که در آن LLMها گاهی اطلاعات نادرست تولید میکنند به دلیل محدودیتهای آموزش یا سایر محدودیتها. ممکن است این را به عنوان "توهمات" در مقالات یا پژوهشهای عمومی شنیده باشید. با این حال، ما به شدت توصیه میکنیم از اصطلاح "ساختگی" استفاده کنید تا به طور تصادفی رفتار را انسانگونه نکنید و ویژگی انسانی را به یک نتیجه ماشینمحور نسبت ندهید. این همچنین از نظر اصطلاحشناسی دستورالعملهای هوش مصنوعی مسئولانه را تقویت میکند، و اصطلاحاتی را حذف میکند که ممکن است در برخی زمینهها توهینآمیز یا غیرشامل باشند.
میخواهید حس کنید که ساختگیها چگونه کار میکنند؟ به یک پرامپت فکر کنید که به هوش مصنوعی دستور میدهد محتوایی برای یک موضوع غیرواقعی تولید کند (تا مطمئن شوید که در مجموعه دادههای آموزشی یافت نمیشود). برای مثال - من این پرامپت را امتحان کردم:
پرامپت: یک برنامه درس درباره جنگ مریخی سال 2076 تولید کنید. یک جستجوی اینترنتی به من نشان داد که داستانهای تخیلی (مانند سریالهای تلویزیونی یا کتابها) درباره جنگهای مریخی وجود داشتهاند - اما هیچکدام در سال ۲۰۷۶ رخ ندادهاند. عقل سلیم نیز به ما میگوید که سال ۲۰۷۶ در آینده است و بنابراین نمیتواند به یک رویداد واقعی مرتبط باشد.
پس چه اتفاقی میافتد وقتی این درخواست را با ارائهدهندگان مختلف مدلهای زبان اجرا کنیم؟
پاسخ ۱: OpenAI Playground (GPT-35)
پاسخ ۲: Azure OpenAI Playground (GPT-35)
پاسخ ۳: : Hugging Face Chat Playground (LLama-2)
همانطور که انتظار میرفت، هر مدل (یا نسخه مدل) پاسخهای کمی متفاوت تولید میکند، به دلیل رفتار تصادفی و تفاوتهای قابلیت مدل. به عنوان مثال، یک مدل مخاطب کلاس هشتم را هدف قرار میدهد، در حالی که دیگری فرض میکند که مخاطب دانشآموز دبیرستانی است. اما هر سه مدل پاسخهایی تولید کردند که میتوانستند یک کاربر ناآگاه را متقاعد کنند که این رویداد واقعی است.
تکنیکهای مهندسی درخواست مانند متاپرومتینگ و پیکربندی دما ممکن است تا حدی جعل مدلها را کاهش دهند. معماریهای جدید مهندسی درخواست نیز ابزارها و تکنیکهای جدید را به طور یکپارچه در جریان درخواست ادغام میکنند تا برخی از این اثرات را کاهش دهند.
بیایید این بخش را با بررسی نحوه استفاده از مهندسی درخواست در راهحلهای واقعی به پایان برسانیم و یک مطالعه موردی را بررسی کنیم: GitHub Copilot.
GitHub Copilot "برنامهنویس جفت هوش مصنوعی" شماست - متن درخواستها را به تکمیل کد تبدیل میکند و در محیط توسعه شما (مانند Visual Studio Code) برای تجربه کاربری یکپارچه ادغام شده است. همانطور که در مجموعهای از وبلاگهای زیر مستند شده است، نسخه اولیه بر اساس مدل OpenAI Codex بود - با این حال مهندسان به سرعت نیاز به تنظیم دقیق مدل و توسعه تکنیکهای بهتر مهندسی درخواست را برای بهبود کیفیت کد درک کردند. در ماه جولای، آنها مدل هوش مصنوعی بهبودیافتهای را معرفی کردند که فراتر از Codex است و پیشنهادات سریعتری ارائه میدهد.
پستها را به ترتیب بخوانید تا سفر یادگیری آنها را دنبال کنید.
- می ۲۰۲۳ | GitHub Copilot در درک کد شما بهتر میشود
- می ۲۰۲۳ | درون GitHub: کار با مدلهای زبان بزرگ پشت GitHub Copilot.
- ژوئن ۲۰۲۳ | چگونه درخواستهای بهتر برای GitHub Copilot بنویسیم.
- جولای ۲۰۲۳ | .. GitHub Copilot فراتر از Codex با مدل هوش مصنوعی بهبودیافته میرود
- جولای ۲۰۲۳ | راهنمای توسعهدهنده برای مهندسی درخواست و مدلهای زبان بزرگ
- سپتامبر ۲۰۲۳ | چگونه یک اپلیکیشن مدل زبان بزرگ سازمانی بسازیم: درسهایی از GitHub Copilot
همچنین میتوانید وبلاگ مهندسی آنها را برای پستهای بیشتری مانند این یکی مرور کنید که نشان میدهد چگونه این مدلها و تکنیکها برای هدایت اپلیکیشنهای واقعی به کار گرفته میشوند.
دیدیم که چرا مهندسی درخواست مهم است - حالا بیایید بفهمیم که درخواستها چگونه ساخته میشوند تا بتوانیم تکنیکهای مختلف را برای طراحی درخواستهای مؤثرتر ارزیابی کنیم.
بیایید با درخواست پایه شروع کنیم: یک ورودی متنی که بدون هیچ زمینه دیگری به مدل ارسال میشود. در اینجا یک مثال آورده شده است - وقتی چند کلمه اول سرود ملی ایالات متحده را به Completion API OpenAI ارسال میکنیم، مدل بلافاصله پاسخ را با چند خط بعدی تکمیل میکند و رفتار پیشبینی پایه را نشان میدهد.
| درخواست (ورودی) | تکمیل (خروجی) |
|---|---|
| Oh say can you see | به نظر میرسد که شما دارید متن سرود ملی ایالات متحده "The Star-Spangled Banner" را شروع میکنید. متن کامل این سرود عبارت است از ... |
حالا بیایید زمینه و دستورالعملها را به آن درخواست پایه اضافه کنیم. Chat Completion API به ما اجازه میدهد یک درخواست پیچیده را به عنوان مجموعهای از پیامها بسازیم که شامل موارد زیر است:
- جفتهای ورودی/خروجی که منعکسکننده ورودی کاربر و پاسخ دستیار هستند.
- پیام سیستمی که زمینهای برای رفتار یا شخصیت دستیار تنظیم میکند.
درخواست اکنون به شکل زیر است، جایی که توکنسازی به طور مؤثر اطلاعات مرتبط را از زمینه و مکالمه ثبت میکند. حالا تغییر زمینه سیستم میتواند به اندازه ورودیهای ارائهشده توسط کاربر بر کیفیت تکمیلها تأثیرگذار باشد.
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)در مثالهای بالا، درخواست کاربر یک پرسش متنی ساده بود که میتوان آن را به عنوان یک درخواست برای اطلاعات تفسیر کرد. با درخواستهای دستوری، میتوانیم از آن متن برای مشخص کردن یک وظیفه با جزئیات بیشتر استفاده کنیم و راهنمایی بهتری به هوش مصنوعی ارائه دهیم. در اینجا یک مثال آورده شده است:
| درخواست (ورودی) | تکمیل (خروجی) | نوع دستورالعمل |
|---|---|---|
| یک توضیح درباره جنگ داخلی بنویسید | یک پاراگراف ساده بازگردانده شد | ساده |
| یک توضیح درباره جنگ داخلی بنویسید. تاریخها و رویدادهای کلیدی را ارائه دهید و اهمیت آنها را توضیح دهید | یک پاراگراف به همراه لیستی از تاریخهای کلیدی رویدادها با توضیحات بازگردانده شد | پیچیده |
| یک توضیح درباره جنگ داخلی در یک پاراگراف بنویسید. سه نکته کلیدی با تاریخها و اهمیت آنها ارائه دهید. سه نکته دیگر با شخصیتهای تاریخی کلیدی و مشارکتهای آنها ارائه دهید. خروجی را به صورت یک فایل JSON بازگردانید | جزئیات بیشتری در یک جعبه متن بازگردانده شد، به صورت JSON قالببندی شده که میتوانید آن را کپی-پیست کنید و در صورت نیاز اعتبارسنجی کنید | پیچیده. قالببندی شده. |
در مثالهای بالا، درخواست هنوز کاملاً باز بود و به مدل زبان بزرگ اجازه میداد تصمیم بگیرد که کدام بخش از مجموعه دادههای پیشآموزشدیده مرتبط است. با الگوی طراحی محتوای اصلی، متن ورودی به دو بخش تقسیم میشود:
- یک دستورالعمل (عمل)
- محتوای مرتبط (که بر عمل تأثیر میگذارد)
در اینجا یک مثال آورده شده است که دستورالعمل "این را در دو جمله خلاصه کنید" است.
| درخواست (ورودی) | تکمیل (خروجی) |
|---|---|
| مشتری پنجمین سیاره از خورشید و بزرگترین سیاره در منظومه شمسی است. این یک غول گازی با جرمی برابر با یکهزارم جرم خورشید است، اما دو و نیم برابر جرم تمام سیارات دیگر در منظومه شمسی است. مشتری یکی از روشنترین اجرام قابل مشاهده با چشم غیرمسلح در آسمان شب است و از زمانهای باستانی توسط تمدنهای قدیمی شناخته شده است. این سیاره به نام خدای رومی مشتری نامگذاری شده است. هنگامی که از زمین مشاهده میشود، مشتری میتواند به اندازهای روشن باشد که نور منعکسشده آن سایههای قابل مشاهده ایجاد کند و به طور متوسط سومین جسم طبیعی روشن در آسمان شب پس از ماه و زهره است. این را در دو جمله کوتاه خلاصه کنید |
مشتری، پنجمین سیاره از خورشید، بزرگترین سیاره در منظومه شمسی است و به عنوان یکی از روشنترین اجرام در آسمان شب شناخته میشود. این غول گازی که به نام خدای رومی مشتری نامگذاری شده است، جرمی دو و نیم برابر جرم تمام سیارات دیگر در منظومه شمسی دارد. |
بخش محتوای اصلی میتواند به روشهای مختلفی برای هدایت دستورالعملهای مؤثرتر استفاده شود:
- مثالها - به جای اینکه به مدل بگویید با یک دستورالعمل صریح چه کاری انجام دهد، به آن مثالهایی از کاری که باید انجام دهد بدهید و اجازه دهید الگو را استنباط کند.
- اشارات - دستورالعمل را با یک "اشاره" دنبال کنید که تکمیل را آماده میکند و مدل را به سمت پاسخهای مرتبطتر هدایت میکند.
- قالبها - اینها "دستورالعملهای" قابل تکرار برای درخواستها با جاینگهدارها (متغیرها) هستند که میتوانند با دادهها برای موارد استفاده خاص سفارشی شوند.
بیایید این موارد را در عمل بررسی کنیم.
این یک روش است که در آن شما از محتوای اصلی برای "تغذیه مدل" با چند مثال از خروجی مطلوب برای یک دستورالعمل خاص استفاده میکنید و اجازه میدهید الگو برای خروجی مطلوب استنباط شود. بر اساس تعداد مثالهای ارائهشده، میتوانیم درخواست بدون مثال، درخواست با یک مثال، درخواست با چند مثال و غیره داشته باشیم.
درخواست اکنون شامل سه مؤلفه است:
- توضیح وظیفه
- چند مثال از خروجی مطلوب
- شروع یک مثال جدید (که به یک توضیح وظیفه ضمنی تبدیل میشود)
| نوع یادگیری | درخواست (ورودی) | تکمیل (خروجی) |
|---|---|---|
| بدون مثال | "خورشید میدرخشد". به اسپانیایی ترجمه کنید | "El Sol está brillando". |
| یک مثال | "خورشید میدرخشد" => ""El Sol está brillando". "روز سرد و بادی است" => |
"Es un día frío y ventoso". |
| چند مثال | بازیکن به دور پایگاهها دوید => بیسبال بازیکن یک آس زد => تنیس بازیکن یک شش زد => کریکت بازیکن یک ضربه اسلم دانک زد => |
بسکتبال |
توجه کنید که چگونه مجبور بودیم دستورالعمل صریح ("به اسپانیایی ترجمه کنید") را در درخواست بدون مثال ارائه دهیم، اما در مثال یکتایی استنباط میشود. مثال چندتایی نشان میدهد که چگونه افزودن مثالهای بیشتر به مدل اجازه میدهد استنباطهای دقیقتری بدون دستورالعملهای اضافی انجام دهد.
یک تکنیک دیگر برای استفاده از محتوای اصلی این است که به جای مثالها، اشارات ارائه دهید. در این حالت، ما به مدل یک اشاره میدهیم که با شروع کردن یک قطعه که بازتابدهنده قالب پاسخ مطلوب است، آن را در مسیر درست هدایت کنیم. مدل سپس "اشاره را میگیرد" و به همان سبک ادامه میدهد.
| تعداد اشارات | درخواست (ورودی) | تکمیل (خروجی) |
|---|---|---|
| ۰ | مشتری پنجمین سیاره از خورشید و بزرگترین سیاره در منظومه شمسی است. این یک غول گازی با جرمی برابر با یکهزارم جرم خورشید است، اما دو و نیم برابر جرم تمام سیارات دیگر در منظومه شمسی است. مشتری یکی از روشنترین اجرام قابل مشاهده با چشم غیرمسلح در آسمان شب است و از زمانهای باستانی توسط تمدنهای قدیمی شناخته شده است. این را خلاصه کنید |
مشتری بزرگترین سیاره در منظومه شمسی و پنجمین سیاره از خورشید است. این یک غول گازی است که جرمی دو و نیم برابر جرم تمام سیارات دیگر در منظومه شمسی دارد و از زمانهای باستانی شناخته شده است و در آسمان شب به راحتی قابل مشاهده است. |
| 1 | مشتری پنجمین سیاره از خورشید و بزرگترین سیاره در منظومه شمسی است. این سیاره یک غول گازی است که جرم آن یک هزارم جرم خورشید است، اما دو و نیم برابر جرم تمام سیارات دیگر در منظومه شمسی است. مشتری یکی از درخشانترین اجرام قابل مشاهده با چشم غیرمسلح در آسمان شب است و از زمانهای باستان توسط تمدنهای قدیمی شناخته شده است. خلاصه کنید چیزی که یاد گرفتیم این است که مشتری |
پنجمین سیاره از خورشید و بزرگترین سیاره در منظومه شمسی است. این سیاره یک غول گازی است که جرم آن یک هزارم جرم خورشید است، اما دو و نیم برابر جرم تمام سیارات دیگر است. این سیاره به راحتی با چشم غیرمسلح قابل مشاهده است و از زمانهای باستان شناخته شده است. |
| 2 | مشتری پنجمین سیاره از خورشید و بزرگترین سیاره در منظومه شمسی است. این سیاره یک غول گازی است که جرم آن یک هزارم جرم خورشید است، اما دو و نیم برابر جرم تمام سیارات دیگر در منظومه شمسی است. مشتری یکی از درخشانترین اجرام قابل مشاهده با چشم غیرمسلح در آسمان شب است و از زمانهای باستان توسط تمدنهای قدیمی شناخته شده است. خلاصه کنید سه نکته مهمی که یاد گرفتیم: |
1. مشتری پنجمین سیاره از خورشید و بزرگترین سیاره در منظومه شمسی است. 2. این سیاره یک غول گازی است که جرم آن یک هزارم جرم خورشید است... 3. مشتری از زمانهای باستان با چشم غیرمسلح قابل مشاهده بوده است ... |
یک قالب درخواست، دستورالعمل از پیش تعریفشدهای برای یک درخواست است که میتوان آن را ذخیره و در صورت نیاز استفاده کرد تا تجربههای کاربری منسجمتری در مقیاس بزرگ ایجاد شود. در سادهترین شکل خود، این فقط مجموعهای از نمونههای درخواست مانند این نمونه از OpenAI است که هم اجزای تعاملی درخواست (پیامهای کاربر و سیستم) و هم قالب درخواست مبتنی بر API را فراهم میکند - برای پشتیبانی از استفاده مجدد.
در شکل پیچیدهتر خود مانند این نمونه از LangChain، شامل جایگزینهایی است که میتوانند با دادههایی از منابع مختلف (ورودی کاربر، زمینه سیستم، منابع داده خارجی و غیره) جایگزین شوند تا یک درخواست به صورت پویا ایجاد شود. این امکان را فراهم میکند که کتابخانهای از درخواستهای قابل استفاده مجدد ایجاد کنیم که میتوانند برای ایجاد تجربههای کاربری منسجم به صورت برنامهریزی شده در مقیاس بزرگ استفاده شوند.
در نهایت، ارزش واقعی قالبها در توانایی ایجاد و انتشار کتابخانههای درخواست برای حوزههای کاربردی خاص نهفته است - جایی که قالب درخواست اکنون بهینهسازی شده است تا زمینه یا نمونههای خاص کاربردی را منعکس کند که پاسخها را برای مخاطبان هدف دقیقتر و مرتبطتر میکند. مخزن Prompts For Edu نمونهای عالی از این رویکرد است که کتابخانهای از درخواستها برای حوزه آموزش با تأکید بر اهداف کلیدی مانند برنامهریزی درس، طراحی برنامه درسی، آموزش دانشآموزان و غیره را گردآوری میکند.
اگر ساخت درخواست را به عنوان داشتن یک دستورالعمل (وظیفه) و یک هدف (محتوای اصلی) در نظر بگیریم، محتوای ثانویه مانند زمینه اضافی است که برای تأثیرگذاری بر خروجی به نوعی ارائه میدهیم. این میتواند شامل تنظیم پارامترها، دستورالعملهای قالببندی، طبقهبندی موضوعات و غیره باشد که به مدل کمک میکند تا پاسخ خود را برای اهداف یا انتظارات کاربر مورد نظر تنظیم کند.
برای مثال: با توجه به یک کاتالوگ دوره با متاداده گسترده (نام، توضیحات، سطح، برچسبهای متاداده، مدرس و غیره) در مورد تمام دورههای موجود در برنامه درسی:
- میتوانیم یک دستورالعمل برای "خلاصه کردن کاتالوگ دوره برای پاییز 2023" تعریف کنیم.
- میتوانیم از محتوای اصلی برای ارائه چند نمونه از خروجی مورد نظر استفاده کنیم.
- میتوانیم از محتوای ثانویه برای شناسایی 5 "برچسب" برتر مورد علاقه استفاده کنیم.
اکنون، مدل میتواند خلاصهای را در قالب نشان داده شده توسط چند نمونه ارائه دهد - اما اگر نتیجه دارای چندین برچسب باشد، میتواند 5 برچسب شناسایی شده در محتوای ثانویه را اولویتبندی کند.
اکنون که میدانیم چگونه درخواستها میتوانند ساخته شوند، میتوانیم شروع به فکر کردن در مورد نحوه طراحی آنها کنیم تا بهترین روشها را منعکس کنند. میتوانیم این را به دو بخش تقسیم کنیم - داشتن طرز فکر مناسب و اعمال تکنیکهای مناسب.
مهندسی درخواست یک فرآیند آزمون و خطا است، بنابراین سه عامل کلی راهنما را در نظر داشته باشید:
-
درک حوزه اهمیت دارد. دقت و ارتباط پاسخها تابعی از حوزه است که آن کاربرد یا کاربر در آن فعالیت میکند. از شهود و تخصص حوزه خود برای سفارشیسازی تکنیکها بیشتر استفاده کنید. به عنوان مثال، شخصیتهای خاص حوزه را در درخواستهای سیستمی خود تعریف کنید، یا از قالبهای خاص حوزه در درخواستهای کاربری خود استفاده کنید. محتوای ثانویهای ارائه دهید که زمینههای خاص حوزه را منعکس کند، یا از نشانهها و نمونههای خاص حوزه برای هدایت مدل به سمت الگوهای استفاده آشنا استفاده کنید.
-
درک مدل اهمیت دارد. میدانیم که مدلها به طور طبیعی تصادفی هستند. اما پیادهسازی مدلها نیز میتواند از نظر مجموعه دادههای آموزشی که استفاده میکنند (دانش پیشآموزش)، قابلیتهایی که ارائه میدهند (مثلاً از طریق API یا SDK) و نوع محتوایی که برای آن بهینه شدهاند (مثلاً کد در مقابل تصاویر در مقابل متن) متفاوت باشد. نقاط قوت و محدودیتهای مدلی که استفاده میکنید را درک کنید و از آن دانش برای اولویتبندی وظایف یا ساخت قالبهای سفارشی که برای قابلیتهای مدل بهینه شدهاند استفاده کنید.
-
تکرار و اعتبارسنجی اهمیت دارد. مدلها به سرعت در حال تکامل هستند و تکنیکهای مهندسی درخواست نیز همینطور. به عنوان یک متخصص حوزه، ممکن است زمینه یا معیارهای دیگری برای کاربرد خاص خود داشته باشید که ممکن است برای جامعه گستردهتر قابل اعمال نباشد. از ابزارها و تکنیکهای مهندسی درخواست برای "شروع سریع" ساخت درخواست استفاده کنید، سپس نتایج را با استفاده از شهود و تخصص حوزه خود تکرار و اعتبارسنجی کنید. بینشهای خود را ثبت کنید و یک پایگاه دانش (مثلاً کتابخانههای درخواست) ایجاد کنید که میتواند به عنوان یک خط پایه جدید توسط دیگران برای تکرار سریعتر در آینده استفاده شود.
اکنون بیایید به بهترین روشهای رایج که توسط OpenAI و متخصصان Azure OpenAI توصیه شدهاند، نگاهی بیندازیم.
| چه چیزی | چرا |
|---|---|
| ارزیابی مدلهای جدید. | نسلهای جدید مدلها احتمالاً ویژگیها و کیفیت بهتری دارند - اما ممکن است هزینههای بیشتری نیز داشته باشند. آنها را برای تأثیر ارزیابی کنید، سپس تصمیمات مهاجرتی بگیرید. |
| جدا کردن دستورالعملها و زمینه | بررسی کنید که آیا مدل/ارائهدهنده شما مرزهایی برای تمایز دستورالعملها، محتوای اصلی و ثانویه تعریف میکند یا خیر. این میتواند به مدلها کمک کند تا وزنها را به طور دقیقتر به توکنها اختصاص دهند. |
| مشخص و واضح باشید | جزئیات بیشتری در مورد زمینه مورد نظر، نتیجه، طول، قالب، سبک و غیره ارائه دهید. این کار کیفیت و انسجام پاسخها را بهبود میبخشد. دستورالعملها را در قالبهای قابل استفاده مجدد ثبت کنید. |
| توصیفی باشید، از مثالها استفاده کنید | مدلها ممکن است به رویکرد "نشان دادن و گفتن" بهتر پاسخ دهند. با رویکرد zero-shot شروع کنید که در آن فقط یک دستورالعمل ارائه میدهید (اما بدون مثال)، سپس با ارائه چند مثال از خروجی مورد نظر، رویکرد few-shot را بهبود دهید. از قیاسها استفاده کنید. |
| از نشانهها برای شروع تکمیل استفاده کنید | با دادن چند کلمه یا عبارت ابتدایی که مدل میتواند به عنوان نقطه شروع برای پاسخ استفاده کند، آن را به سمت نتیجه مطلوب هدایت کنید. |
| تکرار کنید | گاهی ممکن است نیاز باشد که به مدل چند بار دستور دهید. دستورالعملها را قبل و بعد از محتوای اصلی ارائه دهید، از یک دستورالعمل و یک نشانه استفاده کنید و غیره. تکرار و اعتبارسنجی کنید تا ببینید چه چیزی بهتر عمل میکند. |
| ترتیب اهمیت دارد | ترتیب ارائه اطلاعات به مدل ممکن است بر خروجی تأثیر بگذارد، حتی در مثالهای یادگیری، به دلیل تعصب اخیر. گزینههای مختلف را امتحان کنید تا ببینید چه چیزی بهتر عمل میکند. |
| به مدل یک "راه خروج" بدهید | به مدل یک پاسخ تکمیلی پشتیبان بدهید که در صورت عدم توانایی در انجام وظیفه به هر دلیلی، بتواند ارائه دهد. این کار میتواند احتمال تولید پاسخهای نادرست یا ساختگی توسط مدلها را کاهش دهد. |
همانند هر بهترین روش، به یاد داشته باشید که تجربه شما ممکن است متفاوت باشد بسته به مدل، وظیفه و حوزه. از اینها به عنوان نقطه شروع استفاده کنید و برای یافتن بهترین روش برای خود، تکرار کنید. فرآیند مهندسی درخواست خود را به طور مداوم ارزیابی کنید زیرا مدلها و ابزارهای جدید در دسترس قرار میگیرند، با تمرکز بر مقیاسپذیری فرآیند و کیفیت پاسخها.
تبریک! شما به پایان درس رسیدید! اکنون زمان آن است که برخی از این مفاهیم و تکنیکها را با مثالهای واقعی آزمایش کنید!
برای تکلیف ما، از یک Jupyter Notebook با تمرینهایی که میتوانید به صورت تعاملی انجام دهید استفاده خواهیم کرد. همچنین میتوانید Notebook را با سلولهای Markdown و کد خود گسترش دهید تا ایدهها و تکنیکها را به صورت مستقل بررسی کنید.
- (توصیه شده) GitHub Codespaces را راهاندازی کنید.
- (به صورت جایگزین) مخزن را به دستگاه محلی خود کلون کنید و از آن با Docker Desktop استفاده کنید.
- (به صورت جایگزین) Notebook را با محیط اجرایی Notebook مورد نظر خود باز کنید.
- فایل
.env.copyدر ریشه مخزن را به.envکپی کنید و مقادیرAZURE_OPENAI_API_KEY،AZURE_OPENAI_ENDPOINTوAZURE_OPENAI_DEPLOYMENTرا پر کنید. به بخش Learning Sandbox بازگردید تا یاد بگیرید چگونه.
- هسته اجرایی را انتخاب کنید. اگر از گزینههای 1 یا 2 استفاده میکنید، به سادگی هسته پیشفرض Python 3.10.x ارائه شده توسط کانتینر توسعه را انتخاب کنید.
شما آماده اجرای تمرینها هستید. توجه داشته باشید که در اینجا هیچ پاسخ درست و غلطی وجود ندارد - فقط با آزمون و خطا گزینهها را بررسی کنید و شهود خود را برای اینکه چه چیزی برای یک مدل و حوزه کاربردی خاص کار میکند، بسازید.
به همین دلیل، در این درس هیچ بخش راهحل کدی وجود ندارد. در عوض، Notebook دارای سلولهای Markdown با عنوان "راهحل من:" است که یک نمونه خروجی برای مرجع نشان میدهد.
کدام یک از موارد زیر یک درخواست خوب است که برخی از بهترین روشهای معقول را دنبال میکند؟
- به من تصویری از یک ماشین قرمز نشان بده
- به من تصویری از یک ماشین قرمز مدل ولوو XC90 که کنار یک صخره پارک شده و خورشید در حال غروب است نشان بده
- به من تصویری از یک ماشین قرمز مدل ولوو XC90 نشان بده
پاسخ: 2، بهترین درخواست است زیرا جزئیات "چه چیزی" را ارائه میدهد و به جزئیات میپردازد (نه فقط هر ماشینی بلکه یک مدل و نوع خاص) و همچنین محیط کلی را توصیف میکند. 3 گزینه بعدی بهتر است زیرا شامل توضیحات زیادی است.
ببینید آیا میتوانید از تکنیک "نشانه" با درخواست: جمله "به من تصویری از یک ماشین قرمز مدل ولوو و " را کامل کنید. مدل چه پاسخی میدهد و چگونه میتوانید آن را بهبود دهید؟
آیا میخواهید درباره مفاهیم مختلف مهندسی درخواست بیشتر بدانید؟ به صفحه یادگیری ادامهدار بروید تا منابع عالی دیگری در این موضوع پیدا کنید.
به درس پنجم بروید، جایی که ما به تکنیکهای پیشرفته درخواست خواهیم پرداخت!
سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفهای انسانی توصیه میشود. ما مسئولیتی در قبال سوء تفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.







