Membangun Agen AI dengan Agent Development Kit (ADK) untuk Java

1. Selamat datang, para developer agen AI!

Dalam codelab ini, Anda akan mempelajari cara membangun agen AI di Java, menggunakan Agents Development Kit (ADK) untuk Java. Kita akan melampaui panggilan API Model Bahasa Besar (LLM) sederhana untuk membuat agen AI otonom yang dapat menalar, merencanakan, menggunakan alat, dan bekerja sama untuk memecahkan masalah yang kompleks.

Anda akan memulai dengan menukarkan kredit Google Cloud, menyiapkan lingkungan Google Cloud, lalu membangun agen sederhana pertama, dan secara bertahap menambahkan kemampuan yang lebih canggih seperti alat kustom, penelusuran web, dan orkestrasi multi-agen.

d666c455bb267688.png

Yang akan Anda pelajari

  • Cara membuat agen AI dasar yang didorong persona.
  • Cara melengkapi agen dengan alat kustom dan bawaan (seperti Google Penelusuran).
  • Cara menambahkan alat Anda sendiri yang diimplementasikan di Java.
  • Cara mengorkestrasi beberapa agen ke dalam alur kerja berurutan, paralel, dan berulang yang canggih.

Yang Anda butuhkan

  • Browser web yang akan kita gunakan dalam mode Samaran.
  • Akun Gmail pribadi.
  • Project Google Cloud baru yang terkait dengan akun Gmail pribadi Anda.
  • Akun penagihan yang dibuat dengan kredit Google Cloud yang ditukarkan.
  • Alat command line git untuk memeriksa kode sumber.
  • Java 17+ dan Apache Maven.
  • Editor teks atau IDE, seperti IntelliJ IDEA atau VS Code.

Anda dapat menggunakan editor VS Code bawaan di Cloud Shell, di konsol Google Cloud.

2. Penyiapan: Lingkungan Anda

Mengklaim kredit Google Cloud untuk workshop

e3e67ae61e86ec9f.png

Untuk workshop yang dipandu instruktur, Anda akan menerima link ke situs tempat Anda dapat mengklaim kredit Google Cloud untuk digunakan dalam workshop.

  • Gunakan Akun Google pribadi: Anda harus menggunakan Akun Google pribadi (seperti alamat gmail.com) karena alamat email perusahaan atau sekolah tidak akan berfungsi.
  • Gunakan Google Chrome dalam mode samaran: Tindakan ini direkomendasikan untuk membuat sesi yang bersih dan mencegah konflik dengan Akun Google lain.
  • Gunakan link acara khusus: Link khusus untuk acara, yang terlihat seperti https://trygcp.dev/event/xxx diikuti dengan kode acara (di sini "xxx" dalam contoh ini), harus digunakan.
  • Setujui persyaratan layanan: Setelah login, Anda akan melihat persyaratan layanan Google Cloud Platform, yang harus Anda setujui untuk melanjutkan.
  • Buat project baru: Project kosong baru harus dibuat dari Konsol Google Cloud.
  • Tautkan akun penagihan: Tautkan project yang baru dibuat ke akun penagihan.
  • Konfirmasi kredit: Video berikut menunjukkan cara mengonfirmasi bahwa kredit diterapkan ke project dengan memeriksa bagian "kredit" di halaman penagihan.

Jangan ragu untuk menonton video ini yang menjelaskan cara menukarkan dan menerapkan kredit.

Membuat dan Mengonfigurasi Kunci API Anda

Untuk mengautentikasi agen AI ADK Anda dengan Gemini API untuk codelab ini, Anda akan menggunakan kunci API yang terkait dengan project Google Cloud Anda.

  1. Membuat Kunci API:
  • Buka Google AI Studio, lalu klik link "Get API key" di bagian bawah panel samping kiri.
  • Pilih Projects, lalu klik tombol Import projects.
  • Telusuri dan pilih project Google Cloud yang ingin Anda impor, lalu pilih tombol Impor.
  • Setelah project diimpor, buka halaman API Keys dari menu Dashboard, lalu buat kunci API di project yang baru saja Anda impor.
  • Catat kunci API.
  1. Tetapkan Variabel Lingkungan: Agen Anda perlu mengakses kunci ini. Cara standar adalah dengan menetapkan variabel lingkungan bernama GOOGLE_API_KEY.
  • macOS / Linux: Buka terminal Anda dan jalankan perintah berikut, dengan mengganti "your-api-key" dengan kunci yang baru saja Anda salin. Agar menjadi permanen, tambahkan baris ini ke file startup shell Anda (misalnya, ~/.bash_profile, ~/.zshrc).
