نمای کلی
هنگام کار با مجموعه دادههای بزرگ، ارسال مستقیم دادههای خام از طریق مدل مشکلاتی ایجاد میکند: پاسخها را کند میکند، هزینههای توکن را افزایش میدهد و خطاهای استدلال را ایجاد میکند. دادههای 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 با دسترسی به session state دریافت میکند. این به شما امکان میدهد مجموعه دادههای بزرگ را در حافظه پسزمینه در طول نوبتهای مکالمه ذخیره کنید، بدون اینکه آنها را در اعلان مدل قرار دهید.
# root_agent = llm_agent.Agent(
# ...,
# after_tool_callback=stash_and_truncate_results,
# )
کوتاهسازی و ذخیرهسازی پس از اجرا
هدف : نمایش نمونه کوچکی از نتایج پرسوجو به مدل برای تصمیمگیری، در عین حال ذخیره کل مجموعه دادهها برای خروجی نهایی.
برای عامل RMI، یک after_tool_callback نتایج execute_sql رهگیری میکند، لیست کامل ردیفها را در session state ذخیره میکند و یک نمونه کوتاه به همراه تعداد کل ردیفها برمیگرداند:
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
بازگرداندن یک نمونه، توکنهای ورودی را در تمام نوبتهای آینده کاهش میدهد و در نتیجه هزینهها و زمان پاسخ را کاهش میدهد. همچنین از شلوغ شدن پنجره متن توسط نتایج پرسوجوی بزرگ و آسیب رساندن به توانایی مدل در دنبال کردن دستورالعملها جلوگیری میکند.
مطمئن شوید که اعلان عامل شما به صراحت توضیح میدهد که ابزارها بر اساس طراحی، نمونهای را برمیگردانند. بدون این زمینه، مدل میتواند با دادههای جزئی گیج شود، توکنهای محاسبه و استدلال را در تلاش برای تطبیق رکوردهای از دست رفته هدر دهد یا فراخوانیهای ابزار اضافی را برای دریافت بقیه اجرا کند.
مثال: مدیریت یک مجموعه نتایج بزرگ
- کاربر میپرسد «در حال حاضر کدام مسیرها نسبت تأخیر بیش از ۲ دارند؟»
- پرسوجوی عامل در برابر
historical_travel_timeهزاران ردیف را برمیگرداند. - تابع
after_tool_callbackنتیجه کامل را در session state ذخیره میکند و تنها بخش کوچکی از نمونه به علاوه تعداد کل ردیفها را برمیگرداند. - مدل برای نوشتن خلاصه خود، روی آن نمونه استدلال میکند.
- برنامه یا ابزارهای پاییندستی، کل مجموعه دادهها را مستقیماً از وضعیت جلسه (session state) میخوانند تا جدول کامل را رندر کنند یا برای کاربر خروجی بگیرند.
نکات کلیدی
- دادههای حجیم را از اعلانها دور نگه دارید : مجموعه دادههای حجیم را در حالت جلسه ذخیره کنید، نه اینکه آنها را از طریق تاریخچه اعلان به عقب و جلو ارسال کنید.
- خروجیهای بزرگ ابزار را کوتاه کنید :
after_tool_callbackبرای بازگرداندن نمونههای کوچک به مدل و در عین حال ذخیره نتایج کامل در حالت جلسه استفاده کنید. - مدل را در مورد نمونهها مطلع کنید : یک قانون سریع اضافه کنید که توضیح دهد نتایج برای جلوگیری از سردرگمی مدل، اتلاف توکنهای استدلال و فراخوانیهای ابزار اضافی، نمونهبرداری میشوند.
مراحل بعدی
- مرجع فراخوانیهای ADK : برای جزئیات بیشتر در مورد رهگیری در سطح مدل، عامل و ابزار، راهنمای رسمی فراخوانیهای ADK را مطالعه کنید.
مشارکتکنندگان
ناتانیل توماس | کارآموز مهندسی نرمافزار، پلتفرم نقشههای گوگل