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

آنچه در این نوشتار بررسی می‌شود

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

متغیر در پرامپت نویسی چیست؟

متغیر در پرامپت نویسی، یک Placeholder است که در زمان اجرا با مقدار مشخصی پر می‌شود. این مقدار می‌تواند از ورودی کاربر، از یک سیستم خارجی، یا از داده‌های ذخیره‌شده استخراج شود. برای مطالعه پایه‌های این حوزه، نوشتار راهنمای پایه پرامپت نویسی را ببینید.

این مفهوم، مشابه مفهوم Variable در زبان‌های برنامه‌نویسی است. همان‌طور که در یک تابع برنامه‌نویسی، پارامترها امکان تعریف رفتار پویا را فراهم می‌کنند، در پرامپت هم متغیرها امکان استفاده مجدد از یک ساختار را برای ورودی‌های مختلف فراهم می‌کنند.

در ادبیات فنی، این مفهوم بخشی از Template-based Prompting است. برای مطالعه دقیق‌تر در مورد قالب‌ها، نوشتار قالب‌های پرامپت و نحوه ساخت آن‌ها را ببینید.

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

در پروژه‌های کوچک، ممکن است متغیرها غیرضروری به‌نظر برسند. اما با رشد پروژه، ضرورت آن‌ها آشکار می‌شود. سه دلیل اصلی:

۱. قابلیت استفاده مجدد

بدون متغیر، هر بار که می‌خواهیم پرامپتی با ورودی متفاوت بفرستیم، باید کل متن را بازنویسی کنیم. با متغیر، یک قالب واحد داریم که با مقادیر مختلف پر می‌شود.

۲. تفکیک دغدغه‌ها

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

۳. کاهش خطا

وقتی مقادیر از یک منبع مرکزی تأمین می‌شوند، خطاهای کپی-پیست به‌شدت کاهش می‌یابد. یک متغیر واحد، منبع حقیقت یگانه‌ای است که از ناسازگاری بین بخش‌های مختلف جلوگیری می‌کند.

متغیرها، پل بین منطق کسب‌وکار و مدل زبانی هستند. اگر این پل به‌درستی ساخته شود، سیستم قابل نگهداری و توسعه‌پذیر خواهد بود. اگر نباشد، هر تغییر کوچک به یک پروژه‌ی مهاجرت تبدیل می‌شود.

انواع متغیر در پرامپت

در پروژه‌های واقعی، با چند نوع متغیر سر و کار داریم که هر یک کاربرد و چالش خاص خود را دارد:

نوع متغیرتوضیحمثال
ساده متنیمقدار رشته‌اینام کاربر
ساده عددیمقدار عددیسن، مبلغ
ساختاریتعیین‌کننده بخش قالبحالت، لحن
انتخابیانتخاب از چند گزینهدسته‌بندی
شرطیفعال/غیرفعال کردن بخش‌هانمایش اطلاعات VIP
تزریقیاز منابع خارجیاسناد RAG
لیستیآرایه‌ای از مقادیرلیست محصولات
ساختاریافتهشیء تودرتوپروفایل کاربر

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

متغیرهای ساده متنی و عددی

ساده‌ترین نوع متغیر، مقادیر متنی و عددی هستند. این متغیرها در زمان اجرا با مقادیر مشخص پر می‌شوند. سه نکته‌ی کلیدی در مدیریت این متغیرها:

۱. تعریف نوع داده

مشخص کنید که متغیر باید عدد باشد یا متن. اگر متغیری به‌عنوان عدد تعریف شده اما مقدار متنی بگیرد، ممکن است خطا ایجاد شود.

۲. کنترل طول

متغیرهای متنی می‌توانند بسیار طولانی باشند. این طول می‌تواند بودجه توکن را مصرف کند. در پرامپت، محدودیت طول برای هر متغیر تعریف کنید. برای مطالعه دقیق‌تر، نوشتار تأثیر محدودیت توکن بر پرامپت نویسی را ببینید.

۳. فرمت مقادیر

اگر متغیر باید فرمت خاصی داشته باشد (مثلاً تاریخ به شکل YYYY-MM-DD)، این محدودیت را در اعتبارسنجی اعمال کنید.

متغیرهای ساختاری و انتخابی

متغیرهای ساختاری، رفتار قالب را تغییر می‌دهند. سه نوع اصلی:

متغیر انتخاب قالب

مشخص می‌کند که کدام قالب از چند قالب ممکن استفاده شود. مثلاً response_style می‌تواند مقادیر formal، casual یا technical را بگیرد.

متغیر انتخاب لحن

مشخص می‌کند که لحن پاسخ چه باشد. این متغیر معمولاً از یک لیست محدود انتخاب می‌شود.