export GOOGLE_API_KEY="your-api-key"
  • Windows (Command Prompt): Buka command prompt baru dan jalankan:
setx GOOGLE_API_KEY "your-api-key"
  • Anda harus memulai ulang command prompt agar perubahan ini diterapkan.
  • Windows (PowerShell): Buka terminal PowerShell dan jalankan:
$env:GOOGLE_API_KEY="your-api-key"
  • Untuk membuat perubahan ini permanen di PowerShell, Anda harus menambahkannya ke skrip profil.

3. Mulai: Agen Pertama Anda

f814ab5b7614e071.png

Cara terbaik untuk memulai project baru adalah dengan menggunakan template GitHub ADK untuk Java. Ini menyediakan struktur project dan semua dependensi yang diperlukan.

Jika memiliki akun Github, Anda dapat melakukan hal berikut: Use this template > Create a new repository, lalu periksa kode secara lokal dengan perintah git clone.

Berikut screenshot yang menampilkan menu kanan atas untuk menggunakan template.

1613a3d0ddc66dc5.png

Pendekatan lainnya adalah dengan langsung meng-clone repositori tersebut, dengan:

git clone https://github.com/glaforge/adk-java-maven-template.git

Kemudian, cd ke adk-java-maven-template.

Untuk memastikan Anda siap memulai coding agen AI pertama Anda di Java, pastikan Anda dapat mengompilasi kode dalam project ini dengan:

mvn compile

Langkah Kode: Agen Guru Sains yang Ramah

Elemen penyusun dasar di ADK adalah class LlmAgent. Anggap saja ini sebagai AI dengan kepribadian dan tujuan tertentu, yang didukung oleh Model Bahasa Besar. Kami akan menambahkan lebih banyak kemampuan melalui alat nanti, dan menjadikannya lebih efektif dengan berkolaborasi secara erat dengan agen serupa lainnya.

Mari kita buat class Java baru, dalam paket com.example.agent, dan beri nama ScienceTeacher.

Ini adalah "Hello, World!" dalam pembuatan agen. Kita akan menentukan agen sederhana dengan persona seorang guru sains.

// src/main/java/com/example/agent/ScienceTeacher.java
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.web.AdkWebServer;

public class ScienceTeacher {
    public static void main(String[] args) {
        AdkWebServer.start(
            LlmAgent.builder()
                .name("science-teacher")
                .description("A friendly science teacher")
                .instruction("""
                    You are a science teacher for teenagers.
                    You explain science concepts in a simple, concise and direct way.
                    """)
                .model("gemini-2.5-flash")
                .build()
        );
    }
}

Agen AI dikonfigurasi melalui metode LlmAgent.builder(). Parameter name(), description(), dan model() bersifat wajib, dan untuk memberikan kepribadian spesifik dan perilaku yang tepat kepada agen Anda, Anda harus selalu memberikan panduan mendetail melalui metode instruction().

Di sini, kami memilih untuk menggunakan model Gemini 2.5 Flash, tetapi Anda juga dapat mencoba Gemini 2.5 Pro untuk tugas yang lebih rumit.

Agen ini di-wrap dalam metode AdkWebServer.start(). Ini adalah antarmuka chat UI Dev ADK. Fitur ini memungkinkan Anda melakukan percakapan dengan agen melalui antarmuka chat biasa. Selain itu, fitur ini sangat membantu jika Anda ingin memahami apa yang terjadi di balik layar, seperti semua peristiwa yang mengalir melalui sistem, permintaan dan respons yang dikirim ke LLM.

Untuk mengompilasi dan menjalankan agen ini secara lokal, jalankan perintah berikut:

mvn compile exec:java -Dexec.mainClass=com.example.agent.ScienceTeacher

Kemudian, buka browser Anda di http://localhost:8080. Anda akan melihat UI seperti yang ditunjukkan pada screenshot di bawah. Lanjutkan dan ajukan pertanyaan terkait sains kepada agen Anda.

da094da276ba15d6.png

4. Membekali Agen dengan Alat

cd5c5798a0861a1c.png

Mengapa agen memerlukan alat? LLM sangat canggih, tetapi pengetahuannya terbatas pada waktu pelatihannya dan tidak dapat berinteraksi dengan dunia luar. Alat adalah jembatannya. Dengan alat ini, agen dapat mengakses informasi real-time (seperti harga saham atau berita), membuat kueri API pribadi, atau melakukan tindakan apa pun yang dapat Anda kodekan di Java.

Langkah Kode: Membuat Alat Kustom (StockTicker)

Di sini, kita memberi agen alat untuk mencari harga saham. Agen berpendapat bahwa saat pengguna meminta harga, agen harus memanggil metode Java kita.

// src/main/java/com/example/agent/StockTicker.java
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.tools.Annotations.Schema;
import com.google.adk.tools.FunctionTool;
import com.google.adk.web.AdkWebServer;
import java.util.Map;

public class StockTicker {
    public static void main(String[] args) {
        AdkWebServer.start(
            LlmAgent.builder()
                .name("stock_agent")
                .instruction("""
                    You are a stock exchange ticker expert.
                    When asked about the stock price of a company,
                    use the `lookup_stock_ticker` tool to find the information.
                    """)
                .model("gemini-2.5-flash")
                .tools(FunctionTool.create(StockTicker.class, "lookupStockTicker"))
                .build()
        );
    }

    @Schema(
        name = "lookup_stock_ticker",
        description = "Lookup stock price for a given company or ticker"
    )
    public static Map<String, String> lookupStockTicker(
        @Schema(name = "company_name_or_stock_ticker", description = "The company name or stock ticker")
        String ticker) {
        // ... (logic to return a stock price)
    }
}

Untuk membuat agen lebih pintar dan memberinya kemampuan untuk berinteraksi dengan dunia (atau dengan kode, API, layanan, dll. Anda sendiri), Anda dapat mengonfigurasi agen untuk menggunakan alat, dan khususnya alat kode kustom, melalui metode tools(), dengan meneruskan FunctionTool.create(...).

FunctionTool memerlukan class dan nama metode yang mengarah ke metode statis Anda sendiri. Anda juga dapat meneruskan instance class dan nama metode instance objek tersebut.

Penting untuk menentukan name dan description metode, serta parameternya, melalui anotasi @Schema, karena informasi ini akan digunakan oleh LLM yang mendasarinya untuk mengetahui kapan dan bagaimana metode tertentu harus dipanggil.

Yang sama pentingnya, lebih baik bantu LLM dengan petunjuk yang jelas tentang cara dan waktu penggunaan alat ini. Model mungkin dapat mengetahuinya sendiri, tetapi jika Anda memberikan penjelasan eksplisit dalam metode instruction(), fungsi Anda memiliki peluang lebih tinggi untuk dipanggil dengan tepat.

Metode ini harus menampilkan Map. Biasanya, idenya adalah menampilkan peta dengan kunci yang merepresentasikan hasil, seperti stock_price, dan mengaitkan nilai harga saham dengannya. Pada akhirnya, Anda dapat menambahkan pasangan kunci/nilai keberhasilan/benar tambahan untuk menandakan keberhasilan operasi. Jika terjadi error, Anda harus menampilkan peta dengan kunci yang disebut, misalnya, error, dan mengaitkan pesan error dalam nilai terkait. Hal ini membantu LLM memahami apakah panggilan berhasil atau gagal karena alasan tertentu.

  • Jika berhasil, kembalikan: {"stock_price": 123}
  • Jika terjadi error, kembalikan: {"error": "Impossible to retrieve stock price for XYZ"}

Kemudian, jalankan class ini dengan perintah berikut:

mvn compile exec:java -Dexec.mainClass=com.example.agent.StockTicker

5. Kecanggihan Google Penelusuran untuk mendapatkan informasi terbaru

ae215e7b7cde02ab.png

ADK untuk Java dilengkapi dengan sejumlah alat canggih, salah satunya adalah GoogleSearchTool. Dengan alat ini, agen Anda dapat meminta penggunaan Google Penelusuran untuk menemukan informasi yang relevan guna mencapai tujuannya.

Memang, pengetahuan LLM dibatasi oleh waktu: LLM dilatih hingga tanggal tertentu ("tanggal batas") dengan data yang juga terbaru pada saat informasi dikumpulkan. Artinya, LLM mungkin tidak selalu mengetahui peristiwa terbaru, atau pengetahuannya mungkin terbatas dan dangkal, dan bantuan mesin telusur dapat menyegarkan ingatannya atau mengajarinya lebih banyak tentang topik tersebut.

Mari kita lihat agen penelusuran berita sederhana ini:

// src/main/java/com/example/agent/LatestNews.java
package com.example.agent;

import java.time.LocalDate;
import com.google.adk.agents.LlmAgent;
import com.google.adk.tools.GoogleSearchTool;
import com.google.adk.web.AdkWebServer;

public class LatestNews {
    public static void main(String[] args) {
        AdkWebServer.start(LlmAgent.builder()
            .name("news-search-agent")
            .description("A news search agent")
            .instruction("""
                You are a news search agent.
                Use the `google_search` tool
                when asked to search for recent events and information.
                Today is \
                """ + LocalDate.now())
            .model("gemini-2.5-flash")
            .tools(new GoogleSearchTool())
            .build());
    }
}

Perhatikan cara kita meneruskan instance alat penelusuran dengan: tools(new GoogleSearchTool()). Hal inilah yang memberi agen kita kemampuan untuk mendapatkan informasi terbaru yang dapat ditemukan di web. Selain itu, perintah menentukan tanggal hari ini, karena dapat membantu LLM memahami kapan pertanyaan terkait informasi lama dan kapan diperlukan penelusuran informasi yang lebih baru.

Kemudian, jalankan class ini dengan perintah berikut:

mvn compile exec:java -Dexec.mainClass=com.example.agent.LatestNews

Jangan ragu untuk bermain-main dengan perintah, untuk meminta hasil yang berbeda dalam hal gaya, ringkasan, atau fokus, dll.

Langkah Kode: Agen Penelusuran sebagai Alat

Daripada meneruskan GoogleSearchTool ke agen secara langsung sebagai alat, Anda dapat membuat agen penelusuran khusus yang merangkum fungsi penelusuran dan mengekspos agen tersebut sebagai alat ke agen tingkat yang lebih tinggi.

Ini adalah konsep lanjutan yang memungkinkan Anda mendelegasikan perilaku yang kompleks (seperti menelusuri dan meringkas hasilnya) ke sub-agen khusus. Pendekatan ini sering kali berguna untuk alur kerja yang lebih kompleks, karena alat bawaan tidak dapat digunakan dengan alat berbasis kode kustom.

// src/main/java/com/example/agent/SearchAgentAsTool.java
package com.example.agent;

import java.time.LocalDate;

import com.google.adk.agents.LlmAgent;
import com.google.adk.tools.AgentTool;
import com.google.adk.tools.GoogleSearchTool;
import com.google.adk.web.AdkWebServer;

public class SearchAgentAsTool {
    public static void main(String[] args) {
        // 1. Define the specialized Search Agent
        LlmAgent searchAgent = LlmAgent.builder()
            .name("news-search-agent-tool")
            .description("Searches for recent events and provides a concise summary.")
            .instruction("""
                You are a concise information retrieval specialist.
                Use the `google_search` tool to find information.
                Always provide the answer as a short,
                direct summary, without commentary.
                Today is \
                """ + LocalDate.now())
            .model("gemini-2.5-flash")
            .tools(new GoogleSearchTool()) // This agent uses the Google Search Tool
            .build();

        // 2. Wrap the Search Agent as a Tool
        AgentTool searchTool = AgentTool.create(searchAgent);

        // 3. Define the Main Agent that uses the Search Agent Tool
        AdkWebServer.start(LlmAgent.builder()
            .name("main-researcher")
            .description("Main agent for answering complex, up-to-date questions.")
            .instruction("""
                You are a sophisticated research assistant.
                When the user asks a question that requires up-to-date or external information,
                you MUST use the `news-search-agent-tool` to get the facts before answering.
                After the tool returns the result, synthesize the final answer for the user.
                """)
            .model("gemini-2.5-flash")
            .tools(searchTool) // This agent uses the Search Agent as a tool
            .build()
       );
    }
}

Garis AgentTool.create(searchAgent) adalah konsep utama di sini. Fungsi ini mendaftarkan seluruh searchAgent (dengan logika internal, perintah, dan alatnya sendiri) sebagai satu alat yang dapat dipanggil untuk mainAgent. Hal ini meningkatkan modularitas dan penggunaan kembali.

Jalankan class ini dengan perintah berikut:

mvn compile exec:java -Dexec.mainClass=com.example.agent.SearchAgentAsTool

Untuk pertanyaan biasa, agen akan menjawab dari basis pengetahuannya sendiri, tetapi saat ditanya tentang peristiwa terkini, agen akan mendelegasikan penelusuran ke agen penelusuran khusus menggunakan alat Google Penelusuran.

6. Menguasai Alur Kerja Agentic

Untuk masalah yang kompleks, satu agen saja tidak cukup. Jika diberi tujuan yang terdiri dari terlalu banyak sub-tugas, dengan perintah besar yang menjelaskan terlalu banyak detail, atau dengan akses ke sejumlah besar fungsi, LLM akan kesulitan, dan performa serta akurasinya akan menurun.

Kuncinya adalah membagi dan menaklukkan dengan mengorkestrasi beberapa agen khusus. Untungnya, ADK dilengkapi dengan berbagai agen khusus bawaan:

  • Agen normal dengan subAgent() untuk mendelegasikan tugas,
  • SequentialAgent, untuk melakukan tugas secara berurutan,
  • ParallelAgent, untuk menjalankan agen secara paralel,
  • LoopAgent, biasanya untuk melalui proses penyempurnaan sebanyak yang diperlukan.

Untuk mengetahui kasus penggunaan utama, serta kelebihan dan kekurangan setiap alur kerja, lihat tabel di bawah. Namun, ketahui bahwa kekuatan sebenarnya akan berasal dari kombinasi beberapa di antaranya.

Alur kerja

Class ADK

Kasus Penggunaan

Kelebihan

Kekurangan

Sub-Agen

LlmAgent

Tugas fleksibel yang didorong pengguna dan langkah selanjutnya tidak selalu diketahui.

Fleksibilitas tinggi, percakapan, cocok untuk bot yang berinteraksi dengan pengguna.

Kurang dapat diprediksi, mengandalkan penalaran LLM untuk kontrol alur.

Berurutan

SequentialAgent

Proses tetap dan multi-langkah yang urutannya sangat penting.

Dapat diprediksi, andal, mudah di-debug, menjamin urutan.

Tidak fleksibel, dapat lebih lambat jika tugas dapat diparalelkan.

Paralel

ParallelAgent

Mengumpulkan data dari berbagai sumber atau menjalankan tugas independen.

Sangat efisien, mengurangi latensi secara signifikan untuk tugas yang terikat I/O.

Semua tugas berjalan; tidak ada short-circuiting. Kurang cocok untuk tugas dengan dependensi.

Loop

LoopAgent

Penyempurnaan iteratif, koreksi otomatis, atau proses yang berulang hingga suatu kondisi terpenuhi.

Canggih untuk pemecahan masalah yang kompleks, memungkinkan agen meningkatkan kualitas pekerjaan mereka sendiri.

Dapat menyebabkan loop tak terbatas jika tidak didesain dengan cermat (selalu gunakan maxIterations!).

7. Alur Kerja Agentic — Delegasi dengan Sub-Agen

3b3074b840f57c1c.png

Agen supervisor dapat mendelegasikan tugas tertentu kepada sub-agen. Misalnya, bayangkan agen untuk situs e-commerce yang akan mendelegasikan pertanyaan terkait pesanan ke satu agen ("apa status pesanan saya?") dan pertanyaan layanan purnajual ke agen lain ("Saya tidak tahu cara menyalakannya!"). Ini adalah kasus penggunaan yang akan kita bahas.

// src/main/java/com/example/agent/SupportAgent.java
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.web.AdkWebServer;

public class SupportAgent {
    public static void main(String[] args) {
                LlmAgent topicSearchAgent = LlmAgent.builder()
            .name("order-agent")
            .description("Order agent")
            .instruction("""
                Your role is to help our customers
                with all the questions they may have about their orders.
                Always respond that the order has been received, prepared,
                and is now out for delivery.
                """)
            .model("gemini-2.5-flash")
            .build();

        LlmAgent socialMediaAgent = LlmAgent.builder()
            .name("after-sale-agent")
            .description("After sale agent")
            .instruction("""
                You are an after sale agent,
                helping customers with the product they received.
                When a customer has a problem,
                suggest the person to switch the product off and on again.
                """)
            .model("gemini-2.5-flash")
            .build();

        AdkWebServer.start(LlmAgent.builder()
            .name("support-agent")
            .description("Customer support agent")
            .instruction("""
                Your role is help our customers.
                Call the `order-agent` for all questions related to order status.
                Call the `after-sale-agent` for inquiries about the received product.
                """)
            .model("gemini-2.5-flash")
            .subAgents(socialMediaAgent, topicSearchAgent)
            .build()
        );
    }
}

Baris utama di sini adalah tempat metode subAgents() dipanggil, dengan meneruskan dua sub-agen yang peran spesifiknya akan ditangani secara terpisah oleh masing-masing sub-agen.

Jalankan contoh di atas dengan perintah berikut:

mvn compile exec:java -Dexec.mainClass=com.example.agent.SupportAgent

Konsep mendelegasikan tugas kepada sub-agen ini mencerminkan pengelolaan manusia yang efektif, di mana seorang manajer yang baik (agen supervisor) mengandalkan karyawan khusus (sub-agen) untuk menangani tugas tertentu yang lebih sesuai dengan keahlian mereka. Supervisor tidak perlu mengetahui setiap detail proses; tetapi, supervisor secara cerdas mengarahkan permintaan pelanggan (seperti pertanyaan tentang pesanan atau masalah teknis) kepada 'anggota tim' yang paling memenuhi syarat, sehingga memastikan respons yang lebih berkualitas dan efisien daripada yang dapat diberikan oleh satu generalis saja. Selain itu, sub-agen ini dapat sepenuhnya berkonsentrasi pada tugas masing-masing tanpa perlu memahami keseluruhan proses yang rumit.

8. Alur Kerja Agentic — Lini Perakitan

108f8601cd36b559.png

Jika urutan operasi penting, gunakan SequentialAgent. Seperti jalur perakitan, sub-agen dieksekusi dalam urutan tetap di mana setiap langkah dapat bergantung pada langkah sebelumnya.

Bayangkan seorang penyair Inggris berkolaborasi dengan penerjemah Inggris-Prancis untuk membuat puisi dalam bahasa Inggris terlebih dahulu, lalu menerjemahkannya ke dalam bahasa Prancis:

// src/main/java/com/example/agent/PoetAndTranslator.java
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.agents.SequentialAgent;
import com.google.adk.web.AdkWebServer;

public class PoetAndTranslator {
    public static void main(String[] args) {
        LlmAgent poet = LlmAgent.builder()
            .name("poet-agent")
            .description("Poet writing poems")
            .model("gemini-2.5-flash")
            .instruction("""
                You are a talented poet,
                who writes short and beautiful poems.
                """)
            .outputKey("poem")
            .build();

        LlmAgent translator = LlmAgent.builder()
            .name("translator-agent")
            .description("English to French translator")
            .model("gemini-2.5-flash")
            .instruction("""
                As an expert English-French translator,
                your role is to translate the following poem into French,
                ensuring the poem still rhymes even after translation:

                {poem}
                """)
            .outputKey("translated-poem")
            .build();

        AdkWebServer.start(SequentialAgent.builder()
            .name("poet-and-translator")
            .subAgents(poet, translator)
            .build());
    }
}

Jalankan contoh untuk mendapatkan puisi dalam bahasa Inggris, lalu diterjemahkan ke dalam bahasa Prancis, dengan perintah berikut:

mvn compile exec:java -Dexec.mainClass=com.example.agent.PoetAndTranslator

Penguraian sistematis tugas kompleks menjadi sub-tugas yang lebih kecil dan berurutan ini memastikan proses yang lebih deterministik dan andal, sehingga meningkatkan kemungkinan hasil yang berhasil secara signifikan dibandingkan dengan mengandalkan satu agen yang memiliki tujuan luas.

Menguraikan tugas secara efektif menjadi serangkaian sub-tugas (jika memungkinkan dan masuk akal) sangat penting untuk mencapai hasil yang lebih deterministik dan berhasil, karena memungkinkan progres terstruktur dan pengelolaan dependensi antar-langkah.

9. Alur Kerja Agentic — Bekerja Secara Paralel

4ba95f71e0189ae7.png

Jika tugas bersifat independen, ParallelAgent akan memberikan peningkatan efisiensi yang sangat besar dengan menjalankan tugas secara bersamaan. Dalam contoh berikut, kita bahkan akan menggabungkan SequentialAgent dengan ParallelAgent: tugas paralel dijalankan terlebih dahulu, lalu agen akhir merangkum hasil tugas paralel.

