پرش به محتوای اصلی
پرش به محتوای مقاله

«نیاز به تست‌های واحد»؛ راهکار افزایش دقت مدل‌های زبانی در توابع پیچیده

·۱۹ مهر ۱۴۰۵۵ دقیقه مطالعه
راهنما
کشتی گرفتن با هوش مصنوعی برای مستندسازی: از کلی به طلایی برای ابزارهای پایتون من
کشتی گرفتن با هوش مصنوعی برای مستندسازی: از کلی به طلایی برای ابزارهای پایتون من
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

اثبات کمی (از ۳۰٪ به ۸۵٪) اثرگذاری مثال‌های ورودی-خروجی در تولید مستندات فنی؛ تغییر رویکرد از «دستور دادن» به «آموزش با نمونه» برای توابع پیچیده.

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

به گزارش وب‌سایت dev.to در ۱۱ اکتبر ۲۰۲۶، یک توسعه‌دهنده در حین مستندسازی یک کتابخانه قدیمی پایتون متوجه شد که دستورات استاندارد برای مدل‌های gpt-3.5-turbo و gpt-4 عملاً شکست می‌خورند. مدل‌ها به‌جای توضیح منطق کد، صرفاً نام توابع را با کلمات متفاوت بازنویسی می‌کردند و خروجی‌هایی تولید می‌کردند که هیچ ارزش افزوده‌ای برای برنامه‌نویس نداشت.

نوشتن مستندات معمولاً برای برنامه‌نویسان خسته‌کننده است و منجر به تلهٔ رایج «منِ آینده این کار را انجام می‌دهد» می‌شود. در این مورد خاص، توسعه‌دهنده با مخزنی از توابع کاربردی (Utility Functions) روبرو بود؛ قطعه‌کدهای کوچک و پرکاربردی که طی چندین ماه به‌سرعت نوشته شده و عمدتاً بدون مستندات رها شده بودند. هدف این بود که توابع پیچیده‌ای، مانند process_complex_csv_data(filepath, schema_config, output_dir)، بدون نیاز به غوطه‌ور شدن در کدهای داخلی در هر بار استفاده، به‌طور کامل قابل فهم شوند.

وقتی از هوش مصنوعی برای پر کردن این شکاف استفاده می‌کنیم، مدل معمولاً «پرت‌وپلاهای کلی» (Generic Fluff) تولید می‌کند؛ توصیفاتی که صرفاً بیان می‌کنند تابع چه کاری انجام می‌دهد، اما هرگز توضیح نمی‌دهند که تابع چگونه با داده‌های خاص یا حالت‌های لبه (Edge Cases) برخورد می‌کند. این وضعیت یک چرخه منفی در بهره‌وری ایجاد می‌کند: زمانی که صرف بازبینی و اصلاح خروجی مدل، از زمانی که برای نوشتن مستندات از صفر لازم است، بیشتر می‌شود. این چالش با پدیده‌ی «AI Slop» یا محتوای بی‌کیفیت تولید شده توسط هوش مصنوعی همسو است که در تحلیل‌های ما درباره‌ی بازسازی تجربه جست‌وجوی کاربر به تأثیرات آن بر دسترسی به اطلاعات دقیق پرداخته‌ایم.

همان‌طور که در تحلیل‌های قبلی ما درباره‌ی مهندسی پرامپت اشاره کردیم، مدل‌های زبانی بدون بستر (Context) دقیق، تمایل به حدس زدن دارند.

شکست دستورات کلی

تلاش‌های اولیه با دستوراتی ساده مثل «یک docstring به سبک گوگل تولید کن»، خروجی‌هایی داشت که از نظر فنی درست اما از نظر کاربردی بی‌فایده بودند. توسعه‌دهنده برای تست این پرامپت‌ها از محیط Playground شرکت OpenAI و اسکریپت‌های مختلف استفاده کرد.

برای تابعی که طراحی شده بود تا رشته‌ها را برای جست‌وجو نرمال کند — و از Type Hintهای پایتون ۳.۹ به بالا و ماژول re استفاده می‌کرد — مدل صرفاً نوشت: «این تابع رشته را برای اهداف جست‌وجو نرمال می‌کند». کد مورد نظر به شرح زیر بود:

import re
def normalize_string_for_search(text: str, lower_case: bool = True, strip_punct: bool = True) -> str:
    if lower_case:
        text = text.lower()
    if strip_punct:
        text = re.sub(r'[^\w\s]', '', text)
    return text

این رویکرد شکست خورد زیرا مدل نمی‌توانست قصد برنامه‌نویس یا تأثیر دقیق کد را فراتر از نحو (Syntax) سطحی آن استنباط کند. مدل توضیح نداد که چه نوع علائم نگارشی حذف می‌شوند یا خروجی برای رشته‌ای مانند "Hello, World!" با تنظیمات پیش‌فرض چه خواهد بود. حتی ارتقا به gpt-4 تنها بهبودهای جزئی ایجاد کرد، زیرا مدل همچنان در ارائه مثال‌های کاربردی یا شناسایی حالت‌های لبه بدون راهنمایی خارجی ناتوان بود. توسعه‌دهنده چهار ساعت را طی دو شب با امتحان کردن ترکیباتی مثل «دقیق‌تر باش!» و «مثل یک انسان فکر کن!» تلف کرد، اما نتیجه‌ای نگرفت.

