ट्यूटोरियल: Gemini API का इस्तेमाल शुरू करना


इस ट्यूटोरियल में बताया गया है कि Google AI Dart SDK टूल का इस्तेमाल करके, आपके Dart या Flutter ऐप्लिकेशन के लिए, Gemini API को कैसे ऐक्सेस किया जा सकता है. अगर आपको अपने ऐप्लिकेशन में Gemini के मॉडल ऐक्सेस करने के लिए, सीधे तौर पर REST API के साथ काम नहीं करना है, तो इस SDK टूल का इस्तेमाल किया जा सकता है.

इस ट्यूटोरियल में आप इन कामों को करने का तरीका जानेंगे:

इसके अलावा, इस ट्यूटोरियल में बेहतर इस्तेमाल के उदाहरणों (जैसे, एम्बेड करना और टोकन की गिनती करना) के बारे में जानकारी दी गई है. साथ ही, कॉन्टेंट जनरेट करने की प्रोसेस को कंट्रोल करने के विकल्प भी दिए गए हैं.

ज़रूरी शर्तें

यह ट्यूटोरियल मानकर चलता है कि आप Dart के साथ ऐप्लिकेशन बनाने के बारे में जानते हैं.

इस ट्यूटोरियल को पूरा करने के लिए, पक्का करें कि आपका डेवलपमेंट एनवायरमेंट इन ज़रूरी शर्तों को पूरा करता हो:

  • Dart 3.2.0 और उसके बाद के वर्शन

अपना प्रोजेक्ट सेट अप करना

Gemini API को कॉल करने से पहले, आपको अपना प्रोजेक्ट सेट अप करना होगा. इसमें, एपीआई पासकोड सेट अप करना, पब डिपेंडेंसी में SDK टूल जोड़ना, और मॉडल को शुरू करना शामिल हैं.

एपीआई पासकोड सेट अप करना

Gemini API का इस्तेमाल करने के लिए, आपको एपीआई पासकोड की ज़रूरत होगी. अगर आपके पास पहले से कोई पासकोड नहीं है, तो Google AI Studio में जाकर पासकोड बनाएं.

एपीआई पासकोड पाएं

एपीआई पासकोड को सुरक्षित रखना

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

इस ट्यूटोरियल के सभी स्निपेट यह मानते हैं कि एपीआई पासकोड को प्रोसेस एनवायरमेंट वैरिएबल के तौर पर ऐक्सेस किया जा रहा है. अगर कोई Flutter ऐप्लिकेशन डेवलप किया जा रहा है, तो एपीआई पासकोड की मदद से उसे कंपाइल करने के लिए, String.fromEnvironment का इस्तेमाल किया जा सकता है और --dart-define=API_KEY=$API_KEY को flutter build या flutter run में पास किया जा सकता है. ऐसा इसलिए, क्योंकि ऐप्लिकेशन चलाने के दौरान, एनवायरमेंट अलग होगा.

SDK टूल का पैकेज इंस्टॉल करें

Gemini API को अपने ऐप्लिकेशन में इस्तेमाल करने के लिए, आपको Dart या Flutter ऐप्लिकेशन में google_generative_ai पैकेज को add करना होगा:

Dart

dart pub add google_generative_ai

Flutter

flutter pub add google_generative_ai

जनरेटिव मॉडल शुरू करें

एपीआई कॉल करने से पहले, आपको जनरेटिव मॉडल इंपोर्ट और शुरू करना होगा.

import 'dart:io';
import 'package:google_generative_ai/google_generative_ai.dart';

void main() async {

  // Access your API key as an environment variable (see "Set up your API key" above)
  final apiKey = Platform.environment['API_KEY'];
  if (apiKey == null) {
    print('No \$API_KEY environment variable');
    exit(1);
  }

  // The Gemini 1.5 models are versatile and work with most use cases
  final model = GenerativeModel(model: 'gemini-1.5-flash', apiKey: apiKey);
}

