इस पेज पर, ये काम करने का तरीका बताया गया है:
- Prompt API का इस्तेमाल करने के लिए, अपने प्रोजेक्ट को कॉन्फ़िगर करना
- सिर्फ़ टेक्स्ट वाला इनपुट देना और जवाब पाना
- इमेज वाला इनपुट देना. साथ ही, उससे जुड़ा टेक्स्ट इनपुट देना और जवाब पाना
Prompt API के बारे में ज़्यादा जानकारी के लिए, Kotlin (com.google.mlkit.genai.prompt) और Java (com.google.mlkit.genai.prompt.java, com.google.mlkit.genai.prompt) के लिए रेफ़रंस दस्तावेज़ देखें.
प्रोजेक्ट कॉन्फ़िगर करना
ML Kit Prompt API को अपने build.gradle कॉन्फ़िगरेशन में, डिपेंडेंसी के तौर पर जोड़ें:
implementation("com.google.mlkit:genai-prompt:1.0.0-beta2")
जनरेटिव मॉडल लागू करना
अपने प्रोजेक्ट में कोड लागू करने के लिए, यह तरीका अपनाएं:
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 ऐप्लिकेशन के पास, शुरू करने की प्रोसेस पूरी करने के लिए (जिसमें सर्वर से सबसे नए कॉन्फ़िगरेशन डाउनलोड करना शामिल है) शायद ही पर्याप्त समय हो. इसलिए, हो सकता है कि 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 है: होस्ट ... को हल नहीं किया जा सका. | नेटवर्क कनेक्शन बनाए रखें. कुछ मिनट इंतज़ार करें और फिर से कोशिश करें. |