اعتراض الأدوات المتقدّمة لوكلاء 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"