جهش با رویکرد مثال‌محور

راهکار زمانی پیدا شد که با هوش مصنوعی مانند یک برنامه‌نویس جونیور برخورد شد که به تعریف دقیقی از «موفقیت» نیاز دارد. استراتژی تغییر کرد به ارائه مثال‌های عینی از رفتار مورد انتظار؛ در واقع ایجاد «تست‌های واحد برای مستندات».

با استفاده از مدل gpt-4-0125-preview از طریق API (نسخه ۲۰۲۴-۰۵-۱۵)، ساختار جدید پرامپت شامل موارد زیر شد:

  • تعریف نقش (Persona): «تو یک توسعه‌دهنده خبره پایتون هستی که وظیفه نوشتن docstringهای جامع به سبک گوگل را دارد».
  • الزامات سخت‌گیرانه: رعایت فرمت گوگل، توضیح دقیق پارامترها، مقادیر بازگشتی و ارائه حداقل دو مثال کاربردی متمایز که رفتار تابع و حالت‌های لبه را نشان دهد.
  • جفت‌های داده‌ای عینی: لیست کردن صریح ورودی‌ها و خروجی‌های مورد انتظار برای آموزش مدل درباره رفتار تابع:
    • text="Hello, World!", lower_case=True, strip_punct=True $\rightarrow$ "hello world"
    • text="AI & ML rocks!", lower_case=False, strip_punct=True $\rightarrow$ "AI ML rocks"
    • text="What's up, Doc?", lower_case=True, strip_punct=False $\rightarrow$ "what's up, doc?"

طبق اعلام نویسنده در dev.to، این روش کارایی مستندات تولید شده را از حدود ۳۰٪ به ۸۵٪ رساند. خروجی‌ها اکنون دقیق بودند و مثلاً حذف علائم نگارشی را به‌صورت «کاراکترهای غیر الفبایی و غیر فضای خالی» توصیف می‌کردند و شامل مثال‌های قابل اجرا با علامت >>> بودند.

تغییر پارادایم تعامل با مدل

این تجربه ثابت می‌کند که مدل زبانی بزرگ (LLM) — مثل کتابخانه‌داری که میلیاردها صفحه را خوانده و حالا با همان لحن کتاب‌ها جواب می‌دهد — یک مولد جادویی نیست، بلکه ابزاری است که خروجی‌اش توسط بستر ارائه شده محدود می‌شود. برای توابع پیچیده، مدل نمی‌تواند «چرایی» پشت کد را حدس بزند؛ این موضوع باید به او گفته شود.

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

این رویکرد، مدل را از یک نویسنده ناقص و خودمختار به یک کمک‌خلبان (Co-pilot) بسیار مؤثر تبدیل می‌کند. این کار بار بازبینی دستی را کاهش داده و تضمین می‌کند که کدهای قدیمی و به‌هم‌ریخته — مانند فایل utils.py ذکر شده در گزارش — سرانجام مستنداتی را که نیاز دارند دریافت کنند، بدون اینکه نیاز به هفته‌ها کار دستی باشد.

برای پیاده‌سازی این روش، توسعه‌دهندگان باید از درخواست «نوشتن یک docstring» دست بردارند و به‌جای آن بخواهند که مدل «این رفتارهای خاص را در یک docstring بگنجاند».

گام بعدی شما

  • به‌جای درخواست «نوشتن مستندات»، لیستی از ۳ مورد ورودی و خروجی (Input/Output) را به پرامپت اضافه کنید.
  • از مدل بخواهید برای هر تابع، یک «حالت لبه» (Edge Case) را شناسایی و در مستندات ذکر کند.
  • پرامپت‌های خود را با تعریف یک نقش تخصصی (Expert Persona) بازنویسی کنید.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است — به تحلیل ما درباره‌ی تراشه‌های Blackwell مراجعه کنید.

چرا این موضوع مهم است؟

این متدولوژی بار کاری بازبینی مستندات را به‌شدت کاهش می‌دهد و بر اساس تجربه توسعه‌دهندگان، نرخ خطای مستندات تولیدی را به شدت پایین می‌آورد. اعتماد به خروجی مدل در این حالت از «حدس» به «تأیید بر اساس نمونه» تغییر می‌کند.

تأثیر برای ایران

برای برنامه‌نویسان ایرانی که در پروژه‌های Legacy و کدهای قدیمی کار می‌کنند، این روش راهکاری سریع برای مستندسازی بدون نیاز به هزینه‌های بالای APIهای پیشرفته است.

·نگاه ما
تحریریه دات‌هوش

این یافته نشان می‌دهد که مدل‌های زبانی در مواجهه با کدهای کاربردی (Utility Code)، دچار سوگیری «توصیف سطحی» می‌شوند. در واقع، مدل‌ها تمایل دارند ساختار نحوی (Syntax) را به جای منطق عملیاتی (Semantics) گزارش کنند. انتقال از دستورات توصیفی به داده‌های نمونه، در واقع نوعی Grounding سریع در لحظه است که نیاز به Fine-tuning را برای کارهای کوچک از بین می‌برد.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.