اعتراض الأدوات المتقدّمة لوكلاء RMI ADK

نظرة عامة

عند التعامل مع مجموعات البيانات الكبيرة، يؤدي تمرير البيانات الأولية مباشرةً من خلال النموذج إلى حدوث مشاكل: فهو يبطئ الاستجابات، ويضخّم تكاليف الرموز، ويؤدي إلى حدوث أخطاء في عملية الاستنتاج. يمكن أن تمتدّ بيانات RMI إلى ملايين الصفوف، لذا فإنّ السماح للوكيل بالاستعلام عن كمية غير محدودة من البيانات واستيعابها بالكامل لأغراض التحليل أمر مكلف من حيث الرموز ويؤدي إلى تضخيم قدرة الاستيعاب، ما يؤدي إلى تدهور أداء الوكيل في كل دورة لاحقة.

على سبيل المثال، يمكن أن يعرض طلب بحث في جدول historical_travel_time في RMI آلاف الصفوف من مقاطع الطرق. إنّ إعادة مجموعة النتائج الكاملة إلى سجلّ المحادثات يبطئ كل دورة لاحقة، ويضخّم التكلفة، ويشتّت انتباه النموذج عن تجميع الإجابة النهائية.

لا يمكن أن تحلّ تعليمات المطالبة وحدها هذه المشاكل. النهج الموثوق الوحيد هو اعتراض طلبات استخدام الأدوات وتوجيه حمولات البيانات الكبيرة خارج قدرة استيعاب النموذج.

عمليات إعادة استدعاء الأدوات في حزمة تطوير الوكلاء (ADK)

توفّر حزمة تطوير الوكلاء (ADK) نقاط ربط لعمليات إعادة الاستدعاء لاعتراض تنفيذ الأدوات. للتعامل مع مجموعات النتائج الكبيرة، استخدِم after_tool_callback:

  • before_tool_callback(tool, args, tool_context): يتم تشغيلها بعد أن يختار النموذج أداة، ولكن قبل تنفيذ الأداة.
  • after_tool_callback(tool, args, tool_context, tool_response): يتم تشغيلها بعد انتهاء الأداة، ولكن قبل إعادة النتيجة إلى النموذج. استخدِمها لتعديل استجابة الأداة.

تتلقّى عملية إعادة الاستدعاء كائن tool_context مع إمكانية الوصول إلى state الجلسة. يتيح لك ذلك تخزين مجموعات البيانات الكبيرة في الذاكرة في الخلفية على مستوى دورات المحادثة بدون وضعها في مطالبة النموذج.

# root_agent = llm_agent.Agent(
#     ...,
#     after_tool_callback=stash_and_truncate_results,
# )

الاقتطاع والتخزين المؤقت بعد التنفيذ

الهدف: عرض نموذج صغير من نتائج طلب البحث على النموذج لاتخاذ القرارات، مع حفظ مجموعة البيانات الكاملة للناتج النهائي.

بالنسبة إلى وكيل RMI، تعترض after_tool_callback نتائج execute_sql، وتحفظ القائمة الكاملة للصفوف في حالة الجلسة، وتعرض نموذجًا قصيرًا بالإضافة إلى إجمالي عدد الصفوف:

def stash_and_truncate_results(tool, args, tool_context, tool_response):
  if tool.name == "execute_sql" and "rows" in tool_response:
    rows = tool_response["rows"]
    tool_context.state["last_sql_result"] = rows      # keep everything
    tool_response["total_rows_fetched"] = len(rows)
    tool_response["rows"] = rows[:SAMPLE_LIMIT]        # show a sample
    tool_response["message"] = (
        f"Showing {SAMPLE_LIMIT} of {len(rows)} rows. "
        "Full result stashed in background state."
    )
  return tool_response

يؤدي عرض نموذج إلى تقليل رموز الإدخال على مستوى جميع الدورات المستقبلية، ما يؤدي إلى خفض التكاليف وأوقات الاستجابة. ويمنع أيضًا نتائج طلبات البحث الكبيرة من ملء قدرة استيعاب والإضرار بقدرة النموذج على اتّباع التعليمات.

تأكَّد من أنّ مطالبة الوكيل توضّح بشكل صريح أنّ الأدوات تعرض نموذجًا حسب التصميم. بدون هذا السياق، يمكن أن يصبح النموذج مشوشًا بسبب البيانات الجزئية، ما يؤدي إلى إهدار رموز الحوسبة والاستنتاج في محاولة مطابقة السجلاتّ الناقصة أو إطلاق طلبات استخدام أدوات زائدة لجلب الباقي.

مثال: التعامل مع مجموعة نتائج كبيرة

  1. يسأل المستخدِم "ما هي الطرق التي تتجاوز نسب التأخير فيها 2 في الوقت الحالي؟"
  2. يعرض طلب البحث الذي يقدّمه الوكيل في historical_travel_time آلاف الصفوف.
  3. تحفظ after_tool_callback النتيجة الكاملة في حالة الجلسة ولا تعرض سوى نموذج صغير بالإضافة إلى إجمالي عدد الصفوف.
  4. يستنتج النموذج من هذا النموذج لتجميع الملخّص.
  5. يقرأ التطبيق أو الأدوات اللاحقة مجموعة البيانات الكاملة مباشرةً من حالة الجلسة لعرض الجدول الكامل أو تصديره للمستخدِم.
اعتراض أداة وكيل RMI

الخلاصات الرئيسية

  • إبقاء الحمولات الكبيرة خارج المطالبات: خزِّن مجموعات البيانات الكبيرة في حالة الجلسة بدلاً من تمريرها ذهابًا وإيابًا من خلال سجلّ المطالبات.
  • اقتطاع نواتج الأدوات الكبيرة: استخدِم after_tool_callback لعرض نماذج صغيرة على النموذج مع حفظ النتائج الكاملة في حالة الجلسة.
  • إعلام النموذج بالنماذج: أضِف قاعدة مطالبة توضّح أنّه يتم أخذ عيّنات من النتائج لمنع حدوث تشوّش في النموذج وإهدار رموز الاستنتاج وطلبات استخدام الأدوات الزائدة.

الخطوات التالية

المساهمون

ناثانيال توماس | متدرب في هندسة البرمجيات، منصة خرائط Google