Mari kita buat detektif perusahaan yang tugasnya adalah mencari informasi tentang:

  • Profil perusahaan (CEO, kantor pusat, motto, dll.)
  • Berita terbaru tentang perusahaan.
  • Detail tentang keuangan perusahaan.
// src/main/java/com/example/agent/CompanyDetective.java 
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.agents.ParallelAgent;
import com.google.adk.agents.SequentialAgent;
import com.google.adk.tools.GoogleSearchTool;
import com.google.adk.web.AdkWebServer;

public class CompanyDetective {
    public static void main(String[] args) {
        var companyProfiler = LlmAgent.builder()
            .name("company-profiler")
            .description("Provides a general overview of a company.")
            .instruction("""
                Your role is to provide a brief overview of the given company.
                Include its mission, headquarters, and current CEO.
                Use the Google Search Tool to find this information.
                """)
            .model("gemini-2.5-flash")
            .tools(new GoogleSearchTool())
            .outputKey("profile")
            .build();

        var newsFinder = LlmAgent.builder()
            .name("news-finder")
            .description("Finds the latest news about a company.")
            .instruction("""
                Your role is to find the top 3-4 recent news headlines for the given company.
                Use the Google Search Tool.
                Present the results as a simple bulleted list.
                """)
            .model("gemini-2.5-flash")
            .tools(new GoogleSearchTool())
            .outputKey("news")
            .build();

        var financialAnalyst = LlmAgent.builder()
            .name("financial-analyst")
            .description("Analyzes the financial performance of a company.")
            .instruction("""
                Your role is to provide a snapshot of the given company's recent financial performance.
                Focus on stock trends or recent earnings reports.
                Use the Google Search Tool.
                """)
            .model("gemini-2.5-flash")
            .tools(new GoogleSearchTool())
            .outputKey("financials")
            .build();

        var marketResearcher = ParallelAgent.builder()
            .name("market-researcher")
            .description("Performs comprehensive market research on a company.")
            .subAgents(
                companyProfiler,
                newsFinder,
                financialAnalyst
            )
            .build();

        var reportCompiler = LlmAgent.builder()
            .name("report-compiler")
            .description("Compiles a final market research report.")
            .instruction("""
                Your role is to synthesize the provided information into a coherent market research report.
                Combine the company profile, latest news, and financial analysis into a single, well-formatted report.

                ## Company Profile
                {profile}

                ## Latest News
                {news}

                ## Financial Snapshot
                {financials}
                """)
            .model("gemini-2.5-flash")
            .build();

        AdkWebServer.start(SequentialAgent.builder()
            .name("company-detective")
            .description("Collects various information about a company.")
            .subAgents(
                marketResearcher,
                reportCompiler
            ).build());
    }
}

Seperti biasa, Anda dapat menjalankan agen dengan perintah berikut:

mvn compile exec:java -Dexec.mainClass=com.example.agent.CompanyDetective

Agen ini menunjukkan kombinasi alur kerja yang efektif, dengan agen paralel dan berurutan yang digunakan secara efektif, dengan cara yang efisien berkat paralelisme riset dan sintesis informasi.

10. Alur Kerja Agentic — Penyempurnaan Iteratif

ea37b0ab05aa5b28.png

Untuk tugas yang memerlukan siklus "buat → tinjau → perbaiki", gunakan LoopAgent. Alat ini mengotomatiskan peningkatan iteratif hingga sasaran tercapai. Mirip dengan SequentialAgent, LoopAgent akan memanggil sub-agen secara berurutan, tetapi akan kembali ke awal. LLM yang digunakan secara internal oleh agen akan memutuskan apakah akan meminta panggilan ke alat khusus, alat bawaan exit_loop, untuk menghentikan eksekusi loop atau tidak.

Contoh penyempurnaan kode di bawah, menggunakan LoopAgent, mengotomatiskan penyempurnaan kode: buat, tinjau, perbaiki. Hal ini meniru pengembangan manusia. Generator kode pertama-tama membuat kode yang diminta, lalu menyimpannya di status agen dengan kunci generated_code. Kemudian, peninjau kode akan meninjau kode yang dihasilkan, dan memberikan masukan (di bawah kunci feedback), atau memanggil alat loop keluar untuk mengakhiri iterasi lebih awal.

Mari kita lihat kodenya:

