Java के लिए Agent Development Kit (ADK) की मदद से एआई एजेंट बनाना

1. एआई एजेंट डेवलपर, आपका स्वागत है!

इस कोडलैब में, Java के लिए Agents Development Kit (ADK) का इस्तेमाल करके, Java में एआई एजेंट बनाने का तरीका बताया गया है. हम लार्ज लैंग्वेज मॉडल (एलएलएम) के एपीआई कॉल से आगे बढ़कर, ऐसे एआई एजेंट बनाएंगे जो अपने-आप काम कर सकते हैं. ये एजेंट, तर्क दे सकते हैं, प्लान बना सकते हैं, टूल इस्तेमाल कर सकते हैं, और मिलकर मुश्किल समस्याओं को हल कर सकते हैं.

सबसे पहले, Google Cloud क्रेडिट रिडीम करें. इसके बाद, Google Cloud एनवायरमेंट सेट अप करें. फिर, अपना पहला सामान्य एजेंट बनाएं. इसके बाद, कस्टम टूल, वेब खोज, और मल्टी-एजेंट ऑर्केस्ट्रेशन जैसी ज़्यादा बेहतर सुविधाएं जोड़ें.

d666c455bb267688.png

आपको क्या सीखने को मिलेगा

  • पर्सोना के हिसाब से काम करने वाला बुनियादी एआई एजेंट बनाने का तरीका.
  • एजेंट को कस्टम और बिल्ट-इन टूल (जैसे कि Google Search) का इस्तेमाल करने की अनुमति कैसे दें.
  • Java में लागू किए गए अपने टूल जोड़ने का तरीका.
  • एक साथ कई एजेंट को क्रमवार, समानांतर, और लूपिंग वर्कफ़्लो में व्यवस्थित करने का तरीका.

आपको किन चीज़ों की ज़रूरत होगी

  • एक वेब ब्राउज़र, जिसका इस्तेमाल हम गुप्त मोड में करेंगे.
  • निजी Gmail खाता.
  • आपके निजी Gmail खाते से जुड़ा नया Google Cloud प्रोजेक्ट.
  • रिडीम किए गए Google Cloud क्रेडिट से बनाया गया बिलिंग खाता.
  • सोर्स कोड की जांच करने के लिए, git कमांड-लाइन टूल.
  • Java 17+ और Apache Maven.
  • टेक्स्ट एडिटर या आईडीई, जैसे कि IntelliJ IDEA या VS Code.

Google Cloud Console में, Cloud Shell में मौजूद VS Code एडिटर का इस्तेमाल किया जा सकता है.

2. सेटअप: आपका एनवायरमेंट

वर्कशॉप के लिए Google Cloud क्रेडिट क्लेम करना

e3e67ae61e86ec9f.png

अगर आपको किसी इंस्ट्रक्टर की मदद से वर्कशॉप करनी है, तो आपको उस वेबसाइट का लिंक मिलेगा जहां जाकर वर्कशॉप के लिए Google Cloud क्रेडिट क्लेम किए जा सकते हैं.

  • निजी Google खाते का इस्तेमाल करें: निजी Google खाते (जैसे, gmail.com पता) का इस्तेमाल करना ज़रूरी है, क्योंकि कंपनी या स्कूल के ईमेल पते काम नहीं करेंगे.
  • Google Chrome को गुप्त मोड में इस्तेमाल करें: हमारा सुझाव है कि आप ऐसा करें, ताकि एक नया सेशन बनाया जा सके और अन्य Google खातों के साथ होने वाले टकराव को रोका जा सके.
  • इवेंट के लिए खास लिंक का इस्तेमाल करें: इवेंट के लिए एक खास लिंक का इस्तेमाल किया जाना चाहिए. यह लिंक कुछ इस तरह का दिखता है: https://trygcp.dev/event/xxx. इसके बाद, इवेंट कोड (इस उदाहरण में "xxx") का इस्तेमाल किया जाना चाहिए.
  • सेवा की शर्तें स्वीकार करें: साइन इन करने के बाद, आपको Google Cloud Platform की सेवा की शर्तें दिखेंगी. जारी रखने के लिए, आपको इन्हें स्वीकार करना होगा.
  • नया प्रोजेक्ट बनाएं: Google Cloud Console में जाकर, एक नया प्रोजेक्ट बनाएं.
  • बिलिंग खाता लिंक करें: नए प्रोजेक्ट को किसी बिलिंग खाते से लिंक करें.
  • क्रेडिट की पुष्टि करना: इस वीडियो में बताया गया है कि बिलिंग पेज पर "क्रेडिट" सेक्शन में जाकर, यह कैसे पुष्टि करें कि क्रेडिट को प्रोजेक्ट पर लागू किया गया है.

