Prompt API का इस्तेमाल शुरू करना

इस पेज पर, इन कामों को करने का तरीका बताया गया है:

  • Prompt API का इस्तेमाल करने के लिए, अपने प्रोजेक्ट को कॉन्फ़िगर करना
  • सिर्फ़ टेक्स्ट वाला इनपुट देना और जवाब पाना
  • इमेज इनपुट के साथ उससे जुड़ा टेक्स्ट इनपुट दें और जवाब पाएं

Prompt API के बारे में ज़्यादा जानने के लिए, Kotlin (com.google.mlkit.genai.prompt) और Java (com.google.mlkit.genai.prompt.java, com.google.mlkit.genai.prompt) के लिए रेफ़रंस दस्तावेज़ देखें.

प्रोजेक्ट कॉन्फ़िगर करना

अपने build.gradle कॉन्फ़िगरेशन में, ML Kit Prompt API को डिपेंडेंसी के तौर पर जोड़ें:

implementation("com.google.mlkit:genai-prompt:1.0.0-beta4")

अगर आपको Structured Output API का इस्तेमाल करके, किसी खास फ़ॉर्मैट में जवाब चाहिए, तो आपको केएसपी को कॉन्फ़िगर करना होगा और अतिरिक्त डिपेंडेंसी जोड़नी होंगी. ज़्यादा जानकारी के लिए, स्ट्रक्चर्ड आउटपुट जनरेट करना लेख पढ़ें.

जनरेटिव मॉडल लागू करना

अपने प्रोजेक्ट में कोड लागू करने के लिए, यह तरीका अपनाएं:

  • generativeModel ऑब्जेक्ट बनाएं:

    Kotlin

    // Get a GenerativeModel instance
    val generativeModel = Generation.getClient()
    

    Java

    // Get a GenerativeModel instance
    GenerativeModelFutures generativeModelFutures = GenerativeModelFutures
        .from(Generation.INSTANCE.getClient());
    
  • देखें कि Gemini Nano AVAILABLE, DOWNLOADABLE है या UNAVAILABLE. इसके बाद, अगर सुविधा डाउनलोड की जा सकती है, तो उसे डाउनलोड करें:

    Kotlin

    val status = generativeModel.checkStatus()
    when (status) {
        FeatureStatus.UNAVAILABLE -> {
            // Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it
        }
    
        FeatureStatus.DOWNLOADABLE -> {
            // Gemini Nano can be downloaded on this device, but is not currently downloaded
            generativeModel.download().collect { status ->
                when (status) {
                    is DownloadStatus.DownloadStarted ->
                        Log.d(TAG, "starting download for Gemini Nano")
    
                    is DownloadStatus.DownloadProgress ->
                        Log.d(TAG, "Nano ${status.totalBytesDownloaded} bytes downloaded")
    
                    DownloadStatus.DownloadCompleted -> {
                        Log.d(TAG, "Gemini Nano download complete")
                        modelDownloaded = true
                    }
    
                    is DownloadStatus.DownloadFailed -> {
                        Log.e(TAG, "Nano download failed ${status.e.message}")
                    }
                }
            }
        }
    
        FeatureStatus.DOWNLOADING -> {
            // Gemini Nano currently being downloaded
        }
    
        FeatureStatus.AVAILABLE -> {
            // Gemini Nano currently downloaded and available to use on this device
        }
    }
    

    Java

    ListenableFuture<Integer> status = generativeModelFutures.checkStatus();
    Futures.addCallback(generativeModelFutures.checkStatus(), new FutureCallback<>() {
        @Override
        public void onSuccess(Integer featureStatus) {
            switch (featureStatus) {
                case FeatureStatus.AVAILABLE - > {
                    // Gemini Nano currently downloaded and available to use on this device
                }
                case FeatureStatus.UNAVAILABLE - > {
                    // Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it
                }
                case FeatureStatus.DOWNLOADING - > {
                    // Gemini Nano currently being downloaded
                }
                case FeatureStatus.DOWNLOADABLE - > {
                    generativeModelFutures.download(new DownloadCallback() {
                        @Override
                        public void onDownloadStarted(long l) {
                            Log.d(TAG, "starting download for Gemini Nano");
                        }
                        @Override
                        public void onDownloadProgress(long l) {
                            Log.d(TAG, "Nano " + l + " bytes downloaded");
                        }
                        @Override
                        public void onDownloadCompleted() {
                            Log.d(TAG, "Gemini Nano download complete");
                        }
                        @Override
                        public void onDownloadFailed(@NonNull GenAiException e) {
                            Log.e(TAG, "Nano download failed: " + e.getMessage());
                        }
                    });
                }
            }
        }
        @Override
        public void onFailure(@NonNull Throwable t) {
            // Failed to check status
        }
    }, ContextCompat.getMainExecutor(context));
    
    

सिर्फ़ टेक्स्ट वाला इनपुट देना

Kotlin

val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog.")

Java

GenerateContentResponse response = generativeModelFutures.generateContent(
  new GenerateContentRequest.Builder(
    new TextPart("Write a 3 sentence story about a magical dog."))
  .build())
  .get();

इसके अलावा, वैकल्पिक पैरामीटर भी जोड़े जा सकते हैं:

Kotlin

val response = generativeModel.generateContent(
    generateContentRequest(
        TextPart("Write a 3 sentence story about a magical dog."),
    ) {
        // Optional parameters
        temperature = 0.2f
        topK = 10
        candidateCount = 3
    },
)

Java

GenerateContentRequest.Builder requestBuilder =
        new GenerateContentRequest.Builder(
                new TextPart("Write a 3 sentence story about a magical dog."));
requestBuilder.setTemperature(.2f);
requestBuilder.setTopK(10);
requestBuilder.setCandidateCount(3);

GenerateContentResponse response =
        generativeModelFutures.generateContent(requestBuilder.build()).get();

वैकल्पिक पैरामीटर के बारे में ज़्यादा जानने के लिए, वैकल्पिक कॉन्फ़िगरेशन देखें.

मल्टीमोडल (इमेज और टेक्स्ट) इनपुट देना

generateContentRequest() फ़ंक्शन में, एक साथ कई इमेज और टेक्स्ट इनपुट को बंडल करें. इसमें टेक्स्ट प्रॉम्प्ट, इमेज से जुड़ा कोई सवाल या निर्देश होना चाहिए. एक ही अनुरोध में, ज़्यादा से ज़्यादा 10 इमेज बंडल की जा सकती हैं.

Kotlin

val response = generativeModel.generateContent(
    generateContentRequest(ImagePart(bitmap1), ImagePart(bitmap2), TextPart(textPrompt)) {
        // optional parameters
        ...
    },
)

Java

GenerateContentResponse response = generativeModelFutures.generateContent(
    new GenerateContentRequest.Builder(
        new Content.Builder()
            .addPart(new ImagePart(bitmap1))
            .addPart(new ImagePart(bitmap2))
            .addPart(new TextPart("textPrompt"))
            .build())
    // optional parameters
    .build())
.get();

अनुमान के नतीजे को प्रोसेस करना

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

    • यह नॉन-स्ट्रीमिंग अनुमान का इस्तेमाल करता है. यह नतीजा दिखाने से पहले, एआई मॉडल से पूरा नतीजा हासिल करता है:

    Kotlin

    // Call the AI model to generate content and store the complete
    // in a new variable named 'response' once it's finished
    val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog")
    

    Java

    GenerateContentResponse response = generativeModelFutures.generateContent(
            new GenerateContentRequest.Builder(
                    new TextPart("Write a 3 sentence story about a magical dog."))
                    .build())
            .get();
    
    • यहां दिए गए स्निपेट, स्ट्रीमिंग अनुमान का इस्तेमाल करने के उदाहरण हैं. इससे नतीजे जनरेट होने के साथ-साथ, उन्हें अलग-अलग हिस्सों में वापस पाया जा सकता है:

    Kotlin

    // Streaming inference
    var fullResponse = ""
    generativeModel.generateContentStream("Write a 3 sentence story about a magical dog").collect { chunk ->
        val newChunkReceived = chunk.candidates[0].text
        print(newChunkReceived)
        fullResponse += newChunkReceived
    }
    

    Java

    // Streaming inference
    StringBuilder fullResponse = new StringBuilder();
    generativeModelFutures.generateContent(new GenerateContentRequest.Builder(
        (new TextPart("Write a 3 sentence story about a magical dog"))).build(),
            chunk -> {
                Log.d(TAG, chunk);
                fullResponse.append(chunk);
            });
    

स्ट्रीमिंग और नॉन-स्ट्रीमिंग अनुमान के बारे में ज़्यादा जानने के लिए, स्ट्रीमिंग बनाम नॉन-स्ट्रीमिंग देखें.

लेटेंसी ऑप्टिमाइज़ेशन

पहले अनुमान कॉल को ऑप्टिमाइज़ करने के लिए, आपका ऐप्लिकेशन warmup() को कॉल कर सकता है. इससे Gemini Nano, मेमोरी में लोड हो जाता है और रनटाइम कॉम्पोनेंट शुरू हो जाते हैं.

वैकल्पिक कॉन्फ़िगरेशन

हर GenerateContentRequest के हिस्से के तौर पर, ये वैकल्पिक पैरामीटर सेट किए जा सकते हैं:

  • temperature : इससे यह कंट्रोल किया जाता है कि टोकन चुनने में कितनी रैंडमनेस हो.
  • seed : इससे स्टेबल और डिटरमिनिस्टिक नतीजे जनरेट किए जा सकते हैं.
  • topK : इससे नतीजों में रैंडमनेस और विविधता को कंट्रोल किया जाता है.
  • candidateCount : इससे, मिले यूनीक जवाबों की संख्या का अनुरोध किया जाता है. ध्यान दें कि जवाबों की सटीक संख्या, candidateCount से अलग हो सकती है. ऐसा इसलिए, क्योंकि डुप्लीकेट जवाब अपने-आप हट जाते हैं.
  • maxOutputTokens : इससे यह तय होता है कि जवाब में ज़्यादा से ज़्यादा कितने टोकन जनरेट किए जा सकते हैं.

वैकल्पिक कॉन्फ़िगरेशन सेट करने के बारे में ज़्यादा जानकारी के लिए, GenerateContentRequest देखें.

इस्तेमाल की जा सकने वाली सुविधाएं और सीमाएं

  • इनपुट में 4,000 से कम टोकन (या अंग्रेज़ी के करीब 3,000 शब्द) होने चाहिए. ज़्यादा जानकारी के लिए, countTokens रेफ़रंस देखें.
  • ऐसे इस्तेमाल के उदाहरणों से बचना चाहिए जिनमें लंबे आउटपुट (4 हज़ार से ज़्यादा टोकन) की ज़रूरत होती है.
  • AICore, हर ऐप्लिकेशन के लिए अनुमान लगाने का कोटा लागू करता है. ज़्यादा जानकारी के लिए, हर ऐप्लिकेशन के लिए कोटा देखें.

सेटअप से जुड़ी आम समस्याएं

ML Kit GenAI एपीआई, Gemini Nano को ऐक्सेस करने के लिए Android AICore ऐप्लिकेशन का इस्तेमाल करते हैं. जब किसी डिवाइस को सेट अप किया जाता है (इसमें रीसेट करना भी शामिल है) या AICore ऐप्लिकेशन को रीसेट किया जाता है (जैसे, डेटा मिटाना, अनइंस्टॉल करना और फिर से इंस्टॉल करना), तो हो सकता है कि AICore ऐप्लिकेशन को शुरू होने में ज़्यादा समय लगे. इसमें सर्वर से नए कॉन्फ़िगरेशन डाउनलोड करना भी शामिल है. इस वजह से, हो सकता है कि ML Kit के जेन एआई एपीआई उम्मीद के मुताबिक काम न करें. यहां सेट अप से जुड़ी गड़बड़ियों के कुछ सामान्य मैसेज दिए गए हैं. साथ ही, उन्हें ठीक करने का तरीका भी बताया गया है:

गड़बड़ी के मैसेज का उदाहरण समस्या को कैसे हल करें
AICore में गड़बड़ी हुई. गड़बड़ी का टाइप 4-CONNECTION_ERROR और गड़बड़ी का कोड 601-BINDING_FAILURE है: AICore सेवा को बाइंड नहीं किया जा सका. ऐसा तब हो सकता है, जब डिवाइस सेटअप करने के तुरंत बाद, ML Kit GenAI एपीआई का इस्तेमाल करके ऐप्लिकेशन इंस्टॉल किया गया हो या ऐप्लिकेशन इंस्टॉल करने के बाद AICore को अनइंस्टॉल कर दिया गया हो. AICore ऐप्लिकेशन को अपडेट करने के बाद, अपने ऐप्लिकेशन को फिर से इंस्टॉल करें. इससे समस्या ठीक हो जाएगी.
AICore में गड़बड़ी हुई. गड़बड़ी का टाइप 3-PREPARATION_ERROR और गड़बड़ी का कोड 606-FEATURE_NOT_FOUND: ... सुविधा उपलब्ध नहीं है. ऐसा तब हो सकता है, जब AICore ने नए कॉन्फ़िगरेशन डाउनलोड न किए हों. जब डिवाइस इंटरनेट से कनेक्ट होता है, तो आम तौर पर इसे अपडेट होने में कुछ मिनट से लेकर कुछ घंटे लगते हैं. डिवाइस को रीस्टार्ट करने से, अपडेट तेज़ी से हो सकता है.

ध्यान दें कि अगर डिवाइस का बूटलोडर अनलॉक है, तो आपको यह गड़बड़ी भी दिखेगी. यह एपीआई, अनलॉक किए गए बूटलोडर वाले डिवाइसों पर काम नहीं करता.
AICore में गड़बड़ी हुई. गड़बड़ी का टाइप 1-DOWNLOAD_ERROR और गड़बड़ी का कोड 0-UNKNOWN: सुविधा ... काम नहीं कर रही है. गड़बड़ी का स्टेटस 0 और गड़बड़ी का कोड esz: UNAVAILABLE: होस्ट ... को रिज़ॉल्व नहीं किया जा सका इंटरनेट कनेक्शन चालू रखें, कुछ मिनट इंतज़ार करें, और फिर से कोशिश करें.