Dart veya Flutter uygulamalarında Gemini API'yi kullanmaya başlama

Bu eğiticide, Google AI Dart SDK'sını kullanarak Dart veya Flutter uygulamanız için Gemini API'ye nasıl erişeceğiniz gösterilmektedir. Uygulamanızdaki Gemini modellerine erişmek için doğrudan REST API'leriyle çalışmak istemiyorsanız bu SDK'yı kullanabilirsiniz.

Bu eğiticide aşağıdakileri nasıl yapacağınızı öğreneceksiniz:

Ayrıca bu eğitimde, gelişmiş kullanım alanları (ör. yerleştirmeler ve sayma jetonları) ve içerik oluşturma sürecini kontrol etme seçenekleri hakkında bölümler yer alır.

Ön koşullar

Bu eğiticide, Dart ile uygulama geliştirme konusunda bilgi sahibi olduğunuz varsayılmaktadır.

Bu eğiticiyi tamamlamak için geliştirme ortamınızın aşağıdaki gereksinimleri karşıladığından emin olun:

  • Dart 3.2.0 ve üzeri

Projenizi oluşturun

Gemini API'yi çağırmadan önce projenizi ayarlamanız gerekir. Bu aşamaya API anahtarınızı oluşturma, SDK'yı yayıncı bağımlılıklarınıza ekleme ve modeli başlatma dahildir.

API anahtarınızı oluşturma

Gemini API'yi kullanmak için API anahtarı gerekir. Anahtarınız yoksa Google AI Studio'da bir anahtar oluşturun.

API anahtarı alma

API anahtarınızın güvenliğini sağlama

API anahtarınızı güvende tutun. API anahtarını doğrudan kodunuza dahil etmemenizi veya anahtarı içeren dosyaları sürüm kontrol sistemlerinde kontrol etmenizi kesinlikle öneririz. Bunun yerine, API anahtarınız için gizli anahtar deposu kullanmanız gerekir.

Bu eğiticideki tüm snippet'lerde, API anahtarınıza işlem ortamı değişkeni olarak eriştiğiniz varsayılmıştır. Flutter uygulaması geliştiriyorsanız uygulamayı çalıştırırken işlem ortamı farklı olacağından API anahtarıyla derlemek için String.fromEnvironment kullanıp --dart-define=API_KEY=$API_KEY öğesini flutter build veya flutter run öğesine aktarabilirsiniz.

SDK paketini yükleyin

Gemini API'yi kendi uygulamanızda kullanmak için google_generative_ai paketini Dart veya Flutter uygulamanıza add eklemeniz gerekir:

Dart

dart pub add google_generative_ai

Flutter

flutter pub add google_generative_ai

Üretken modeli ilk kullanıma hazırlama

Herhangi bir API çağrısı yapabilmeniz için önce üretici modeli içe aktarıp başlatmanız gerekir.

import 'package:google_generative_ai/google_generative_ai.dart';

// 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);
}

final model = GenerativeModel(model: 'MODEL_NAME', apiKey: apiKey);

Bir model belirtirken aşağıdakilere dikkat edin:

  • Kullanım alanınıza özel bir model kullanın (örneğin, gemini-pro-vision çok modlu giriş içindir). Bu kılavuzda, her uygulamaya ilişkin talimatlarda, her kullanım alanı için önerilen model listelenmiştir.

Yaygın kullanım alanlarından yararlanın

Projeniz hazır olduğuna göre farklı kullanım alanları uygulamak için Gemini API'yi nasıl kullanabileceğinizi keşfedebilirsiniz:

Gelişmiş kullanım alanları bölümünde, Gemini API ve yerleştirmeler hakkında bilgi edinebilirsiniz.

Yalnızca metin girişinden metin oluştur

