W tym samouczku pokazujemy, jak uzyskać dostęp do interfejsu Gemini API w aplikacji Dart lub Flutter za pomocą pakietu SDK Google AI Dart. Możesz użyć tego pakietu SDK, jeśli nie chcesz korzystać bezpośrednio z interfejsów API REST przy dostępie do modeli Gemini w aplikacji.
Z tego samouczka dowiesz się, jak:
- Konfigurowanie projektu, w tym klucza interfejsu API
- Generowanie tekstu na podstawie samego tekstu
- Generowanie tekstu na podstawie danych wejściowych z tekstem i obrazem (multimodalne)
- Tworzenie rozmów wieloetapowych (czat)
- Jak korzystać ze strumieniowania, aby przyspieszyć interakcje
Dodatkowo ten samouczek zawiera sekcje o zaawansowanych przypadkach użycia (takich jak umieszczanie na stronach i tokeny liczenia) oraz opcje kontrolowania generowania treści.
Wymagania wstępne
W tym samouczku zakładamy, że wiesz, jak tworzyć aplikacje w Dart.
Przed ukończeniem samouczka upewnij się, że Twoje środowisko programistyczne spełnia te wymagania:
- Dart 3.2.0+
Konfigurowanie projektu
Zanim wywołasz Gemini API, musisz skonfigurować projekt, co obejmuje skonfigurowanie klucza interfejsu API, dodanie pakietu SDK do zależności wydawcy i zainicjowanie modelu.
Konfigurowanie klucza interfejsu API
Aby korzystać z Gemini API, potrzebujesz klucza interfejsu API. Jeśli nie masz jeszcze klucza, utwórz go w Google AI Studio.
Uzyskiwanie klucza interfejsu API
Zabezpiecz klucz interfejsu API
Zabezpiecz swój klucz interfejsu API. Zdecydowanie zalecamy, aby nie umieszczać klucza interfejsu API bezpośrednio w kodzie ani sprawdzać plików zawierających ten klucz w systemach kontroli wersji. Zamiast tego użyj magazynu obiektów tajnych dla klucza interfejsu API.
Wszystkie fragmenty kodu w tym samouczku zakładają, że używasz klucza interfejsu API jako zmiennej środowiskowej procesu. Jeśli tworzysz aplikację Flutter, możesz użyć polecenia String.fromEnvironment
i przekazać --dart-define=API_KEY=$API_KEY
do flutter build
lub flutter run
, by skompilować go za pomocą klucza interfejsu API, ponieważ środowisko procesu będzie się różnić po uruchomieniu aplikacji.
Zainstaluj pakiet SDK
Aby używać interfejsu Gemini API w swojej aplikacji, musisz add
pakiet google_generative_ai
w aplikacji Dart lub Flutter:
Dart
dart pub add google_generative_ai
Flutter
flutter pub add google_generative_ai
Zainicjuj model generatywny
Zanim będzie można wykonywać wywołania interfejsu API, musisz zaimportować i zainicjować model generatywny.
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);
}
Podczas określania modelu pamiętaj o tych kwestiach:
Użyj modelu dopasowanego do Twojego przypadku użycia (np.
gemini-1.5-flash
służy do wprowadzania multimodalnych danych wejściowych). W tym przewodniku instrukcje dotyczące poszczególnych implementacji wskazują zalecany model w poszczególnych przypadkach użycia.
Wdrażanie typowych przypadków użycia
Po skonfigurowaniu projektu możesz zacząć korzystać z Gemini API, aby wdrażać różne przypadki użycia:
- Generowanie tekstu na podstawie samego tekstu
- Generowanie tekstu na podstawie danych wejściowych z tekstem i obrazem (multimodalne)
- Tworzenie rozmów wieloetapowych (czat)
- Jak korzystać ze strumieniowania, aby przyspieszyć interakcje
W sekcji zaawansowanych przypadków użycia znajdziesz informacje o interfejsie Gemini API i umieszczaniu.
Generuj tekst na podstawie samego tekstu
Jeśli prompt zawiera tylko tekst, do wygenerowania tekstu wyjściowego użyj modelu Gemini 1.5 lub Gemini 1.0 Pro z funkcją generateContent
:
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);
}
Generuj tekst na podstawie danych wejściowych z tekstem i obrazem (multimodalny)
Gemini udostępnia różne modele, które obsługują dane wejściowe multimodalne (modele Gemini 1.5), dzięki czemu można w nich wpisywać zarówno tekst, jak i obrazy. Zapoznaj się z wymaganiami dotyczącymi obrazów w promptach.
Jeśli prompt zawiera zarówno tekst, jak i obrazy, do wygenerowania tekstu wyjściowego użyj modelu Gemini 1.5 z metodą generateContent
:
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);
}
Tworzenie rozmów wieloetapowych (czat)
Za pomocą Gemini możesz prowadzić swobodne rozmowy na różnych etapach. Pakiet SDK upraszcza ten proces, zarządzając stanem rozmowy, więc w przeciwieństwie do generateContent
nie musisz samodzielnie zapisywać historii rozmowy.
Aby utworzyć rozmowę wieloetapową (np. czat), użyj modelu Gemini 1.5 lub Gemini 1.0 Pro i zainicjuj czat, dzwoniąc pod numer startChat()
.
Następnie użyj sendMessage()
, aby wysłać nową wiadomość użytkownika. Ta wiadomość i odpowiedź zostaną też dołączone do historii czatu.
Istnieją 2 opcje pola role
związane z treścią rozmowy:
user
: rola, która dostarcza prompty. Jest to wartość domyślna w przypadku wywołań funkcjisendMessage
. W przypadku przekazania innej roli funkcja zgłasza wyjątek.model
: rola, która dostarcza odpowiedzi. Tej roli można używać podczas wywoływania funkcjistartChat()
przy użyciu istniejącego kontahistory
.
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);
}
Używaj strumieniowania, aby przyspieszyć interakcje
Domyślnie model zwraca odpowiedź po zakończeniu całego procesu generowania. Możesz przyspieszyć interakcje, nie czekając na cały wynik. Zamiast tego użyj strumieniowania do obsługi częściowych wyników.
Z przykładu poniżej dowiesz się, jak wdrożyć strumieniowanie za pomocą metody generateContentStream
, aby generować tekst na podstawie promptu wejściowego tekstowego i obrazu.
// ...
final response = model.generateContentStream([
Content.multi([prompt, ...imageParts])
]);
await for (final chunk in response) {
print(chunk.text);
}
// ...
Podobne podejście możesz zastosować w przypadkach użycia samego tekstu i czatu.
// Use streaming with text-only input
final response = model.generateContentStream(content);
// Use streaming with multi-turn conversations (like chat)
final response = chat.sendMessageStream(content);
Wdrażanie zaawansowanych przypadków użycia
Typowe przypadki użycia opisane w poprzedniej sekcji tego samouczka pomagają opanować interfejs Gemini API. W tej sekcji opisujemy niektóre przypadki użycia, które mogą być uznane za bardziej zaawansowane.
Wywoływanie funkcji
Wywołania funkcji ułatwiają uzyskiwanie danych wyjściowych uporządkowanych danych z modeli generatywnych. Następnie możesz używać tych danych wyjściowych do wywoływania innych interfejsów API i zwracania odpowiednich danych odpowiedzi do modelu. Inaczej mówiąc, wywołanie funkcji pomaga połączyć modele generatywne z systemami zewnętrznymi, aby generowane treści zawierały najbardziej aktualne i dokładne informacje. Więcej informacji znajdziesz w samouczku na temat wywoływania funkcji.
Korzystanie z wektorów dystrybucyjnych
Umieszczanie to technika używana do przedstawiania informacji w postaci listy liczb zmiennoprzecinkowych w tablicy. Gemini umożliwia przedstawienie tekstu (słów, zdań i bloków tekstu) w formie wektorowej, co ułatwia porównywanie reprezentacji właściwościowych. Na przykład 2 teksty o podobnym temacie lub odczuciu powinny mieć podobne reprezentacje właściwościowe, które można zidentyfikować za pomocą technik matematycznych, takich jak podobieństwo cosinusowe.
Do generowania wektorów dystrybucyjnych używaj modelu embedding-001
z metodą embedContent
(lub batchEmbedContent
). Ten przykład generuje wektor dystrybucyjny dla pojedynczego ciągu znaków:
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);
Policz tokeny
W przypadku długich promptów liczenie tokenów przed wysłaniem jakiejkolwiek treści do modelu może być przydatne. Poniższe przykłady pokazują, jak używać countTokens()
w różnych przypadkach:
// 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}');
Opcje kontrolowania generowania treści
Możesz kontrolować generowanie treści, konfigurując parametry modelu lub używając ustawień bezpieczeństwa.
Pamiętaj, że przekazanie generationConfig
lub safetySettings
do metody żądania modelu (takiej jak generateContent
) spowoduje pełne zastąpienie obiektu konfiguracji o tej samej nazwie przekazanej w getGenerativeModel
.
Skonfiguruj parametry modelu
Każdy prompt wysyłany do modelu zawiera wartości parametrów, które kontrolują sposób generowania odpowiedzi przez model. Model może generować różne wyniki w zależności od wartości parametrów. Dowiedz się więcej o parametrach modelu. Konfiguracja jest przechowywana przez cały okres istnienia instancji modelu.
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,
);
Korzystanie z ustawień bezpieczeństwa
Korzystając z ustawień bezpieczeństwa, możesz dostosować prawdopodobieństwo otrzymywania odpowiedzi, które mogą być uznane za szkodliwe. Domyślnie ustawienia bezpieczeństwa blokują treści o średnim prawdopodobieństwie lub z dużym prawdopodobieństwem, że mogą być niebezpieczne we wszystkich wymiarach. Dowiedz się więcej o ustawieniach bezpieczeństwa.
Aby skonfigurować jedno ustawienie bezpieczeństwa:
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,
);
Możesz też skonfigurować więcej niż jedno ustawienie bezpieczeństwa:
final safetySettings = [
SafetySetting(HarmCategory.harassment, HarmBlockThreshold.high),
SafetySetting(HarmCategory.hateSpeech, HarmBlockThreshold.high),
];
Co dalej
Projektowanie promptów to proces tworzenia promptów, które wywołują pożądaną odpowiedź z modeli językowych. Napisanie dobrze uporządkowanych promptów jest niezbędną częścią gwarantowania dokładnych, wysokiej jakości odpowiedzi na podstawie modelu językowego. Poznaj sprawdzone metody pisania promptów.
Gemini oferuje kilka wersji modelu, aby sprostać różnym przypadkom użycia, takim jak typy danych wejściowych i złożoność, implementacje czatu lub innych zadań związanych z językiem w oknie dialogowym oraz ograniczenia rozmiaru. Dowiedz się więcej o dostępnych modelach Gemini.