الدرس 02 · قاعدة

لم تتغير الدورة، كل ما في الأمر هو أن هناك المزيد من الأدوات

"لم تتغير الحلقة على الإطلاق، لقد أضفت للتو أشياء إلى مصفوفة TOOLS." - s02_tool_use.py الكلمات الأصلية.

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

كم عدد الأماكن التي تحتاج إلى الانتقال إليها لإضافة أداة؟

وكيل S01 يعرف فقط bash. كيف يمكنك تغييره لتمكين أيضًا read_file / write_file / edit_file؟

رد الفعل الأول للعديد من الأشخاص هو: تغيير الحلقة. خطأ. لا تلمس سطرًا واحدًا من الحلقة. هناك حاجة إلى ثلاثة أشياء فقط:

  1. اكتب دالة معالج بايثون (run_read(path, Limit)).
  2. قم بتسجيله في جدول التعيين TOOL_HANDLERS ("read_file": lambda **kw: run_read(...)).
  3. أضف عبارة مخطط JSON إلى مصفوفة TOOLS (لتخبر النموذج باسم الأداة والمعلمات التي تقبلها).

عندما ترى الحلقة كتلة tool_use، اضغط على block.name للبحث عن الوظيفة في خريطة الإرسال، وتنفيذها، وإعادة إدخال المخرجات في tool_result. يتبع نفس المسار تمامًا مثل bash.

# خريطة الإرسال: الاسم → معالج لامدا
معالجات الأدوات = {
    "bash": lambda **kw: run_bash(kw["command"]),
    "read_file": lambda **kw: run_read(kw["path"], kw.get("limit"))),
    "write_file": lambda **kw: run_write(kw["path"], kw["content"]),
    "edit_file": lambda **kw: run_edit(kw["path"], kw["old_text"], kw["new_text"]),

انظر كيف يتم توجيه الإرسال

تتيح لك الأداة التالية النقر على طلب tool_use الذي قد يتم إرساله بواسطة نموذج لمعرفة كيفية توجيهه إلى وظيفة Python محددة. ملاحظة: يحدد block.name السطر الذي سيتم اتخاذه.

Safe_path: خط الدفاع الذي لا يمكن إغفاله

امنح الوكيل حقوق الوصول إلى الملف. الفشل الأمني ​​الأكثر احتمالاً هو مسار الهروب: كان من المفترض أن يعمل النموذج في /home/user/project/، ولكن انتهى به الأمر بإرسال read_file("../../etc/passwd").

توجد وظيفة صغيرة في s02 تتعامل مع هذا:

def safe_path(p: str) -> المسار:
    المسار = (WORKDIR / p).resolve() # التطبيع والحل .. والروابط الناعمة
    إذا ليس path.is_relative_to(WORKDIR):
        رفع ValueError(f"المسار يهرب من مساحة العمل: {p}")
    مسار العودة

يكمن المفتاح في خطوتين .resolve() + .is_relative_to() - قم بالتحليل إلى المسار المطلق ثم تحقق مما إذا كان لا يزال في وضع الحماية. بدون الأول، يمكن أن يمر foo/../../etc من خلاله؛ وبدون هذا الأخير، لا يتم إجراء أي فحص.

تحديد أمان المسار

المسارات الخمسة التالية هي جميع معلمات read_file التي قد يرسلها النموذج. ما هي تلك التي سيتم السماح بها بواسطة safe_path وأي منها سيتم رفضها؟ افترض WORKDIR = /home/user/project.

لا تقم بإضافة أدوات خطيرة إلى الوكيل

من السهل إضافة أدوات، ولكن تذكر: كل أداة تضيفها تمثل حدًا جديدًا لقدرة النموذج. في s02، يحتوي bash بالفعل على قائمة سوداء (rm -rf /، sudo، shutdown)، وwrite_file لديه قيود safe_path. اطرح على نفسك ثلاثة أسئلة قبل إضافة الأدوات إلى الإنتاج:

  • هل يمكن لهذه الأداة أن تسمح للنموذج بالقيام بأشياء لا رجعة فيها؟ (rm، إرسال بريد إلكتروني، git Push)
  • ما الذي يمكن أنيتسرب؟ (env vars، .ssh، ملفات تعريف الارتباط)
  • هل سيتم التعامل مع مخرجات الخطأ كتعليقات على الأمر؟ (الحقن الفوري عبر إخراج الأداة)

ستضيف المحاضرة 07 "طبقة إذن" لسحب هذه القرارات من الكود وجعلها تصريحية.

تفاعلي

Widget 1 · إرسال الأداة · كيف يتم توجيه استخدام الأداة إلى المعالج

انقر فوق طلب tool_use وشاهد كيف يعثر block.name في الحلقة على الوظيفة المقابلة وينفذها ويعيد الإخراج إلى كتلة tool_result.

模型发来的 tool_use 块
TOOL_HANDLERS 映射表

        
执行结果 · tool_result 块
(点上面任意一条 tool_use 触发路由)
تفاعلي

Widget 2 · المسار الآمن · كشف الهروب لخمسة مسارات

ستتم معالجة كل مسار بواسطة safe_path(). افترض أن WORKDIR = /home/user/project، وانقر فوق "إصدار" أو "رفض" - يعتمد ذلك على ما إذا كان حدسك حول الهروب من المسار دقيقًا.

答对 0 / 5
تفاعلي

Widget 3 · إضافة أداة · ما الذي يجب تغييره لإضافة أداة شاملة إلى الوكيل؟

لنفترض أنك تريد إضافة أداة جديدة glob(pattern) للسماح للوكيل بالعثور على الملفات على دفعات. املأ الفراغات: يجب تغيير الثلاثة جميعها، ولا يمكن فقدان أي منها.

第 1 处 · 写一个 handler 函数
def run_glob(pattern: str) -> str:
    import glob
    return "\n".join(glob.glob(pattern))
第 2 处 · 注册到 dispatch map(选正确一行)
第 3 处 · 在 TOOLS 数组里加 schema(选正确一组)