تصور کنید کدی را به هوش مصنوعی میسپارید تا بنویسد و سپس از همان مدل میخواهید آن را تصحیح کند؛ در واقع شما دارید از یک دانشآموز میخواهید برگهٔ امتحانی خودش را نمره دهد. این چرخهٔ بسته باعث میشود مدل به جای حل مسئله، صرفاً پاسخهای مورد انتظار را تقلید کند. این پدیده که «اثر فتوکپی» نامیده میشود، توسط یک توسعهدهنده دانشجو در هالیفاکس کشف شد که برای نوشتن و تأیید کدها به یک هوش مصنوعی دوردست (Remote) متکی بود.
سهشنبه گذشته، در حالی که این توسعهدهنده روی یک آزمایشگاه ۴۰ خطی برای نرمالسازی نامها با یک فایل CSV نامرتب و ضربالاجلی نزدیک کار میکرد، با یک سؤال حیاتی روبرو شد: اگر پاسخ از ماشینی میآید که متعلق به من نیست، آیا من در حال تحویل یک «راه حل» هستم یا صرفاً یک پاراگراف مودبانه که زیر یک رشتهٔ دمو، شبیه به راه حل به نظر میرسد؟ این مورد نشان میدهد که اگر مدل به کلید پاسخ دسترسی داشته باشد، خروجی او دیگر یک منطق واقعی نیست. این مطالعهٔ موردی ثابت میکند که چگونه یک سیستم «شاهد» میتواند فرآیند پیشنویس را از فرآیند ارزیابی جدا کند تا اطمینان حاصل شود که منطق واقعی به کار گرفته شده است.
این چالش در حالی رخ میدهد که برنامهنویسان بهجای استفاده از توکنهای پولی — که میتواند یک آزمایشگاه دو ساعته را به یک شانه بالا انداختن تبدیل کند — به سمت سرورهای رایگان میروند و اغلب کل تکالیف خود را در پرامپتها میچسبانند. بحثهای عمومی در این باره شدید است: برخی ادعا میکنند مدلها در حال حاضر بهتر از انسانها کد میزنند، در حالی که برخی دیگر میپرسند آیا این ابزارها صرفاً ما را تنبلتر کردهاند؟ وقتی مدل در جای دیگری میزبانی میشود، تنها مدرکی که یک توسعهدهنده میتواند به آن اعتماد کند، یک فیکسچر محلی است. در اینجا «قیاس یادداشت چسبان» صدق میکند: یک مدل دوردست شبیه به یک دستگاه فتوکپی در ساختمانی دیگر است. شما میتوانید صفحهای را برایش بفرستید، اما نباید کلید پاسخ را هم ارسال کنید و بعد از اینکه صفحهٔ بازگشتی شبیه به کلید بود، تشویقش کنید.
سازوکار آزمایشگاه «شاهد»
برای حل این مشکل، این توسعهدهنده سیستمی محلی با استفاده از پایتون ۳.۱۱ (Python 3.11)، کتابخانه استاندارد و یک ترمینال پیاده کرد. او عمداً از pip install یا نوتبوکها اجتناب کرد تا بازتولید کد برای هر کسی که پایتون ۳.۱۱ یا ۳.۱۲ دارد، تضمین شود. این سیستم یک مرز سخت بین هوش مصنوعی دوردست و دادههای ارزیابی از طریق این اجزای اصلی ایجاد میکند:
- فیکسچرهای پنهان (Hidden Fixtures): فایلی به نام
fixtures.jsonکه حاوی «کلید پاسخها» است و هرگز از دیسک محلی خارج نمیشود. این امر تضمین میکند که سمت دوردست هرگز «تله» را نبیند. - انتقال محدود (Constrained Transport): یک تابع واحد که درخواست پیشنویس را به مدل دوردست میفرستد. در این آزمایشگاه، این تابع یک جایگزین محلی است که یک پیشنویس عجولانه (strip + lower) را تقلید میکند، اما میتوان آن را با یک انتقال واقعی به یک سرور رایگان جایگزین کرد.
- لاگ شاهد (Witness Log): فایلی به نام
witness.jsonlکه هشهای SHA-256 پرامپت و کد حاصل را به همراه لیستی از شناسههای (ID) مواردی که پاس شده یا شکست خوردهاند، ثبت میکند. - قانون کد اخلاقی: یک قانون سختگیرانه که طبق آن دادههای دوره و نامهای لیست کاربران روی لپتاپ میمانند. سمت دوردست اجازه دارد یک رشتهٔ دمو را ببیند، اما هرگز نباید به لیست واقعی دسترسی داشته باشد.
جزئیات فنی پیادهسازی
این سیستم بر پایه دو فایل اصلی میچرخد. فایل اول fixtures.json است که شامل مواردی است که مدل باید بدون دیدن آنها پاس کند. این موارد عبارتند از:
- شناسه "demo": ورودی "Ada Lovelace"، خروجی مورد انتظار "ada lovelace". این همان مسیر سادهای است که پرامپت از قبل لو داده است.
- شناسه "double_space": ورودی "Ada Lovelace"، خروجی مورد انتظار "ada lovelace". این مورد دقیقاً باگ کلید اتصال در فضای سفید داخلی را هدف قرار میدهد.
- شناسه "empty": ورودی ""، خروجی مورد انتظار "". این تضمین میکند که رشتههای خالی خالی بمانند و به
Noneیا "none" تبدیل نشوند.
فایل دوم lab_witness.py است که اجرای کد را مدیریت میکند. این برنامه از کتابخانه hashlib برای ایجاد هشهای ۱۶ کاراکتری SHA-256 از پرامپت و پیشنویس استفاده میکند. این کار یک رکورد دائمی روی دیسک ایجاد میکند — یک فایل شاهد — که برخلاف نام مدلها یا سقف توکنها، منقضی نمیشود. تابع remote_draft به گونهای طراحی شده که عمداً ضعیف باشد؛ این تابع بررسی میکند که آیا پرامپت حاوی رشتهٔ خاص "Write a Python function named normalize_name" است یا خیر و سپس یک پیادهسازی ابتدایی name.strip().lower() را برمیگرداند.
تلهٔ «کلید اتصال»
تمرکز این آزمایشگاه روی یک تابع نرمالسازی نام بود که طراحی شده بود نامهای نمایشی را به «کلیدهای اتصال» (Join Keys) تبدیل کند. توسعهدهنده از MonkeyCode — یک ابزار متنباز دانشجویی که دسترسی رایگان به مدلها و گزینه سرور رایگان ارائه میدهد — به عنوان موتور پیشنویس دوردست استفاده کرد. این ابزار مشخصاً به این دلیل انتخاب شد که به دانشجویان اجازه میدهد بدون «آتش زدن پولها»، تکرار و اصلاح کد را انجام دهند.
سیستم سه سناریوی خاص را برای افشای نقاط ضعف مدل آزمایش کرد:
۱. مسیر ساده (Happy Path): تبدیل "Ada Lovelace" به "ada lovelace". این همان رشتهٔ دمویی است که در پرامپت ارائه شده و تقریباً هر مدلی آن را پاس میکند، زیرا فتوکپی صرفاً مثال خود پرامپت را کپی میکند.
۲. رشته خالی: یک ورودی خالی ("") که باید خالی بماند. این مورد اغلب از پیادهسازیهای ساده .strip() جان سالم به در میبرد، زیرا اجرای .strip() روی یک رشته خالی، همچنان یک رشته خالی است.
۳. باگ کلید اتصال (Join-Key Bug): ورودی "Ada Lovelace" (با یک فاصله دوگانه). این نقطهٔ شکست حیاتی است. یک دستور ساده .strip().lower() در اینجا شکست میخورد زیرا فاصلههای داخلی را جمع نمیکند (collapse نمیکند)، در حالی که این یک واقعیت رایج در لیستهای دانشجویان در یک روز سهشنبه معمولی است.
اجرا و نتایج
برنامهٔ شاهد از تابع exec برای اجرای کد تولید شده توسط AI در محیط محلی استفاده میکند. نویسنده صراحتاً هشدار میدهد که exec یک «چاقوی آموزشی» است، نه یک مرز امنیتی؛ بنابراین هرگز نباید به سمت اینترنت نشانه رود یا خارج از پوشهای که کاربر حاضر است آن را حذف کند، استفاده شود.
هنگام اجرا، خروجی تله را آشکار میکند. پیشنویس کامل به نظر میرسد زیرا مورد دمو و رشته خالی را پاس کرده است. با این حال، نتایج نشان میدهد:
- PASS demo: given='Ada Lovelace' expected='ada lovelace' actual='ada lovelace'
- PASS empty: given='' expected='' actual=''
- FAIL double_space: given='Ada Lovelace' expected='ada lovelace' actual='ada Lovelace'
این شکست ثابت میکند که یک رشتهٔ دمو، ارزیاب بسیار بدی است. پیشنویس «شرور» نبود، اما «بهطور حداقلی مفید» (local-minimum helpful) بود. اگر توسعهدهنده در اولین خط سبز متوقف میشد، کلید اتصالی را تحویل میداد که باعث تکرار افراد در مجموعه داده نهایی میشد.
جلوگیری از نشت پرامپت
بخش کلیدی این تجربه، سناریوی «پرامپت لو رفته» بود. توسعهدهنده تابعی به نام build_prompt_leaked ساخت که صراحتاً fixtures.json را در پرامپت میگنجاند: "Hidden cases: " + json.dumps(fixtures). این نسخهٔ «فتوکپی با کلید پاسخ» است.
اگر توسعهدهندهای فیکسچرها را در پرامپت بچسباند تا نمره قبولی بگیرد، سیستم شاهد از طریق هش پرامپت، این تغییر را تشخیص میدهد. هنگامی که سمت دوردست مورد double_space را میبیند، یک «پاس» دیگر به معنای درک مدل از کلیدهای اتصال نیست؛ بلکه به معنای آن است که برگه امتحان به ماشین نشان داده شده است. این امر فرآیند را از یک ارزیابی واقعی به یک «اسپویل» تبدیل میکند. شاهد در اینجا مانند یک ناظر راهرو عمل میکند و تضمین میکند که تابع دوردست میتواند پیشنویس بزند، اما نمیتواند مهر تأیید نهایی را بزند.
تحلیل: مالکیت ارزیابی
این تغییر در گردش کار، «منبع حقیقت» را از لاگهای فروشنده AI به دیسک محلی توسعهدهنده بازمیگرداند. این موضوع حیاتی است زیرا برخورد با لاگ فروشنده به عنوان یک نوتبوک، منجر به گم شدن رشته افکار میشود وقتی که چت ناپدید میگردد. برای یک کدنویس متوسط، این یعنی تفاوت بین تحویل تابعی که نمیتواند در ساعت اداری (office hour) توضیح دهد و تابعی که را به شدت تحت فشار تست کرده است.
این رویکرد این فرض را به چالش میکشد که افزودن «رشتههای دمو» بیشتر در پرامپت منجر به استواری بیشتر میشود. در واقع، افزودن مثالها تا حدی که مدل یک استایل را حفظ کند، فقط یک اسپویل طولانیتر است. فیکسچری که توسعهدهنده از ارسال آن خودداری میکند، نوع متفاوتی از تست است — تستی که دقیقاً شبیه به روشی است که یک مصحح انسانی تکلیف را نمره میدهد.
با مالکیت «ورودیهای زشت» و لاگها، توسعهدهنده مالکیت فکری راه حل را حفظ میکند. AI به عنوان یک ابزار پیشنویس مفید — یک «فتوکپی» — باقی میماند، اما اختیار عمل به عنوان داور از او گرفته میشود. توسعهدهنده مالک جملهای است که اگر دستیار آموزشی (TA) پرسید چرا دو فاصله اهمیت دارد، پاسخ دهد.
درسها و محدودیتها
این رویکرد مرزهای مشخصی دارد. نویسنده اشاره میکند که این روش نباید در امتحانات تکلیفی (take-home exams) استفاده شود اگر سرفصل دروس استفاده از مدلهای خارجی را ممنوع کرده باشد. علاوه بر این، نامهای واقعی دانشجویان، ایمیلها یا نشانههای سلامتی هرگز نباید به هیچ باکس دوردستی، چه رایگان و چه غیر آن، ارسال شوند. دسترسی رایگان یک در است، نه یک قرارداد تضمین سطح خدمات (SLA) تولیدی.
برای کسانی که از قبل یک مجموعه تست محلی دارند و هرگز تستها را در مدل نمیچسبانند، این «تئاتر» غیرضروری است — آنها از قبل مالک ارزیابی خود هستند. با این حال، برای دانشجویی که تقریباً تسلیم وسوسه پیشنویس دوردست میشود، این سیستم یک شبکه ایمنی فراهم میکند.
برای تست این موضوع توسط خودتان، سعی کنید یک «فاصله نشکن» ("Ada\u00a0Lovelace") به فیکسچرهای محلی خود اضافه کنید و تصمیم بگیرید که کلید اتصال شما چه باید باشد. قبل از اجرا، نتیجه را پیشبینی کنید. اگر پیشنویس شما همچنان دمو را پاس کند اما در این مورد جدید شکست بخورد، شاهد کارش را درست انجام داده است. اگر آن را با لو دادن مورد در پرامپت «اصلاح» کنید، شاهد یک پاس را ثبت میکند، اما شما درس اشتباهی به خودتان دادهاید.
من یک دانشجو هستم. ابزارهایی را دوست دارم که به من اجازه دهند بدون آتش زدن پولها، تکرار کنم. اگر میخواهید همان تفکیکی را امتحان کنید که من در این مطالعه موردی استفاده کردم — شاهد محلی، پیشنویس دوردست، فیکسچرهایی که هرگز دیسک را ترک نمیکنند — دسترسی رایگان به مدلها و گزینه سرور رایگان MonkeyCode همان سمت دوردستی است که من به آن تابع انتقال متصل کردم. ورودیهای زشت را روی لپتاپ خود نگه دارید. تمام تکلیف همین است.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو