RMI ADK এজেন্টদের জন্য উন্নত টুল ইন্টারসেপশন

সংক্ষিপ্ত বিবরণ

When dealing with large datasets, passing raw data directly through the model causes problems: it slows responses, inflates token costs, and introduces reasoning errors. RMI data can span millions of rows, so letting the agent query an unbounded amount and ingest it all for analysis is expensive in tokens and bloats the context window, degrading the agent's performance on every subsequent turn.

উদাহরণস্বরূপ, RMI-এর historical_travel_time টেবিলের উপর একটি কোয়েরি হাজার হাজার রোড-সেগমেন্ট সারি ফেরত দিতে পারে। সম্পূর্ণ ফলাফল সেটটিকে কনভার্সেশন হিস্ট্রিতে ফিরিয়ে আনলে তা পরবর্তী প্রতিটি টার্নকে ধীর করে দেয়, খরচ বাড়িয়ে তোলে এবং মডেলকে চূড়ান্ত উত্তর সংশ্লেষণ করা থেকে বিভ্রান্ত করে।

শুধুমাত্র প্রম্পট নির্দেশাবলী দিয়ে এই সমস্যাগুলো সমাধান করা যায় না। একমাত্র নির্ভরযোগ্য উপায় হলো টুল কলগুলোকে ইন্টারসেপ্ট করা এবং মডেলের কনটেক্সট উইন্ডোর বাইরে বড় আকারের ডেটা পেলোড রাউট করা।

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. historical_travel_time এর উপর এজেন্টের করা কোয়েরিটি হাজার হাজার সারি ফেরত দেয়।
  3. after_tool_callback সম্পূর্ণ ফলাফলটি সেশন স্টেটে সংরক্ষণ করে এবং শুধুমাত্র একটি ছোট নমুনা ও মোট সারির সংখ্যা ফেরত দেয়।
  4. মডেলটি তার সারসংক্ষেপ তৈরি করার জন্য সেই নমুনাটি নিয়ে যুক্তি-তর্ক করে।
  5. অ্যাপ্লিকেশন বা ডাউনস্ট্রিম টুলগুলো ব্যবহারকারীর জন্য সম্পূর্ণ টেবিলটি রেন্ডার করতে বা এক্সপোর্ট করতে সরাসরি সেশন স্টেট থেকে সম্পূর্ণ ডেটাসেটটি পড়ে নেয়।
আরএমআই এজেন্ট টুল ইন্টারসেপশন

মূল বিষয়বস্তু

  • প্রম্পট থেকে বড় পেলোড দূরে রাখুন : বড় ডেটাসেটগুলিকে প্রম্পট হিস্ট্রির মাধ্যমে বারবার আদান-প্রদান না করে সেশন স্টেটে সংরক্ষণ করুন।
  • বৃহৎ টুল আউটপুট সংক্ষিপ্ত করুন : সেশন স্টেটে সম্পূর্ণ ফলাফল সংরক্ষণ করার পাশাপাশি মডেলে ছোট নমুনা ফেরত পাঠাতে after_tool_callback ব্যবহার করুন।
  • মডেলকে স্যাম্পল সম্পর্কে জানান : মডেলের বিভ্রান্তি, রিজনিং টোকেনের অপচয় এবং অপ্রয়োজনীয় টুল কল এড়াতে, ফলাফল স্যাম্পল করা হয়েছে তা ব্যাখ্যা করে একটি প্রম্পট রুল যোগ করুন।

পরবর্তী পদক্ষেপ

  • ADK কলব্যাক রেফারেন্স : মডেল, এজেন্ট এবং টুল-স্তরের ইন্টারসেপশন সম্পর্কে বিস্তারিত জানতে অফিসিয়াল ADK কলব্যাক গাইড পড়ুন।

অবদানকারীরা

নাথানিয়েল থমাস | সফটওয়্যার ইঞ্জিনিয়ারিং ইন্টার্ন, গুগল ম্যাপস প্ল্যাটফর্ম