خود-پرامپت نویسی (Self-Prompting) تکنیکی است که در آن، مدل زبانی به‌جای وابستگی به یک پرامپت واحد، خودش پرامپت‌های میانی را برای حل یک مسئله پیچیده تولید می‌کند.
این تکنیک، بر پایه توانایی مدل در تقسیم مسئله به گام‌های کوچک‌تر و تولید دستورالعمل مناسب برای هر گام بنا شده است.
خود-پرامپت نویسی، در وظایف چندمرحله‌ای و پیچیده، دقت را به‌طور چشمگیری افزایش می‌دهد.
این تکنیک، به‌عنوان یک لایه پویا بر روی زنجیره تفکر عمل می‌کند.
این راهنما مکانیزم، پیاده‌سازی و کاربردهای خود-پرامپت نویسی را به‌صورت فنی بررسی می‌کند.

خود-پرامپت نویسی (Self-Prompting) یکی از تکنیک‌های پیشرفته در حوزه پرامپت نویسی است که به مدل اجازه می‌دهد به‌جای وابستگی به یک پرامپت ثابت، خودش مراحل بعدی را برنامه‌ریزی و پرامپت مناسب را تولید کند. این تکنیک، در وظایفی که نیازمند تصمیم‌گیری پویا هستند، نقشی حیاتی ایفا می‌کند. برای درک این مفهوم، ابتدا باید با زنجیره تفکر در پرامپت نویسی و متا-پرامپت نویسی آشنا باشیم.

در پروژه‌هایی که با وظایف چندمرحله‌ای پیچیده مواجه بودیم، خود-پرامپت نویسی ابزار اصلی برای پویایی در حل مسئله بوده است. این تکنیک به‌جای وابستگی به پرامپت‌های از پیش تعریف‌شده، اجازه می‌دهد مدل بر اساس وضعیت فعلی، گام بعدی را تصمیم بگیرد. اگر با الگوریتم‌های بهینه‌سازی پرامپت آشنا هستید، آماده‌اید تا به لایه خود-پرامپت وارد شوید.

خود-پرامپت نویسی را می‌توان با یک راننده ماهر مقایسه کرد که در طول مسیر، مسیر خود را بر اساس شرایط جاده تنظیم می‌کند. در سامانه‌های LLM، این راننده همان مدل است که پرامپت‌های میانی را تولید می‌کند. برای مطالعه بیشتر درباره مبانی، می‌توانید صفحه Prompt Engineering را در ویکی‌پدیا ببینید.

خود-پرامپت نویسی دقیقاً چیست؟

خود-پرامپت نویسی، تکنیکی است که در آن، مدل زبانی به‌جای وابستگی به یک پرامپت واحد، خودش پرامپت‌های میانی را برای حل مسئله تولید می‌کند.

در این تکنیک، سه سطح پرامپت وجود دارد:

  • پرامپت اولیه: پرامپتی که وظیفه اصلی را تعریف می‌کند.
  • پرامپت‌های میانی: پرامپت‌هایی که مدل در هر گام تولید می‌کند.
  • پرامپت نهایی: پرامپتی که پاسخ نهایی را تولید می‌کند.

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

تفاوت با پرامپت نویسی معمولی

در پرامپت نویسی معمولی، همه دستورالعمل‌ها در یک پرامپت واحد ارائه می‌شوند. در خود-پرامپت نویسی، دستورالعمل‌ها به‌صورت پویا در هر گام تولید می‌شوند.

خود-پرامپت نویسی به‌عنوان یک مهارت

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

خود-پرامپت نویسی، اجازه دادن به مدل برای طراحی مسیر حل مسئله است.

چرا خود-پرامپت نویسی اهمیت دارد؟

خود-پرامپت نویسی به چند دلیل اهمیت دارد:

پویایی در حل مسئله

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

افزایش دقت در وظایف چندمرحله‌ای

در وظایف چندمرحله‌ای، خود-پرامپت نویسی دقت را افزایش می‌دهد، زیرا هر گام بر اساس گام قبلی تصمیم‌گیری می‌شود.

کاهش وابستگی به طراحی دستی

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

تطبیق با شرایط متغیر

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

کشف مسیرهای جدید

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

ویژگیپرامپت ثابتخود-پرامپت نویسی
پویاییپایینبالا
دقت در وظایف پیچیدهمتوسطبالا
وابستگی به طراحی دستیبالاپایین
تطبیق با شرایط متغیرمحدودگسترده

تفاوت با زنجیره تفکر و متا-پرامپت

خود-پرامپت نویسی، با زنجیره تفکر و متا-پرامپت نویسی شباهت‌هایی دارد اما در چند محور متفاوت است:

خود-پرامپت نویسی در مقابل زنجیره تفکر

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

خود-پرامپت نویسی در مقابل متا-پرامپت نویسی

در متا-پرامپت نویسی، از یک پرامپت متا برای تولید پرامپت اصلی استفاده می‌شود. در خود-پرامپت نویسی، مدل در طول حل مسئله، پرامپت‌های میانی را تولید می‌کند. تفاوت اصلی در زمان تولید پرامپت است.

ترکیب سه رویکرد

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

مکانیزم فنی

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

ساختار حلقه

def self_prompting(task, max_steps=5):
    state = {"task": task, "history": []}

    for step in range(max_steps):
        # Generate next prompt
        prompt = generate_next_prompt(state)

        # Execute prompt
        result = execute_prompt(prompt)

        # Update state
        state["history"].append({"prompt": prompt, "result": result})

        # Check if done
        if is_done(result):
            return result

    return state["history"][-1]["result"]

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

تولید پرامپت میانی

