Вызов функций упрощает получение структурированных выходных данных из генеративных моделей. Затем вы можете использовать эти выходные данные для вызова других API и возврата соответствующих данных ответа в модель. Другими словами, вызов функций помогает подключить генеративные модели к внешним системам, чтобы сгенерированный контент содержал самую актуальную и точную информацию.
Вы можете предоставить модели Gemini описания функций. Это функции, которые вы пишете на языке вашего приложения (то есть они не являются функциями Google Cloud). Модель может попросить вас вызвать функцию и отправить результат обратно, чтобы помочь модели обработать ваш запрос.
Если вы еще этого не сделали, ознакомьтесь с разделом «Введение в вызов функций», чтобы узнать больше.
Настройте свой проект
Прежде чем вызывать Gemini API, вам необходимо настроить свой проект, который включает в себя настройку ключа API, добавление SDK в зависимости вашего паба и инициализацию модели.
Чтобы использовать API Gemini, вам понадобится ключ API. Если у вас его еще нет, создайте ключ в Google AI Studio.
Защитите свой ключ API
Храните свой ключ API в безопасности. Мы настоятельно рекомендуем вам не включать ключ API непосредственно в свой код и не проверять файлы, содержащие ключ, в системах контроля версий. Вместо этого вам следует использовать хранилище секретов для вашего ключа API.
В этом руководстве предполагается, что вы получаете доступ к своему ключу API как к переменной среды процесса. Если вы разрабатываете приложение Flutter, вы можете использовать String.fromEnvironment
и передать --dart-define=API_KEY=$API_KEY
для flutter build
или flutter run
для компиляции с ключом API, поскольку при запуске приложения среда процесса будет другой. .
Чтобы использовать API Gemini в своем приложении, вам необходимо add
пакет google_generative_ai
в приложение Dart или Flutter:
Дарт
dart pub add google_generative_ai
трепетать
flutter pub add google_generative_ai
Прежде чем вы сможете выполнять какие-либо вызовы API, вам необходимо импортировать и инициализировать генеративную модель. Это базовая инициализация; далее в этом руководстве вы обновите его для вызова функций.
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);
}
// Use a model that supports function calling, like Gemini 1.0 Pro.
// See "Supported models" in the "Introduction to function calling" page.
final model = GenerativeModel(model: 'MODEL_NAME', apiKey: apiKey);
Настройка вызова функции
В этом руководстве модель будет взаимодействовать с гипотетическим API обмена валюты, который поддерживает следующие параметры:
Параметр | Тип | Необходимый | Описание |
---|---|---|---|
currencyDate | нить | да | Дата получения обменного курса для (который всегда должен быть в формате ГГГГ-ММ-ДД или latest значение, если период времени не указан) |
currencyFrom | нить | да | Валюта для конвертации |
currencyTo | нить | нет | Валюта для конвертации в |
Пример запроса API
{
"currencyDate": "2024-04-17",
"currencyFrom": "USD",
"currencyTo": "SEK"
}
Пример ответа API
{
"base": "USD",
"date": "2024-04-17",
"rates": {"SEK": 0.091}
}
Шаг 1. Создайте функцию, которая выполняет запрос API.
Если вы еще этого не сделали, начните с создания функции, которая отправляет запрос к API.
В демонстрационных целях в этом руководстве вместо отправки фактического запроса API вы будете возвращать жестко закодированные значения в том же формате, который возвращал бы реальный API.
Future<Map<String, Object?>> findExchangeRate(
Map<String, Object?> arguments,
) async =>
// This hypothetical API returns a JSON such as:
// {"base":"USD","date":"2024-04-17","rates":{"SEK": 0.091}}
{
'date': arguments['currencyDate'],
'base': arguments['currencyFrom'],
'rates': <String, Object?>{arguments['currencyTo'] as String: 0.091}
};
Шаг 2. Создайте объявление функции.
Создайте объявление функции, которое вы передадите в генеративную модель (следующий шаг этого руководства).
Включите как можно больше подробностей в описания функций и параметров. Генеративная модель использует эту информацию, чтобы определить, какую функцию выбрать и как предоставить значения параметров при вызове функции.
final exchangeRateTool = FunctionDeclaration(
'findExchangeRate',
'Returns the exchange rate between currencies on given date.',
Schema(SchemaType.object, properties: {
'currencyDate': Schema(SchemaType.string,
description: 'A date in YYYY-MM-DD format or '
'the exact value "latest" if a time period is not specified.'),
'currencyFrom': Schema(SchemaType.string,
description: 'The currency code of the currency to convert from, '
'such as "USD".'),
'currencyTo': Schema(SchemaType.string,
description: 'The currency code of the currency to convert to, '
'such as "USD".')
}, requiredProperties: [
'currencyDate',
'currencyFrom'
]));
Шаг 3. Укажите объявление функции во время инициализации модели.
Укажите объявление функции при инициализации генеративной модели, передав его в параметр tools
модели:
final model = GenerativeModel(
// Use a model that supports function calling, like Gemini 1.0 Pro
// See "Supported models" in the "Introduction to function calling" page.
model: 'gemini-1.0-pro',
apiKey: apiKey,
// Specify the function declaration.
tools: [
Tool(functionDeclarations: [exchangeRateTool])
],
);
Шаг 4. Создайте вызов функции.
Теперь вы можете запросить модель с определенной функцией.
Рекомендуемый способ использования вызова функций — через интерфейс чата, поскольку вызовы функций хорошо вписываются в многоходовую структуру чата.
final chat = model.startChat();
final prompt = 'How much is 50 US dollars worth in Swedish krona?';
// Send the message to the generative model.
var response = await chat.sendMessage(Content.text(prompt));
final functionCalls = response.functionCalls.toList();
// When the model response with a function call, invoke the function.
if (functionCalls.isNotEmpty) {
final functionCall = functionCalls.first;
final result = switch (functionCall.name) {
// Forward arguments to the hypothetical API.
'findExchangeRate' => await findExchangeRate(functionCall.args),
// Throw an exception if the model attempted to call a function that was
// not declared.
_ => throw UnimplementedError(
'Function not implemented: ${functionCall.name}')
};
// Send the response to the model so that it can use the result to generate
// text for the user.
response = await chat
.sendMessage(Content.functionResponse(functionCall.name, result));
}
// When the model responds with non-null text content, print it.
if (response.text case final text?) {
print(text);
}