// src/main/java/com/example/agent/CodeRefiner.java
package com.example.agent;

import com.google.adk.agents.LlmAgent;
import com.google.adk.agents.LoopAgent;
import com.google.adk.agents.SequentialAgent;
import com.google.adk.tools.ExitLoopTool;
import com.google.adk.web.AdkWebServer;

public class CodeRefiner {
    public static void main(String[] args) {
        var codeGenerator = LlmAgent.builder()
            .name("code-generator")
            .description("Writes and refines code based on a request and feedback.")
            .instruction("""
                Your role is to write a Python function based on the user's request.
                In the first turn, write the initial version of the code.
                In subsequent turns, you will receive feedback on your code.
                Your task is to refine the code based on this feedback.

                Previous feedback (if any):
                {feedback?}
                """)
            .model("gemini-2.5-flash")
            .outputKey("generated_code")
            .build();

        var codeReviewer = LlmAgent.builder()
            .name("code-reviewer")
            .description("Reviews code and decides if it's complete or needs more work.")
            .instruction("""
                Your role is to act as a senior code reviewer.
                Analyze the provided Python code for correctness, style, and potential bugs.

                Code to review:
                {generated_code}

                If the code is perfect and meets the user's request,
                you MUST call the `exit_loop` tool.

                Otherwise, provide constructive feedback for the `code-generator to improve the code.
                """)
            .model("gemini-2.5-flash")
            .outputKey("feedback")
            .tools(ExitLoopTool.INSTANCE)
            .build();

        var codeRefinerLoop = LoopAgent.builder()
            .name("code-refiner-loop")
            .description("Iteratively generates and reviews code until it is correct.")
            .subAgents(
                codeGenerator,
                codeReviewer
            )
            .maxIterations(3) // Safety net to prevent infinite loops
            .build();

        var finalPresenter = LlmAgent.builder()
            .name("final-presenter")
            .description("Presents the final, accepted code to the user.")
            .instruction("""
                The code has been successfully generated and reviewed.
                Present the final version of the code to the user in a clear format.

                Final Code:
                {generated_code}
                """)
            .model("gemini-2.5-flash")
            .build();

        AdkWebServer.start(SequentialAgent.builder()
            .name("code-refiner-assistant")
            .description("Manages the full code generation and refinement process.")
            .subAgents(
                codeRefinerLoop,
                finalPresenter)
            .build());
    }
}

Jalankan agen ini dengan perintah berikut:

mvn compile exec:java -Dexec.mainClass=com.example.agent.CodeRefiner

Loop masukan/penyempurnaan, yang diterapkan menggunakan LoopAgent, sangat diperlukan untuk memecahkan masalah yang memerlukan peningkatan iteratif dan koreksi mandiri, yang sangat meniru proses kognitif manusia. Pola desain ini sangat berguna untuk tugas-tugas yang output awalnya jarang sempurna, seperti pembuatan kode, penulisan kreatif, iterasi desain, atau analisis data yang kompleks. Dengan mengulang-ulang output melalui agen peninjau khusus yang memberikan masukan terstruktur, agen pembuat dapat terus menyempurnakan karyanya hingga kriteria penyelesaian yang telah ditentukan terpenuhi, sehingga menghasilkan kualitas akhir yang terbukti lebih tinggi dan lebih andal daripada pendekatan sekali jalan.

11. Selamat!

337a2e319008d004.png

Anda telah berhasil membangun dan menjelajahi berbagai agen AI, mulai dari agen percakapan sederhana hingga sistem multi-agen yang kompleks. Anda telah mempelajari konsep inti ADK untuk Java: menentukan agen dengan petunjuk, melengkapinya dengan alat, dan mengatur agen tersebut ke dalam alur kerja yang efektif.

Apa langkah selanjutnya?

  • Pelajari repositori GitHub ADK untuk Java resmi.
  • Pelajari lebih lanjut framework di dokumentasinya.
  • Baca berbagai alur kerja agentik dalam seri blog ini dan berbagai alat yang tersedia.
  • Pelajari lebih dalam alat bawaan lainnya dan callback lanjutan.
  • Tangani konteks, status, dan artefak untuk interaksi yang lebih kaya dan multimodal.
  • Terapkan dan terapkan plugin yang terhubung ke siklus proses agen Anda.
  • Coba bangun agen Anda sendiri yang memecahkan masalah di dunia nyata.