راهنمای مهندسی پرامپت برای برنامهنویسان
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۳/۰۶ ۲۰:۲۳
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
NaN (مخفف Not a Number به معنی "عدد نیست") را برمیگرداند. کد به شرح زیر است: [کد را اینجا قرار دهید]. این تابع برای آرایهای از اعداد مانند [1, 2, 3] باید یک عدد (مجموع) را خروجی دهد، اما من NaN دریافت میکنم. دلیل این خطا (Bug) چه میتواند باشد؟" این نوع پرسش، زبان برنامهنویسی، رفتار مورد انتظار، خروجی نادرست مشاهده شده و کد مرتبط را مشخص میکند که همگی اطلاعاتی حیاتی هستند. ارائه یک زمینه ساختاریافته (شامل کد، خطا، نتیجه مورد انتظار و اقداماتی که انجام دادهاید)، نقطه شروع قویای را برای هوش مصنوعی فراهم میآورد.total را در هر مرحله دنبال کن. این مقدار بهدرستی جمع نمیشود – منطق در کجا دچار مشکل شده است؟" این نمونهای از پرسشنویسی "اشکالزدایی اردک لاستیکی" (Rubber Duck Debugging) است که در آن از هوش مصنوعی خواسته میشود تا فرایند اشکالزدایی انسانی را با استفاده از پرینتها (Prints) یا یک دیباگر (Debugger) شبیهسازی کند. چنین پرسشهایی اغلب مسائل ظریفی مانند ریست (Reset) نشدن متغیرها (Variables) یا منطق شرطی (Conditional Logic) نادرست را آشکار میکنند، زیرا هوش مصنوعی وضعیت (State) را در هر مرحله تشریح خواهد کرد. اگر به بخش خاصی از کد مشکوک هستید، میتوانید بر آن تمرکز کنید: "توضیح بده فراخوانی filter در اینجا چه کاری انجام میدهد و آیا ممکن است آیتمهای بیشتری را از آنچه باید، حذف کند؟" درگیر کردن هوش مصنوعی در نقش توضیحی میتواند در فرایند توضیح، خطا را آشکار سازد.TypeError دریافت میکنید، سعی کنید آن را با چند خط کد که میتوانید به اشتراک بگذارید، تکثیر کنید. هدف، جداسازی خطا با حداقل کد است. میتوانید هوش مصنوعی را در این فرایند مشارکت دهید و بگویید: "این یک مثال ساده شده است که هنوز خطا را فعال میکند [قطعه کد را وارد کنید]. چرا این خطا رخ میدهد؟" با سادهسازی، نویز (Noise) را حذف کرده و به هوش مصنوعی کمک میکنید تا مشکل را دقیقاً شناسایی کند.// BUG: returns NaN, fix this function بنویسید و مشاهده کنید که چگونه بهطور خودکار تکمیل میشود – اما بهطور کلی، چت تعاملی توضیحات کاملتری را ارائه میدهد. الگوی پیگیری دیگر این است: اگر هوش مصنوعی یک راهحل ارائه داد اما شما دلیل آن را متوجه نشدید، بپرسید "میتوانید توضیح دهید چرا آن تغییر مشکل را حل میکند؟" به این ترتیب، هم برای دفعات بعدی یاد میگیرید و هم صحت استدلال هوش مصنوعی را دو بار بررسی میکنید.// Buggy function: converts array of users to a map by ID
function mapUsersById(users) {
const userMap = {};
for (let i = 0; i <= users.length; i++) {
// Note: using <= will go out of bounds on the last iteration
const user = users[i];
userMap[user.id] = user;
}
return userMap;
}
// Example usage:
const result = mapUsersById([{ id: 1, name: "Alice" }]);i <= users.length بهجای i < users.length استفاده میکند. این باعث میشود که users[i] در آخرین تکرار undefined باشد، که به احتمال زیاد منجر به خطای زمان اجرا (Runtime Error) میشود (مثلاً تلاش برای دسترسی به ویژگی id از undefined).mapUsersById من کار نمیکند؟"id دارد"). هوش مصنوعی خطای واقعی را شناسایی نکرد. این نوع پاسخی است که وقتی سؤال مبهم باشد، دریافت میکنید – مدل فقط میتواند نکات اشکالزدایی متداول را تکرار کند. از دیدگاه یک توسعهدهنده داتنت (Microsoft .NET), این پاسخ بسیار غیرمفید است، زیرا به اشتباه واقعی اشاره نمیکند. فقدان زمینه و جزئیات در پرسش منجر به پاسخی عمومی میشود (در واقع، معادل هوش مصنوعی عبارت "آیا سعی کردی آن را خاموش و روشن کنی؟").mapUsersById دارم که باید یک آرایه از اشیای کاربر را به یک نگاشت (شیء) که توسط شناسه کاربر کلیدگذاری شده است، تبدیل کند. با این حال، وقتی آن را اجرا میکنم، خطا میدهد. بهعنوان مثال، وقتی [{id: 1, name: "Alice"}] را به آن ارسال میکنم، TypeError: Cannot read property 'id' of undefined دریافت میکنم. کد تابع به شرح زیر است:function mapUsersById(users) {
const userMap = {};
for (let i = 0; i <= users.length; i++) {
const user = users[i];
userMap[user.id] = user;
}
return userMap;
}{"1": {id: 1, name: "Alice"}} را برگرداند. خطا چیست و چگونه میتوانم آن را رفع کنم؟"for (let i = 0; i < users.length; i++) {
const user = users[i];
userMap[user.id] = user;
}i برای اولین (و تنها) عنصر، 0 خواهد بود و سپس حلقه متوقف میشود. با این تغییر، تابع شما دیگر با یک user تعریف نشده مواجه نخواهد شد و باید همانطور که انتظار میرود کار کند و برای ورودی داده شده، {"1": {id: 1, name: "Alice"}} را برگرداند."<= در حلقه) را شناسایی میکند و توضیح میدهد که چرا باعث undefined شدن user میشود. سپس راهحل صحیح کد (i < users.length) را ارائه میدهد و نتیجه مورد انتظار را تأیید میکند. پرسشنویسی بهبودیافته موفق بود زیرا از اصول پیروی کرد: زبان (JavaScript) را مشخص کرد، هدف تابع را توضیح داد، پیام خطای دقیق و یک ورودی نمونه را شامل شد و حتی قطعه کد مورد نظر را ارائه داد. توجه داشته باشید که هوش مصنوعی چگونه از پیام خطا بهعنوان سرنخ برای تمرکز بر محدودههای حلقه استفاده کرد – یک پرسش هدفمند هوش مصنوعی را قادر ساخت تا در حل مسئله واقعی مشارکت کند، و بهطور مؤثر شبیهسازی کرد که یک دیباگر (Debugger) انسانی چگونه فکر میکند: "از کجا میتواند undefined آمده باشد؟ احتمالاً از ایندکسگذاری (Indexing) حلقه." این یک نمایش عینی از مزایای پرسشنویسی جزئی است.TypeError: cannot read property 'foo' of undefined در این کد چیست؟" به همراه کد. مدل ممکن است چند سناریو (مثلاً شیء (Object) مقداردهی اولیه نشده، شرایط رقابتی (Race Condition)، دامنه متغیر (Variable Scoping) اشتباه و غیره) را فهرست کند. این میتواند به شما زوایای بررسیای را بدهد که به آنها فکر نکردهاید. این مانند طوفان فکری (Brainstorming) با یک همکار است.null و غیره) دست یابد. این هم برای اشکالزدایی و هم برای تولید تستها جهت اطمینان از استحکام آینده (Future Robustness) مفید است.null) را نیز آشکار کند که ممکن است مفید باشند.reduce برای ساخت یک نقشه (Map)) را کشف کنید که قبلاً از آن استفاده نکرده بودید. این یکی از دلایل درخواست توضیحات است: پاسخ را به یک آموزش کوچک تبدیل میکند و درک شما را از بهترین شیوهها تقویت میکند.SearchBar با یک ورودی که استیت searchQuery را بهروزرسانی میکند، ایجاد کنید." تقسیم یک قابلیت به بخشهای کوچکتر، تضمین میکند که هر پرامپت مشخص و پاسخهای هوش مصنوعی قابل مدیریت باشد و روند توسعه تکراری (iterative development) را شبیهسازی میکند.UserList موجود است (کد...). اکنون یک کامپوننت ProductList مشابه آن ایجاد کنید، اما شامل یک نوار جستجو باشد." هوش مصنوعی الگوها (مانند استفاده از کتابخانههای خاص یا قراردادهای سبکنویسی) را تشخیص داده و آنها را اعمال خواهد کرد. باز نگه داشتن فایلهای مرتبط یا ارجاع به آنها در پرامپت، زمینهای را فراهم میکند که منجر به پیشنهادهای کدهای خاصتر و سازگارتر با پروژه میشود. همچنین، اگر پروژه شما از یک سبک کدنویسی یا معماری خاص (مانند Redux برای مدیریت استیت یا یک فریمورک (framework) CSS خاص) استفاده میکند، آن را ذکر کنید، مثلاً: "ما از Redux برای مدیریت استیت استفاده میکنیم – استیت جستجو را در Redاکس استور (Redux store) ادغام کنید." یک مدل آموزشدیده، کدی را تولید خواهد کرد که با الگوهای Redux سازگار است. این کار در واقع به هوش مصنوعی میآموزد که محیط پروژه شما چگونه است تا بتواند خروجی را متناسب با آن تنظیم کند. حتی اگر چیزی را از ابتدا شروع میکنید اما رویکرد ترجیحی دارید، میتوانید آن را نیز ذکر کنید: "من میخواهم این را با استفاده از سبک برنامهنویسی تابعی (functional programming style) پیادهسازی کنم (بدون استیت خارجی، با استفاده از متدهای آرایه)." یا "اطمینان حاصل کنید که الگوی MVC را دنبال کرده و منطق را در کنترلر (controller) قرار دهید، نه در ویو (view)."// TODO: Validate the request payload (ensure name and email are provided) و سپس خط بعدی را شروع کنید. Copilot اغلب قصد شما را درک کرده و یک بلوک کد برای انجام آن اعتبارسنجی (validation) تولید میکند. این روش مؤثر است زیرا کامنت شما عملاً یک پرامپت زبان طبیعی (natural language prompt) است. با این حال، همیشه آماده باشید تا کد تولید شده را در صورت سوءتفسیر هوش مصنوعی ویرایش کنید.formatPrice(amount) در جاوااسکریپت (JavaScript) پیادهسازی کنید که یک عدد (مانند 2.5) را میگیرد و یک رشته (string) قالببندی شده به دلار آمریکا (مانند '$2.50') را برمیگرداند. به عنوان مثال، formatPrice(2.5) باید '$2.50' را برگرداند." با ارائه این مثال، هوش مصنوعی را مجبور میکنید تابعی سازگار با آن تولید کند. بدون مثال، هوش مصنوعی ممکن است قالببندی یا ارز دیگری را فرض کند که میتواند تفاوت ظریفی اما مهم باشد. در یک محیط وب (web context): "یک میانافزار (middleware) اکسپرس پیادهسازی کنید که درخواستها را ثبت میکند. به عنوان مثال، یک درخواست GET به /users باید 'GET /users' را در کنسول (console) ثبت کند." این امر خروجی مورد انتظار را شفاف میکند.array filter استفاده کنید." یا "آیا میتوانید کامپوننت تولید شده را بازسازی کنید تا از React Hooks برای استیت به جای یک کامپوننت کلاس (class component) استفاده کند؟ پایگاه کد ما همگی کامپوننتهای تابعی هستند." همچنین میتوانید محدودیتهای جدیدی اضافه کنید: "همچنین، اطمینان حاصل کنید که تابع در زمان O(n) یا بهتر اجرا میشود، زیرا n میتواند بزرگ باشد." این پرامپتنویسی تکراری بسیار قدرتمند است. نکته مهم این است که پس از یک بار تلاش دست از کار نکشید. مشخص کنید که در پرامپت چه چیزی کمبود داشت یا به اشتباه درک شد و آن را شفاف کنید. این جوهره مهندسی پرامپت است – هر تغییر میتواند مدل را به آنچه در ذهن دارید نزدیکتر کند.ProductList ایجاد کنید که لیستی از محصولات را نمایش میدهد و شامل یک ورودی متنی برای فیلتر کردن محصولات بر اساس نام است. این کامپوننت باید: آرایهای از محصولات را از /api/products دریافت کند (فرض کنید یک آرایه JSON از {id, name, ...} برمیگرداند)، آنها را در استیت ذخیره کند، و به کاربر اجازه دهد تا در یک کادر جستجو تایپ کند تا محصولات نمایش داده شده را بر اساس نام فیلتر کند (مطابقت بدون حساسیت به حروف بزرگ و کوچک). لیست فیلتر شده را در یک ساده با نام محصولات نمایش دهید. شامل مدیریت خطای اولیه (مانند نمایش پیام خطا در صورت عدم موفقیت فراخوانی API) و یک استیت بارگذاری (loading state) در حین دریافت اطلاعات باشد."ProductList تولید میکند که شامل: وارد کردن React, useState, useEffect است؛ استیتهایی برای products, search, loading, error تعریف میکند؛ از useEffect برای دریافت محصولات از /api/products به صورت ناهمزمان (async) استفاده میکند، شامل مدیریت خطا و استیت بارگذاری است؛ تابعی به نام handleSearchChange برای بهروزرسانی استیت جستجو دارد؛ محصولات را بر اساس عبارت جستجو (بدون حساسیت به حروف بزرگ و کوچک) فیلتر میکند؛ و در نهایت، رندر (render) کامپوننت شامل نمایش استیتهای بارگذاری و خطا، یک input برای جستجو، و یک ul برای نمایش محصولات فیلتر شده است. (احتمالاً همراه با کامنتهایی (comments) در کد که هر بخش را توضیح میدهند، اگر درخواست شده باشد.)const [sortOrder, setSortOrder] = useState('asc'); و یک ورودی select برای sortOrder و مرتبسازی filteredProducts قبل از رندر: const sortedProducts = [...filteredProducts].sort((a, b) => { if (sortOrder === 'asc') return a.name.localeCompare(b.name); else return b.name.localeCompare(a.name); }); (به علاوه رابط کاربری (UI) منوی کشویی)./**
* Returns the nth Fibonacci number.
* @param {number} n - The position in Fibonacci sequence (0-indexed).
* @returns {number} The nth Fibonacci number.
* * Example: fibonacci(5) -> 5 (sequence: 0,1,1,2,3,5,…)
*/
function fibonacci(n) {
// ... implementation
}