متغیر سطح جزئیات

مشخص می‌کند که پاسخ در چه سطحی از جزئیات باشد: brief، normal، detailed. این متغیر، مستقیماً بر طول خروجی اثر می‌گذارد.

این متغیرها معمولاً به‌صورت Enum تعریف می‌شوند. مقادیر مجاز در پرامپت مشخص می‌شوند و در اعتبارسنجی بررسی می‌گردند.

متغیرهای شرطی و قالب‌های پویا

متغیرهای شرطی، امکان فعال یا غیرفعال کردن بخش‌هایی از قالب را فراهم می‌کنند. این تکنیک، قدرت قالب را به‌طور قابل توجهی افزایش می‌دهد.

مثال ساختاری

{% if user.is_vip %}
اطلاعات ویژه مشتریان VIP را در پاسخ لحاظ کن.
{% endif %}

پاسخ را به کاربر بده.

کاربردها

  • نمایش اطلاعات اضافی برای کاربران خاص
  • فعال کردن قوانین ویژه در شرایط مشخص
  • تغییر لحن بر اساس زمینه
  • افزودن مثال‌های more-shot در موارد پیچیده

متغیرهای شرطی، نیازمند موتور قالب قدرتمندی هستند که از منطق شرطی پشتیبانی کند. Jinja2 و Handlebars این قابلیت را دارند. برای مطالعه دقیق‌تر، نوشتار قالب‌های پرامپت و نحوه ساخت آن‌ها را ببینید.

متغیرهای تزریقی از منابع خارجی

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

سه منبع اصلی

  • حافظه: اطلاعات از نشست‌های قبلی کاربر
  • RAG: اسناد مرتبط با پرسش کاربر
  • API خارجی: داده‌های زنده از سیستم‌های دیگر

مدیریت حجم

متغیرهای تزریقی می‌توانند بودجه توکن را به‌سرعت مصرف کنند. سه راهبرد برای مدیریت:

  1. محدودسازی تعداد: فقط تعداد محدودی سند یا مورد تزریق شود.
  2. فشرده‌سازی: محتوا با یک مدل سبک خلاصه شود.
  3. فیلترکردن: فقط موارد با امتیاز شباهت بالا نگه داشته شوند.

برای مطالعه دقیق‌تر در این حوزه، نوشتار فشرده‌سازی زمینه در RAG را ببینید.

اصول نام‌گذاری متغیرها

نام‌گذاری متغیرها، یکی از تصمیم‌های مهم در طراحی قالب است. اصول پیشنهادی:

۱. توصیفی بودن

نام متغیر باید توصیف کند که چه چیزی در آن ذخیره می‌شود. user_name بسیار بهتر از un است.

۲. یکنواختی

سبک نام‌گذاری باید در کل پروژه یکنواخت باشد. اگر user_name استفاده می‌کنید، productName نگذارید.

۳. پرهیز از اختصارهای مبهم

اختصارهای مبهم، خوانایی را کاهش می‌دهند. document_content بهتر از dc است. اگر اختصار استفاده می‌کنید، آن را در مستندات توضیح دهید.

۴. تفکیک دامنه

اگر متغیرها از دامنه‌های مختلف هستند، از پیشوند استفاده کنید. user_name، product_name، order_date.

۵. زبان انگلیسی

نام متغیرها را به انگلیسی بنویسید، حتی اگر متن پرامپت فارسی است. این کار، سازگاری با ابزارها و محیط‌های برنامه‌نویسی را تضمین می‌کند.

اعتبارسنجی و پاک‌سازی مقادیر

پیش از تزریق مقادیر در قالب، دو مرحله ضروری است:

اعتبارسنجی

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

پاک‌سازی

مقدار را از کاراکترهای مخرب یا نامناسب پاک کنید. این مرحله به‌ویژه برای متغیرهایی که از ورودی کاربر تأمین می‌شوند، ضروری است. برای مطالعه دقیق‌تر در مورد امنیت، نوشتار بهترین روش‌های امنیت PHP را ببینید که اصول مشابهی دارد.

مراحل اعتبارسنجی و پاک‌سازی

مرحلهفعالیت
۱. بررسی نبودمقدار برای متغیرهای اجباری موجود باشد
۲. بررسی نوعمقدار با نوع تعریف‌شده سازگار است
۳. بررسی محدودهمقدار در محدوده مجاز قرار دارد
۴. بررسی قالبمقدار با قالب موردنظر مطابقت دارد
۵. پاک‌سازیکاراکترهای مخرب حذف می‌شوند
۶. Escape کردنکاراکترهای خاص برای متن پرامپت

امنیت متغیرها و جلوگیری از تزریق

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

