پاک‌سازی پرامپت (Prompt Sanitization) فرایندی است که در آن، ورودی‌های کاربر قبل از ارسال به مدل زبانی بزرگ (Large Language Model یا LLM) بررسی، اصلاح یا حذف می‌شوند تا از تزریق، نشت و سایر حملات جلوگیری شود.
این فرایند، اولین لایه دفاعی در معماری امنیتی سامانه‌های LLM است.
پاک‌سازی، شامل نرمال‌سازی، فیلتر الگوهای مخرب، محدودسازی ساختاری و حذف کاراکترهای کنترلی است.
پاک‌سازی مؤثر، سطح حمله را به‌طور چشمگیری کاهش می‌دهد.
این راهنما اصول، لایه‌ها و پیاده‌سازی پاک‌سازی پرامپت را به‌صورت فنی بررسی می‌کند.

پاک‌سازی پرامپت (Prompt Sanitization) بخشی از معماری امنیتی سامانه‌های LLM است که برای ایمن‌سازی ورودی‌های کاربر قبل از رسیدن به مدل طراحی می‌شود. برخلاف سامانه‌های سنتی که ورودی کاربر از یک ساختار مشخص تبعیت می‌کند، در سامانه‌های LLM، ورودی از زبان طبیعی استفاده می‌کند و همین ویژگی، پاک‌سازی را چالش‌برانگیز می‌کند. برای درک این چالش، ابتدا باید با تزریق پرامپت چیست و تشخیص تزریق پرامپت آشنا باشیم.

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

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

پاک‌سازی پرامپت دقیقاً چیست؟

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

پاک‌سازی، یک فرایند چندلایه است که شامل:

  • نرمال‌سازی: تبدیل ورودی به یک شکل استاندارد.
  • فیلتر: حذف الگوهای شناخته‌شده حمله.
  • محدودسازی: اعمال محدودیت‌های ساختاری.
  • کدگذاری: Escaping کاراکترهای خاص.

تفاوت پاک‌سازی و اعتبارسنجی

اعتبارسنجی (Validation) بررسی می‌کند که ورودی با قواعد مورد انتظار مطابقت دارد یا نه. پاک‌سازی (Sanitization) ورودی را به شکل ایمن تبدیل می‌کند. این دو، مکمل یکدیگر هستند و در سامانه‌های حرفه‌ای، هر دو استفاده می‌شوند.

پاک‌سازی به‌عنوان اولین لایه

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

چرا پاک‌سازی ضروری است؟

پاک‌سازی پرامپت به چند دلیل ضروری است:

کاهش سطح حمله

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

افزایش هزینه مهاجم

سیستم پاک‌سازی، مهاجم را مجبور می‌کند از تکنیک‌های پیچیده‌تر استفاده کند. این افزایش هزینه، بسیاری از حملات را حذف می‌کند.

محافظت از لایه‌های دیگر

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

بهبود پایداری خروجی

ورودی‌های پاک، خروجی پایدارتری تولید می‌کنند. این پایداری، در سامانه‌های تولیدی حیاتی است.

انطباق با مقررات

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

محوربدون پاک‌سازیبا پاک‌سازی
سطح حملهبالاکاهش‌یافته
هزینه مهاجمپایینبالا
فشار روی لایه‌های دیگربالامتوسط
پایداری خروجیمتوسطبالا

پاک‌سازی پرامپت، حذف همه چیز نیست؛ حذف آن بخش‌هایی است که می‌توانند به‌عنوان دستور مخرب تفسیر شوند.

لایه‌های پاک‌سازی

پاک‌سازی پرامپت، از چند لایه تشکیل می‌شود:

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

ترتیب این لایه‌ها مهم است. نرمال‌سازی باید ابتدا انجام شود تا سایر لایه‌ها با یک شکل استاندارد کار کنند.

نرمال‌سازی یونیکد

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

انواع نرمال‌سازی

  • NFKC: نرمال‌سازی سازگاری ترکیبی.
  • NFC: نرمال‌سازی ترکیبی استاندارد.
  • NFD: نرمال‌سازی تجزیه‌ای.
  • NFKD: نرمال‌سازی تجزیه‌ای سازگاری.

نمونه‌ای از نرمال‌سازی

مهاجم می‌تواند از کاراکترهای مشابه برای دور زدن فیلتر استفاده کند:

IGNORE (با I و G معمولی)
IGNORE (با کاراکترهای تمام‌عرض یونیکد)

نرمال‌سازی NFKC، این کاراکترها را به شکل استاندارد تبدیل می‌کند و فیلتر می‌تواند آن‌ها را شناسایی کند.

پیاده‌سازی

import unicodedata

def normalize_unicode(text):
    return unicodedata.normalize("NFKC", text)

این تابع ساده، بسیاری از حملات مبتنی بر یونیکد را خنثی می‌کند.

فیلتر الگوهای مخرب

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

الگوهای رایج

  • عبارت‌هایی مانند «دستورهای قبلی را نادیده بگیر».
  • تگ‌هایی مانند <system> و </system>.
  • الگوهای «از این به بعد» که نشانه تغییر دستور است.
  • الگوهای درخواست افشای System Prompt.

پیاده‌سازی

import re

BLOCKED_PATTERNS = [
    r"ignore\s+(all\s+)?previous\s+instructions",
    r"disregard\s+(all\s+)?prior",
    r"reveal\s+(your\s+)?system\s+prompt",
    r"</?\s*system\s*>",
    r"from\s+now\s+on",
]

