您可以使用函数调用定义自定义函数并将其提供给生成式 AI 模型。模型不会直接调用这些函数,而是生成指定函数名称和建议的参数的结构化数据输出。此输出支持调用外部 API,然后生成的 API 输出可以重新合并到模型中,从而实现更全面的查询响应。函数调用使 LLM 能够与实时信息和各种服务(如数据库、客户关系管理系统和文档代码库)进行交互,从而增强其提供相关且符合情境的回答的能力。
函数调用的工作原理
函数使用函数声明来描述。在您将查询中的函数声明列表传递给语言模型后,该模型会以 OpenAPI 兼容架构格式返回一个对象(其中包含函数名称及其参数),并尝试使用返回的函数之一回答用户查询。语言模型通过分析函数声明来了解函数的用途。该模型实际上并未调用该函数。开发者会在响应中使用与 OpenAPI 兼容的架构对象来调用模型返回的函数。
实现函数调用时,您需要创建一个或多个函数声明,然后将函数声明添加到传递给模型的 tools
对象中。每个函数声明包含一个函数的相关信息,其中包括:
- 函数名称
- 采用与 OpenAPI 兼容的架构格式的函数参数。支持部分特定子集。使用 curl 时,架构是使用 JSON 指定的。
- 函数说明(可选)。为获得最佳效果,我们建议您添加说明。
Gemini API 还支持并行函数调用,您可以一次调用多个函数。
本文档包含使用 GenerativeModel
类及其方法进行 REST 调用的 curl 示例。
支持的模型
以下模型支持函数调用:
gemini-1.0-pro
gemini-1.0-pro-001
gemini-1.5-flash-latest
gemini-1.5-pro-latest
函数调用模式
您可以使用函数调用 mode 来定义函数调用的执行行为。有三种模式可供选择:
AUTO
:默认模型行为。模型决定预测函数调用或自然语言响应。ANY
:模型被约束为始终预测函数调用。如果未提供allowed_function_names
,则模型会从所有可用的函数声明中选择。如果提供了allowed_function_names
,则模型会从一组允许的函数中进行选择。NONE
:模型不会预测函数调用。在这种情况下,模型行为与没有传递任何函数声明相同。
您还可以传递一组 allowed_function_names
,如果提供该集,则会限制模型将调用的函数。仅当模式为 ANY
时,才应包含 allowed_function_names
。函数名称应与函数声明名称一致。将模式设为 ANY
并设置 allowed_function_names
后,模型将根据所提供的一组函数名称预测函数调用。
下面是将模式设置为 ANY
并指定允许的函数列表的示例请求的一部分:
"tool_config": {
"function_calling_config": {
"mode": "ANY",
"allowed_function_names": ["find_theaters", "get_showtimes"]
},
}
调用 c网址 示例的函数
使用 c网址 时,函数和参数信息包含在 tools
元素中。tools
元素中的每个函数声明都包含函数名称、使用与 OpenAPI 兼容的架构指定的参数以及函数说明。以下示例演示了如何使用 curl 命令进行函数调用:
单轮 curl 示例
单轮是指调用语言模型一次。对于函数调用,单轮用例可能是当您向模型提供自然语言查询和函数列表时的用例。在本例中,模型使用函数声明(包括函数名称、形参和说明)来预测要调用哪个函数以及调用该函数的参数。
以下 curl 示例是一个传入函数说明的示例,该函数会返回有关影片播放位置的信息。请求中会包含多个函数声明,例如 find_movies
和 find_theaters
。
单轮函数调用 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?" } }, "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 示例的响应可能与以下内容类似。
单轮函数调用 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 } }]
使用“不限”模式的单轮操作示例
以下 curl 示例与单轮示例类似,但它将模式设置为 ANY
:
"tool_config": {
"function_calling_config": {
"mode": "ANY"
},
}
使用 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" }, } }'
响应可能类似以下内容:
使用 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 模式和允许函数的单轮操作示例
以下 curl 示例与单轮示例类似,但它将模式设置为 ANY
并包含允许的函数列表:
"tool_config": {
"function_calling_config": {
"mode": "ANY",
"allowed_function_names": ["find_theaters", "get_showtimes"]
},
}
使用 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", "allowed_function_names": ["find_theaters", "get_showtimes"] }, } }'
该模型无法预测 find_movies
函数,因为它不在允许的函数列表中,因此它预测的是其他函数。响应可能类似于以下内容:
使用 ANY 模式和允许的函数调用单轮函数(响应)
{ "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 示例:
使用上一轮响应的 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": "function", "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"] } }] }] }'
此 curl 示例的响应包含调用 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 示例请求
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": "function", "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 } } ]
最佳实践
遵循以下最佳实践可提高函数调用的准确性和可靠性。
功能键字段
在将函数集成到请求中时,准确定义函数至关重要。每个函数都依赖于特定参数来指导其行为以及与模型的互动。以下是 functions_declarations
数组中使用的关键参数的细分数据。
function_declarations
(数组):
- 包含一个或多个 对象,每个对象代表一个不同的函数。
在每个 function_declarations
对象中:
name
(字符串):API 调用中函数的唯一标识符。- 最佳做法:使用清晰的描述性名称,其中不得包含空格、句点 (
.
) 或短划线 (-
) 字符。请改用下划线 (_
) 字符或驼峰命名法。
- 最佳做法:使用清晰的描述性名称,其中不得包含空格、句点 (
description
(字符串):对函数用途和功能的全面说明。- 最佳实践:函数说明要详细、清晰、具体,并视需要提供示例。例如,使用
find theaters based on location and optionally movie title that is currently playing in theaters.
而不是find theaters
,而不是过于宽泛或含糊的说明。
- 最佳实践:函数说明要详细、清晰、具体,并视需要提供示例。例如,使用
parameters
(对象):定义函数所需的输入数据。type
(字符串):指定整体数据类型(例如,object
).properties
(对象):- 列出各个参数,每个参数都包含以下信息:
type
(字符串):参数的数据类型(例如,string
、integer
、boolean
)。- 最佳实践:使用强类型参数来减少模型幻觉。例如,如果参数值来自一个有限集,请使用
enum
字段,而不是在说明中列出值(例如"type": "enum", "values": ["now_playing", "upcoming"]
)。如果参数值始终是整数,请将类型设置为integer
,而不是number
。
- 最佳实践:使用强类型参数来减少模型幻觉。例如,如果参数值来自一个有限集,请使用
description
(字符串):明确说明参数的用途和预期格式。- 最佳实践:提供具体示例和限制。例如,使用
The city and state, e.g. San Francisco, CA or a zip code e.g. 95616
,而不是the location to search
。
- 最佳实践:提供具体示例和限制。例如,使用
- 列出各个参数,每个参数都包含以下信息:
required
(数组):- 一个字符串数组,其中列出了函数运行所必需的参数名称。
用户提示
为获得最佳结果,请在用户查询前面加上以下详细信息:
- 模型的其他上下文。例如
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 调用
如果模型建议调用一个会发送订单、更新数据库或以其他方式产生重大后果的函数,请在执行之前先向用户验证该函数调用。