İstem girişi yalnızca metin içeriyorsa metin çıkışı oluşturmak için generateContent yöntemiyle gemini-pro modelini kullanın:

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);
  }
  // For text-only input, use the gemini-pro model
  final model = GenerativeModel(model: 'gemini-pro', apiKey: apiKey);
  final content = [Content.text('Write a story about a magic backpack.')];
  final response = await model.generateContent(content);
  print(response.text);
}

Metin ve resim girişinden metin oluşturma (çok modlu)

Gemini çok modlu bir model (gemini-pro-vision) sunar. Böylece hem metin hem de resim girebilirsiniz. Giriş için resim koşullarını incelediğinizden emin olun.

İstem girişi hem metin hem de resimleri içerdiğinde metin çıkışı oluşturmak için generateContent yöntemiyle gemini-pro-vision modelini kullanın:

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);
  }
  // For text-and-image input (multimodal), use the gemini-pro-vision model
  final model = GenerativeModel(model: 'gemini-pro-vision', 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);
}

Çok dönüşlü görüşmeler yapma (sohbet)

Gemini'ı kullanarak birden fazla dönüş için serbest biçimli konuşmalar oluşturabilirsiniz. SDK, görüşmenin durumunu yöneterek süreci basitleştirir. Böylece, generateContent'den farklı olarak sohbet geçmişini sizin saklamanız gerekmez.

Çok dönüşlü bir görüşme (ör. sohbet) oluşturmak için gemini-pro modelini kullanın ve startChat() yöntemini çağırarak sohbeti başlatın. Ardından, yeni bir kullanıcı mesajı göndermek için sendMessage() kullanın. Bu işlem, mesajı ve yanıtı da sohbet geçmişine ekler.

Bir görüşmedeki içerikle ilişkili role için iki olası seçenek vardır:

  • user: İstemleri sağlayan rol. Bu değer sendMessage çağrıları için varsayılan değerdir ve farklı bir rol aktarılırsa işlev bir istisna atar.

  • model: Yanıtları sağlayan rol. Bu rol, mevcut history ile startChat() çağrılırken kullanılabilir.

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);
  }
  // For text-only input, use the gemini-pro model
  final model = GenerativeModel(
      model: 'gemini-pro',
      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);
}

Daha hızlı etkileşimler için akış özelliğini kullanın

Varsayılan olarak model, tüm oluşturma işlemini tamamladıktan sonra bir yanıt döndürür. Tüm sonucu beklemeyip bunun yerine kısmi sonuçları işlemek için akışı kullanarak daha hızlı etkileşimler gerçekleştirebilirsiniz.

Aşağıdaki örnekte, metin ve resim giriş isteminden metin oluşturmak için generateContentStream yöntemiyle akışın nasıl uygulanacağı gösterilmektedir.

// ...

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

// ...

Yalnızca metin girişi ve sohbet kullanım alanları için benzer bir yaklaşım kullanabilirsiniz.

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

Gelişmiş kullanım alanları

Bu eğiticinin önceki bölümünde açıklanan yaygın kullanım alanları, Gemini API'yi kullanmaya alışmanıza yardımcı olur. Bu bölümde, daha ileri düzey olarak değerlendirilebilecek bazı kullanım alanları açıklanmaktadır.

İşlev çağrısı

İşlev çağrısı, üretici modellerden yapılandırılmış veri çıkışları almanızı kolaylaştırır. Daha sonra bu çıkışları kullanarak diğer API'leri çağırabilir ve ilgili yanıt verilerini modele döndürebilirsiniz. Başka bir deyişle, işlev çağrısı, üretken modelleri harici sistemlere bağlamanıza yardımcı olarak oluşturulan içeriğin en güncel ve doğru bilgileri içermesini sağlar. İşlev çağrısı eğiticisinde daha fazla bilgi edinebilirsiniz.

Yerleştirmeleri kullanma