راهبردهای دفاعی

  1. جداسازی صریح: متغیرهای کاربر در بخش‌های مجزا و با برچسب مشخص قرار گیرند.
  2. محدودسازی طول: حداکثر طول برای هر متغیر تعریف شود.
  3. پاک‌سازی کاراکترهای خاص: کاراکترهایی که می‌توانند ساختار پرامپت را بشکنند، حذف یا Escape شوند.
  4. اعتبارسنجی با Schema: اگر متغیر باید با Schema مشخصی مطابقت داشته باشد، این بررسی انجام شود.
  5. جداسازی با Delimiter: از یک Delimiter غیرقابل حدس برای جداسازی متغیرهای کاربر استفاده کنید.
  6. فیلتر محتوایی: محتوای متغیر را برای الگوهای مشکوک بررسی کنید.

این راهبردها، به‌تنهایی کافی نیستند. دفاع مؤثر نیازمند ترکیبی از این تکنیک‌ها و ارزیابی مستمر است. برای مطالعه دقیق‌تر، نوشتار دفاع در برابر تزریق پرامپت را ببینید.

اشتباهات رایج در کار با متغیرها

  • نام‌گذاری مبهم و ناسازگار
  • نبود اعتبارسنجی پیش از تزریق
  • نبود پاک‌سازی متغیرهای ورودی کاربر
  • تزریق مستقیم مقادیر بدون جداسازی
  • نبود محدودیت طول برای متغیرهای متنی
  • عدم تعریف مقدار پیش‌فرض برای متغیرهای اختیاری
  • نادیده گرفتن اثر متغیرها بر بودجه توکن
  • نبود مستندسازی متغیرها
  • استفاده از نام‌های یکسان در دامنه‌های مختلف
  • عدم مدیریت خطاهای ناشی از مقادیر نامعتبر

پرسش‌های متداول درباره متغیرهای پرامپت

متغیر در پرامپت نویسی چیست؟

متغیر در پرامپت نویسی یک Placeholder است که در زمان اجرا با مقدار مشخصی پر می‌شود. این مقدار می‌تواند از ورودی کاربر، از یک سیستم خارجی، یا از داده‌های ذخیره‌شده استخراج شود.

چرا از متغیرها استفاده کنیم؟

برای قابلیت استفاده مجدد، تفکیک دغدغه‌ها و کاهش خطا. بدون متغیر، هر پرامپت باید به‌طور کامل بازنویسی شود و این موضوع به بدهی فنی منجر می‌شود.

چطور از تزریق پرامپت جلوگیری کنیم؟

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

آیا متغیرها روی هزینه اثر می‌گذارند؟

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

آیا متغیرها در زبان فارسی چالش خاصی دارند؟

بله، عمدتاً در توکن‌سازی. متن فارسی ممکن است بیش از متن انگلیسی معادل، توکن مصرف کند. طراحی متغیرها باید این تفاوت را در نظر بگیرد.

نگاه معمارانه به متغیرهای پرامپت

از منظر معماری، متغیرهای پرامپت یک لایه‌ی انتزاعی مهم در سیستم‌های مبتنی بر مدل‌های زبانی هستند. این لایه، پل بین منطق کسب‌وکار و مدل زبانی است. طراحی خوب این لایه، تفاوت بین یک سیستم قابل نگهداری و یک سیستم شکننده را می‌سازد.

در سیستم‌های پیشرفته، معمولاً یک لایه‌ی مدیریت متغیرها وجود دارد که وظایف زیر را انجام می‌دهد:

  • تأمین مقادیر از منابع مختلف
  • اعتبارسنجی و پاک‌سازی
  • Escape کردن برای امنیت
  • پایش مصرف و کیفیت
  • مدیریت نسخه و سازگاری

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

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

در سیستم‌های مقیاس بزرگ، متغیرها معمولاً از چند منبع تأمین می‌شوند: از CRM برای اطلاعات مشتری، از پایگاه داده محصول برای اطلاعات کاتالوگ، از RAG برای اسناد مرتبط، و از حافظه برای پیشینه مکالمه. یکپارچگی این منابع، چالشی مستقل است که نیازمند لایه‌ی هماهنگ‌کننده‌ای است که اولویت و تبدیل بین فرمت‌ها را مدیریت کند.

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

تجربه شما

اگر در پروژه‌ای واقعی روی مدیریت متغیرهای پرامپت کار کرده‌اید، برای ما جالب است بدانید کدام چالش بیشترین زمان را گرفته است: اعتبارسنجی، پاک‌سازی، یا امنیت. اگر رویکرد متفاوتی برای مدیریت متغیرها دارید، تجربه‌تان را در دیدگاه‌ها بنویسید تا خواننده بعدی از آن استفاده کند.