W tym samouczku pokazujemy, jak uzyskać dostęp do interfejsu Gemini API w Dart lub Aplikacja Flutter korzystająca z pakietu SDK Google AI Dart. Możesz używać tego pakietu SDK, jeśli: nie chcesz bezpośrednio pracować z interfejsami API REST przy dostępie do modeli Gemini .
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
Ponadto w tym samouczku znajdują się sekcje dotyczące zaawansowanych przypadków użycia (takich jak umieszczone elementy oraz tokeny liczenia) oraz opcje kontrolowanie generowania treści.
Wymagania wstępne
W tym samouczku zakładamy, że wiesz, jak tworzyć aplikacje w Dart.
Aby ukończyć ten samouczek, upewnij się, że Twoje środowisko programistyczne spełnia wymagania następujące wymagania:
- Dart 3.2.0+
Konfigurowanie projektu
Zanim wywołasz Gemini API, musisz skonfigurować projekt, który obejmuje skonfigurowanie klucza interfejsu API i dodanie pakietu SDK do zależności wydawcy, zainicjowanie modelu.
Konfigurowanie klucza interfejsu API
Aby korzystać z Gemini API, potrzebujesz klucza interfejsu API. Jeśli jeszcze nie masz konta Google, utworzyć klucz w Google AI Studio.
Uzyskiwanie klucza interfejsu API
Zabezpiecz klucz interfejsu API
Zabezpiecz swój klucz interfejsu API. Zdecydowanie zalecamy, aby nie umieszczać parametru klucza interfejsu API bezpośrednio w kodzie lub sprawdź w wersji pliki, które zawierają ten klucz systemów sterowania. 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
zmienną środowiskową procesu. Jeśli tworzysz aplikację Flutter, możesz użyć
String.fromEnvironment
i przejedź przez --dart-define=API_KEY=$API_KEY
do
flutter build
lub flutter run
, aby skompilować za pomocą klucza interfejsu API od momentu wykonania tego procesu
będzie działać inaczej.
Zainstaluj pakiet SDK
Aby używać interfejsu Gemini API w swojej aplikacji, musisz add
Pakiet google_generative_ai
do 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 danych multimodalnych). Instrukcje w tym przewodniku dla poszczególnych elementów dla każdego z nich z listą zalecanych modeli.
Wdrażanie typowych przypadków użycia
Po skonfigurowaniu projektu możesz zacząć korzystać z Gemini API, aby: implementuj 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 umieszczania.
Generuj tekst na podstawie samego tekstu
Jeśli prompt zawiera tylko tekst, użyj modelu Gemini 1.5 lub
Model Gemini 1.0 Pro z funkcją generateContent
do generowania tekstu:
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 wpisywać zarówno tekst, i obrazów. Zapoznaj się z wymagania dotyczące obrazów w promptach.
Jeśli prompt zawiera zarówno tekst, jak i obrazy, użyj modelu Gemini 1.5
za pomocą metody generateContent
do generowania tekstowych danych wyjściowych:
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, dlatego w przeciwieństwie do
dzięki generateContent
nie musisz zapisywać historii rozmów
siebie.
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ść dla użytkownika, która będzie też dołączać tag
wiadomości oraz odpowiedź na nie.
Istnieją 2 opcje dla elementu role
związane z treścią w
rozmowa:
user
: rola, która dostarcza prompty. Jest to wartość domyślna dla opcjisendMessage
, i zgłosi wyjątek, jeśli inne jest przekazywana.model
: rola, która dostarcza odpowiedzi. Tej roli można używać, gdy Dzwonię pod numerstartChat()
w istniejącej siecihistory
.
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 generowania proces tworzenia konta. Możesz przyspieszyć interakcje, nie czekając do końca i używać strumieniowania do obsługi wyników częściowych.
Poniższy przykład pokazuje, jak wdrożyć strumieniowanie za pomocą
Metoda generateContentStream
do generowania tekstu na podstawie danych wejściowych z tekstem i obrazem
.
// ...
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 są pomocne znasz już interfejs Gemini API. W tej sekcji opisano niektóre przypadków użycia, które można uznać za bardziej zaawansowane.
Wywoływanie funkcji
Wywołanie funkcji ułatwia pobieranie danych wyjściowych z uporządkowanych danych modeli generatywnych. Następnie możesz użyć tych danych wyjściowych do wywołania innych interfejsów API i zwrócenia odpowiednich danych odpowiedzi dla modelu. Innymi słowy, wywołanie funkcji pomaga Łączysz modele generatywne z systemami zewnętrznymi, aby wygenerowane treści zawiera najbardziej aktualne i dokładne informacje. Więcej informacji: samouczek wywoływania funkcji.
Korzystanie z wektorów dystrybucyjnych
Umieszczanie to technika używana do przedstawiania informacji. jako listę liczb zmiennoprzecinkowych w tablicy. Dzięki Gemini możesz zaprezentować tekstu (słów, zdań i bloków tekstu) w postaci wektorowej, dzięki czemu łatwiej będzie porównać reprezentacje właściwościowe. Na przykład 2 teksty o tym samym identyfikatorze tematyka lub nastawienie powinny mieć podobne wektory dystrybucyjne, zidentyfikowanych za pomocą technik porównań matematycznych, takich jak podobieństwo cosinusowe.
Użyj modelu embedding-001
z metodą embedContent
(lub
batchEmbedContent
), aby wygenerować wektory dystrybucyjne. Przykład poniżej
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
Jeśli używasz długich promptów, warto policzyć tokeny przed wysłaniem
do modelu. Poniższe przykłady pokazują, jak używać atrybutu countTokens()
do różnych celów:
// 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
Generowanie treści możesz kontrolować, konfigurując parametry modelu i za pomocą funkcji ustawieniach bezpieczeństwa.
Pamiętaj, że przekazanie do żądania modelu generationConfig
lub safetySettings
(np. generateContent
) całkowicie zastąpi obiekt konfiguracji
o tej samej nazwie przekazanym w getGenerativeModel
.
Skonfiguruj parametry modelu
Każdy prompt wysyłany do modelu zawiera wartości parametrów, które określają, model wygeneruje odpowiedź. Model może generować różne wyniki dla: różne wartości parametrów. Więcej informacji o Parametry 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
W ustawieniach bezpieczeństwa możesz dostosować prawdopodobieństwo otrzymania odpowiedzi, mogą zostać uznane za szkodliwe. Domyślnie ustawienia bezpieczeństwa blokują treści zawierające medium lub wysokie prawdopodobieństwo, że treści te mogą być niebezpieczne we wszystkich wymiarach. Ucz się 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ą oczekiwane działanie odpowiedzi modelowych. Tworzenie dobrze ustrukturyzowanych promptów to podstawa jest częścią zapewniania dokładnych i wysokiej jakości odpowiedzi z modelu językowego. Poznaj sprawdzone metody pisania promptów.
Gemini oferuje kilka wersji modelu, które można dopasować do różnych zastosowań takie jak typy danych wejściowych i złożoność, wdrożenia czatu zadania związane z językiem okien dialogowych i ograniczeniami rozmiaru. Dowiedz się więcej o dostępnych modelach Gemini.