در هر گام، مدل بر اساس وضعیت فعلی، پرامپت بعدی را تولید می‌کند:

def generate_next_prompt(state):
    meta_prompt = f"""Task: {state["task"]}
History: {state["history"]}

Generate the next prompt to make progress on this task.
The prompt should be specific and actionable.
"""
    return llm_call(meta_prompt)

تشخیص پایان

مدل باید بتواند تشخیص دهد که مسئله حل شده است. این تشخیص می‌تواند با یک پرامپت جداگانه یا با تحلیل خروجی انجام شود.

رویکردهای اصلی

چند رویکرد اصلی برای خود-پرامپت نویسی وجود دارد:

رویکرد گام‌به‌گام

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

رویکرد برنامه‌ریزی محور

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

رویکرد بازگشتی

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

رویکرد موازی

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

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

پیاده‌سازی گام‌به‌گام

پیاده‌سازی خود-پرامپت نویسی در چند گام انجام می‌شود:

def self_prompting_workflow(task, max_steps=10, max_retries=3):
    state = {"task": task, "history": []}

    for step in range(max_steps):
        # Generate next prompt
        prompt = generate_next_prompt(state)

        # Execute with retries
        for attempt in range(max_retries):
            try:
                result = execute_prompt(prompt)
                break
            except Exception as e:
                if attempt == max_retries - 1:
                    return {"error": str(e)}

        # Update state
        state["history"].append({"step": step, "prompt": prompt, "result": result})

        # Check completion
        if is_task_complete(state):
            return result

    return state["history"][-1]["result"]

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

مدیریت تاریخچه

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

کاربردهای عملی

خود-پرامپت نویسی در چند سناریو کاربرد دارد:

حل مسائل پیچیده

در مسائلی که به چند مرحله نیاز دارند، خود-پرامپت نویسی می‌تواند مسیر حل را به‌صورت پویا برنامه‌ریزی کند.

عامل‌های هوشمند

در سامانه‌های عامل‌محور، خود-پرامپت نویسی به عامل اجازه می‌دهد در هر گام تصمیم بگیرد. برای جزئیات، پست پرامپت نویسی برای عامل‌های هوشمند را ببینید.

پژوهش و تحلیل

در پژوهش‌هایی که نیازمند بررسی چند مرحله‌ای هستند، خود-پرامپت نویسی می‌تواند مسیر تحلیل را برنامه‌ریزی کند.

تولید محتوای پیچیده

در تولید محتوایی که نیازمند ساختار چندبخشی است، خود-پرامپت نویسی می‌تواند هر بخش را به‌صورت پویا تولید کند. برای جزئیات، پست پرامپت نویسی برای خلاقیت را ببینید.

کدگذاری چندمرحله‌ای

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

سامانه‌های RAG

در سامانه‌های بازیابی‌محور، خود-پرامپت نویسی می‌تواند مسیر جستجو را به‌صورت پویا تنظیم کند. برای جزئیات، پست RAG چیست را ببینید.

ارزیابی و بهبود

ارزیابی خود-پرامپت نویسی، بخش حیاتی این تکنیک است.

معیارهای ارزیابی

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

بهبود عملکرد

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

محدودیت‌ها

خود-پرامپت نویسی، محدودیت‌های خاص خود را دارد:

  • حلقه بی‌پایان: اگر مدل نتواند تشخیص دهد که مسئله حل شده است، ممکن است در حلقه بی‌پایان گرفتار شود.
  • هزینه بالا: هر گام، یک فراخوانی مدل است. این هزینه در وظایف پیچیده می‌تواند قابل‌توجه باشد.
  • نبود تضمین: خود-پرامپت نویسی همیشه به نتیجه مطلوب منجر نمی‌شود.
  • پیچیدگی تفسیر: تاریخچه گام‌ها می‌تواند پیچیده و دشوار برای تفسیر باشد.
  • ریسک امنیتی: تولید پویا پرامپت می‌تواند منبع تزریق باشد. برای جزئیات، پست تزریق پرامپت چیست را ببینید.
  • نیاز به طراحی دقیق: خود-پرامپت نویسی نیازمند طراحی دقیق پرامپت اولیه و شرایط توقف است.

پرسش‌های پرتکرار درباره خود-پرامپت نویسی

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

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

خود-پرامپت نویسی چه تفاوتی با متا-پرامپت نویسی دارد؟

در متا-پرامپت نویسی، از یک پرامپت متا برای تولید پرامپت اصلی استفاده می‌شود. در خود-پرامپت نویسی، مدل در طول حل مسئله، پرامپت‌های میانی را تولید می‌کند.

آیا خود-پرامپت نویسی همیشه به نتیجه مطلوب منجر می‌شود؟

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

چطور از حلقه بی‌پایان در خود-پرامپت نویسی جلوگیری کنیم؟

با تعیین حداکثر گام‌ها و شرایط توقف مشخص.

آیا خود-پرامپت نویسی بر هزینه اثر دارد؟

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

آیا خود-پرامپت نویسی برای همه وظایف مناسب است؟

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

آیا خود-پرامپت نویسی با درخت تفکر قابل ترکیب است؟

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

آیا خود-پرامپت نویسی بر امنیت اثر دارد؟

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

چطور خود-پرامپت نویسی را در تیم نهادینه کنیم؟

با تعریف فرایندهای استاندارد، آموزش تیم و پایش مستمر.

آیا خود-پرامپت نویسی با خودسازگاری قابل ترکیب است؟

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

آیا خود-پرامپت نویسی برای سامانه‌های Real-Time مناسب است؟

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

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

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

خود-پرامپت نویسی، اجازه دادن به مدل برای طراحی مسیر حل مسئله است.

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