बेझिझक यह वीडियो देखें. इसमें क्रेडिट रिडीम करने और उन्हें लागू करने का तरीका बताया गया है.

एपीआई पासकोड बनाना और उसे कॉन्फ़िगर करना

इस कोडलैब के लिए, Gemini API की मदद से अपने ADK एआई एजेंट की पुष्टि करने के लिए, आपको अपने Google Cloud प्रोजेक्ट से जुड़े एपीआई पासकोड का इस्तेमाल करना होगा.

  1. एपीआई पासकोड जनरेट करना:
  • Google AI Studio पर जाएं. इसके बाद, बाईं ओर मौजूद साइड पैनल में सबसे नीचे मौजूद "एपीआई पासकोड पाएं" लिंक पर क्लिक करें.
  • प्रोजेक्ट चुनें. इसके बाद, प्रोजेक्ट इंपोर्ट करें बटन पर क्लिक करें.
  • आपको जिस Google Cloud प्रोजेक्ट को इंपोर्ट करना है उसे खोजें और चुनें. इसके बाद, इंपोर्ट करें बटन चुनें.
  • प्रोजेक्ट इंपोर्ट हो जाने के बाद, डैशबोर्ड मेन्यू में जाकर एपीआई पासकोड पेज पर जाएं. इसके बाद, उस प्रोजेक्ट में एपीआई पासकोड बनाएं जिसे आपने अभी इंपोर्ट किया है.
  • एपीआई पासकोड को नोट कर लें.
  1. एनवायरमेंट वैरिएबल सेट करें: आपके एजेंट को इस कुंजी को ऐक्सेस करने की ज़रूरत होती है. इसके लिए, GOOGLE_API_KEY नाम का एनवायरमेंट वैरिएबल सेट करना सबसे सही तरीका है.
  • macOS / Linux: अपना टर्मिनल खोलें और यहां दिया गया निर्देश चलाएं. साथ ही, "your-api-key" की जगह पर, अभी कॉपी की गई कुंजी डालें. इसे हमेशा के लिए सेट करने के लिए, इस लाइन को अपने शेल की स्टार्टअप फ़ाइल में जोड़ें. जैसे, ~/.bash_profile, ~/.zshrc).
export GOOGLE_API_KEY="your-api-key"
  • Windows (कमांड प्रॉम्प्ट): नया कमांड प्रॉम्प्ट खोलें और यह कमांड चलाएं:
setx GOOGLE_API_KEY "your-api-key"
  • इस बदलाव को लागू करने के लिए, आपको कमांड प्रॉम्प्ट को रीस्टार्ट करना होगा.
  • Windows (PowerShell): PowerShell टर्मिनल खोलें और यह कमांड चलाएं:
$env:GOOGLE_API_KEY="your-api-key"
  • PowerShell में इस बदलाव को हमेशा के लिए लागू करने के लिए, आपको इसे अपनी प्रोफ़ाइल स्क्रिप्ट में जोड़ना होगा.

3. शुरू करना: आपका पहला एजेंट

f814ab5b7614e071.png

नया प्रोजेक्ट शुरू करने का सबसे अच्छा तरीका, ADK for Java GitHub टेंप्लेट का इस्तेमाल करना है. यह प्रोजेक्ट का स्ट्रक्चर और सभी ज़रूरी डिपेंडेंसी उपलब्ध कराता है.

अगर आपके पास GitHub खाता है, तो ये काम किए जा सकते हैं: Use this template > Create a new repository पर जाएं. इसके बाद, git clone कमांड का इस्तेमाल करके, कोड को स्थानीय तौर पर देखें.

यहां टेंप्लेट इस्तेमाल करने के लिए, सबसे ऊपर दाएं कोने में मौजूद मेन्यू का स्क्रीनशॉट दिया गया है.

1613a3d0ddc66dc5.png

दूसरा तरीका यह है कि उस रिपॉज़िटरी को सीधे तौर पर क्लोन किया जाए. इसके लिए, यह तरीका अपनाएं:

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

इसके बाद, cd को adk-java-maven-template में डालें.

यह देखने के लिए कि क्या आप Java में अपने पहले एआई एजेंट को कोड करने के लिए तैयार हैं, पक्का करें कि इस प्रोजेक्ट में कोड को इन चीज़ों के साथ कंपाइल किया जा सकता हो:

mvn compile

कोड स्टेप: विज्ञान पढ़ाने वाला एक मददगार एजेंट

ADK में, LlmAgent क्लास सबसे बुनियादी बिल्डिंग ब्लॉक है. इसे एक ऐसे एआई के तौर पर देखें जिसकी एक खास पर्सनैलिटी और लक्ष्य है. यह लार्ज लैंग्वेज मॉडल की मदद से काम करता है. हम बाद में टूल के ज़रिए, इसमें और सुविधाएं जोड़ेंगे. साथ ही, मिलते-जुलते अन्य एजेंट के साथ मिलकर काम करके, इसे और बेहतर बनाएंगे.

com.example.agent पैकेज में एक नई Java क्लास बनाते हैं और इसे ScienceTeacher कहते हैं.

यह एजेंट बनाने का "नमस्ते, दुनिया के लोगों!" वाला उदाहरण है. हम एक ऐसा एजेंट बना रहे हैं जो विज्ञान के शिक्षक की तरह काम करेगा.

// 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()
        );
    }
}

एआई एजेंट को LlmAgent.builder() तरीके से कॉन्फ़िगर किया जाता है. name(), description(), और model() पैरामीटर ज़रूरी हैं. साथ ही, अपने एजेंट को खास पर्सनैलिटी और सही व्यवहार देने के लिए, आपको हमेशा instruction() तरीके से पूरी जानकारी देनी चाहिए.

यहाँ हमने Gemini 2.5 Flash मॉडल का इस्तेमाल किया है. हालाँकि, ज़्यादा मुश्किल कामों के लिए Gemini 2.5 Pro को भी आज़माया जा सकता है.

इस एजेंट को AdkWebServer.start() तरीके से रैप किया गया है. यह ADK Dev UI का चैट इंटरफ़ेस है. इसकी मदद से, सामान्य चैट इंटरफ़ेस के ज़रिए एजेंट से बातचीत की जा सकती है. इसके अलावा, अगर आपको यह समझना है कि सिस्टम में क्या हो रहा है, तो यह सुविधा बहुत काम की है. जैसे, सिस्टम में फ़्लो होने वाले सभी इवेंट, एलएलएम को भेजे गए अनुरोध और जवाब.

इस एजेंट को स्थानीय तौर पर कंपाइल और चलाने के लिए, यह निर्देश चलाएं:

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

इसके बाद, अपने ब्राउज़र पर http://localhost:8080 पर जाएं. आपको यूज़र इंटरफ़ेस (यूआई) में यह जानकारी दिखनी चाहिए. अपने एजेंट से विज्ञान से जुड़े सवाल पूछें.

da094da276ba15d6.png

4. टूल की मदद से एजेंट को सशक्त बनाना

cd5c5798a0861a1c.png

एजेंट को टूल की ज़रूरत क्यों होती है? एलएलएम बहुत शक्तिशाली होते हैं, लेकिन उनकी जानकारी समय के साथ अपडेट नहीं होती. साथ ही, वे बाहरी दुनिया से इंटरैक्ट नहीं कर सकते. टूल, ब्रिज की तरह काम करते हैं. इनकी मदद से, एजेंट को रीयल-टाइम में जानकारी ऐक्सेस करने की अनुमति मिलती है. जैसे, शेयर की कीमतें या खबरें. साथ ही, निजी एपीआई से क्वेरी करने या Java में कोड की गई कोई भी कार्रवाई करने की अनुमति मिलती है.

कोड का चरण: कस्टम टूल बनाना (StockTicker)

यहां, हमने अपने एजेंट को शेयर की कीमतों का पता लगाने के लिए एक टूल दिया है. एजेंट का मानना है कि जब कोई उपयोगकर्ता कीमत के बारे में पूछता है, तो उसे हमारे Java तरीके को कॉल करना चाहिए.

// 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)
    }
}

एजेंट को ज़्यादा स्मार्ट बनाने और उसे दुनिया के साथ इंटरैक्ट करने की सुविधा देने के लिए, एजेंट को टूल इस्तेमाल करने के लिए कॉन्फ़िगर किया जा सकता है. खास तौर पर, कस्टम कोड टूल. इसके लिए, tools() तरीके का इस्तेमाल करें और उसे FunctionTool.create(...) पास करें. एजेंट को अपने कोड, एपीआई, सेवाओं वगैरह के साथ इंटरैक्ट करने की सुविधा भी दी जा सकती है.

FunctionTool को एक क्लास और एक मेथड के नाम की ज़रूरत होती है, जो आपके स्टैटिक मेथड की ओर इशारा करता हो. क्लास का इंस्टेंस और उस ऑब्जेक्ट के इंस्टेंस मेथड का नाम भी पास किया जा सकता है.

@Schema एनोटेशन के ज़रिए, दोनों तरीकों के name और description के साथ-साथ उनके पैरामीटर के बारे में बताना ज़रूरी है. इस जानकारी का इस्तेमाल, एलएलएम यह पता लगाने के लिए करेगा कि उसे किसी दिए गए तरीके को कब और कैसे कॉल करना चाहिए.

यह भी उतना ही ज़रूरी है कि एलएलएम को इस बारे में साफ़ तौर पर निर्देश दिए जाएं कि टूल को कब और कैसे इस्तेमाल करना है. मॉडल अपने-आप इसका पता लगा सकता है. हालांकि, अगर आपने instruction() तरीके में साफ़ तौर पर जानकारी दी है, तो आपके फ़ंक्शन को सही तरीके से कॉल किए जाने की संभावना ज़्यादा होती है.

इस तरीके से Map मिलना चाहिए. आम तौर पर, इसका मतलब है कि नतीजे को दिखाने वाले मैप को वापस लाना है. जैसे, stock_price और इसमें शेयर की कीमत की वैल्यू को जोड़ना है. आखिर में, ऑपरेशन के पूरा होने का सिग्नल देने के लिए, एक और success / true की-वैल्यू पेयर जोड़ा जा सकता है. गड़बड़ी होने पर, आपको एक मैप दिखाना चाहिए. इसमें error नाम की एक कुंजी होनी चाहिए. साथ ही, गड़बड़ी के मैसेज को उससे जुड़ी वैल्यू में जोड़ना चाहिए. इससे एलएलएम को यह समझने में मदद मिलती है कि कॉल सफल हुआ या किसी वजह से पूरा नहीं हो सका.

  • सफल होने पर, यह वैल्यू दिखाता है: {"stock_price": 123}
  • गड़बड़ी होने पर, यह वैल्यू दिखेगी: {"error": "Impossible to retrieve stock price for XYZ"}

इसके बाद, इस क्लास को यहां दिए गए कमांड की मदद से चलाएं:

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

5. अप-टू-डेट जानकारी के लिए Google Search की ताकत

ae215e7b7cde02ab.png

ADK for Java में कई बेहतरीन टूल शामिल हैं. इनमें से एक GoogleSearchTool है. इस टूल की मदद से, आपका एजेंट Google Search का इस्तेमाल करने का अनुरोध कर सकता है, ताकि वह अपने लक्ष्य को पूरा करने के लिए काम की जानकारी ढूंढ सके.

एलएलएम की जानकारी समय के साथ अपडेट नहीं होती: इसे एक तय तारीख ("कट-ऑफ़ डेट") तक के डेटा के साथ ट्रेन किया गया है. यह डेटा भी उतना ही अप-टू-डेट होता है जितना जानकारी इकट्ठा करते समय था. इसका मतलब है कि एलएलएम को हाल ही के इवेंट के बारे में जानकारी नहीं हो सकती है. इसके अलावा, उनकी जानकारी सीमित और कम हो सकती है. ऐसे में, सर्च इंजन की मदद से उनकी मेमोरी को रीफ़्रेश किया जा सकता है या उन्हें विषय के बारे में ज़्यादा जानकारी दी जा सकती है.

आइए, इस सामान्य समाचार खोज एजेंट पर एक नज़र डालें:

// 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());
    }
}

ध्यान दें कि हमने खोज टूल का एक इंस्टेंस कैसे पास किया: tools(new GoogleSearchTool()). इसी वजह से, हमारा एजेंट वेब पर मौजूद नई जानकारी को तुरंत समझ पाता है. इसके अलावा, प्रॉम्प्ट में दिन की तारीख भी बताई गई थी. इससे एलएलएम को यह समझने में मदद मिल सकती है कि सवाल पुरानी जानकारी के बारे में कब हैं और हाल ही की जानकारी कब चाहिए.

इसके बाद, इस क्लास को यहां दिए गए कमांड की मदद से चलाएं:

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

प्रॉम्प्ट में बदलाव करके, अलग-अलग स्टाइल, कम शब्दों में जानकारी देने या किसी खास विषय पर फ़ोकस करने जैसे अलग-अलग नतीजे पाए जा सकते हैं.

कोड का चरण: खोज एजेंट को टूल के तौर पर इस्तेमाल करना

GoogleSearchTool को सीधे तौर पर किसी एजेंट को टूल के तौर पर पास करने के बजाय, खोज के लिए एक खास एजेंट बनाया जा सकता है. यह एजेंट, खोज से जुड़ी सुविधाओं को शामिल करता है. इसके बाद, उस एजेंट को किसी बड़े एजेंट के लिए टूल के तौर पर उपलब्ध कराया जा सकता है.

यह एक ऐडवांस कॉन्सेप्ट है. इसकी मदद से, मुश्किल टास्क (जैसे कि खोज करना और नतीजों की खास जानकारी देना) किसी खास सब-एजेंट को सौंपा जा सकता है. यह तरीका अक्सर ज़्यादा जटिल वर्कफ़्लो के लिए फ़ायदेमंद होता है, क्योंकि कस्टम कोड पर आधारित टूल के साथ, पहले से मौजूद टूल का इस्तेमाल नहीं किया जा सकता.

// 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()
       );
    }
}

यहां AgentTool.create(searchAgent) लाइन मुख्य सिद्धांत है. यह पूरे searchAgent को mainAgent के लिए, कॉल किए जा सकने वाले एक टूल के तौर पर रजिस्टर करता है. इसमें searchAgent का अपना इंटरनल लॉजिक, प्रॉम्प्ट, और टूल शामिल होते हैं. इससे मॉड्युलैरिटी और दोबारा इस्तेमाल करने की सुविधा मिलती है.

इस क्लास को इस कमांड की मदद से चलाएं:

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

सामान्य सवालों के लिए, एजेंट अपने नॉलेज बेस से जवाब देगा. हालांकि, हाल ही की घटनाओं के बारे में पूछे जाने पर, वह Google Search टूल का इस्तेमाल करके, खोज के काम को खोज करने वाले खास एजेंट को सौंप देगा.

6. एजेंटिक वर्कफ़्लो को बेहतर तरीके से इस्तेमाल करना

जटिल समस्याओं को हल करने के लिए, एक एजेंट काफ़ी नहीं होता. जब एलएलएम को बहुत सारे उप-टास्क वाला कोई लक्ष्य दिया जाता है, जिसमें बहुत ज़्यादा जानकारी के साथ प्रॉम्प्ट दिया गया हो या बहुत सारे फ़ंक्शन का ऐक्सेस दिया गया हो, तो एलएलएम को काम करने में मुश्किल होती है. साथ ही, उसकी परफ़ॉर्मेंस और सटीकता कम हो जाती है.

इसके लिए, कई स्पेशलाइज़्ड एजेंट को एक साथ काम करने के लिए कहा जाता है, ताकि काम को बांटा जा सके और उसे पूरा किया जा सके. अच्छी बात यह है कि ADK में, पहले से ही अलग-अलग तरह के एजेंट मौजूद होते हैं:

  • टास्क सौंपने के लिए, subAgent() की सुविधा वाला सामान्य एजेंट,
  • SequentialAgent, ताकि टास्क को क्रम से किया जा सके,
  • ParallelAgent, एजेंटों को एक साथ चलाने के लिए,
  • LoopAgent, आम तौर पर इसे ज़रूरत के मुताबिक कई बार बेहतर बनाने की प्रोसेस के लिए इस्तेमाल किया जाता है.

यहां दिए गए टेबल में, हर वर्कफ़्लो के मुख्य इस्तेमाल के उदाहरण और इसके फ़ायदे और नुकसान देखें. हालांकि, यह जान लें कि इन सभी को मिलाकर इस्तेमाल करने से ही आपको ज़्यादा फ़ायदा मिलेगा!

वर्कफ़्लो

ADK क्लास

इस्तेमाल का उदाहरण

फ़ायदे

नुकसान

सब-एजेंट

LlmAgent

उपयोगकर्ता के हिसाब से तय किए जाने वाले ऐसे टास्क जिनमें अगला चरण हमेशा पता नहीं होता.

इसमें कई तरह के विकल्प उपलब्ध हैं. यह बातचीत के लिए बेहतर है और उपयोगकर्ताओं के लिए उपलब्ध बॉट के लिए बहुत अच्छा है.

इसका अनुमान लगाना मुश्किल है. यह फ़्लो कंट्रोल के लिए, एलएलएम की तार्किकता पर निर्भर करता है.

क्रम में

SequentialAgent

कई चरणों वाली ऐसी प्रोसेस जिनमें क्रम का पालन करना ज़रूरी है.

आसानी से अनुमान लगाया जा सकता है, भरोसेमंद है, डीबग करना आसान है, और क्रम की गारंटी देता है.

इसमें बदलाव नहीं किया जा सकता. अगर टास्क को एक साथ किया जा सकता है, तो यह तरीका धीमा हो सकता है.

समांतर

ParallelAgent

कई सोर्स से डेटा इकट्ठा करना या अलग-अलग टास्क पूरे करना.

यह बहुत असरदार है. साथ ही, इससे I/O-बाउंड टास्क के लिए इंतज़ार का समय काफ़ी कम हो जाता है.

सभी टास्क पूरे होते हैं. कोई भी टास्क बीच में नहीं रुकता. यह उन टास्क के लिए कम सही है जो एक-दूसरे पर निर्भर होते हैं.

लूप

LoopAgent

बार-बार सुधार करना, खुद से गलती ठीक करना या ऐसी प्रोसेस जो किसी शर्त के पूरा होने तक दोहराई जाती हैं.

मुश्किल समस्याओं को हल करने में मददगार है. इससे एजेंट अपने काम को बेहतर बना पाते हैं.

अगर इसे सावधानी से डिज़ाइन नहीं किया जाता है, तो यह इनफ़िनिट लूप की वजह बन सकता है. इसलिए, हमेशा maxIterations का इस्तेमाल करें!

7. एजेंटिक वर्कफ़्लो — सब-एजेंट को टास्क सौंपना

3b3074b840f57c1c.png

सुपरवाइज़र एजेंट, कुछ टास्क को सब-एजेंट को सौंप सकता है. उदाहरण के लिए, किसी ई-कॉमर्स वेबसाइट के एजेंट के बारे में सोचें. यह एजेंट, ऑर्डर से जुड़े सवालों को एक एजेंट ("मेरे ऑर्डर का स्टेटस क्या है?") को और बिक्री के बाद की सेवा से जुड़े सवालों को दूसरे एजेंट ("मुझे इसे चालू करने का तरीका नहीं पता!") को सौंपता है. हम इस इस्तेमाल के उदाहरण के बारे में बात करने जा रहे हैं.

// 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()
        );
    }
}

यहां मुख्य लाइन में, subAgents() तरीके को कॉल किया जाता है. इसमें उन दो सब-एजेंट को पास किया जाता है जिनकी भूमिका को एक-दूसरे से अलग तरीके से हैंडल किया जाएगा.

ऊपर दिए गए उदाहरण को इस कमांड की मदद से चलाएं:

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

उप-एजेंट को टास्क सौंपने का यह कॉन्सेप्ट, इंसानों के बेहतर मैनेजमेंट को दिखाता है. इसमें एक अच्छा मैनेजर (सुपरवाइज़र एजेंट), खास काम करने के लिए उन कर्मचारियों (उप-एजेंट) पर भरोसा करता है जिनके पास उस काम की ज़्यादा विशेषज्ञता होती है. सुपरवाइज़र को हर प्रोसेस की छोटी-छोटी बातों के बारे में जानने की ज़रूरत नहीं होती. इसके बजाय, यह सिस्टम ग्राहक के अनुरोध (जैसे, ऑर्डर के बारे में पूछताछ या तकनीकी समस्या) को सबसे ज़्यादा काबिल ‘टीम मेंबर' को भेजता है. इससे यह पक्का होता है कि ग्राहक को बेहतर क्वालिटी और ज़्यादा असरदार जवाब मिले. ऐसा इसलिए, क्योंकि कोई सामान्य व्यक्ति अकेले ऐसा जवाब नहीं दे सकता. इसके अलावा, ये सब-एजेंट अपने-अपने असाइनमेंट पर पूरी तरह से ध्यान दे सकते हैं. उन्हें पूरी जटिल प्रोसेस को समझने की ज़रूरत नहीं होती.

8. एजेंटिक वर्कफ़्लो — द असेंबली लाइन

108f8601cd36b559.png

जब संक्रियाओं का क्रम मायने रखता हो, तब SequentialAgent का इस्तेमाल करें. यह एक असेंबली लाइन की तरह काम करता है. इसमें सब-एजेंट, तय किए गए क्रम में काम करते हैं. हर चरण, पिछले चरण पर निर्भर हो सकता है.

मान लें कि अंग्रेज़ी भाषा में कविताएं लिखने वाला कोई कवि, अंग्रेज़ी-फ़्रेंच अनुवादक के साथ मिलकर काम करता है. वह पहले अंग्रेज़ी में कविताएं लिखता है और फिर उन्हें फ़्रेंच में अनुवाद करता है:

// 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());
    }
}

अंग्रेज़ी में कविता पाने के लिए, यहां दिया गया उदाहरण चलाएं. इसके बाद, इसे फ़्रेंच में अनुवादित करें. इसके लिए, यह निर्देश दें:

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

जटिल टास्क को छोटे-छोटे, क्रम से लगे सब-टास्क में बांटने से, प्रोसेस ज़्यादा भरोसेमंद और सटीक हो जाती है. इससे, किसी एक एजेंट पर भरोसा करने के बजाय, टास्क के पूरा होने की संभावना काफ़ी बढ़ जाती है.

किसी टास्क को सब-टास्क की सीरीज़ में बांटना (जब ऐसा करना मुमकिन हो और सही हो) बहुत ज़रूरी है. इससे, ज़्यादा भरोसेमंद और बेहतर नतीजे मिलते हैं. ऐसा इसलिए, क्योंकि इससे चरणों के बीच स्ट्रक्चर्ड प्रोग्रेशन और डिपेंडेंसी मैनेजमेंट की अनुमति मिलती है.

9. एजेंटिक वर्कफ़्लो — पैरलल में काम करना

4ba95f71e0189ae7.png

जब टास्क एक-दूसरे पर निर्भर नहीं होते हैं, तो उन्हें एक साथ चलाने पर ParallelAgent से काफ़ी ज़्यादा फ़ायदा मिलता है. यहां दिए गए उदाहरण में, हम SequentialAgent को ParallelAgent के साथ जोड़ेंगे: पैरलल टास्क पहले पूरे किए जाते हैं. इसके बाद, फ़ाइनल एजेंट पैरलल टास्क के नतीजे की खास जानकारी देता है.

आइए, एक कंपनी डिटेक्टिव बनाते हैं. इसका काम इन विषयों पर जानकारी खोजना होगा:

  • कंपनी की प्रोफ़ाइल (सीईओ, मुख्यालय, सिद्धांत वगैरह)
  • कंपनी के बारे में ताज़ा खबरें.
  • कंपनी के वित्तीय मामलों के बारे में जानकारी.
// 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());
    }
}

हमेशा की तरह, एजेंट को इस निर्देश की मदद से चलाया जा सकता है:

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

यह एजेंट, वर्कफ़्लो के एक बेहतरीन कॉम्बिनेशन को दिखाता है. इसमें पैरलल और सीक्वेंशियल, दोनों तरह के एजेंट का अच्छी तरह से इस्तेमाल किया गया है. साथ ही, जानकारी की रिसर्च और सिंथेसिस को पैरलल करने की वजह से, इसे असरदार तरीके से इस्तेमाल किया गया है.

10. एजेंटिक वर्कफ़्लो — बार-बार सुधार करना

ea37b0ab05aa5b28.png

जिन टास्क के लिए "जनरेट करें → समीक्षा करें → बेहतर बनाएं" साइकल की ज़रूरत होती है उनके लिए, LoopAgent का इस्तेमाल करें. यह लक्ष्य पूरा होने तक, बार-बार सुधार करने की प्रोसेस को अपने-आप पूरा करता है. SequentialAgent की तरह ही, LoopAgent भी सब-एजेंट को क्रम से कॉल करेगा. हालांकि, यह शुरू से ही लूप में वापस आ जाएगा. यह एजेंट के लिए, इंटरनल तौर पर इस्तेमाल किया जाने वाला एलएलएम है. यह तय करेगा कि लूप को बंद करने के लिए, किसी खास टूल या exit_loop बिल्ट-इन टूल से कॉल का अनुरोध करना है या नहीं.

नीचे दिए गए कोड रिफ़ाइनर के उदाहरण में, LoopAgent का इस्तेमाल करके कोड को अपने-आप रिफ़ाइन किया जाता है: जनरेट करना, समीक्षा करना, और ठीक करना. यह इंसानों के विकास की तरह ही होता है. कोड जनरेट करने वाला टूल, सबसे पहले अनुरोध किया गया कोड जनरेट करता है. इसके बाद, इसे एजेंट की स्थिति में generated_code कुंजी के तहत सेव करता है. इसके बाद, कोड की समीक्षा करने वाला व्यक्ति जनरेट किए गए कोड की समीक्षा करता है. वह feedback कुंजी के तहत सुझाव देता है या कोड को जल्दी बंद करने के लिए, एक्ज़िट लूप टूल को कॉल करता है.

आइए, कोड पर एक नज़र डालें:

// 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());
    }
}

इस एजेंट को इस कमांड के साथ चलाएं:

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

LoopAgent का इस्तेमाल करके लागू किए गए सुझाव/बेहतर बनाने के लूप, उन समस्याओं को हल करने के लिए ज़रूरी हैं जिनमें बार-बार सुधार करने और खुद से ठीक होने की ज़रूरत होती है. ये लूप, इंसानों की संज्ञानात्मक प्रक्रियाओं की तरह काम करते हैं. यह डिज़ाइन पैटर्न, खास तौर पर उन कामों के लिए मददगार होता है जिनमें शुरुआती आउटपुट कभी-कभी सही नहीं होता. जैसे, कोड जनरेट करना, क्रिएटिव राइटिंग, डिज़ाइन में बदलाव करना या डेटा का जटिल विश्लेषण करना. आउटपुट को खास तौर पर समीक्षा करने वाले एजेंट के पास भेजकर, स्ट्रक्चर्ड फ़ीडबैक पाया जाता है. इससे जवाब जनरेट करने वाला एजेंट, पहले से तय किए गए मानदंड पूरे होने तक अपने काम को लगातार बेहतर बना सकता है. इससे, एक बार में जवाब जनरेट करने के तरीके की तुलना में, बेहतर क्वालिटी और ज़्यादा भरोसेमंद नतीजे मिलते हैं.

11. बधाई हो!

337a2e319008d004.png

आपने अलग-अलग तरह के एआई एजेंट बनाए और उन्हें एक्सप्लोर किया. इनमें बातचीत करने वाले सामान्य एजेंट से लेकर, जटिल मल्टी-एजेंट सिस्टम तक शामिल हैं. आपने Java के लिए ADK के मुख्य कॉन्सेप्ट के बारे में जान लिया है. जैसे, निर्देशों के साथ एजेंट तय करना, उन्हें टूल उपलब्ध कराना, और उन्हें बेहतर वर्कफ़्लो में व्यवस्थित करना.

आगे क्या करना है?

  • Java के लिए ADK की आधिकारिक GitHub रिपॉज़िटरी देखें.
  • इस फ़्रेमवर्क के बारे में ज़्यादा जानने के लिए, इसका दस्तावेज़ देखें.
  • इस ब्लॉग सीरीज़ में, एजेंटिक वर्कफ़्लो के बारे में पढ़ें. साथ ही, उपलब्ध अलग-अलग टूल के बारे में जानें.
  • अन्य बिल्ट-इन टूल और ऐडवांस कॉलबैक के बारे में ज़्यादा जानें.
  • बेहतर और मल्टीमॉडल इंटरैक्शन के लिए, कॉन्टेक्स्ट, स्टेट, और आर्टफ़ैक्ट मैनेज करता है.
  • ऐसे प्लगिन लागू करें और इस्तेमाल करें जो आपके एजेंट के लाइफ़साइकल में प्लग इन होते हैं.
  • असल ज़िंदगी की किसी समस्या को हल करने वाला अपना एजेंट बनाएं!