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

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

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

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

[ज़रूरी नहीं] Gemma 3n मॉडल के साथ प्रॉम्प्ट को टेस्ट करना

इसे लागू करने से पहले, AI Studio में Gemma 3n E4B मॉडल की मदद से अपने प्रॉम्प्ट को टेस्ट करें. Gemma 3n के आउटपुट, nano-v3 के आउटपुट से काफ़ी मिलते-जुलते हो सकते हैं.

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

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

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

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

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

  • 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() फ़ंक्शन में, इमेज और टेक्स्ट इनपुट को एक साथ बंडल करें. टेक्स्ट प्रॉम्प्ट, इमेज से जुड़ा कोई सवाल या निर्देश होना चाहिए:

Kotlin

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

Java

GenerateContentResponse response = generativeModelFutures.generateContent(
    new GenerateContentRequest.Builder(
        new ImagePart(bitmap),
        new TextPart("textPrompt"))
    // 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 रेफ़रंस देखें.
  • ऐसे इस्तेमाल के उदाहरणों से बचना चाहिए जिनमें लंबे आउटपुट (256 से ज़्यादा टोकन) की ज़रूरत होती है.
  • AICore, हर ऐप्लिकेशन के लिए अनुमान लगाने का कोटा लागू करता है. ज़्यादा जानकारी के लिए, हर ऐप्लिकेशन के लिए कोटा देखें.
  • Prompt API के लिए, इन भाषाओं की पुष्टि की गई है:
    • अंग्रेज़ी
    • कोरियाई

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

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

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

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