Вызов функций упрощает получение структурированных выходных данных из генеративных моделей. Затем вы можете использовать эти выходные данные для вызова других API и возврата соответствующих данных ответа в модель. Другими словами, вызов функций помогает подключить генеративные модели к внешним системам, чтобы сгенерированный контент содержал самую актуальную и точную информацию.
Вы можете предоставить модели Gemini описания функций. Это функции, которые вы пишете на языке вашего приложения (то есть они не являются функциями Google Cloud). Модель может попросить вас вызвать функцию и отправить результат обратно, чтобы помочь модели обработать ваш запрос.
Если вы еще этого не сделали, ознакомьтесь с разделом «Введение в вызов функций», чтобы узнать больше.
Настройте свой проект
Прежде чем вызывать API Gemini, вам необходимо настроить проект Xcode, который включает в себя настройку ключа API, добавление пакета SDK в проект Xcode и инициализацию модели.
Чтобы использовать API Gemini, вам понадобится ключ API. Если у вас его еще нет, создайте ключ в Google AI Studio.
Защитите свой ключ API
Настоятельно рекомендуется не проверять ключ API в вашей системе контроля версий. Один из альтернативных вариантов — сохранить его в файле GenerativeAI-Info.plist
, а затем прочитать ключ API из файла .plist
. Обязательно поместите этот файл .plist
в корневую папку вашего приложения и исключите его из контроля версий.
enum APIKey {
// Fetch the API key from `GenerativeAI-Info.plist`
static var `default`: String {
guard let filePath = Bundle.main.path(forResource: "GenerativeAI-Info", ofType: "plist")
else {
fatalError("Couldn't find file 'GenerativeAI-Info.plist'.")
}
let plist = NSDictionary(contentsOfFile: filePath)
guard let value = plist?.object(forKey: "API_KEY") as? String else {
fatalError("Couldn't find key 'API_KEY' in 'GenerativeAI-Info.plist'.")
}
if value.starts(with: "_") {
fatalError(
"Follow the instructions at https://ai.google.dev/tutorials/setup to get an API key."
)
}
return value
}
}
Вы также можете просмотреть пример приложения , чтобы узнать, как хранить ключ API в файле .plist
.
В этом руководстве предполагается, что вы получаете доступ к своему ключу API из этого .plist
-файла ресурса по требованию.
Чтобы использовать Gemini API в своем собственном приложении Swift, добавьте в свое приложение пакет GoogleGenerativeAI
:
В Xcode щелкните правой кнопкой мыши свой проект в навигаторе проекта.
Выберите «Добавить пакеты» в контекстном меню.
В диалоговом окне «Добавить пакеты» вставьте URL-адрес пакета в строку поиска:
https://github.com/google/generative-ai-swift
Нажмите «Добавить пакет» . Xcode теперь добавит пакет
GoogleGenerativeAI
в ваш проект.
Прежде чем вы сможете выполнять какие-либо вызовы API, вам необходимо инициализировать генеративную модель. Это базовая инициализация; далее в этом руководстве вы обновите его для вызова функций.
Импортируйте модуль
GoogleGenerativeAI
:import GoogleGenerativeAI
Инициализируйте генеративную модель:
// Access your API key from your on-demand resource .plist file // (see "Set up your API key" above) // Use a model that supports function calling, like Gemini 1.0 Pro. // See "Supported models" in the "Introduction to function calling" page. let model = GenerativeModel(name: "MODEL_NAME", apiKey: APIKey.default)
Настройка вызова функции
В этом руководстве модель будет взаимодействовать с гипотетическим API обмена валюты, который поддерживает следующие параметры:
Параметр | Тип | Необходимый | Описание |
---|---|---|---|
currencyFrom | нить | да | Валюта для конвертации |
currencyTo | нить | да | Валюта для конвертации в |
Пример запроса API
{
"currencyFrom": "USD",
"currencyTo": "SEK"
}
Пример ответа API
{
"base": "USD",
"rates": {"SEK": 0.091}
}
Шаг 1. Создайте функцию, которая выполняет запрос API.
Если вы еще этого не сделали, начните с создания функции, которая отправляет запрос к API.
В демонстрационных целях в этом руководстве вместо отправки фактического запроса API вы будете возвращать жестко запрограммированные значения в том же формате, который возвращал бы реальный API.
func makeAPIRequest(currencyFrom: String,
currencyTo: String) -> JSONObject {
// This hypothetical API returns a JSON such as:
// {"base":"USD","rates":{"SEK": 0.091}}
return [
"base": .string(currencyFrom),
"rates": .object([currencyTo: .number(0.091)]),
]
}
Шаг 2. Создайте объявление функции.
Создайте объявление функции, которое вы передадите в генеративную модель (следующий шаг этого руководства).
Включите как можно больше подробностей в описания функций и параметров. Генеративная модель использует эту информацию, чтобы определить, какую функцию выбрать и как предоставить значения параметров при вызове функции.
let getExchangeRate = FunctionDeclaration(
name: "getExchangeRate",
description: "Get the exchange rate for currencies between countries",
parameters: [
"currencyFrom": Schema(
type: .string,
description: "The currency to convert from."
),
"currencyTo": Schema(
type: .string,
description: "The currency to convert to."
),
],
requiredParameters: ["currencyFrom", "currencyTo"]
)
Шаг 3. Укажите объявление функции во время инициализации модели.
Укажите объявление функции при инициализации генеративной модели, установив параметр tools
модели:
// Use a model that supports function calling, like Gemini 1.0 Pro.
// See "Supported models" in the "Introduction to function calling" page.
let generativeModel = GenerativeModel(
name: "gemini-1.0-pro",
apiKey: apiKey,
// Specify the function declaration.
tools: [Tool(functionDeclarations: [getExchangeRate])]
)
Шаг 4. Создайте вызов функции.
Теперь вы можете запросить модель с определенной функцией.
Рекомендуемый способ использования вызова функций — через интерфейс чата, поскольку вызовы функций хорошо вписываются в многоходовую структуру чата.
let chat = generativeModel.startChat()
let prompt = "How much is 50 US dollars worth in Swedish krona?"
// Send the message to the generative model
let response1 = try await chat.sendMessage(prompt)
// Check if the model responded with a function call
guard let functionCall = response1.functionCalls.first else {
fatalError("Model did not respond with a function call.")
}
// Print an error if the returned function was not declared
guard functionCall.name == "getExchangeRate" else {
fatalError("Unexpected function called: \(functionCall.name)")
}
// Verify that the names and types of the parameters match the declaration
guard case let .string(currencyFrom) = functionCall.args["currencyFrom"] else {
fatalError("Missing argument: currencyFrom")
}
guard case let .string(currencyTo) = functionCall.args["currencyTo"] else {
fatalError("Missing argument: currencyTo")
}
// Call the hypothetical API
let apiResponse = makeAPIRequest(currencyFrom: currencyFrom, currencyTo: currencyTo)
// Send the API response back to the model so it can generate a text response that can be
// displayed to the user.
let response = try await chat.sendMessage([ModelContent(
role: "function",
parts: [.functionResponse(FunctionResponse(
name: functionCall.name,
response: apiResponse
))]
)])
// Log the text response.
guard let modelResponse = response.text else {
fatalError("Model did not respond with text.")
}
print(modelResponse)