Tutorial ini menunjukkan cara mengakses Gemini API untuk Dart atau Aplikasi Flutter menggunakan Google AI Dart SDK. Anda dapat menggunakan SDK ini jika tidak ingin bekerja secara langsung dengan REST API untuk mengakses model Gemini di .
Dalam tutorial ini, Anda akan mempelajari cara melakukan hal berikut:
- Menyiapkan project Anda, termasuk kunci API Anda
- Membuat teks dari input hanya teks
- Membuat teks dari input teks dan gambar (multimodal)
- Membuat percakapan bolak-balik (chat)
- Gunakan streaming untuk interaksi yang lebih cepat
Selain itu, tutorial ini berisi bagian tentang kasus penggunaan lanjutan (seperti embeddings dan penghitungan token) serta opsi untuk mengontrol pembuatan konten.
Prasyarat
Tutorial ini mengasumsikan bahwa Anda sudah memahami cara membangun aplikasi dengan Dart.
Untuk menyelesaikan tutorial ini, pastikan lingkungan pengembangan Anda memenuhi persyaratan berikut:
- Dart 3.2.0+
Menyiapkan project
Sebelum memanggil Gemini API, Anda perlu menyiapkan project, yang mencakup menyiapkan kunci API, menambahkan SDK ke dependensi pub Anda, dan melakukan inisialisasi model.
Menyiapkan kunci API
Untuk menggunakan Gemini API, Anda memerlukan kunci API. Jika Anda belum memilikinya, membuat kunci di Google AI Studio.
Mengamankan kunci API Anda
Menjaga kunci API Anda tetap aman. Sebaiknya Anda tidak menyertakan Kunci API langsung di kode Anda, atau periksa file yang berisi kunci ke dalam versi sistem kontrol. Sebagai gantinya, Anda harus menggunakan penyimpanan secret untuk kunci API Anda.
Semua cuplikan dalam tutorial ini mengasumsikan bahwa Anda mengakses kunci API sebagai
variabel lingkungan proses. Jika mengembangkan aplikasi Flutter, Anda dapat menggunakan
String.fromEnvironment
dan teruskan --dart-define=API_KEY=$API_KEY
ke
flutter build
atau flutter run
untuk mengompilasi dengan kunci API karena prosesnya
akan berbeda saat menjalankan aplikasi.
Menginstal paket SDK
Untuk menggunakan Gemini API di aplikasi Anda sendiri, Anda perlu add
google_generative_ai
ke aplikasi Dart atau Flutter Anda:
Dart
dart pub add google_generative_ai
Flutter
flutter pub add google_generative_ai
Melakukan inisialisasi model generatif
Sebelum dapat melakukan panggilan API, Anda harus mengimpor dan menginisialisasi generatif.
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);
}
Saat menentukan model, perhatikan hal-hal berikut:
Gunakan model yang spesifik untuk kasus penggunaan Anda (misalnya,
gemini-1.5-flash
untuk input multimodal). Dalam panduan ini, petunjuk untuk setiap mencantumkan model yang direkomendasikan untuk setiap kasus penggunaan.
Mengimplementasikan kasus penggunaan umum
Setelah project Anda siap, Anda dapat menjelajah menggunakan Gemini API untuk terapkan kasus penggunaan yang berbeda:
- Membuat teks dari input hanya teks
- Membuat teks dari input teks dan gambar (multimodal)
- Membuat percakapan bolak-balik (chat)
- Gunakan streaming untuk interaksi yang lebih cepat
Di bagian kasus penggunaan lanjutan, Anda dapat menemukan informasi tentang Gemini API dan embeddings.
Membuat teks dari input hanya teks
Jika input perintah hanya menyertakan teks, gunakan model Gemini 1.5 atau
Model Gemini 1.0 Pro dengan generateContent
untuk menghasilkan output teks:
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);
}
Membuat teks dari input teks dan gambar (multimodal)
Gemini menyediakan berbagai model yang dapat menangani input multimodal (model Gemini 1.5) sehingga Anda dapat memasukkan dan gambar. Pastikan untuk meninjau persyaratan gambar untuk perintah.
Saat input perintah menyertakan teks dan gambar, gunakan model Gemini 1.5
dengan metode generateContent
untuk menghasilkan output teks:
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);
}
Membuat percakapan bolak-balik (chat)
Dengan Gemini, Anda dapat membangun percakapan berformat bebas dalam beberapa giliran. Tujuan
SDK menyederhanakan proses dengan mengelola status percakapan, jadi tidak seperti
dengan generateContent
, Anda tidak perlu menyimpan histori percakapan
diri Anda sendiri.
Untuk membuat percakapan bolak-balik (seperti chat), gunakan model Gemini 1.5 atau
Gemini 1.0 Pro, dan melakukan inisialisasi percakapan dengan memanggil startChat()
.
Kemudian, gunakan sendMessage()
untuk mengirim pesan pengguna baru, yang juga akan menambahkan
dan respons terhadap histori chat.
Ada dua kemungkinan opsi untuk role
yang terkait dengan konten di
percakapan:
user
: peran yang memberikan perintah. Ini adalah nilai {i>default<i} untuksendMessage
memanggil, dan fungsi akan menampilkan pengecualian jika peran diteruskan.model
: peran yang memberikan respons. Peran ini dapat digunakan saat memanggilstartChat()
denganhistory
yang ada.
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);
}
Gunakan streaming untuk interaksi yang lebih cepat
Secara default, model menampilkan respons setelah menyelesaikan seluruh pembuatan {i>checkout<i}. Anda dapat mencapai interaksi yang lebih cepat dengan tidak menunggu seluruh hasil penelusuran, dan sebagai gantinya, gunakan streaming untuk menangani hasil yang tidak lengkap.
Contoh berikut menunjukkan cara mengimplementasikan streaming dengan
Metode generateContentStream
untuk menghasilkan teks dari input teks dan gambar
.
// ...
final response = model.generateContentStream([
Content.multi([prompt, ...imageParts])
]);
await for (final chunk in response) {
print(chunk.text);
}
// ...
Anda dapat menggunakan pendekatan serupa untuk kasus penggunaan chat dan input hanya teks.
// Use streaming with text-only input
final response = model.generateContentStream(content);
// Use streaming with multi-turn conversations (like chat)
final response = chat.sendMessageStream(content);
Mengimplementasikan kasus penggunaan lanjutan
Kasus penggunaan umum yang dijelaskan di bagian sebelumnya dalam tutorial ini membantu Anda merasa nyaman menggunakan Gemini API. Bagian ini menjelaskan beberapa yang mungkin dianggap lebih canggih.
Panggilan fungsi
Panggilan fungsi memudahkan Anda untuk mendapatkan output data terstruktur dari model generatif. Anda kemudian dapat menggunakan output ini untuk memanggil API lain dan menampilkan data respons yang relevan dengan model. Dengan kata lain, panggilan fungsi membantu Anda menghubungkan model generatif ke sistem eksternal sehingga konten yang dihasilkan berisi informasi yang terbaru dan akurat. Pelajari lebih lanjut di tutorial panggilan fungsi.
Menggunakan embedding
Penyematan adalah teknik yang digunakan untuk menampilkan informasi sebagai daftar angka floating point dalam array. Dengan Gemini, Anda dapat mewakili teks (kata, kalimat, dan blok teks) dalam bentuk vektor, sehingga lebih mudah untuk dibandingkan dan membedakan embedding. Misalnya, dua teks yang memiliki materi pokok atau sentimen serupa harus memiliki embedding serupa, yang dapat yang diidentifikasi melalui teknik perbandingan matematis seperti kesamaan kosinus.
Gunakan model embedding-001
dengan metode embedContent
(atau
batchEmbedContent
) untuk menghasilkan embeddings. Contoh berikut
menghasilkan embedding untuk string tunggal:
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);
Hitung token
Saat menggunakan perintah yang panjang, sebaiknya hitung token sebelum mengirim
konten ke model. Contoh berikut menunjukkan cara menggunakan countTokens()
untuk berbagai kasus penggunaan:
// 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}');
Opsi untuk mengontrol pembuatan konten
Anda dapat mengontrol pembuatan konten dengan mengonfigurasi parameter model dan menggunakan setelan keamanan.
Perhatikan bahwa meneruskan generationConfig
atau safetySettings
ke permintaan model
(seperti generateContent
) akan sepenuhnya mengganti objek konfigurasi
dengan nama yang sama yang diteruskan di getGenerativeModel
.
Mengonfigurasi parameter model
Setiap dialog yang Anda kirim ke model akan menyertakan parameter value yang mengontrol cara model akan menghasilkan respons. Model ini dapat memberikan hasil yang berbeda untuk parameter value yang berbeda. Pelajari lebih lanjut cara Parameter model. Konfigurasi ini akan dipertahankan selama instance model Anda aktif.
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,
);
Gunakan setelan keamanan
Anda dapat menggunakan setelan keamanan untuk menyesuaikan kemungkinan mendapatkan respons yang mungkin dianggap berbahaya. Secara default, setelan keamanan memblokir konten dengan media dan/atau kemungkinan besar merupakan konten yang tidak aman di semua dimensi. Pelajari selengkapnya tentang Setelan keamanan.
Berikut ini cara menetapkan satu setelan keamanan:
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,
);
Anda juga dapat menetapkan lebih dari satu setelan keamanan:
final safetySettings = [
SafetySetting(HarmCategory.harassment, HarmBlockThreshold.high),
SafetySetting(HarmCategory.hateSpeech, HarmBlockThreshold.high),
];
Langkah berikutnya
Desain prompt adalah proses pembuatan prompt yang mendapatkan respons yang diinginkan dari model bahasa. Menulis dialog yang terstruktur dengan baik adalah bagian penting untuk memastikan respons yang akurat dan berkualitas tinggi dari model bahasa. Pelajari praktik terbaik untuk menulis perintah.
Gemini menawarkan beberapa variasi model untuk memenuhi kebutuhan berbagai penggunaan kasus, seperti jenis dan kompleksitas input, implementasi untuk chat atau tugas bahasa dialog, dan batasan ukuran. Pelajari model Gemini yang tersedia.