生成式模型擅长解决许多类型的问题。但是,它们受到如下限制的约束:
- 模型在训练后被冻结,导致知识过时。
- 无法查询或修改外部数据。
函数调用可以帮助您克服其中一些限制。函数调用有时称为“工具使用”,因为它允许模型使用外部工具(如 API 和函数)生成其最终响应。
您可以在 Google Cloud 文档中详细了解函数调用,其中包括函数调用的用例的实用列表。
Gemini 1.0 Pro、Gemini 1.5 Pro 和 Gemini 1.5 Flash 支持函数调用。
本指南介绍了如何实现类似于本页面下一部分中所述示例的函数调用设置。概括来讲,在应用中设置函数调用的步骤如下:
编写一个函数,用于向模型提供生成最终响应所需的信息(例如,该函数可以调用外部 API)。
创建一个函数声明,描述该函数及其参数。
在模型初始化期间提供函数声明,以便模型知道可以在需要时如何使用该函数。
设置您的应用,以便模型可以发送应用调用函数所需的信息。
将函数的响应传递回模型,以便模型可以生成最终响应。
函数调用示例概览
向模型发送请求时,您还可以为模型提供一组用于生成最终响应的“工具”(例如函数)。为了使用这些函数并调用它们(称为“函数调用”),模型和您的应用需要相互传递信息,因此建议通过多轮聊天界面使用函数调用。
假设您有一个应用可以,用户可以在其中输入如下提示:What was the weather in Boston on October 17, 2024?
。
Gemini 模型可能不知道这些天气信息;但是,假设您知道一个可以提供这些信息的外部天气服务 API。您可以使用函数调用为 Gemini 模型提供指向该 API 及其天气信息的路径。
首先,您需要在应用中编写一个函数 fetchWeather
,用于与这个假设的外部 API 进行交互,该 API 具有以下输入和输出:
参数 | 类型 | 必需 | 说明 |
---|---|---|---|
输入 | |||
location |
对象 | 是 | 要获取其天气信息的城市及其所在的州的名称。 仅支持美国境内的城市。必须始终是 city 和 state 的嵌套对象。
|
date |
字符串 | 是 | 要获取该日期的天气信息(必须始终采用 YYYY-MM-DD 格式)。 |
输出 | |||
temperature |
整数 | 是 | 温度(华氏度) |
chancePrecipitation |
字符串 | 是 | 降水概率(以百分比表示) |
cloudConditions |
字符串 | 是 | Cloud 条件(clear 、partlyCloudy 、mostlyCloudy 、cloudy 之一)
|
初始化模型时,您需要告知模型此 fetchWeather
函数存在,并在必要时告知模型如何用它来处理传入请求。这称为“函数声明”。模型不会直接调用函数。相反,在模型处理传入请求时,它会确定 fetchWeather
函数能否帮助其响应请求。如果模型确定函数确实有用,则会生成有助于您的应用调用函数的结构化数据。
再次查看传入的请求:What was the weather in Boston on October 17, 2024?
。模型可能会决定 fetchWeather
函数可以帮助其生成回答。该模型会查看 fetchWeather
需要哪些输入参数,然后为该函数生成结构化输入数据,大致如下所示:
{
functionName: fetchWeather,
location: {
city: Boston,
state: Massachusetts // the model can infer the state from the prompt
},
date: 2024-10-17
}
模型会将这些结构化输入数据传递给您的应用,以便您的应用调用 fetchWeather
函数。当您的应用从 API 收到天气状况后,会将信息传递给模型。借助此天气信息,模型可以完成最终处理,并生成对 What was the weather in Boston on October 17, 2024?
的初始请求的响应
模型可能会提供最终的自然语言响应,例如:On October 17, 2024, in Boston, it was 38 degrees Fahrenheit with partly cloudy skies.
实现函数调用
准备工作
完成 Vertex AI in Firebase SDK 入门指南(如果您尚未完成)。请确保您已完成以下所有操作:
设置新的或现有的 Firebase 项目,包括使用 Blaze 定价方案以及启用所需的 API。
将您的应用与 Firebase 相关联,包括注册应用并将 Firebase 配置添加到应用中。
添加 SDK,并在应用中初始化 Vertex AI 服务和生成式模型。
将应用关联到 Firebase、添加 SDK 并初始化 Vertex AI 服务和生成模型后,您就可以调用 Gemini API 了。
本指南的其余步骤将向您展示如何实现与函数调用示例概览(请参阅本页顶部部分)中所述工作流类似的函数调用设置。
您可以在本页稍后部分查看此函数调用示例的完整代码示例。
第 1 步:编写函数
假设您有一个应用,用户可以在其中输入类似以下的提示:What was the weather in Boston on October 17, 2024?
。Gemini 模型可能不知道此天气信息;但是,假设您知道一个可以提供此信息的外部天气服务 API。本指南中的示例依赖于这个假设的外部 API。
在应用中编写将与假设的外部 API 进行交互的函数,并为模型提供生成最终请求所需的信息。在此天气示例中,它将是一个 fetchWeather
函数,用于调用以下假设性的外部 API。
第 2 步:创建函数声明
创建您稍后要提供给模型的函数声明(本指南的下一步)。
在声明中,为函数及其参数添加尽可能详细的信息。
模型会使用函数声明中的信息来确定要选择哪个函数,以及如何为对函数的实际调用提供参数值。请参阅本页后面的其他行为和选项,了解模型如何在函数中选择以及如何控制该选择。
对于您提供的架构,请注意以下事项:
您必须以与 OpenAPI 架构兼容的架构格式提供函数声明。Vertex AI 对 OpenAPI 架构提供有限支持。
支持以下属性:
type
、nullable
、required
、format
、description
、properties
、items
、enum
。以下属性不受支持:
default
、optional
、maximum
、oneOf
。
默认情况下,对于 Vertex AI in Firebase SDK,所有字段都被视为必需字段,除非您在
optionalProperties
数组中将其指定为可选字段。对于这些选填字段,模型可以填充或跳过这些字段。请注意,这与 Vertex AI Gemini API 的默认行为相反。
如需了解与函数声明相关的最佳实践(包括名称和说明方面的提示),请参阅 Google Cloud 文档中的最佳实践。
编写函数声明的方法如下:
第 3 步:在模型初始化期间提供函数声明
请求中可提供的函数声明的最大数量为 128 个。如需了解模型如何从这些函数中进行选择,以及如何控制该选择(使用 toolConfig
设置函数调用模式),请参阅本页下文中的其他行为和选项。
了解如何选择适合您的用例和应用的 Gemini 模型和(可选)位置。
第 4 步:调用该函数以调用外部 API
如果模型确定 fetchWeather
函数确实可以帮助其生成最终回答,您的应用需要使用模型提供的结构化输入数据实际调用该函数。
由于需要在模型和应用之间来回传递信息,因此建议通过多轮聊天界面使用函数调用。
以下代码段展示了如何告知您的应用模型要使用 fetchWeather
函数。它还显示,模型为函数调用(及其底层外部 API)提供了必要的输入参数值。
在此示例中,传入请求包含提示 What was the weather in Boston on October 17, 2024?
。从此提示中,模型推断出 fetchWeather
函数所需的输入参数(即 city
、state
和 date
)。
第 5 步:向模型提供函数的输出以生成最终回答
在 fetchWeather
函数返回天气信息后,您的应用需要将其传回给模型。
然后,模型会执行最终处理,并生成最终的自然语言回答,例如:On October 17, 2024 in Boston, it was 38 degrees Fahrenheit with partly cloudy skies.
其他行为和选项
以下是您需要在代码中适应的函数调用的一些其他行为,以及您可以控制的选项。
模型可能会要求再次调用某个函数或其他函数。
如果一个函数调用的响应不足以让模型生成最终响应,则模型可能会请求进行额外的函数调用,或者请求调用完全不同的函数。只有在函数声明列表中向模型提供多个函数时,才会出现后一种情况。
您的应用需要考虑到模型可能会请求进行其他函数调用。
模型可能会要求同时调用多个函数。
您最多可以在函数声明列表中向模型提供 128 个函数。因此,模型可能会决定需要多个函数来帮助生成最终响应。它可能会决定同时调用其中的一些函数,这称为并行函数调用。
您的应用需要适应模型可能会请求同时运行的多个函数,并且需要将函数的所有响应提供给模型。
Gemini 1.5 Pro 和 Gemini 1.5 Flash 支持并行函数调用。
您可以控制模型是否可以请求调用函数以及调用方式。
您可以对模型应如何以及是否应使用所提供的函数声明施加一些约束条件。这称为设置函数调用模式。下面是一些示例:
您可以强制模型始终使用函数调用,而不是允许模型在即时自然语言回答和函数调用之间进行选择。这称为强制函数调用。
如果您提供了多个函数声明,则可以限制模型仅使用所提供函数的一部分。
您可以通过添加工具配置 (toolConfig
) 以及提示和函数声明来实现这些约束条件(或模式)。在工具配置中,您可以指定以下某种模式。最实用的模式是 ANY
。
Mode | 说明 |
---|---|
AUTO |
默认的模型行为。模型决定是使用函数调用还是自然语言回答。 |
ANY |
模型必须使用函数调用(“强制函数调用”)。如需将模型限制为一部分函数,请在 allowedFunctionNames 中指定允许的函数名称。 |
NONE |
模型不得使用函数调用。此行为等同于没有任何关联函数声明的模型请求。 |
Gemini 1.5 Pro 和 Gemini 1.5 Flash 支持函数调用模式。
您还可以执行哪些操作?
试用 Gemini API 的其他功能
了解如何控制内容生成
您还可以使用 Vertex AI Studio 对提示和模型配置进行实验。
详细了解 Gemini 模型
了解适用于各种用例的模型及其配额和价格。就您使用 Vertex AI in Firebase 的体验提供反馈