الدرس 08 · متزامن

دع الوكيل يعمل بنفسه دون حظر الوكيل.

「Fire and forget — the agent doesn't block while the command runs.」

⏱ ~10 د · 📝 3 مكونات تفاعلية · 🧑‍💻 مبني على shareAI-lab · s08_background_tasks.py

ألم حظر المكالمات

أداة bash في S02 متزامنة: subprocess.run(..., timeout=120). يستغرق تشغيل أمر مثل npm install 90 ثانية، وتتوقف حلقة الوكيل بأكملها لمدة 90 ثانية. يحدق المستخدم في الجهاز، ولا يعرف ما إذا كان معلقًا أم يعمل.

حل s08: امنح الوكيل أداة background_run. يقوم على الفور بإرجاع task_id ويتم تشغيل الأمر على مؤشر ترابط آخر. يستمر الوكيل في التكرار والقيام بأشياء أخرى؛ عند اكتمال مهمة bg، تتم إضافة النتائج إلى قائمة انتظار الإشعارات.

def تشغيل(self, الأمر: str) -> str:
    Task_id = str(uuid.uuid4())[:8]
    self.tasks[task_id] = {"الحالة":"قيد التشغيل", ...}
    Thread = Threading.Thread(target=self._execute, args=(task_id, Command), daemon=True)
    الموضوع.بدء()
    return f"بدأت مهمة الخلفية {task_id}" # العودة فورًا

كيفية إرجاع النتيجة إلى الوكيل؟

المفتاح عبارة عن قائمة انتظار آمنة لمؤشر الترابط: عند اكتمال مؤشر ترابط bg، يتم إلحاقه بقائمة الانتظار؛ قبل كل استدعاء LLM بواسطة سلسلة الرسائل الرئيسية، يتم استنزاف قائمة الانتظار ويتم حشو إشعار الإكمال في الرسائل كرسائل مستخدم.

def agent_loop(الرسائل):
    بينما صحيح:
        # استنزاف إشعارات bg قبل كل مكالمة LLM
        الإخطارات = BG.drain_notifications()
        إذا إشعارات:
            الرسائل.إلحاق({
                "الدور": "المستخدم"،
                "content": f"<background-results>{notif_text}</background-results>",
            })
        الاستجابة = client.messages.create(...)
        ...

بهذه الطريقة، يقوم الوكيل بإنشاء مهمة bg في الجولة Nth. عند اكتمال المهمة في جولة N+3، سيجلب استدعاء LLM التالي النتائج تلقائيًا - سيعرف النموذج عندما يرى كتلة <background-results>: "أوه، انتهت هذه المهمة، سأستمر."

عرض الجدول الزمني

يسمح لك عنصر واجهة المستخدم التالي بالمحاكاة: يتم تحديد مؤشر الترابط الرئيسي كل ثانية (محاكاة إيقاع دورة الوكيل)؛ يمكنك إنشاء مهمة bg في أي وقت. شاهد كيف يلتقي الدليلان عند "نقطة التصريف".

ما هي الأوامر التي يجب وضعها في الخلفية؟

لا ينبغي وضع كافة الأوامر في الخلفية. هناك معياران:

  1. استهلاك الوقت: يعد التشغيل المتزامن في غضون ثوانٍ قليلة أمرًا أبسط، مما يلغي الحاجة إلى الاحتفاظ بقوائم الانتظار.
  2. أهمية النتيجة: إذا تم استخدام النتيجة فورًا في الخطوة التالية (مثل cat file.txt متبوعة مباشرة بـ grep)، فإن الخلفية لا معنى لها - فلا يزال يتعين عليك انتظارها.
تفاعلي

Widget 1 · الجدول الزمني · الموضوع الرئيسي + 2 مواضيع بغ

انقر فوق Spawn لإرسال العمل إلى سلسلة رسائل bg. يتحقق الخيط الرئيسي من قائمة انتظار الإشعارات في كل علامة. انظر كيف تتشابك ممرات السباحة الثلاثة.

🧠 Main (agent loop)
⚙ Background thread A
(idle)
⚙ Background thread B
(idle)
queue: []
تفاعلي

Widget 2 · أطلق النار وانسى الحكم · 8 أوامر، أي منها يستحق الدعم؟

اختر المقدمة (متزامنة، وما إلى ذلك) أو الخلفية (نشر غير متزامن) لكل أمر. انتبه إلى البعدين "هل يجب أن تنتظر النتيجة" + "استهلاك الوقت".

答对 0 / 8
تفاعلي

Widget 3 · توقيت الصرف · في أي جولة شوهد الإخطار

القاعدة الأساسية: يستنزف الخيط الرئيسي قائمة الانتظار قبل كل استدعاء LLM. أعطيك 5 سيناريوهات. الإجابة: بعد اكتمال مهمة bg، في أي جولة ستدخل النتائج إلى مجال رؤية الوكيل.

答对 0 / 5