Ringkasan
Saat menangani set data besar, meneruskan data mentah secara langsung melalui model akan menimbulkan masalah: memperlambat respons, meningkatkan biaya token, dan menimbulkan kesalahan penalaran. Data RMI dapat mencakup jutaan baris, sehingga membiarkan agen membuat kueri dalam jumlah yang tidak terbatas dan menyerap semuanya untuk analisis akan mahal dalam token dan memperbesar jendela konteks, sehingga menurunkan performa agen pada setiap giliran berikutnya.
Misalnya, kueri pada tabel historical_travel_time RMI dapat menampilkan ribuan baris segmen jalan. Menempatkan seluruh kumpulan hasil kembali ke histori percakapan akan memperlambat setiap giliran berikutnya, meningkatkan biaya, dan mengalihkan perhatian model dari mensintesis jawaban akhir.
Petunjuk perintah saja tidak dapat menyelesaikan masalah ini. Satu-satunya pendekatan yang andal adalah mencegat panggilan alat dan merutekan payload data besar di luar jendela konteks model.
Callback alat ADK
ADK menyediakan hook callback untuk mencegat eksekusi alat. Untuk menangani set hasil yang besar, gunakan after_tool_callback:
before_tool_callback(tool, args, tool_context): Berjalan setelah model memilih alat, tetapi sebelum alat dijalankan.after_tool_callback(tool, args, tool_context, tool_response): Berjalan setelah alat selesai, tetapi sebelum hasil dikembalikan ke model. Gunakan untuk mengubah respons alat.
Callback menerima objek tool_context dengan akses ke sesi state.
Hal ini memungkinkan Anda menyimpan set data besar di memori latar belakang di seluruh giliran percakapan tanpa memasukkannya ke dalam perintah model.
# root_agent = llm_agent.Agent(
# ...,
# after_tool_callback=stash_and_truncate_results,
# )
Pemangkasan dan penyimpanan pasca-eksekusi
Tujuan: Menunjukkan sampel kecil hasil kueri kepada model untuk pengambilan keputusan, sekaligus menyimpan set data lengkap untuk output akhir.
Untuk agen RMI, after_tool_callback mencegat hasil execute_sql,
menyimpan daftar lengkap baris dalam status sesi, dan menampilkan sampel singkat beserta
jumlah total baris:
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
Menampilkan contoh akan mengurangi token input di semua giliran mendatang, sehingga menurunkan biaya dan waktu respons. Cara ini juga mencegah hasil kueri yang besar memenuhi jendela konteks dan merusak kemampuan model untuk mengikuti petunjuk.
Pastikan perintah agen Anda menjelaskan secara eksplisit bahwa alat menampilkan sampel berdasarkan desain. Tanpa konteks ini, model dapat menjadi bingung dengan data parsial, membuang-buang token komputasi dan penalaran untuk mencoba merekonsiliasi data yang hilang atau meluncurkan panggilan alat yang berlebihan untuk mengambil data lainnya.
Contoh: Menangani kumpulan hasil yang besar
- Pengguna bertanya "What are routes that have delay ratios over 2 right now?" (Rute mana yang saat ini memiliki rasio keterlambatan di atas 2?)
- Kueri agen terhadap
historical_travel_timemenampilkan ribuan baris. after_tool_callbackmenyimpan hasil lengkap dalam status sesi dan hanya menampilkan sampel kecil ditambah jumlah total baris.- Model akan menalar contoh tersebut untuk menyusun ringkasannya.
- Aplikasi atau alat hilir membaca set data lengkap langsung dari status sesi untuk merender tabel lengkap atau mengekspor untuk pengguna.
Poin-poin penting
- Menjaga payload besar agar tidak masuk ke perintah: Simpan set data besar dalam status sesi, bukan mengirimkannya bolak-balik melalui histori perintah.
- Memangkas output alat yang besar: Gunakan
after_tool_callbackuntuk menampilkan sampel kecil ke model sambil menyimpan hasil lengkap dalam status sesi. - Memberi tahu model tentang sampel: Tambahkan aturan perintah yang menjelaskan bahwa hasil diambil sampelnya untuk mencegah kebingungan model, token penalaran yang terbuang, dan panggilan alat yang berlebihan.
Langkah berikutnya
- Referensi callback ADK: Baca panduan Callback ADK resmi untuk mengetahui detail tentang intersepsi tingkat model, agen, dan alat.
Kontributor
Nathaniel Thomas | Software Engineering Intern, Google Maps Platform