Agent Frameworks

DSPy برای عامل‌های خودترمیم: پیاده‌سازی بازیابی خطای زمان اجرا و استراتژی‌های پرامپت‌دهی تطبیقی

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

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

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

پرامپت‌های ایستا شکننده هستند. وقتی یک LLM با یک مورد لبه‌ای مواجه می‌شود که به‌طور صریح برای آن آموزش ندیده یا پرامپت نشده است، ممکن است توهم کند، JSON نادرست برگرداند یا نتواند ابزار صحیح را فراخوانی کند. در یک زنجیره از عامل‌ها، این شکست واحد می‌تواند به صورت زنجیره‌ای گسترش یابد و کل جریان کاری را از کار بیندازد. اشکال‌زدایی دستی شامل سخت‌کد کردن بلوک‌های try-catch و منطق تلاش مجدد است که در مقیاس بزرگ پایدار نیست. DSPy این مشکل را با جداسازی منطق (امضا) از پیاده‌سازی (پرامپت) حل می‌کند و به سیستم اجازه می‌دهد پیاده‌سازی را بر اساس معیارهای عملکرد بهینه‌سازی کند.

تعریف امضاهای مقاوم در DSPy

در هسته DSPy، Signature (امضا) وجود دارد که رابط ورودی-خروجی یک ماژول را تعریف می‌کند. برای ساخت عامل‌های خودترمیم، باید امضاهایی تعریف کنیم که نه تنها توصیفی باشند، بلکه در برابر ابهام نیز مقاوم باشند.


import dspy

class ExtractCodeSnippet(dspy.Signature):
    """Extract valid Python code from unstructured text. If no code is present, return None."""
    raw_text = dspy.InputField(desc="The raw input text")
    code_snippet = dspy.OutputField(desc="Valid Python code or None")

class AgentErrorRecovery(dspy.Module):
    def __init__(self, model):
        super().__init__()
        self.extractor = dspy.ChainOfThought(ExtractCodeSnippet, model=model)
        self.validator = dspy.Predict("code_snippet -> is_valid: bool")

    def forward(self, raw_text):
        # Attempt extraction
        result = self.extractor(raw_text=raw_text)
        snippet = result.code_snippet

        # Adaptive validation loop
        if snippet:
            validation = self.validator(code_snippet=snippet)
            if validation.is_valid:
                return snippet
            else:
                # Trigger self-healing: retry with specific error context
                error_context = f"Previous attempt: {snippet}\nError: Invalid syntax. Try again."
                retry_result = self.extractor(raw_text=f"{raw_text}\n{error_context}")
                return retry_result.code_snippet

        return None

پیاده‌سازی بازیابی خطای زمان اجرا

قطعه کد بالا یک حلقه خودترمیمی پایه را نشان می‌دهد. وقتی validator (اعتبارسنج) کد نامعتبر را شناسایی کند، عامل خراب نمی‌شود. به جای آن، زمینه خطا را دوباره به extractor (استخراج‌کننده) تزریق می‌کند. این یک شکل از پرامپت‌دهی تطبیقی است: پرامپت بر اساس وضعیت زمان اجرا به‌صورت پویا تغییر می‌کند.

برای سناریوهای پیچیده‌تر، DSPy به شما اجازه می‌دهد این ماژول‌ها را با استفاده از dspy.BootstrapFewShot یا dspy.MIPROv2 کامپایل کنید. در طول کامپایل، DSPy چندین پرامپت را نمونه‌برداری می‌کند و آن را انتخاب می‌کند که یک معیار (مثلاً نرخ موفقیت اجرا) را به حداکثر برساند. این به این معنی است که رفتار «خودترمیمی» فقط یک تلاش مجدد در زمان اجرا نیست، بلکه یک استراتژی بهینه‌شده است که از شکست‌های تاریخی آموخته شده است.

استراتژی‌های پرامپت‌دهی تطبیقی

فراتر از تلاش‌های مجدد ساده، DSPy استراتژی‌های تطبیقی پیشرفته را ممکن می‌سازد:

  • خودبازاندیشی: از یک ماژول جداگانه برای نقد خروجی قبلی قبل از تلاش مجدد استفاده کنید.
  • انتخاب پویای ابزار: اگر فراخوانی ابزار شکست بخورد، یک پرامپت تطبیقی می‌تواند ابزارهای جایگزین را از یک فهرست از پیش تعریف شده پیشنهاد دهد.
  • آستانه‌های اطمینان: اگر اطمینان مدل (از طریق logprobs یا امتیازدهی هیوریستیک) پایین باشد، یک پرامپت محافظه‌کارانه‌تر با محدودیت‌های اضافی را فعال کنید.

class AdaptiveToolSelector(dspy.Module):
    def __init__(self, model):
        super().__init__()
        self.selector = dspy.ChainOfThought("query, available_tools -> selected_tool, reason", model=model)

    def forward(self, query, available_tools, last_error=None):
        context = query
        if last_error:
            context += f"\nPrevious tool failed: {last_error}. Choose a different approach."

        result = self.selector(query=context, available_tools=available_tools)
        return result.selected_tool

نتیجه‌گیری

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

Share: