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-beta2")

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

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

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

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

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

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 है: होस्ट ... को हल नहीं किया जा सका नेटवर्क कनेक्शन चालू रखें. कुछ मिनट इंतज़ार करें और फिर से कोशिश करें.
checkFeatureStatus() या checkStatus() को कॉल करने के बाद ही, इससे जुड़ा कोई यूज़र इंटरफ़ेस (यूआई) दिखाएं. इससे आपके ऐप्लिकेशन के उपयोगकर्ताओं को ये गड़बड़ियां नहीं दिखेंगी.