मॉडल तय करते समय, इन बातों का ध्यान रखें:

  • उस मॉडल का इस्तेमाल करें जो आपके इस्तेमाल के उदाहरण के लिए खास हो. उदाहरण के लिए, gemini-1.5-flash मल्टीमॉडल इनपुट के लिए है. इस गाइड में, हर लागू करने के निर्देशों में, इस्तेमाल के हर उदाहरण के लिए सुझाए गए मॉडल की सूची दी गई है.

इस्तेमाल के सामान्य उदाहरण लागू करना

आपका प्रोजेक्ट सेट अप हो गया है. इसलिए, अब Gemini API के इस्तेमाल के अलग-अलग उदाहरण लागू किए जा सकते हैं:

इस्तेमाल के ऐडवांस उदाहरणों वाले सेक्शन में, आपको Gemini API और एम्बेड करने के बारे में जानकारी मिल सकती है.

सिर्फ़ टेक्स्ट इनपुट से टेक्स्ट जनरेट करें

अगर प्रॉम्प्ट इनपुट में सिर्फ़ टेक्स्ट शामिल है, तो टेक्स्ट आउटपुट जनरेट करने के लिए, Gemini के 1.5 मॉडल या generateContent के साथ Gemini 1.0 Pro मॉडल का इस्तेमाल करें:

import 'dart:io';

import 'package:google_generative_ai/google_generative_ai.dart';

void main() async {
  // Access your API key as an environment variable (see "Set up your API key" above)
  final apiKey = Platform.environment['API_KEY'];
  if (apiKey == null) {
    print('No \$API_KEY environment variable');
    exit(1);
  }
  // The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
  final model = GenerativeModel(model: 'gemini-1.5-flash', apiKey: apiKey);
  final content = [Content.text('Write a story about a magic backpack.')];
  final response = await model.generateContent(content);
  print(response.text);
}

टेक्स्ट और इमेज इनपुट से टेक्स्ट जनरेट करें (मल्टीमॉडल)

Gemini में ऐसे कई मॉडल उपलब्ध हैं जो मल्टीमॉडल इनपुट (Gemini 1.5 मॉडल) को हैंडल कर सकते हैं, ताकि टेक्स्ट और इमेज, दोनों इनपुट किए जा सकें. प्रॉम्प्ट के लिए इमेज से जुड़ी ज़रूरी शर्तें ज़रूर देखें.

अगर प्रॉम्प्ट इनपुट में टेक्स्ट और इमेज, दोनों शामिल हैं, तो टेक्स्ट आउटपुट जनरेट करने के लिए, generateContent तरीके के साथ Gemini 1.5 मॉडल का इस्तेमाल करें:

import 'dart:io';

import 'package:google_generative_ai/google_generative_ai.dart';

void main() async {
  // Access your API key as an environment variable (see "Set up your API key" above)
  final apiKey = Platform.environment['API_KEY'];
  if (apiKey == null) {
    print('No \$API_KEY environment variable');
    exit(1);
  }
  // The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
  final model = GenerativeModel(model: 'gemini-1.5-flash', apiKey: apiKey);
  final (firstImage, secondImage) = await (
    File('image0.jpg').readAsBytes(),
    File('image1.jpg').readAsBytes()
  ).wait;
  final prompt = TextPart("What's different between these pictures?");
  final imageParts = [
    DataPart('image/jpeg', firstImage),
    DataPart('image/jpeg', secondImage),
  ];
  final response = await model.generateContent([
    Content.multi([prompt, ...imageParts])
  ]);
  print(response.text);
}

बार-बार होने वाली बातचीत (चैट) की सुविधा तैयार करें

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

बार-बार होने वाली बातचीत (जैसे, चैट) शुरू करने के लिए, Gemini के 1.5 मॉडल या Gemini 1.0 Pro मॉडल का इस्तेमाल करें. इसके बाद, startChat() पर कॉल करके चैट शुरू करें. इसके बाद, उपयोगकर्ता को नया मैसेज भेजने के लिए sendMessage() का इस्तेमाल करें. इसमें मैसेज के साथ-साथ चैट के इतिहास में जवाब भी शामिल हो जाएगा.