Yerleştirme, bilgiyi bir dizideki kayan nokta sayıları listesi olarak göstermek için kullanılan bir tekniktir. Gemini ile metinleri (kelimeler, cümleler ve metin blokları) vektörleştirilmiş biçimde temsil edebilirsiniz. Böylece, yerleştirilmiş öğeleri daha kolay karşılaştırıp karşılaştırabilirsiniz. Örneğin, benzer bir konuyu veya duyguyu paylaşan iki metin, kosinüs benzerliği gibi matematiksel karşılaştırma teknikleriyle tanımlanabilecek benzer yerleştirmelere sahip olmalıdır.

Yerleştirme oluşturmak için embedding-001 modelini embedContent yöntemiyle (veya batchEmbedContent yöntemiyle) kullanın. Aşağıdaki örnek, tek bir dize için yerleştirme oluşturur:

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);

Jetonları say

Uzun istemler kullanırken, modele içerik göndermeden önce jetonların sayılması yararlı olabilir. Aşağıdaki örneklerde countTokens() öğesinin çeşitli kullanım alanlarında nasıl kullanılacağı gösterilmektedir:

// 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}');

İçerik oluşturmayı denetleme seçenekleri

Model parametrelerini yapılandırarak ve güvenlik ayarlarını kullanarak içerik oluşturmayı kontrol edebilirsiniz.

Bir model isteği yöntemine (generateContent gibi) generationConfig veya safetySettings geçirilmesinin, getGenerativeModel öğesinde geçirilen adla yapılandırma nesnesini tamamen geçersiz kılacağını unutmayın.

Model parametrelerini yapılandırma

Modele gönderdiğiniz her istem, modelin nasıl yanıt oluşturacağını kontrol eden parametre değerleri içerir. Model, farklı parametre değerleri için farklı sonuçlar oluşturabilir. Model parametreleri hakkında daha fazla bilgi edinin. Yapılandırma, model örneğinizin kullanım ömrü boyunca korunur.

final generationConfig = GenerationConfig(
  stopSequences: ["red"],
  maxOutputTokens: 200,
  temperature: 0.9,
  topP: 0.1,
  topK: 16,
);
final model = GenerativeModel(
  model: 'MODEL_NAME',
  apiKey: apiKey,
  generationConfig: generationConfig,
);

Güvenlik ayarlarını kullan

Zararlı olarak değerlendirilebilecek yanıtlar alma olasılığını ayarlamak için güvenlik ayarlarını kullanabilirsiniz. Güvenlik ayarları, varsayılan olarak güvenli olmayan içerik olması orta ve/veya yüksek olasılıklı tüm içerikleri tüm boyutlarda engeller. Güvenlik ayarları hakkında daha fazla bilgi edinin.

Aşağıda, bir güvenlik ayarını nasıl belirleyeceğiniz açıklanmıştır:

final safetySettings = [
  SafetySetting(HarmCategory.harassment, HarmBlockThreshold.high)
];
final model = GenerativeModel(
  model: 'MODEL_NAME',
  apiKey: apiKey,
  safetySettings: safetySettings,
);

Birden fazla güvenlik ayarı da belirleyebilirsiniz:

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

Sırada ne var?

  • İstem tasarımı, dil modellerinden istenen yanıtı alan istemler oluşturma sürecidir. İyi yapılandırılmış istemler yazmak, bir dil modelinden doğru, yüksek kaliteli yanıtlar almanın önemli bir parçasıdır. İstem yazmayla ilgili en iyi uygulamalar hakkında bilgi edinin.

  • Gemini, giriş türleri ve karmaşıklık, sohbet veya diğer iletişim dili görevlerine yönelik uygulamalar ve boyut kısıtlamaları gibi farklı kullanım alanlarının ihtiyaçlarını karşılamak için çeşitli model varyasyonları sunuyor. Kullanılabilir Gemini modelleri hakkında bilgi edinin.

  • Gemini, hız sınırının artırılmasını isteme seçeneği sunar. Gemini Pro modelleri için hız sınırı dakikada 60 istektir (BGBG).