def filter_patterns(text):
    for pattern in BLOCKED_PATTERNS:
        if re.search(pattern, text, re.IGNORECASE):
            return None, pattern
    return text, None

محدودیت‌ها

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

محدودسازی ساختاری

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

محدودیت‌های ساختاری

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

نمونه‌ای از محدودسازی

import html

def apply_structural_limits(text, max_length=2000):
    if len(text) > max_length:
        text = text[:max_length]
    text = html.escape(text)
    text = re.sub(r"https?://\S+", "[URL_REMOVED]", text)
    return text

این تابع، ورودی را به محدوده‌ای مشخص محدود می‌کند و تگ‌های HTML و URLها را خنثی می‌کند.

حذف کاراکترهای کنترلی

برخی کاراکترهای یونیکد، در نمایش متنی دیده نمی‌شوند اما می‌توانند بر رفتار مدل اثر بگذارند. این کاراکترها باید حذف شوند.

انواع کاراکترهای کنترلی

  • صفر عرض: کاراکترهایی که فضای نمایشی ندارند.
  • جهت‌دهی: کاراکترهایی که ترتیب متن را تغییر می‌دهند.
  • کنترل: کاراکترهای کنترلی ASCII.
  • جداکننده: کاراکترهایی که مرزهای ساختاری را می‌شکنند.

پیاده‌سازی

import unicodedata

def remove_control_chars(text):
    return "".join(
        ch for ch in text
        if unicodedata.category(ch)[0] != "C"
    )

این تابع، همه کاراکترهای دسته C (کنترلی) را حذف می‌کند.

کدگذاری و Escaping

لایه پنجم، کدگذاری کاراکترهای خاص است. این لایه، از تفسیر ناخواسته کاراکترها جلوگیری می‌کند.

انواع Escaping

  • HTML Escaping: تبدیل کاراکترهای خاص HTML.
  • JSON Escaping: تبدیل کاراکترهای خاص JSON.
  • URL Encoding: تبدیل کاراکترهای خاص URL.

پیاده‌سازی

import html

def escape_for_llm(text):
    text = html.escape(text)
    text = text.replace("\\", "\\\\")
    return text

پیاده‌سازی عملی

یک پیاده‌سازی کامل پاک‌سازی، ترکیبی از همه لایه‌هاست:

def sanitize_prompt(user_input):
    if not user_input or len(user_input) < 1:
        return None, "empty_input"
    text = normalize_unicode(user_input)
    text = remove_control_chars(text)
    text, pattern = filter_patterns(text)
    if pattern:
        return None, f"blocked_pattern: {pattern}"
    text = apply_structural_limits(text, max_length=2000)
    text = escape_for_llm(text)
    return text, None

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

ملاحظات عملکرد

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

کاهش خطای مثبت کاذب

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

راهکارهای کاهش خطا

  • محدودسازی قواعد: قواعد باید دقیق باشند، نه کلی.
  • استفاده از زمینه: قواعد می‌توانند بر اساس زمینه تنظیم شوند.
  • پایش نرخ خطا: نرخ False Positive باید پایش شود.
  • بازبینی دوره‌ای: قواعد باید به‌صورت دوره‌ای بازبینی شوند.
  • آزمون با داده واقعی: قواعد باید با داده‌های واقعی آزمایش شوند.

نمونه‌ای از خطای مثبت کاذب

اگر قاعده‌ای وجود داشته باشد که همه ورودی‌های حاوی «ignore» را مسدود کند، ممکن است ورودی‌های مجاز مانند «I ignore the warning message» نیز مسدود شوند. برای جلوگیری، قواعد باید دقیق‌تر باشند.

ترکیب با سایر لایه‌ها

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

ترکیب با تشخیص

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

ترکیب با اعتبارسنجی خروجی

پس از دریافت خروجی مدل، باید اعتبارسنجی شود. برای جزئیات، پست دفاع در برابر تزریق پرامپت را ببینید.

ترکیب با مدل نگهبان

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

ترکیب با حاکمیت

پاک‌سازی، بخشی از حاکمیت امنیتی است. برای جزئیات، پست حاکمیت پرامپت را ببینید.

پرسش‌های پرتکرار درباره پاک‌سازی پرامپت

پاک‌سازی پرامپت چه تفاوتی با اعتبارسنجی دارد؟

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

آیا پاک‌سازی به‌تنهایی کافی است؟

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

آیا پاک‌سازی می‌تواند همه حملات را مسدود کند؟

خیر. مهاجمان با تکنیک‌های پیچیده می‌توانند فیلترهای ساده را دور بزنند.

چطور می‌توان خطای مثبت کاذب را کاهش داد؟

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

آیا پاک‌سازی بر عملکرد سامانه اثر دارد؟

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

آیا پاک‌سازی برای همه سامانه‌ها ضروری است؟

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

آیا پاک‌سازی می‌تواند بر کیفیت خروجی اثر منفی بگذارد؟

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

آیا پاک‌سازی برای ورودی‌های چندزبانه متفاوت است؟

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

آیا پاک‌سازی بر حریم خصوصی اثر دارد؟

پاک‌سازی، می‌تواند به حذف داده‌های حساس کمک کند. برای جزئیات، پست حریم خصوصی در پرامپت نویسی را ببینید.

چطور قواعد پاک‌سازی را به‌روز نگه داریم؟

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

آیا پاک‌سازی با مدل نگهبان تفاوت دارد؟

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

نتیجه‌گیری کاربردی

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

پاک‌سازی پرامپت، حذف همه چیز نیست؛ حذف آن بخش‌هایی است که می‌توانند به‌عنوان دستور مخرب تفسیر شوند.

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