1. Yapay zeka aracısı geliştiricileri, hoş geldiniz.
Bu codelab'de, Java için Agents Development Kit (ADK)'yı kullanarak Java'da yapay zeka ajanları oluşturmayı öğreneceksiniz. Basit Büyük Dil Modeli (LLM) API çağrılarının ötesine geçerek akıl yürütebilen, plan yapabilen, araçları kullanabilen ve karmaşık sorunları çözmek için birlikte çalışabilen bağımsız yapay zeka aracıları oluşturacağız.
Öncelikle Google Cloud kredilerini kullanacak, Google Cloud ortamınızı kuracak, ardından ilk basit aracınızı oluşturacak ve özel araçlar, web araması ve çoklu aracı düzenleme gibi daha gelişmiş özellikleri kademeli olarak ekleyeceksiniz.

Neler öğreneceksiniz?
- Temel, karaktere dayalı bir yapay zeka ajanı oluşturma
- Ajanları özel ve yerleşik araçlarla (ör. Google Arama) güçlendirme
- Java'da uygulanan kendi araçlarınızı ekleme
- Birden fazla ajanı güçlü sıralı, paralel ve döngüsel iş akışları halinde düzenleme
İhtiyacınız olanlar
- Gizli modda kullanacağımız bir web tarayıcısı.
- Kişisel bir Gmail hesabı
- Kişisel Gmail hesabınızla ilişkili yeni bir Google Cloud projesi.
- Kullanılan Google Cloud kredileriyle oluşturulmuş bir faturalandırma hesabı.
- Kaynak kodu incelemek için kullanılan git komut satırı aracı.
- Java 17+ ve Apache Maven.
- IntelliJ IDEA veya VS Code gibi bir metin düzenleyici ya da IDE.
Google Cloud Console'daki Cloud Shell'de yerleşik kod düzenleyiciyi kullanabilirsiniz.
2. Kurulum: Ortamınız
Çalıştay için Google Cloud kredilerini talep etme

