函式呼叫 (也稱為「工具使用」) 會為大型語言模型提供外部工具 (例如 get_current_weather
函式) 的定義。處理提示時,模型會判斷是否需要工具,如果需要,就會輸出結構化資料,指定要呼叫的工具及其參數 (例如 get_current_weather(location='Boston')
)。應用程式隨後會執行這項工具,並將結果回饋至模型,讓模型以動態的實際資訊或動作結果完成回覆。這樣就能有效連結 LLM 與系統,並擴充 LLM 的功能。
函式呼叫可用於兩種主要用途:
擷取資料:擷取模型回覆的最新資訊,例如目前天氣、貨幣轉換或知識庫和 API 的特定資料 (RAG)。
採取行動:執行外部作業,例如提交表單、更新應用程式狀態,或協調代理人工作流程 (例如對話移交)。
如要進一步瞭解更多用途和範例,請參閱「用途」一文。
功能與限制
以下型號支援呼叫函式:
最多可指定 128 個
FunctionDeclarations
使用 OpenAPI 結構定義格式定義函式。
如需與函式宣告相關的最佳做法,包括名稱和說明的提示,請參閱最佳做法。
如何建立函式呼叫應用程式
如要使用函式呼叫,請執行下列工作:
步驟 1:將提示和函式宣告提交至模型
使用與 OpenAPI 結構定義相容的結構定義格式,宣告 Tool
。詳情請參閱結構定義範例。
以下範例會將提示和函式宣告提交至模型。
REST
PROJECT_ID=myproject
LOCATION=us-central1
MODEL_ID=gemini-2.0-flash-001
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:generateContent \
-d '{
"contents": [{
"role": "user",
"parts": [{
"text": "What is the weather in Boston?"
}]
}],
"tools": [{
"functionDeclarations": [
{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name of the location for which to get the weather.",
"default": {
"string_value": "Boston, MA"
}
}
},
"required": [
"location"
]
}
}
]
}]
}'
Python
您可以使用 Python 字典手動指定結構定義,也可以使用 from_func
輔助函式自動指定結構定義。以下範例說明如何手動宣告函式。
import vertexai
from vertexai.generative_models import (
Content,
FunctionDeclaration,
GenerationConfig,
GenerativeModel,
Part,
Tool,
ToolConfig
)
# Initialize Vertex AI
# TODO(developer): Update the project
vertexai.init(project="PROJECT_ID", location="us-central1")
# Initialize Gemini model
model = GenerativeModel(model_name="gemini-2.0-flash")
# Manual function declaration
get_current_weather_func = FunctionDeclaration(
name="get_current_weather",
description="Get the current weather in a given location",
# Function parameters are specified in JSON schema format
parameters={
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name of the location for which to get the weather.",
"default": {
"string_value": "Boston, MA"
}
}
},
},
)
response = model.generate_content(
contents = [
Content(
role="user",
parts=[
Part.from_text("What is the weather like in Boston?"),
],
)
],
generation_config = GenerationConfig(temperature=0),
tools = [
Tool(
function_declarations=[get_current_weather_func],
)
]
)
或者,您也可以使用 from_func
輔助函式自動宣告函式,如以下範例所示:
def get_current_weather(location: str = "Boston, MA"):
"""
Get the current weather in a given location
Args:
location: The city name of the location for which to get the weather.
"""
# This example uses a mock implementation.
# You can define a local function or import the requests library to call an API
return {
"location": "Boston, MA",
"temperature": 38,
"description": "Partly Cloudy",
"icon": "partly-cloudy",
"humidity": 65,
"wind": {
"speed": 10,
"direction": "NW"
}
}
get_current_weather_func = FunctionDeclaration.from_func(get_current_weather)
Node.js
這個範例說明一個包含一個函式和一個提示的文字情境。
Node.js
在試用這個範例之前,請先按照 Vertex AI 快速入門:使用用戶端程式庫中的操作說明設定 Node.js。詳情請參閱 Vertex AI Node.js API 參考說明文件。
如要向 Vertex AI 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Go
這個範例說明包含一個函式和一個提示的文字情境。
瞭解如何安裝或更新 Gen AI SDK for Go。
詳情請參閱 SDK 參考說明文件。
設定環境變數,以便在 Vertex AI 中使用 Gen AI SDK:
# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values # with appropriate values for your project. export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT export GOOGLE_CLOUD_LOCATION=global export GOOGLE_GENAI_USE_VERTEXAI=True
C#
這個範例說明包含一個函式和一個提示的文字情境。
C#
在試用這個範例之前,請先按照 Vertex AI 快速入門:使用用戶端程式庫中的操作說明設定 C#。詳情請參閱 Vertex AI C# API 參考說明文件。
如要向 Vertex AI 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
Java
Java
在試用這個範例之前,請先按照 Vertex AI 快速入門:使用用戶端程式庫中的操作說明設定 Java。詳情請參閱 Vertex AI Java API 參考說明文件。
如要向 Vertex AI 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定驗證機制」。
如果模型判斷需要特定函式的輸出內容,應用程式從模型收到的回應就會包含函式名稱,以及應以何種方式呼叫函式的參數值。
以下是模型回覆使用者提示「波士頓的天氣如何?」的範例。模型建議使用 Boston, MA
參數呼叫 get_current_weather
函式。
candidates { content { role: "model" parts { function_call { name: "get_current_weather" args { fields { key: "location" value { string_value: "Boston, MA" } } } } } } ... }
步驟 2:為模型提供 API 輸出內容
叫用外部 API,並將 API 輸出內容傳回模型。
以下範例使用合成資料模擬外部 API 的回應酬載,並將輸出內容提交回模型。
REST
PROJECT_ID=myproject
MODEL_ID=gemini-2.0-flash
LOCATION="us-central1"
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:generateContent \
-d '{
"contents": [
{
"role": "user",
"parts": {
"text": "What is the weather in Boston?"
}
},
{
"role": "model",
"parts": [
{
"functionCall": {
"name": "get_current_weather",
"args": {
"location": "Boston, MA"
}
}
}
]
},
{
"role": "user",
"parts": [
{
"functionResponse": {
"name": "get_current_weather",
"response": {
"temperature": 20,
"unit": "C"
}
}
}
]
}
],
"tools": [
{
"function_declarations": [
{
"name": "get_current_weather",
"description": "Get the current weather in a specific location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name of the location for which to get the weather."
}
},
"required": [
"location"
]
}
}
]
}
]
}'
Python
function_response_contents = []
function_response_parts = []
# Iterates through the function calls in the response in case there are parallel function call requests
for function_call in response.candidates[0].function_calls:
print(f"Function call: {function_call.name}")
# In this example, we'll use synthetic data to simulate a response payload from an external API
if (function_call.args['location'] == "Boston, MA"):
api_response = { "location": "Boston, MA", "temperature": 38, "description": "Partly Cloudy" }
if (function_call.args['location'] == "San Francisco, CA"):
api_response = { "location": "San Francisco, CA", "temperature": 58, "description": "Sunny" }
function_response_parts.append(
Part.from_function_response(
name=function_call.name,
response={"contents": api_response}
)
)
# Add the function call response to the contents
function_response_contents = Content(role="user", parts=function_response_parts)
# Submit the User's prompt, model's response, and API output back to the model
response = model.generate_content(
[
Content( # User prompt
role="user",
parts=[
Part.from_text("What is the weather like in Boston?"),
],
),
response.candidates[0].content, # Function call response
function_response_contents # API output
],
tools=[
Tool(
function_declarations=[get_current_weather_func],
)
],
)
# Get the model summary response
print(response.text)
如需 API 叫用作業的最佳做法,請參閱「最佳做法 - API 叫用」。
如果模型提出了多個並行函式呼叫,應用程式必須將所有回應傳回模型。詳情請參閱平行函式呼叫範例。
模型可能會判斷回應提示時,需要使用其他函式的輸出內容。在這種情況下,應用程式從模型收到的回應會包含另一個函式名稱和另一組參數值。
如果模型判斷 API 回應足以回應使用者提示,就會建立自然語言回應,並傳回至應用程式。在這種情況下,應用程式必須將回應傳回給使用者。以下是自然語言回應範例:
It is currently 38 degrees Fahrenheit in Boston, MA with partly cloudy skies.
並行函式呼叫
如果提示為「取得波士頓和舊金山的天氣詳細資料?」,模型可能會建議幾個並行函式呼叫。如需支援並行函式呼叫的型號清單,請參閱「支援的型號」。
REST
這個範例說明包含一個 get_current_weather
函式的情況。使用者提示為「Get weather details in Boston and San Francisco?」(取得波士頓和舊金山的天氣詳細資料?)。模型會建議兩個平行的 get_current_weather
函式呼叫:一個使用參數 Boston
,另一個使用參數 San Francisco
。
如要進一步瞭解要求參數,請參閱 Gemini API。
{ "candidates": [ { "content": { "role": "model", "parts": [ { "functionCall": { "name": "get_current_weather", "args": { "location": "Boston" } } }, { "functionCall": { "name": "get_current_weather", "args": { "location": "San Francisco" } } } ] }, ... } ], ... }
以下指令示範如何將函式輸出內容提供給模型。將 my-project 替換為您的 Google Cloud 專案名稱。
模型要求
PROJECT_ID=my-project MODEL_ID=gemini-2.0-flash LOCATION="us-central1" curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:generateContent \ -d '{ "contents": [ { "role": "user", "parts": { "text": "What is difference in temperature in Boston and San Francisco?" } }, { "role": "model", "parts": [ { "functionCall": { "name": "get_current_weather", "args": { "location": "Boston" } } }, { "functionCall": { "name": "get_current_weather", "args": { "location": "San Francisco" } } } ] }, { "role": "user", "parts": [ { "functionResponse": { "name": "get_current_weather", "response": { "temperature": 30.5, "unit": "C" } } }, { "functionResponse": { "name": "get_current_weather", "response": { "temperature": 20, "unit": "C" } } } ] } ], "tools": [ { "function_declarations": [ { "name": "get_current_weather", "description": "Get the current weather in a specific location", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city name of the location for which to get the weather." } }, "required": [ "location" ] } } ] } ] }'
模型產生的自然語言回應如下:
模型回應
[ { "candidates": [ { "content": { "parts": [ { "text": "The temperature in Boston is 30.5C and the temperature in San Francisco is 20C. The difference is 10.5C. \n" } ] }, "finishReason": "STOP", ... } ] ... } ]
Python
這個範例說明含有一個 get_current_weather
函式的情況。使用者提示為「波士頓和舊金山的天氣如何?」
將 my-project 替換為您的 Google Cloud 專案名稱。
import vertexai
from vertexai.generative_models import (
Content,
FunctionDeclaration,
GenerationConfig,
GenerativeModel,
Part,
Tool,
ToolConfig
)
# Initialize Vertex AI
# TODO(developer): Update the project
vertexai.init(project="my-project", location="us-central1")
# Initialize Gemini model
model = GenerativeModel(model_name="gemini-2.0-flash")
# Manual function declaration
get_current_weather_func = FunctionDeclaration(
name="get_current_weather",
description="Get the current weather in a given location",
# Function parameters are specified in JSON schema format
parameters={
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name of the location for which to get the weather.",
"default": {
"string_value": "Boston, MA"
}
}
},
},
)
response = model.generate_content(
contents = [
Content(
role="user",
parts=[
Part.from_text("What is the weather like in Boston and San Francisco?"),
],
)
],
generation_config = GenerationConfig(temperature=0),
tools = [
Tool(
function_declarations=[get_current_weather_func],
)
]
)
以下指令示範如何將函式輸出內容提供給模型。
function_response_contents = []
function_response_parts = []
# You can have parallel function call requests for the same function type.
# For example, 'location_to_lat_long("London")' and 'location_to_lat_long("Paris")'
# In that case, collect API responses in parts and send them back to the model
for function_call in response.candidates[0].function_calls:
print(f"Function call: {function_call.name}")
# In this example, we'll use synthetic data to simulate a response payload from an external API
if (function_call.args['location'] == "Boston, MA"):
api_response = { "location": "Boston, MA", "temperature": 38, "description": "Partly Cloudy" }
if (function_call.args['location'] == "San Francisco, CA"):
api_response = { "location": "San Francisco, CA", "temperature": 58, "description": "Sunny" }
function_response_parts.append(
Part.from_function_response(
name=function_call.name,
response={"contents": api_response}
)
)
# Add the function call response to the contents
function_response_contents = Content(role="user", parts=function_response_parts)
function_response_contents
response = model.generate_content(
contents = [
Content(
role="user",
parts=[
Part.from_text("What is the weather like in Boston and San Francisco?"),
],
), # User prompt
response.candidates[0].content, # Function call response
function_response_contents, # Function response
],
tools = [
Tool(
function_declarations=[get_current_weather_func],
)
]
)
# Get the model summary response
print(response.text)
Go
強制函式呼叫
您可以強制模型只預測函式呼叫,而非允許模型在自然語言回應和函式呼叫之間進行選擇。這就是所謂的強制函式呼叫。您也可以選擇為模型提供完整的函式宣告,但將回應限制在這些函式的子集。
模式 | 說明 |
---|---|
AUTO |
預設模型行為。模型會決定是否要預測函式呼叫或自然語言回應。 |
ANY |
模型會受到限制,一律預測函式呼叫。如果未提供 allowed_function_names ,模型會從所有可用的函式宣告中挑選。如果提供 allowed_function_names ,模型會從允許的函式組合中挑選。 |
NONE |
模型不得預測函式呼叫。這項行為等同於模型要求,但沒有任何相關聯的函式宣告。 |
以下範例會強制預測 get_weather
函式呼叫。
Python
response = model.generate_content(
contents = [
Content(
role="user",
parts=[
Part.from_text("What is the weather like in Boston?"),
],
)
],
generation_config = GenerationConfig(temperature=0),
tools = [
Tool(
function_declarations=[get_weather_func, some_other_function],
)
],
tool_config=ToolConfig(
function_calling_config=ToolConfig.FunctionCallingConfig(
# ANY mode forces the model to predict only function calls
mode=ToolConfig.FunctionCallingConfig.Mode.ANY,
# Allowed function calls to predict when the mode is ANY. If empty, any of
# the provided function calls will be predicted.
allowed_function_names=["get_weather"],
)
)
)
函式結構定義範例
函式宣告與 OpenAPI 結構定義相容。我們支援以下屬性:type
、nullable
、required
、format
、description
、properties
、items
、enum
、anyOf
、$ref
和 $defs
。不支援其他屬性。
含有物件和陣列參數的函式
以下範例使用 Python 字典,宣告同時接受物件和陣列參數的函式:
extract_sale_records_func = FunctionDeclaration( name="extract_sale_records", description="Extract sale records from a document.", parameters={ "type": "object", "properties": { "records": { "type": "array", "description": "A list of sale records", "items": { "description": "Data for a sale record", "type": "object", "properties": { "id": {"type": "integer", "description": "The unique id of the sale."}, "date": {"type": "string", "description": "Date of the sale, in the format of MMDDYY, e.g., 031023"}, "total_amount": {"type": "number", "description": "The total amount of the sale."}, "customer_name": {"type": "string", "description": "The name of the customer, including first name and last name."}, "customer_contact": {"type": "string", "description": "The phone number of the customer, e.g., 650-123-4567."}, }, "required": ["id", "date", "total_amount"], }, }, }, "required": ["records"], }, )
含有列舉參數的函式
以下範例使用 Python 字典宣告函式,該函式會採用整數 enum
參數:
set_status_func = FunctionDeclaration( name="set_status", description="set a ticket's status field", # Function parameters are specified in JSON schema format parameters={ "type": "object", "properties": { "status": { "type": "integer", "enum": [ "10", "20", "30" ], # Provide integer (or any other type) values as strings. } }, }, )
含有 ref 和 def 的函式
下列 JSON 函式宣告會使用 ref
和 defs
屬性:
{ "contents": ..., "tools": [ { "function_declarations": [ { "name": "get_customer", "description": "Search for a customer by name", "parameters": { "type": "object", "properties": { "first_name": { "ref": "#/defs/name" }, "last_name": { "ref": "#/defs/name" } }, "defs": { "name": { "type": "string" } } } } ] } ] }
使用須知:
- 與 OpenAPI 結構定義不同的是,請指定不含
$
符號的ref
和defs
。 ref
必須參照defs
的直接子項,不得參照外部項目。- 巢狀結構的深度上限為 32。
defs
中的遞迴深度 (自我參照) 上限為兩個。
from_func
與陣列參數
以下程式碼範例會宣告函式,該函式會將數字陣列相乘,並使用 from_func
產生 FunctionDeclaration
結構定義。
from typing import List # Define a function. Could be a local function or you can import the requests library to call an API def multiply_numbers(numbers: List[int] = [1, 1]) -> int: """ Calculates the product of all numbers in an array. Args: numbers: An array of numbers to be multiplied. Returns: The product of all the numbers. If the array is empty, returns 1. """ if not numbers: # Handle empty array return 1 product = 1 for num in numbers: product *= num return product multiply_number_func = FunctionDeclaration.from_func(multiply_numbers) """ multiply_number_func contains the following schema: {'name': 'multiply_numbers', 'description': 'Calculates the product of all numbers in an array.', 'parameters': {'properties': {'numbers': {'items': {'type': 'INTEGER'}, 'description': 'list of numbers', 'default': [1.0, 1.0], 'title': 'Numbers', 'type': 'ARRAY'}}, 'description': 'Calculates the product of all numbers in an array.', 'title': 'multiply_numbers', 'property_ordering': ['numbers'], 'type': 'OBJECT'}} """
函式呼叫的最佳做法
撰寫清楚且詳細的函式名稱、參數說明和操作說明
函式名稱應以英文字母或底線開頭,且只能包含 a-z、A-Z、0-9、底線、半形句點或連字號,長度上限為 64 個字元。
函式說明應清楚詳盡。例如,
book_flight_ticket
函式的說明可能為book flight tickets after confirming users' specific requirements, such as time, departure, destination, party size and preferred airline
使用強型參數
如果參數值來自有限集合,請新增 enum
欄位,而非將值集合放入說明中。如果參數值一律是整數,請將類型設為 integer
而非 number
。
使用系統指示
使用含有日期、時間或位置參數的函式時,請在系統指示中加入目前的日期、時間或相關位置資訊 (例如城市和國家/地區)。這樣一來,即使使用者提示缺少詳細資料,模型仍可獲得必要的背景資訊,準確處理要求。
更新使用者提示
為達最佳效果,請在使用者提示前加上下列詳細資料:
- 模型的其他背景資訊,例如
You are a flight API assistant to help with searching flights based on user preferences.
- 如何使用函式和使用時機的詳細說明或操作說明,例如
Don't make assumptions on the departure or destination airports. Always use a future date for the departure or destination time.
- 使用者查詢內容不夠明確時,請問清楚的說明問題,例如
Ask clarifying questions if not enough information is available.
使用產生設定
請使用 0
或其他低值做為溫度參數。這麼做可指示模型產生更可靠的結果,並減少幻覺。
驗證 API 呼叫
如果模型建議叫用會傳送訂單、更新資料庫或造成重大後果的函式,請先向使用者驗證函式呼叫,再執行該函式。
定價
函式呼叫的價格取決於文字輸入內容和輸出內容中的字元數。如需更多資訊,請參閱「Vertex AI 定價」。
在此處,文字輸入 (提示) 是指目前對話回合的使用者提示、目前對話回合的函式宣告,以及對話記錄。對話記錄包含先前對話輪次的查詢、函式呼叫和函式回應。Vertex AI 會將對話記錄截斷至 32,000 個字元。
文字輸出 (回應) 是指目前對話輪次的函式呼叫和文字回應。
函式呼叫的用途
您可以使用函式呼叫執行以下工作:
用途 | 範例說明 | 連結示例 |
---|---|---|
整合外部 API | 使用氣象 API 取得天氣資訊 | Notebook 教學課程 |
將地址轉換為經緯度座標 | Notebook 教學課程 | |
使用貨幣兌換 API 轉換貨幣 | 程式碼研究室 | |
建構進階聊天機器人 | 回答客戶對產品和服務的疑問 | Notebook 教學課程 |
建立助理,回答與公司相關的財務和新聞問題 | Notebook 教學課程 | |
結構和控制函式呼叫 | 從原始記錄資料中擷取結構化實體 | Notebook 教學課程 |
從使用者輸入內容中擷取單一或多個參數 | Notebook 教學課程 | |
在函式呼叫中處理清單和巢狀資料結構 | Notebook 教學課程 | |
處理函式呼叫行為 | 處理平行函式呼叫和回應 | Notebook 教學課程 |
管理模型可呼叫的函式和時間 | Notebook 教學課程 | |
以自然語言查詢資料庫 | 將自然語言問題轉換為 BigQuery 的 SQL 查詢 | 範例應用程式 |
多模態函式呼叫 | 使用圖片、影片、音訊和 PDF 檔做為觸發函式呼叫的輸入內容 | Notebook 教學課程 |
以下是其他用途:
解讀語音指令:建立與車內工作相關的函式。舉例來說,您可以建立可開啟收音機或啟動空調的函式。將使用者的語音指令音訊檔案傳送至模型,並要求模型將音訊轉換成文字,並識別使用者要呼叫的函式。
根據環境觸發條件自動化工作流程:建立可代表可自動化程序的函式。將環境感應器的資料提供給模型,並要求模型剖析及處理資料,以決定是否應啟用一或多個工作流程。舉例來說,模型可以處理倉庫中的溫度資料,並選擇啟用灑水器功能。
自動指派支援單:為模型提供支援單、記錄和情境感知規則。請模型處理所有這類資訊,以便判斷應將支援單指派給誰。呼叫函式,將票證指派給模型建議的使用者。
從知識庫擷取資訊:建立函式,擷取特定主題的學術文章並加以摘要。讓模型回答學科相關問題,並為答案提供參考資料。
後續步驟
請參閱函式呼叫的 API 參考資料。