Этот учебник демонстрирует, как получить доступ к API Gemini для вашего приложения DART или Flutter, используя Google AI DART SDK. Вы можете использовать этот SDK, если не хотите работать напрямую с API REST для доступа к моделям Близнецов в вашем приложении.
В этом уроке вы узнаете, как сделать следующее:
- Настройте свой проект, включая свой ключ API
- Создать текст из ввода только текста
- Создать текст с ввода текста и изображения (мультимодальный)
- Создайте многократные разговоры (чат)
- Используйте потоковую передачу для более быстрых взаимодействий
Кроме того, этот урок содержит разделы о передовых вариантах использования (например, встраивания и токенов подсчета ), а также опции для управления генерацией контента .
Предварительные условия
Этот учебник предполагает, что вы знакомы с строительными приложениями с DART.
Чтобы завершить этот урок, убедитесь, что ваша среда разработки соответствует следующим требованиям:
- Дарт 3.2.0+
Настройте свой проект
Прежде чем вызывать API Gemini, вам необходимо настроить свой проект, который включает настройку ключа API, добавление SDK в зависимости вашего паба и инициализацию модели.
Установите свой ключ API
Чтобы использовать API Gemini, вам понадобится ключ API. Если у вас его еще нет, создайте ключ в Google AI Studio.
Закрепите свой ключ API
Держите свой ключ API в безопасности. Мы настоятельно рекомендуем вам не включать ключ API непосредственно в ваш код или проверять файлы, которые содержат ключ в системы управления версиями. Вместо этого вы должны использовать секреты для вашего ключа API.
Все фрагменты в этом уроке предполагают, что вы получаете доступ к своему клавишу API в качестве переменной среды процесса. Если вы разрабатываете приложение Flutter, вы можете использовать String.fromEnvironment
и pass --dart-define=API_KEY=$API_KEY
чтобы flutter build
или flutter run
для компиляции с ключом API, поскольку среда процесса будет отличаться при запуске приложения .
Установите пакет SDK
Чтобы использовать API Gemini в вашем собственном приложении, вам необходимо add
пакет google_generative_ai
в приложение DART или Flutter:
Дарт
dart pub add google_generative_ai
трепетать
flutter pub add google_generative_ai
Инициализировать генеративную модель
Прежде чем вы сможете сделать какие -либо вызовы API, вам необходимо импортировать и инициализировать генеративную модель.
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
для мультимодального входа). В рамках этого руководства в инструкциях для каждой реализации перечислены рекомендуемая модель для каждого варианта использования.
Реализовать общие варианты использования
Теперь, когда ваш проект настроен, вы можете изучить, используя API Gemini для реализации различных вариантов использования:
- Создать текст из ввода только текста
- Создать текст с ввода текста и изображения (мультимодальный)
- Создайте многократные разговоры (чат)
- Используйте потоковую передачу для более быстрых взаимодействий
В разделе Advanced Caser Cassion вы можете найти информацию об API и встраивании Близнецов.
Создать текст из ввода только текста
Когда ввод подсказки включает только текст, используйте модель Gemini 1.5 или модель Gemini 1.0 Pro с 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);
}
Создать текст с ввода текста и изображения (мультимодальный)
Gemini предоставляет различные модели, которые могут обрабатывать мультимодальный вход (модели Gemini 1.5), чтобы вы могли вводить как текст, так и изображения. Обязательно просмотрите требования к изображению для подсказок .
Когда ввод подсказки включает в себя как текст, так и изображения, используйте модель Gemini 1.5 с помощью метода 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);
}
Создайте многократные разговоры (чат)
Используя Gemini, вы можете создавать свободные разговоры по нескольким поворотам. SDK упрощает процесс, управляя состоянием разговора, поэтому, в отличие от generateContent
, вам не нужно хранить историю разговора самостоятельно.
Чтобы построить многообразование разговора (например, чат), используйте модель Gemini 1.5 или модель Gemini 1.0 Pro, и инициализируйте чат, позвонив startChat()
. Затем используйте sendMessage()
, чтобы отправить новое пользовательское сообщение, которое также добавит сообщение и ответ на историю чата.
Есть два возможных варианта role
, связанных с содержанием в разговоре:
user
: роль, которая предоставляет подсказки. Это значение является по умолчанию для вызововsendMessage
, и функция будет выдвинуть исключение, если будет проходить другая роль.model
: роль, которая обеспечивает ответы. Эта роль может быть использована при вызовеstartChat()
с существующейhistory
.
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);
Внедрить расширенные варианты использования
Общие варианты использования, описанные в предыдущем разделе этого учебника, помогают вам понять API Gemini. В этом разделе описываются некоторые варианты использования, которые можно считать более продвинутыми.
Функция вызова
Функциональный вызов облегчает вам структурированные выходные данные из генеративных моделей. Затем вы можете использовать эти выходы для вызова других API и вернуть соответствующие данные ответа в модель. Другими словами, функциональный вызов помогает вам подключить генеративные модели к внешним системам, чтобы сгенерированный контент включал самую современную и точную информацию. Узнайте больше в функции, вызову обучения .
Используйте встраивание
Встраивание - это метод, используемый для представления информации в качестве списка номеров с плавающей запятой в массиве. С Близнецами вы можете представлять текст (слова, предложения и блоки текста) в векторизованной форме, что облегчает сравнение и сопоставление встраиваний. Например, два текста, в которых разделяют сходные темы или чувства, должны иметь сходные встроенные встроения, которые могут быть идентифицированы с помощью математических методов сравнения, таких как сходство косинуса.
Используйте модель embedding-001
с помощью метода embedContent
(или метода batchEmbedContent
), чтобы генерировать вставки. Следующий пример генерирует встроение для одной строки:
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}');
Параметры для контроля генерации контента
Вы можете управлять генерацией содержания, настраивая параметры модели и с помощью настройки безопасности.
Обратите внимание, что передача generationConfig
или safetySettings
в метод запроса модели (например, generateContent
) полностью переопределяет объект конфигурации с тем же именем, передаваемым в 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 предлагает несколько вариантов модели для удовлетворения потребностей различных вариантов использования, таких как типы вводов и сложность, реализации для чата или другие языковые задачи диалоговых языков и ограничения размера. Узнайте о доступных моделях Близнецов .