Eğitmen yönetimindeki atölye çalışmalarında, atölye çalışmasında kullanmak üzere Google Cloud kredisi talep edebileceğiniz web sitesinin bağlantısını almış olursunuz.
- Kişisel bir Google Hesabı kullanın: Kurumsal veya okul e-posta adresleri çalışmayacağından kişisel bir Google Hesabı (ör. gmail.com adresi) kullanmanız önemlidir.
- Google Chrome'u gizli modda kullanın: Temiz bir oturum oluşturmak ve diğer Google Hesaplarıyla çakışmaları önlemek için bu önerilir.
- Özel etkinlik bağlantısını kullanın: Etkinlik için özel bir bağlantı (ör. https://trygcp.dev/event/xxx) ve ardından bir etkinlik kodu (bu örnekte "xxx") kullanılmalıdır.
- Hizmet şartlarını kabul etme: Oturum açtıktan sonra, devam etmek için kabul etmeniz gereken Google Cloud Platform Hizmet Şartları gösterilir.
- Yeni proje oluşturma: Google Cloud Console'da yeni ve boş bir proje oluşturulmalıdır.
- Faturalandırma hesabı bağlama: Yeni oluşturulan projeyi bir faturalandırma hesabına bağlayın.
- Krediyi onaylama: Aşağıdaki videoda, faturalandırma sayfasındaki "krediler" bölümünü kontrol ederek kredinin projeye uygulandığını nasıl onaylayacağınız gösterilmektedir.
Kredileri nasıl kullanacağınızı ve uygulayacağınızı açıklayan bu videoyu inceleyebilirsiniz.
Vertex AI API'yi etkinleştirme
Öncelikle Vertex AI API'yi etkinleştirin. Bu işlemi, Google Cloud Console'da Vertex AI API'yi arayıp API'yi etkinleştirerek yapabilirsiniz. Aşağıdaki komutu çalıştırarak bu işlemi Cloud Shell'den de yapabilirsiniz:
gcloud services enable aiplatform.googleapis.com
ADK'yı Vertex AI ile yapılandırma
Bu codelab'de ADK yapay zeka aracılarınızın kimliğini Vertex AI'daki Gemini ile doğrulamak için aşağıdaki ortam değişkenlerini ayarlayın. Benzersiz proje kimliğinizi kullandığınızdan emin olun.
macOS / Linux: Terminalinizi açıp aşağıdaki komutu çalıştırın. Bunu kalıcı hale getirmek için bu satırı kabuğunuzun başlangıç dosyasına (ör. ~/.bash_profile, ~/.zshrc) ekleyin.
export GOOGLE_GENAI_USE_VERTEXAI=true export GOOGLE_CLOUD_PROJECT=your-project-id
Windows (Komut İstemi): Yeni bir komut istemi açın ve şu komutu çalıştırın:
set GOOGLE_GENAI_USE_VERTEXAI=true set GOOGLE_CLOUD_PROJECT=your-project-id
Bu değişikliğin geçerli olması için komut isteminizi yeniden başlatmanız gerekir.
Windows (PowerShell): PowerShell terminalini açıp şunu çalıştırın:
$env:GOOGLE_GENAI_USE_VERTEXAI = "true" $env:GOOGLE_CLOUD_PROJECT = "your-project-id"
Bu değişikliği PowerShell'de kalıcı hale getirmek için profil komut dosyanıza eklemeniz gerekir.
3. Başlangıç: İlk Ajanınız
Yeni bir projeye başlamanın en iyi yolu Java için ADK GitHub şablonunu kullanmaktır. Proje yapısını ve gerekli tüm bağımlılıkları sağlar.
GitHub hesabınız varsa şunları yapabilirsiniz: Use this template > Create a new repository, ardından git clone komutuyla kodu yerel olarak kontrol edin.
Şablonu kullanmak için sağ üstteki menüyü gösteren ekran görüntüsünü aşağıda bulabilirsiniz.

Diğer yaklaşım ise bu depoyu doğrudan klonlamaktır:
git clone https://github.com/glaforge/adk-java-maven-template.git
Java'da ilk yapay zeka aracınızı kodlamaya başlamaya hazır olduğunuzu kontrol etmek için bu projedeki kodu aşağıdakilerle derleyebildiğinizden emin olun:
cd adk-java-maven-template
mvn compile
Code Step: A Friendly Science Teacher Agent
ADK'daki temel yapı taşı LlmAgent sınıfıdır. Bunu, büyük bir dil modeli tarafından desteklenen, belirli bir kişiliğe ve amaca sahip bir yapay zeka olarak düşünebilirsiniz. Daha sonra araçlar aracılığıyla daha fazla özellik ekleyecek ve diğer benzer temsilcilerle birlikte çalışarak daha güçlü hale getireceğiz.
com.example.agent paketinde yeni bir Java sınıfı oluşturalım ve buna ScienceTeacher adını verelim.
Bu, ajan oluşturma sürecinin "Merhaba Dünya!" aşamasıdır. Bilim öğretmeni kişiliğine sahip basit bir aracı tanımlıyoruz.
// 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()
);
}
}
Yapay zeka aracısı, LlmAgent.builder() yöntemiyle yapılandırılır. name(), description() ve model() parametreleri zorunludur. Aracınıza belirli bir kişilik ve uygun davranış kazandırmak için instruction() yöntemiyle her zaman ayrıntılı talimatlar vermelisiniz.
Burada Gemini 2.5 Flash modelini kullanmayı tercih ettik ancak daha karmaşık görevler için Gemini 2.5 Pro'yu da deneyebilirsiniz.
Bu temsilci, AdkWebServer.start() yöntemiyle sarmalanmıştır. Bu, ADK Dev UI adlı sohbet arayüzüdür. Bu sayede, normal bir sohbet arayüzü üzerinden temsilciyle konuşabilirsiniz. Ayrıca, sistemden geçen tüm etkinlikler, LLM'ye gönderilen istekler ve yanıtlar gibi arka planda neler olduğunu anlamak istiyorsanız bu araçtan büyük ölçüde yararlanabilirsiniz.
Bu aracıyı yerel olarak derleyip çalıştırmak için aşağıdaki komutu çalıştırın:
mvn compile exec:java -Dexec.mainClass=com.example.agent.ScienceTeacher
Ardından tarayıcınızda http://localhost:8080 adresine gidin. Cloud Shell'deyseniz Web Preview'a (Web önizlemesi) gidip Preview on port 8080'i (8080 bağlantı noktasında önizle) seçebilirsiniz.
Kullanıcı arayüzünü aşağıdaki ekran görüntüsünde gösterildiği gibi görmelisiniz. Ajanınıza bilimle ilgili sorular sorabilirsiniz.

4. Araçlarla Ajanları Güçlendirme

Temsilciler neden araçlara ihtiyaç duyar? LLM'ler güçlü olsa da bilgileri zaman içinde değişmez ve dış dünyayla etkileşim kuramazlar. Araçlar köprüdür. Bu ajanlar, gerçek zamanlı bilgilere (ör. hisse senedi fiyatları veya haberler) erişebilir, özel API'leri sorgulayabilir ya da Java'da kodlayabileceğiniz herhangi bir işlemi gerçekleştirebilir.
Kod Adımı: Özel Araç Oluşturma (StockTicker)
Burada, temsilcimize hisse senedi fiyatlarını arayabileceği bir araç veriyoruz. Aracı, kullanıcı fiyat sorduğunda Java yöntemimizin çağrılması gerektiğini belirtiyor.
// 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)
}
}
Ajanları daha akıllı hale getirmek ve dünyayla (veya kendi kodunuz, API'leriniz, hizmetleriniz vb. ile) etkileşim kurmalarını sağlamak için tools() yöntemini kullanarak ajanları araçları, özellikle de özel kod araçlarını kullanacak şekilde yapılandırabilirsiniz. Bu yönteme FunctionTool.create(...) iletmeniz gerekir.
FunctionTool, kendi statik yönteminizi işaret eden bir sınıf ve yöntem adı gerektirir. Ayrıca bir sınıfın örneğini ve bu nesnenin bir örnek yönteminin adını da iletebilirsiniz.
Bu bilgiler, temel LLM tarafından belirli bir yöntemin ne zaman ve nasıl çağrılması gerektiğini belirlemek için kullanılacağından, hem yöntemin hem de parametrelerinin name ve description değerlerinin @Schema notuyla belirtilmesi önemlidir.
Aynı derecede önemli olan bir diğer nokta da LLM'ye aracı nasıl ve ne zaman kullanacağıyla ilgili net talimatlar vererek yardımcı olmaktır. Model bunu kendi başına da anlayabilir ancak instruction() yönteminde açık açıklamalar yaparsanız işlevinizin uygun şekilde çağrılma olasılığı daha yüksek olur.
Bu yöntem Map döndürmelidir. Genellikle, sonuçları temsil eden bir anahtarla (ör. stock_price) bir harita döndürmek ve hisse senedi fiyatının değerini bu anahtarla ilişkilendirmek amaçlanır. Son olarak, işlemin başarısını belirtmek için ek bir başarı / doğru anahtar çifti ekleyebilirsiniz. Hata durumunda ise örneğin error adlı bir anahtara sahip bir harita döndürmeli ve hata mesajını ilişkili değerle ilişkilendirmelisiniz. Bu, LLM'nin aramanın başarılı olup olmadığını veya bir nedenden dolayı başarısız olup olmadığını anlamasına yardımcı olur.
- Başarılı olursa şu değer döndürülür:
{"stock_price": 123} - Hata durumunda döndürülecek değer:
{"error": "Impossible to retrieve stock price for XYZ"}
Ardından, aşağıdaki komutla bu sınıfı çalıştırın:
mvn compile exec:java -Dexec.mainClass=com.example.agent.StockTicker
Artık temsilciye What's the stock price for GOOG? gibi hisse senedi fiyatlarını sorabilirsiniz. Yanıt alırsınız ve lookup_stock_ticker aracının kullanıldığını görürsünüz.
5. Google Arama'nın güncel bilgiler için sunduğu avantajlar

Java için ADK, GoogleSearchTool dahil olmak üzere bir dizi güçlü araçla birlikte gelir. Bu araçla temsilciniz, hedefine ulaşmak için alakalı bilgiler bulmak üzere Google Arama'nın kullanılmasını isteyebilir.
Aslında, LLM'lerin bilgisi zaman içinde sabitlenir: Bilgilerin toplandığı zamanki kadar güncel olan verilerle belirli bir tarihe ("kesme tarihi") kadar eğitilir. Bu nedenle, LLM'ler yakın zamandaki olaylar hakkında bilgi sahibi olmayabilir veya bilgileri sınırlı ve yüzeysel olabilir. Arama motorunun yardımıyla hafızalarını tazeleyebilir ya da konu hakkında daha fazla bilgi edinebilirler.
Şu basit haber arama aracına göz atalım:
// 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());
}
}
Arama aracının bir örneğini tools(new GoogleSearchTool()) ile nasıl ilettiğimize dikkat edin. Bu sayede aracımız, web'de bulunan en son bilgilerden haberdar olabilir. Ayrıca, istemde günün tarihi de belirtildi. Bu, soruların geçmiş bilgilerle ilgili olup olmadığını ve daha yeni bilgilerin aranmasının gerekip gerekmediğini anlamasına yardımcı olabilir.
Ardından, aşağıdaki komutla bu sınıfı çalıştırın:
mvn compile exec:java -Dexec.mainClass=com.example.agent.LatestNews
İstemi istediğiniz gibi değiştirebilirsiniz. Örneğin, şunları sorabilirsiniz: What's the latest news in the world?
Kod Adımı: Araç olarak Arama Aracısı
GoogleSearchTool öğesini doğrudan bir araca aktarmak yerine, arama işlevini kapsayan özel bir arama aracısı oluşturabilir ve bu aracıyı daha üst düzey bir aracıya araç olarak sunabilirsiniz.
Bu, karmaşık davranışları (ör. arama ve sonuçları özetleme) özel bir alt aracıya devretmenize olanak tanıyan gelişmiş bir kavramdır. Bu yaklaşım genellikle daha karmaşık iş akışlarında faydalıdır.
// 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()
);
}
}
Buradaki temel kavram AgentTool.create(searchAgent) satırıdır. searchAgent'nın tamamını (kendi dahili mantığı, istemi ve araçlarıyla birlikte) mainAgent için tek bir çağrılabilir araç olarak kaydeder. Bu, modülerliği ve yeniden kullanılabilirliği teşvik eder.
Bu sınıfı aşağıdaki komutla çalıştırın:
mvn compile exec:java -Dexec.mainClass=com.example.agent.SearchAgentAsTool
Ajan, sıradan soruları kendi bilgi tabanından yanıtlar. Ancak son olaylarla ilgili sorular sorulduğunda, Google Arama aracını kullanarak aramayı özel arama aracısına devreder.
6. Temsilci tabanlı iş akışlarında ustalaşma
Karmaşık sorunlar için tek bir temsilci yeterli değildir. Çok fazla alt görev içeren, çok fazla ayrıntı içeren büyük bir istemle açıklanan veya çok sayıda işleve erişimi olan bir hedef verildiğinde LLM'ler zorlanır ve performansları ile doğrulukları düşer.
Buradaki anahtar nokta, birden fazla uzmanlaşmış ajanı yöneterek böl ve yönet stratejisini uygulamaktır. Neyse ki ADK'da farklı yerleşik uzmanlaşmış temsilciler bulunur:
- Görevleri devredecek
subAgent()ile normal temsilci, SequentialAgent, görevleri sırayla yapmak için,ParallelAgent, temsilcileri paralel olarak yürütmek içinLoopAgent, genellikle gerektiği kadar çok kez iyileştirme sürecinden geçmek için kullanılır.
Temel kullanım alanları ve her iş akışının avantajları ile dezavantajları için lütfen aşağıdaki tabloya göz atın. Ancak gerçek gücün aslında birkaçının birleşiminden geleceğini unutmayın.
İş akışı | ADK Class | Kullanım alanı | Artıları | Eksileri |
Alt Temsilciler |
| Bir sonraki adımın her zaman bilinmediği, kullanıcı odaklı ve esnek görevler. | Yüksek esneklik, sohbet edilebilir, kullanıcıya yönelik botlar için idealdir. | Daha az tahmin edilebilir, akış denetimi için LLM muhakemesine dayanır. |
Sıralı |
| Sıranın önemli olduğu, sabit ve çok adımlı süreçler | Öngörülebilir, güvenilir, hata ayıklaması kolay, sırayı garanti eder. | Esnek değildir, görevler paralelleştirilebiliyorsa daha yavaş olabilir. |
Paralel |
| Birden fazla kaynaktan veri toplama veya bağımsız görevler çalıştırma | Son derece verimlidir ve G/Ç'ye bağlı görevlerde gecikmeyi önemli ölçüde azaltır. | Tüm görevler çalışır, kısa devre olmaz. Bağımlılıkları olan görevler için daha az uygundur. |
Döngü |
| Yinelemeli iyileştirme, kendini düzeltme veya bir koşul karşılanana kadar tekrarlanan süreçler. | Karmaşık sorunları çözmede güçlüdür ve temsilcilerin kendi çalışmalarını iyileştirmesini sağlar. | Dikkatli tasarlanmazsa sonsuz döngülere yol açabilir (her zaman maxIterations kullanılmalıdır). |
7. Ajan tabanlı iş akışları: Alt ajanlarla görevlendirme

Bir yönetici temsilci, belirli görevleri alt temsilcilere devredebilir. Örneğin, siparişle ilgili soruları bir temsilciye ("Siparişimin durumu nedir?"), satış sonrası hizmet sorularını ise başka bir temsilciye ("Nasıl açacağımı bilmiyorum!") yönlendiren bir e-ticaret web sitesinin temsilcisini düşünün. Bu kullanım alanını ele alacağız.
// 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 orderAgent = 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 afterSaleAgent = 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 to 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(afterSaleAgent, orderAgent)
.build()
);
}
}
Buradaki önemli nokta, subAgents() yönteminin çağrıldığı ve her birinin belirli rolünün ayrı ayrı ele alınacağı iki alt aracının iletildiği yerdir.
Yukarıdaki örneği aşağıdaki komutla çalıştırın:
mvn compile exec:java -Dexec.mainClass=com.example.agent.SupportAgent
I have a question about my order veya I have a question about my received order gibi sorular sorabilirsiniz. Ana temsilcinin, sorulan soruya bağlı olarak doğru temsilciye yönlendirme yaptığını görmelisiniz.
Görevleri alt aracılara devretme kavramı, etkili insan yönetimine benzer. İyi bir yönetici (gözetmen aracı), uzmanlığı daha fazla olan belirli görevleri yerine getirmesi için uzmanlaşmış çalışanlara (alt aracılar) güvenir. Yöneticinin her sürecin ayrıntılarını bilmesi gerekmez. Bunun yerine, müşterinin talebini (ör. sipariş sorgusu veya teknik sorun) en nitelikli "ekip üyesine" akıllıca yönlendirerek genel bir uzmanın tek başına sağlayabileceğinden daha kaliteli ve verimli bir yanıt verilmesini sağlar. Ayrıca bu alt aracılar, karmaşık ve kapsamlı sürecin tamamını anlamalarına gerek kalmadan kendi görevlerine tamamen odaklanabilir.
8. Temsilci tabanlı iş akışları: Üretim hattı

İşlem sırasının önemli olduğu durumlarda SequentialAgent kullanın. Her adımın bir öncekine bağlı olabileceği, alt aracıların sabit bir sırada yürütüldüğü bir montaj hattına benzer.
İngilizce bir şairin, önce İngilizce olarak yazdığı şiirleri Fransızcaya çevirmek için İngilizce-Fransızca çeviri yapan bir kişiyle işbirliği yaptığını düşünelim:
// 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());
}
}
Örneği çalıştırın:
mvn compile exec:java -Dexec.mainClass=com.example.agent.PoetAndTranslator
Artık temsilciye Write me a poem about a lonely software developer gibi bir soru sorabilirsiniz. Önce İngilizce, ardından Fransızcaya çevrilmiş bir şiir alırsınız.
Karmaşık görevlerin daha küçük ve sıralı alt görevlere ayrılması, daha belirleyici ve güvenilir bir süreç sağlar. Bu sayede, tek bir genel amaçlı aracıya güvenmeye kıyasla başarılı bir sonuç elde etme olasılığı önemli ölçüde artar.
Bir görevi mümkün olduğunda ve mantıklı olduğunda alt görevler dizisine etkili bir şekilde ayırmak, daha belirleyici ve başarılı sonuçlar elde etmek için çok önemlidir. Çünkü bu, adımlar arasında yapılandırılmış ilerleme ve bağımlılık yönetimine olanak tanır.
9. Agentic Workflows — Working in Parallel

Görevler birbirinden bağımsız olduğunda ParallelAgent, bunları aynı anda çalıştırarak büyük bir verimlilik artışı sağlar. Aşağıdaki örnekte, SequentialAgent ile ParallelAgent'yi bile birleştireceğiz: Önce paralel görevler çalıştırılır, ardından nihai bir aracı paralel görevlerin sonucunu özetler.
Şu konularda bilgi arayacak bir şirket dedektifi oluşturalım:
- Şirketin profili (CEO, genel merkez, slogan vb.)
- Şirketle ilgili en son haberler.
- Şirketin mali durumuyla ilgili ayrıntılar.
// 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());
}
}
Aracıyı her zamanki gibi aşağıdaki komutla çalıştırabilirsiniz:
mvn compile exec:java -Dexec.mainClass=com.example.agent.CompanyDetective
Google veya Apple gibi farklı şirketler hakkında soru sorarak ne tür yanıtlar aldığınızı görün.
Bu ajan, bilgi araştırması ve sentezinin paralelleştirilmesi sayesinde hem paralel hem de sıralı ajanların verimli bir şekilde kullanıldığı güçlü bir iş akışı kombinasyonu sunar.
10. Temsilci tabanlı iş akışları: Yinelemeli iyileştirme

"Oluştur → incele → iyileştir" döngüsü gerektiren görevler için LoopAgent kullanın. Bir hedef karşılanana kadar yinelemeli iyileştirmeyi otomatikleştirir. SequentialAgent'ya benzer şekilde, LoopAgent de alt aracıları sırayla çağırır ancak başlangıca geri döner. Döngünün yürütülmesini durdurmak için exit_loop yerleşik aracına çağrı isteyip istemeyeceğine karar verecek olan, aracı tarafından dahili olarak kullanılan LLM'dir.
Aşağıdaki kod iyileştirici örneğinde LoopAgent kullanılarak kod iyileştirme (oluşturma, inceleme, düzeltme) otomatikleştirilir. Bu, insan gelişimini taklit eder. Kod oluşturucu, önce istenen kodu oluşturur ve generated_code anahtarı altında aracı durumuna kaydeder. Ardından bir kod inceleyici, oluşturulan kodu inceler ve feedback tuşu altında geri bildirim sağlar veya yinelemeyi erken sonlandırmak için bir çıkış döngüsü aracı çağırır.
Koda göz atalım:
// 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());
}
}
Bu aracı aşağıdaki komutla çalıştırın:
mvn compile exec:java -Dexec.mainClass=com.example.agent.CodeRefiner
Tower of Hanoi veya Quicksort Algorithm gibi karmaşık bir şeyi uygulamasını isteyebilirsiniz.
LoopAgent kullanılarak uygulanan geri bildirim/iyileştirme döngüleri, yinelemeli iyileştirme ve kendi kendini düzeltme gerektiren sorunları çözmek için vazgeçilmezdir. Bu döngüler, insan bilişsel süreçlerini yakından taklit eder. Bu tasarım kalıbı, özellikle ilk çıktının nadiren mükemmel olduğu görevler için faydalıdır. Örneğin, kod oluşturma, yaratıcı yazma, tasarım yineleme veya karmaşık veri analizi gibi görevlerde kullanılabilir. Çıkışı, yapılandırılmış geri bildirim sağlayan özel bir inceleme aracısı üzerinden geçirerek, oluşturma aracısı önceden tanımlanmış bir tamamlama ölçütü karşılanana kadar çalışmasını sürekli olarak iyileştirebilir. Bu da tek geçişli bir yaklaşıma kıyasla belirgin şekilde daha yüksek kaliteli ve daha güvenilir nihai sonuçlar elde edilmesini sağlar.
11. Tebrikler!

Basit sohbet edenlerden karmaşık, çoklu ajanlı sistemlere kadar çeşitli yapay zeka aracılarını başarıyla oluşturup incelediniz. Java için ADK'nın temel kavramlarını (talimatlarla aracı tanımlama, araçlarla aracı güçlendirme ve aracıları güçlü iş akışları oluşturacak şekilde düzenleme) öğrendiniz.
Sırada ne var?
- Resmi Java için ADK GitHub deposunu inceleyin.
- Çerçeve hakkında daha fazla bilgiyi belgelerinde bulabilirsiniz.
- Bu blog serisinde çeşitli agentic iş akışları ve kullanabileceğiniz çeşitli araçlar hakkında bilgi edinin.
- Diğer yerleşik araçlar ve gelişmiş geri aramalar hakkında daha ayrıntılı bilgi edinin.
- Daha zengin ve çok formatlı etkileşimler için bağlamı, durumu ve yapay nesneleri yönetin.
- Temsilcilerinizin yaşam döngüsüne bağlanan eklentileri uygulayın.
- Gerçek dünyadaki bir sorunu çözen kendi aracınızı oluşturmayı deneyin.