किसी बातचीत के कॉन्टेंट से जुड़े role के लिए, ये दो विकल्प हो सकते हैं:

  • user: वह भूमिका जो प्रॉम्प्ट देती है. यह वैल्यू sendMessage कॉल के लिए डिफ़ॉल्ट वैल्यू होती है. अगर कोई दूसरी भूमिका पास की जाती है, तो फ़ंक्शन अपवाद को अनुमति देगा.

  • model: वह भूमिका जो जवाब देती है. मौजूदा history के साथ startChat() को कॉल करते समय, इस भूमिका का इस्तेमाल किया जा सकता है.

import 'dart:io';

import 'package:google_generative_ai/google_generative_ai.dart';

Future<void> main() async {
  // Access your API key as an environment variable (see "Set up your API key" above)
  final apiKey = Platform.environment['API_KEY'];
  if (apiKey == null) {
    print('No \$API_KEY environment variable');
    exit(1);
  }
  // The Gemini 1.5 models are versatile and work with multi-turn conversations (like chat)
  final model = GenerativeModel(
      model: 'gemini-1.5-flash',
      apiKey: apiKey,
      generationConfig: GenerationConfig(maxOutputTokens: 100));
  // Initialize the chat
  final chat = model.startChat(history: [
    Content.text('Hello, I have 2 dogs in my house.'),
    Content.model([TextPart('Great to meet you. What would you like to know?')])
  ]);
  var content = Content.text('How many paws are in my house?');
  var response = await chat.sendMessage(content);
  print(response.text);
}

तेज़ी से इंटरैक्शन करने के लिए स्ट्रीमिंग का इस्तेमाल करें

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

इस उदाहरण में बताया गया है कि टेक्स्ट और इमेज इनपुट प्रॉम्प्ट से टेक्स्ट जनरेट करने के लिए, generateContentStream तरीके की मदद से स्ट्रीमिंग कैसे लागू की जाए.

// ...

final response = model.generateContentStream([
  Content.multi([prompt, ...imageParts])
]);
await for (final chunk in response) {
  print(chunk.text);
}

// ...

सिर्फ़ टेक्स्ट इनपुट और चैट के इस्तेमाल के लिए, इसी तरीके का इस्तेमाल किया जा सकता है.

// Use streaming with text-only input
final response = model.generateContentStream(content);
// Use streaming with multi-turn conversations (like chat)
final response = chat.sendMessageStream(content);

इस्तेमाल के बेहतर उदाहरण लागू करना

इस ट्यूटोरियल के पिछले सेक्शन में, इस्तेमाल के जिन सामान्य उदाहरणों के बारे में बताया गया है उनसे Gemini API को इस्तेमाल करने में मदद मिलती है. इस सेक्शन में, इस्तेमाल के कुछ ऐसे उदाहरणों के बारे में बताया गया है जिन्हें ज़्यादा बेहतर माना जा सकता है.

फ़ंक्शन कॉलिंग

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

एम्बेड करने की सुविधा का इस्तेमाल करना

एम्बेड करना एक ऐसी तकनीक है जिसका इस्तेमाल किसी अरे में फ़्लोटिंग पॉइंट नंबर की सूची के तौर पर जानकारी को दिखाने के लिए किया जाता है. Gemini की मदद से, टेक्स्ट (शब्द, वाक्य, और टेक्स्ट के ब्लॉक) को वेक्टर के हिसाब से दिखाया जा सकता है. इससे, एम्बेड किए गए कॉन्टेंट की तुलना करना और कंट्रास्ट करना आसान हो जाता है. उदाहरण के लिए, एक जैसे विषय या भावनाओं वाले दो टेक्स्ट में एक जैसी एम्बेडिंग होनी चाहिए. इसकी पहचान, कोसाइन (cos) जैसी गणित की तुलना की तकनीकों से की जा सकती है.

एम्बेड करने की सुविधा जनरेट करने के लिए, embedContent तरीके या batchEmbedContent तरीके के साथ embedding-001 मॉडल का इस्तेमाल करें. इस उदाहरण में, सिंगल स्ट्रिंग के लिए एम्बेड करने की सुविधा जनरेट की गई है:

final model = GenerativeModel(model: 'embedding-001', apiKey: apiKey);
final content = Content.text('The quick brown fox jumps over the lazy dog.');
final result = await model.embedContent(content);
print(result.embedding.values);

टोकन गिनें

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

// For text-only input
final tokenCount = await model.countTokens(Content.text(prompt));
print('Token count: ${tokenCount.totalTokens}');
// For text-and-image input (multimodal)
final tokenCount = await model.countTokens([
  Content.multi([prompt, ...imageParts])
]);
print('Token count: ${tokenCount.totalTokens}');
// For multi-turn conversations (like chat)
final prompt = Content.text(message);
final allContent = [...chat.history, prompt];
final tokenCount = await model.countTokens(allContent);
print('Token count: ${tokenCount.totalTokens}');

कॉन्टेंट जनरेट करने की प्रोसेस को कंट्रोल करने के विकल्प

मॉडल पैरामीटर कॉन्फ़िगर करके और सुरक्षा सेटिंग का इस्तेमाल करके, कॉन्टेंट जनरेट करने की प्रोसेस को कंट्रोल किया जा सकता है.

ध्यान दें कि मॉडल अनुरोध के तरीके (जैसे generateContent) में generationConfig या safetySettings पास करने पर, कॉन्फ़िगरेशन ऑब्जेक्ट पूरी तरह बदल जाएगा. साथ ही, getGenerativeModel में पास किया गया नाम एक ही होगा.

मॉडल पैरामीटर कॉन्फ़िगर करें

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

final generationConfig = GenerationConfig(
  stopSequences: ["red"],
  maxOutputTokens: 200,
  temperature: 0.9,
  topP: 0.1,
  topK: 16,
);
final model = GenerativeModel(
  // The Gemini 1.5 models are versatile and work with most use cases
  model: 'gemini-1.5-flash',
  apiKey: apiKey,
  generationConfig: generationConfig,
);

सुरक्षा सेटिंग का इस्तेमाल करना

सुरक्षा सेटिंग का इस्तेमाल करके, ऐसे जवाब मिलने की संभावना को कम या ज़्यादा किया जा सकता है जिन्हें नुकसान पहुंचाने वाला माना जा सकता हो. डिफ़ॉल्ट रूप से, सुरक्षा सेटिंग सभी डाइमेंशन में मीडियम और/या असुरक्षित कॉन्टेंट वाले कॉन्टेंट को ब्लॉक कर देती हैं. सुरक्षा की सेटिंग के बारे में ज़्यादा जानें.

यहां एक सुरक्षा सेटिंग सेट करने का तरीका बताया गया है:

final safetySettings = [
  SafetySetting(HarmCategory.harassment, HarmBlockThreshold.high)
];
final model = GenerativeModel(
  // The Gemini 1.5 models are versatile and work with most use cases
  model: 'gemini-1.5-flash',
  apiKey: apiKey,
  safetySettings: safetySettings,
);

आप एक से ज़्यादा सुरक्षा सेटिंग भी सेट कर सकते हैं:

final safetySettings = [
  SafetySetting(HarmCategory.harassment, HarmBlockThreshold.high),
  SafetySetting(HarmCategory.hateSpeech, HarmBlockThreshold.high),
];

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

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

  • अलग-अलग कामों को पूरा करने के लिए, Gemini में कई तरह के मॉडल उपलब्ध हैं. जैसे, इनपुट का टाइप और जटिलता, चैट या डायलॉग की भाषा के अन्य टास्क लागू करना, और साइज़ से जुड़ी शर्तें. Gemini के उपलब्ध मॉडल के बारे में जानें.