Используя функцию вызова функций Gemini API, вы можете предоставить модели пользовательские определения функций. Модель не вызывает эти функции напрямую, а вместо этого генерирует структурированный вывод, в котором указывается имя функции и предлагаемые аргументы. Затем вы можете использовать имя функции и аргументы для вызова внешнего API, а также включить полученный результат API в дальнейший запрос к модели, что позволит модели предоставлять более полный ответ и выполнять дополнительные действия.
Вызов функций дает пользователям возможность взаимодействовать с информацией и услугами в реальном времени, такими как базы данных, системы управления взаимоотношениями с клиентами и хранилища документов. Эта функция также расширяет возможности модели предоставлять релевантные и контекстуальные ответы. Вызов функций лучше всего подходит для взаимодействия с внешними системами. Если ваш вариант использования требует, чтобы модель выполняла вычисления, но не задействует внешние системы или API, вам следует рассмотреть возможность использования вместо этого выполнения кода .
Рабочий пример вызова функции смотрите в блокноте «легкий бот» .
Как работает вызов функций
Вы используете функцию вызова функций, добавляя в приглашение модели данные структурированного запроса, описывающие интерфейсы программирования, называемые объявлениями функций . В объявлениях функций указывается имя функции API, поясняется ее назначение, все поддерживаемые ею параметры и описания этих параметров. После того как вы передадите список объявлений функций в запросе к модели, она анализирует объявления функций и остальную часть запроса, чтобы определить, как использовать объявленный API в ответ на запрос.
Затем модель возвращает объект в схеме, совместимой с OpenAPI, определяющей, как вызвать одну или несколько объявленных функций, чтобы ответить на вопрос пользователя. Затем вы можете взять рекомендуемые параметры вызова функции, вызвать фактический API, получить ответ и предоставить этот ответ пользователю или предпринять дальнейшие действия. Обратите внимание, что модель фактически не вызывает объявленные функции. Вместо этого вы используете возвращенные параметры объекта схемы для вызова функции. Gemini API также поддерживает параллельный вызов функций, где модель рекомендует несколько вызовов функций API на основе одного запроса.
Объявления функций
Когда вы реализуете вызов функции в командной строке, вы создаете объект tools
, который содержит одно или несколько function declarations
. Вы определяете функции с помощью JSON, в частности, с выбранным подмножеством формата схемы OpenAPI . Одно объявление функции может включать следующие параметры:
-
name
(строка): уникальный идентификатор функции в вызове API. -
description
(строка): подробное объяснение назначения и возможностей функции. -
parameters
(объект): определяют входные данные, необходимые функции.-
type
(строка): указывает общий тип данных, напримерobject
. -
properties
(объект): список отдельных параметров, каждый из которых имеет:-
type
(строка): тип данных параметра, напримерstring
,integer
,boolean
. -
description
(строка): четкое объяснение назначения параметра и ожидаемого формата.
-
-
required
(массив): массив строк, в котором перечислены имена параметров, которые являются обязательными для работы функции.
-
Примеры кода объявления функции с использованием команд cURL см. в разделе Примеры вызова функций . Примеры создания объявлений функций с использованием SDK Gemini API см. в руководстве по вызову функций .
Лучшие практики для объявлений функций
Точное определение функций имеет важное значение при их интеграции в ваши запросы. Каждая функция опирается на определенные параметры, которые определяют ее поведение и взаимодействие с моделью. В следующем листинге представлены рекомендации по определению параметров отдельной функции в массиве functions_declarations
.
name
: используйте понятные, описательные имена без пробелов, точек (.
) и тире (-
). Вместо этого используйте символы подчеркивания (_
) или верблюжий регистр.description
: предоставьте подробное, четкое и конкретное описание функций, при необходимости приведя примеры. Например, вместоfind theaters
используйтеfind theaters based on location and optionally movie title that is currently playing in theaters.
Избегайте слишком широких или двусмысленных описаний.properties
>type
: используйте строго типизированные параметры, чтобы уменьшить галлюцинации модели. Например, если значения параметров взяты из конечного набора, используйте полеenum
вместо перечисления значений в описании (например,"type": "enum", "values": ["now_playing", "upcoming"]
). . Если значение параметра всегда является целым числом, установите типinteger
а неnumber
.properties
>description
: предоставьте конкретные примеры и ограничения. Например, вместоthe location to search
используйтеThe city and state, eg San Francisco, CA or a zip code eg 95616
.
Дополнительные рекомендации по использованию вызова функций см. в разделе «Рекомендации» .
Режим вызова функций
Вы можете использовать параметр mode
вызова функции, чтобы изменить поведение выполнения функции. Доступны три режима:
-
AUTO
: поведение модели по умолчанию. Модель решает предсказать либо вызов функции, либо ответ на естественном языке. -
ANY
: модель ограничена тем, что всегда прогнозирует вызов функции. Еслиallowed_function_names
не указаны, модель выбирает из всех доступных объявлений функций. Если указаноallowed_function_names
, модель выбирает из набора разрешенных функций. -
NONE
: модель не будет прогнозировать вызов функции. В этом случае поведение модели такое же, как если бы вы не передавали никаких объявлений функций.
Использование режима ANY
(«принудительный вызов функции») поддерживается только для моделей Gemini 1.5 Pro
и Gemini 1.5 Flash
.
Вы также можете передать набор allowed_function_names
, которые, если они предоставлены, ограничивают функции, которые будет вызывать модель. Вам следует включать allowed_function_names
только в том случае, если выбран режим ANY
. Имена функций должны соответствовать именам объявлений функций. Если для режима установлено значение ANY
и заданы allowed_function_names
, модель будет прогнозировать вызов функции на основе предоставленного набора имен функций.
В следующем фрагменте кода из примера запроса показано, как установить mode
ANY
и указать список разрешенных функций:
"tool_config": {
"function_calling_config": {
"mode": "ANY",
"allowed_function_names": ["find_theaters", "get_showtimes"]
},
}
Примеры вызова функций
В этом разделе приведены примеры приглашений для вызова функций с помощью команд cURL. Примеры включают однооборотные и многооборотные сценарии, а также включение различных режимов вызова функций.
При использовании команд cURL с этой функцией информация о функциях и параметрах включается в элемент tools
. Каждое объявление функции в элементе tools
содержит имя функции. Вы указываете параметры, используя схему, совместимую с OpenAPI , и описание функции.
Однооборотный пример
Однооборотный — это когда вы вызываете языковую модель один раз. При вызове функций однооборотным вариантом использования может быть предоставление модели запроса на естественном языке и списка функций. В этом случае модель использует объявление функции, которое включает имя функции, параметры и описание, чтобы предсказать, какую функцию вызывать и с какими аргументами ее вызывать.
Следующий пример Curl представляет собой пример передачи описания функции, которая возвращает информацию о том, где воспроизводится фильм. В запрос включены несколько объявлений функций, например find_movies
и find_theaters
.
Пример запроса вызова однооборотной функции
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=$API_KEY \ -H 'Content-Type: application/json' \ -d '{ "contents": { "role": "user", "parts": { "text": "Which theaters in Mountain View show Barbie movie?" } }, "tools": [ { "function_declarations": [ { "name": "find_movies", "description": "find movie titles currently playing in theaters based on any description, genre, title words, etc.", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "description": { "type": "string", "description": "Any kind of description including category or genre, title words, attributes, etc." } }, "required": [ "description" ] } }, { "name": "find_theaters", "description": "find theaters based on location and optionally movie title which is currently playing in theaters", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "movie": { "type": "string", "description": "Any movie title" } }, "required": [ "location" ] } }, { "name": "get_showtimes", "description": "Find the start times for movies playing in a specific theater", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "movie": { "type": "string", "description": "Any movie title" }, "theater": { "type": "string", "description": "Name of the theater" }, "date": { "type": "string", "description": "Date for requested showtime" } }, "required": [ "location", "movie", "theater", "date" ] } } ] } ] }'
Ответ на этот пример с завитками может быть примерно таким.
Однооборотная функция, вызывающая пример ответа Curl
[{ "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "find_theaters", "args": { "movie": "Barbie", "location": "Mountain View, CA" } } } ] }, "finishReason": "STOP", "safetyRatings": [ { "category": "HARM_CATEGORY_HARASSMENT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HATE_SPEECH", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_DANGEROUS_CONTENT", "probability": "NEGLIGIBLE" } ] } ], "usageMetadata": { "promptTokenCount": 9, "totalTokenCount": 9 } }]
Пример однооборотного режима с использованием режима ЛЮБОЙ
Следующий пример скручивания аналогичен примеру с одним витком , но в нем устанавливается режим ANY
:
"tool_config": {
"function_calling_config": {
"mode": "ANY"
},
}
Однооборотный вызов функции в режиме ЛЮБОЙ (запрос)
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=$API_KEY \ -H 'Content-Type: application/json' \ -d '{ "contents": { "role": "user", "parts": { "text": "What movies are showing in North Seattle tonight?" } }, "tools": [ { "function_declarations": [ { "name": "find_movies", "description": "find movie titles currently playing in theaters based on any description, genre, title words, etc.", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "description": { "type": "string", "description": "Any kind of description including category or genre, title words, attributes, etc." } }, "required": [ "description" ] } }, { "name": "find_theaters", "description": "find theaters based on location and optionally movie title which is currently playing in theaters", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "movie": { "type": "string", "description": "Any movie title" } }, "required": [ "location" ] } }, { "name": "get_showtimes", "description": "Find the start times for movies playing in a specific theater", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "movie": { "type": "string", "description": "Any movie title" }, "theater": { "type": "string", "description": "Name of the theater" }, "date": { "type": "string", "description": "Date for requested showtime" } }, "required": [ "location", "movie", "theater", "date" ] } } ] } ], "tool_config": { "function_calling_config": { "mode": "ANY" }, } }'
Ответ может быть примерно следующим:
Однооборотный вызов функции в режиме ЛЮБОЙ (ответ)
{ "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "find_movies", "args": { "description": "", "location": "North Seattle, WA" } } } ], "role": "model" }, "finishReason": "STOP", "index": 0, "safetyRatings": [ { "category": "HARM_CATEGORY_DANGEROUS_CONTENT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HARASSMENT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HATE_SPEECH", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "probability": "NEGLIGIBLE" } ] } ], "promptFeedback": { "safetyRatings": [ { "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HATE_SPEECH", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HARASSMENT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_DANGEROUS_CONTENT", "probability": "NEGLIGIBLE" } ] } }
Пример однооборотного режима с использованием ЛЮБОГО режима и разрешенных функций
Следующий пример скручивания аналогичен примеру с одним оборотом , но в нем устанавливается режим ANY
и включается список разрешенных функций:
"tool_config": {
"function_calling_config": {
"mode": "ANY",
"allowed_function_names": ["find_theaters", "get_showtimes"]
},
}
Однооборотный вызов функции в режиме ЛЮБОЙ и разрешенные функции (запрос)
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=$API_KEY \ -H 'Content-Type: application/json' \ -d '{ "contents": { "role": "user", "parts": { "text": "What movies are showing in North Seattle tonight?" } }, "tools": [ { "function_declarations": [ { "name": "find_movies", "description": "find movie titles currently playing in theaters based on any description, genre, title words, etc.", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "description": { "type": "string", "description": "Any kind of description including category or genre, title words, attributes, etc." } }, "required": [ "description" ] } }, { "name": "find_theaters", "description": "find theaters based on location and optionally movie title which is currently playing in theaters", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "movie": { "type": "string", "description": "Any movie title" } }, "required": [ "location" ] } }, { "name": "get_showtimes", "description": "Find the start times for movies playing in a specific theater", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "movie": { "type": "string", "description": "Any movie title" }, "theater": { "type": "string", "description": "Name of the theater" }, "date": { "type": "string", "description": "Date for requested showtime" } }, "required": [ "location", "movie", "theater", "date" ] } } ] } ], "tool_config": { "function_calling_config": { "mode": "ANY", "allowed_function_names": ["find_theaters", "get_showtimes"] }, } }'
Модель не может предсказать функцию find_movies
, поскольку ее нет в списке разрешенных функций, поэтому вместо этого она прогнозирует другую функцию. Ответ может быть примерно следующим:
Однооборотный вызов функции в режиме ЛЮБОЙ и разрешенные функции (ответ)
{ "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "find_theaters", "args": { "location": "North Seattle, WA", "movie": null } } } ], "role": "model" }, "finishReason": "STOP", "index": 0, "safetyRatings": [ { "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HARASSMENT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HATE_SPEECH", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_DANGEROUS_CONTENT", "probability": "NEGLIGIBLE" } ] } ], "promptFeedback": { "safetyRatings": [ { "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HATE_SPEECH", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HARASSMENT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_DANGEROUS_CONTENT", "probability": "NEGLIGIBLE" } ] } }
Многооборотные примеры
Вы можете реализовать сценарий многооборотного вызова функции, выполнив следующие действия:
- Получите ответ на вызов функции, вызвав языковую модель. Это первый поворот.
- Вызовите языковую модель, используя ответ на вызов функции с первого поворота и ответ функции, который вы получаете от вызова этой функции. Это второй поворот.
Ответ второго этапа либо суммирует результаты для ответа на ваш запрос в первом раунде, либо содержит второй вызов функции, который вы можете использовать для получения дополнительной информации для вашего запроса.
Этот раздел включает в себя два примера многооборотных завихрений:
- Пример завитка, в котором используется ответ функции из предыдущего поворота
- Пример Curl, который вызывает языковую модель несколько раз
Используйте ответ из предыдущего хода
Следующий пример Curl вызывает функцию и аргументы, возвращенные предыдущим примером с одним поворотом, чтобы получить ответ. Метод и параметры, возвращаемые примером с одним оборотом, находятся в этом JSON.
"functionCall": {
"name": "find_theaters",
"args": {
"movie": "Barbie",
"location": "Mountain View, CA"
}
}
Многооборотная функция, вызывающая запрос примера Curl
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=$API_KEY \ -H 'Content-Type: application/json' \ -d '{ "contents": [{ "role": "user", "parts": [{ "text": "Which theaters in Mountain View show Barbie movie?" }] }, { "role": "model", "parts": [{ "functionCall": { "name": "find_theaters", "args": { "location": "Mountain View, CA", "movie": "Barbie" } } }] }, { "role": "user", "parts": [{ "functionResponse": { "name": "find_theaters", "response": { "name": "find_theaters", "content": { "movie": "Barbie", "theaters": [{ "name": "AMC Mountain View 16", "address": "2000 W El Camino Real, Mountain View, CA 94040" }, { "name": "Regal Edwards 14", "address": "245 Castro St, Mountain View, CA 94040" }] } } } }] }], "tools": [{ "functionDeclarations": [{ "name": "find_movies", "description": "find movie titles currently playing in theaters based on any description, genre, title words, etc.", "parameters": { "type": "OBJECT", "properties": { "location": { "type": "STRING", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "description": { "type": "STRING", "description": "Any kind of description including category or genre, title words, attributes, etc." } }, "required": ["description"] } }, { "name": "find_theaters", "description": "find theaters based on location and optionally movie title which is currently playing in theaters", "parameters": { "type": "OBJECT", "properties": { "location": { "type": "STRING", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "movie": { "type": "STRING", "description": "Any movie title" } }, "required": ["location"] } }, { "name": "get_showtimes", "description": "Find the start times for movies playing in a specific theater", "parameters": { "type": "OBJECT", "properties": { "location": { "type": "STRING", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "movie": { "type": "STRING", "description": "Any movie title" }, "theater": { "type": "STRING", "description": "Name of the theater" }, "date": { "type": "STRING", "description": "Date for requested showtime" } }, "required": ["location", "movie", "theater", "date"] } }] }] }'
Ответ на этот пример скручивания включает результат вызова метода find_theaters
. Ответ может быть примерно следующим:
Многооборотная функция, вызывающая пример ответа Curl
{ "candidates": [ { "content": { "parts": [ { "text": " OK. Barbie is showing in two theaters in Mountain View, CA: AMC Mountain View 16 and Regal Edwards 14." } ] } } ], "usageMetadata": { "promptTokenCount": 9, "candidatesTokenCount": 27, "totalTokenCount": 36 } }
Позвоните модели несколько раз
В следующем примере cURL генеративная модель искусственного интеллекта вызывается несколько раз для вызова функции. Каждый раз, когда модель вызывает функцию, она может использовать другую функцию для ответа на другой запрос пользователя в запросе.
Многооборотная функция, вызывающая запрос примера Curl
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=$API_KEY \ -H 'Content-Type: application/json' \ -d '{ "contents": [{ "role": "user", "parts": [{ "text": "Which theaters in Mountain View show Barbie movie?" }] }, { "role": "model", "parts": [{ "functionCall": { "name": "find_theaters", "args": { "location": "Mountain View, CA", "movie": "Barbie" } } }] }, { "role": "user", "parts": [{ "functionResponse": { "name": "find_theaters", "response": { "name": "find_theaters", "content": { "movie": "Barbie", "theaters": [{ "name": "AMC Mountain View 16", "address": "2000 W El Camino Real, Mountain View, CA 94040" }, { "name": "Regal Edwards 14", "address": "245 Castro St, Mountain View, CA 94040" }] } } } }] }, { "role": "model", "parts": [{ "text": " OK. Barbie is showing in two theaters in Mountain View, CA: AMC Mountain View 16 and Regal Edwards 14." }] },{ "role": "user", "parts": [{ "text": "Can we recommend some comedy movies on show in Mountain View?" }] }], "tools": [{ "functionDeclarations": [{ "name": "find_movies", "description": "find movie titles currently playing in theaters based on any description, genre, title words, etc.", "parameters": { "type": "OBJECT", "properties": { "location": { "type": "STRING", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "description": { "type": "STRING", "description": "Any kind of description including category or genre, title words, attributes, etc." } }, "required": ["description"] } }, { "name": "find_theaters", "description": "find theaters based on location and optionally movie title which is currently playing in theaters", "parameters": { "type": "OBJECT", "properties": { "location": { "type": "STRING", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "movie": { "type": "STRING", "description": "Any movie title" } }, "required": ["location"] } }, { "name": "get_showtimes", "description": "Find the start times for movies playing in a specific theater", "parameters": { "type": "OBJECT", "properties": { "location": { "type": "STRING", "description": "The city and state, e.g. San Francisco, CA or a zip code e.g. 95616" }, "movie": { "type": "STRING", "description": "Any movie title" }, "theater": { "type": "STRING", "description": "Name of the theater" }, "date": { "type": "STRING", "description": "Date for requested showtime" } }, "required": ["location", "movie", "theater", "date"] } }] }] }'
Многооборотная функция, вызывающая пример ответа Curl
[{ "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "find_movies", "args": { "description": "comedy", "location": "Mountain View, CA" } } } ] }, "finishReason": "STOP", "safetyRatings": [ { "category": "HARM_CATEGORY_HARASSMENT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_HATE_SPEECH", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "probability": "NEGLIGIBLE" }, { "category": "HARM_CATEGORY_DANGEROUS_CONTENT", "probability": "NEGLIGIBLE" } ] } ], "usageMetadata": { "promptTokenCount": 48, "totalTokenCount": 48 } } ]
Лучшие практики
Следуйте этим рекомендациям, чтобы повысить точность и надежность вызовов функций.
Подсказка пользователя
Для достижения наилучших результатов добавьте к пользовательскому запросу следующую информацию:
- Дополнительный контекст для модели. Например,
You are a movie API assistant to help users find movies and showtimes based on their preferences.
- Подробности или инструкции о том, как и когда использовать функции. Например,
Don't make assumptions on showtimes. Always use a future date for showtimes.
- Инструкция задавать уточняющие вопросы, если запросы пользователей неоднозначны. Например,
Ask clarifying questions if not enough information is available to complete the request.
Параметры выборки
Для параметра температуры используйте 0
или другое низкое значение. Это дает модели возможность генерировать более уверенные результаты и уменьшает галлюцинации.
вызов API
Если модель предлагает вызов функции, которая отправит заказ, обновит базу данных или иным образом повлечет за собой серьезные последствия, проверьте вызов функции у пользователя перед ее выполнением.