Prompt Engineering

عیب‌یابی و رفع مشکلات شکست‌های فراخوانی تابع در مدل‌های زبانی بزرگ (LLM) تولیدی

انتقال مدل‌های زبانی بزرگ (LLM) از مرحله نمونه‌سازی به محیط تولید، مجموعه‌ای جدید از چالش‌ها را به ویژه هنگام استفاده از فراخوانی تابع برای پیوند هوش مصنوعی مولد با منطق نرم‌افزاری قطعی ایجاد می‌کند. اگرچه وعده استخراج داده‌های ساختاریافته از طریق فراخوانی‌های API جذاب است، اما واقعیت اغلب با مواجهه با JSON نامعتبر، آرگومان‌های توهمی (hallucinated) و عدم تطابق طرحواره همراه است. این مقاله رایج‌ترین حالت‌های شکست در محیط‌های تولید را بررسی کرده و راهبردهای عملی برای کاهش آن‌ها ارائه می‌دهد.

قاتل خاموش: خروجی JSON نامعتبر

شایع‌ترین نقطه شکست در پایپ‌لاین‌های فراخوانی تابع، ناتوانی مدل در تولید JSON از نظر نحوی صحیح است. مدل‌های زبانی بزرگ پیش‌بینی‌کننده توکن بعدی هستند، نه کامپایلرهای JSON. حتی انحرافات جزئی—مانند کاماهای گمشده، کاماهای اضافی در انتهای لیست، یا کاراکترهای خاص غیرفرار—می‌تواند باعث کرش کردن پارسرهای بعدی شود، پیش از آنکه هرگونه منطق تجاری اجرا گردد.

برای رفع این مشکل، لایه‌های پردازش پس از تولید (post-processing) مستحکمی پیاده‌سازی کنید. به جای تکیه صرف بر خروجی خام مدل، از یک پارسر JSON سبک استفاده کنید که بتواند خطاهای نحوی رایج را «تعمیر» کند. با این حال، موثرترین راهکار، پیشگیری از خطا در منبع آن از طریق بهبود پرامپت‌ها و محدودیت‌های طرحواره است.

// کد شبه (Pseudocode) برای مکانیزم تلاش مجدد با اعتبارسنجی JSON
def call_llm_with_retry(prompt, functions, max_retries=3):
    for attempt in range(max_retries):
        response = llm.chat(prompt, functions=functions)
        
        # استخراج متن خام
        raw_json = response.choices[0].message.tool_calls[0].function.arguments
        
        try:
            # تلاش برای تجزیه JSON
            parsed_args = json.loads(raw_json)
            return execute_function(response.tool_calls[0].name, parsed_args)
        except json.JSONDecodeError as e:
            # ایجاد پرامپت خطای خاص برای تلاش مجدد
            error_prompt = f"JSON قبلی نامعتبر بود: {str(e)}. لطفاً فرمت را اصلاح کنید. خروجی خام: {raw_json}"
            prompt += "\n" + error_prompt
            
    raise Exception("تعداد تلاش‌های مجاز برای تجزیه JSON فراتر رفت")

عدم تطابق طرحواره و انحراف نوع داده

حتی زمانی که JSON معتبر باشد، انواع داده اغلب با تعاریف سخت‌گیرانه ارائه شده در طرحواره تابع شما مطابقت ندارند. برای مثال، یک LLM ممکن است برای یک فیلد عدد صحیح (integer)، یک رشته (string) بازگرداند یا یک فیلد ضروری را به طور کامل حذف کند. این موضوع به ویژه زمانی شایع است که مدل درباره فرمت داده‌ها مطمئن نباشد.

راه حل در اعمال سخت‌گیرانه طرحواره و کدنویسی تدافعی نهفته است. از ابزارهایی مانند pydantic در پایتون یا zod در Node.js برای اعتبارسنجی آرگومان‌های ورودی بر اساس انواع مورد انتظار خود، بلافاصله پس از دریافت استفاده کنید. اگر اعتبارسنجی شکست خورد، تابع را اجرا نکنید؛ در عوض، یک پیام خطای ساختاریافته به LLM بازگردانید که دقیقاً توضیح دهد کدام فیلد و چرا از اعتبارسنجی رد شده است.

توهم‌های زمینه‌ای و پارامترهای نامرتبط

گاهی اوقات، ساختار JSON کامل است، اما مقادیر آن بی‌معنی هستند. یک LLM ممکن است یک مقدار پارامتر را استنباط کند که در پایگاه داده سیستم شما وجود ندارد، که منجر به خطای «404 Not Found» یا یک خطای منطقی در فرآیند کسب‌وکار شما می‌شود. این اتفاق زمانی می‌افتد که پرامپت فاقد زمینه کافی باشد یا توضیح تابع بسیار مبهم باشد.

توضیحات تابع خود را با شامل کردن مثال‌هایی از مقادیر معتبر و محدودیت‌های شفاف بهبود بخشید. برای انواع داده‌ای پیچیده (enums)، مقادیر مجاز را به صراحت در فیلد توضیحات طرحواره JSON خود فهرست کنید. این کار بار شناختی مدل را کاهش داده و خروجی آن را با دامنه داده‌های واقعی شما همسو می‌سازد.

نتیجه‌گیری

عیب‌یابی شکست‌های فراخوانی تابع در محیط تولید نیازمند تغییر نگرش از «پرامپت‌نویسی برای دقت» به «مهندسی برای تاب‌آوری» است. با پیاده‌سازی اعتبارسنجی سخت‌گیرانه طرحواره، تجزیه JSON مستحکم همراه با منطق تلاش مجدد، و توضیحات دقیق تابع، می‌توانید نویز موجود در پایپ‌لاین‌های LLM خود را به طور قابل توجهی کاهش دهید. به یاد داشته باشید، LLM یک موتور احتمالاتی است؛ کد شما باید تار عنکبوت قطعی و ایمنی باشد که خطاهای اجتناب‌ناپذیر را جذب کند.

Share: