Files API

Gemini 系列人工智慧 (AI) 模型可處理各種類型的輸入資料,包括文字、圖片和音訊。由於這些模型可處理多種資料類型或模式,因此 Gemini 模型稱為多模態模型,或稱為具有多模態功能

本指南將說明如何使用 Files API 處理媒體檔案。音訊檔案、圖片、影片、文件和其他支援的檔案類型,都適用相同的基本操作。

如需檔案提示指南,請參閱「檔案提示指南」一節。

上傳檔案

您可以使用 Files API 上傳媒體檔案。如果總要求大小 (包括檔案、文字提示、系統指示等) 超過 20 MB,請一律使用 Files API。

下列程式碼會上傳檔案,然後在呼叫 generateContent 時使用該檔案。

Python

from google import genai

client = genai.Client(api_key="GOOGLE_API_KEY")

myfile = client.files.upload(file="path/to/sample.mp3")

response = client.models.generate_content(
    model="gemini-2.0-flash", contents=["Describe this audio clip", myfile]
)

print(response.text)

JavaScript

import {
  GoogleGenAI,
  createUserContent,
  createPartFromUri,
} from "@google/genai";

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });

async function main() {
  const myfile = await ai.files.upload({
    file: "path/to/sample.mp3",
    config: { mimeType: "audio/mpeg" },
  });

  const response = await ai.models.generateContent({
    model: "gemini-2.0-flash",
    contents: createUserContent([
      createPartFromUri(myfile.uri, myfile.mimeType),
      "Describe this audio clip",
    ]),
  });
  console.log(response.text);
}

await main();

Go

file, err := client.UploadFileFromPath(ctx, "path/to/sample.mp3", nil)
if err != nil {
    log.Fatal(err)
}
defer client.DeleteFile(ctx, file.Name)

model := client.GenerativeModel("gemini-2.0-flash")
resp, err := model.GenerateContent(ctx,
    genai.FileData{URI: file.URI},
    genai.Text("Describe this audio clip"))
if err != nil {
    log.Fatal(err)
}

printResponse(resp)

REST

AUDIO_PATH="path/to/sample.mp3"
MIME_TYPE=$(file -b --mime-type "${AUDIO_PATH}")
NUM_BYTES=$(wc -c < "${AUDIO_PATH}")
DISPLAY_NAME=AUDIO

tmp_header_file=upload-header.tmp

# Initial resumable request defining metadata.
# The upload url is in the response headers dump them to a file.
curl "${BASE_URL}/upload/v1beta/files?key=${GOOGLE_API_KEY}" \
  -D upload-header.tmp \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
  -H "Content-Type: application/json" \
  -d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null

upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"

# Upload the actual bytes.
curl "${upload_url}" \
  -H "Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@${AUDIO_PATH}" 2> /dev/null > file_info.json

file_uri=$(jq ".file.uri" file_info.json)
echo file_uri=$file_uri

# Now generate content using that file
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
          {"text": "Describe this audio clip"},
          {"file_data":{"mime_type": "${MIME_TYPE}", "file_uri": '$file_uri'}}]
        }]
      }' 2> /dev/null > response.json

cat response.json
echo

jq ".candidates[].content.parts[].text" response.json

取得檔案的中繼資料

您可以呼叫 files.get,驗證 API 是否已成功儲存上傳的檔案,並取得其中繼資料。

Python

myfile = client.files.upload(file='path/to/sample.mp3')
file_name = myfile.name
myfile = client.files.get(name=file_name)
print(myfile)

JavaScript

const myfile = await ai.files.upload({
  file: "path/to/sample.mp3",
  config: { mimeType: "audio/mpeg" },
});

const fileName = myfile.name;
const fetchedFile = await ai.files.get({ name: fileName });
console.log(fetchedFile);

Go

file, err := client.UploadFileFromPath(ctx, "path/to/sample.mp3", nil)
if err != nil {
    log.Fatal(err)
}

gotFile, err := client.GetFile(ctx, file.Name)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Got file:", gotFile.Name)

REST

# file_info.json was created in the upload example
name=$(jq ".file.name" file_info.json)
# Get the file of interest to check state
curl https://generativelanguage.googleapis.com/v1beta/files/$name > file_info.json
# Print some information about the file you got
name=$(jq ".file.name" file_info.json)
echo name=$name
file_uri=$(jq ".file.uri" file_info.json)
echo file_uri=$file_uri

列出已上傳的檔案

您可以使用 Files API 上傳多個檔案。以下程式碼可取得所有上傳檔案的清單:

Python

print('My files:')
for f in client.files.list():
    print(' ', f.name)

JavaScript

const listResponse = await ai.files.list({ config: { pageSize: 10 } });
for await (const file of listResponse) {
  console.log(file.name);
}

Go

iter := client.ListFiles(ctx)
for {
    ifile, err := iter.Next()
    if err == iterator.Done {
        break
    }
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(ifile.Name)
}

REST

echo "My files: "

curl "https://generativelanguage.googleapis.com/v1beta/files?key=$GOOGLE_API_KEY"

刪除已上傳的檔案

檔案會在 48 小時後自動刪除。您也可以手動刪除已上傳的檔案:

Python

myfile = client.files.upload(file='path/to/sample.mp3')
client.files.delete(name=myfile.name)

JavaScript

const myfile = await ai.files.upload({
  file: "path/to/sample.mp3",
  config: { mimeType: "audio/mpeg" },
});

const fileName = myfile.name;
await ai.files.delete({ name: fileName });

Go

file, err := client.UploadFileFromPath(ctx, "path/to/sample.mp3", nil)
if err != nil {
    log.Fatal(err)
}
client.DeleteFile(ctx, file.Name)

REST

curl --request "DELETE" https://generativelanguage.googleapis.com/v1beta/files/$name?key=$GOOGLE_API_KEY

使用資訊

您可以使用 Files API 上傳媒體檔案並與其互動。透過 Files API,您可以在每個專案中儲存最多 20 GB 的檔案,且每個檔案的大小上限為 2 GB。檔案會儲存 48 小時。在此期間,您可以使用 API 取得檔案的中繼資料,但無法下載檔案。在 Gemini API 支援的所有地區,您都可以免費使用 Files API。

檔案提示策略

本節提供使用 Gemini API 提示的媒體檔案指南和最佳做法。

在提示中使用各種類型的資料,可讓您更靈活地運用 Gemini API 處理工作。舉例來說,您可以傳送美味餐點的相片給模型,並要求模型撰寫有關該餐點的短篇網誌。

提示 回應

根據這張圖片撰寫簡短且引人入勝的網誌文章。應包含對相片中餐點的說明,並談論我準備餐點的過程。


Cookie

準備餐點是節省時間和金錢的好方法,也可以幫助您吃得更健康。這道餐點是健康美味的絕佳例子,而且可以輕鬆提前準備。

這道餐點包含糙米、烤蔬菜和照燒雞肉。 糙米是健康的複合碳水化合物,可持續提供能量。烤蔬菜是攝取每日維生素和礦物質的絕佳選擇,而照燒雞肉則是美味又富含蛋白質的選擇。

這道料理也非常容易準備。只要煮糙米、烤蔬菜,然後烹煮照燒雞即可。所有食材都煮熟後,請將其分裝到餐點準備容器中,並放入冰箱。這樣一來,你就能在忙碌的早晨拿起容器,出門上班了!

如果你想吃健康又美味的餐點,而且可以提前準備,這道菜色會是絕佳選擇。它富含營養和美味,一定能讓你感到飽足和滿足。

祝你準備出美味健康的餐點!

如果您無法順利從使用媒體檔案的提示中取得所需的輸出內容,可以採用一些策略來取得所需的結果。以下各節將提供設計方法和疑難排解提示,協助您改善使用多模態輸入的提示。

您可以按照下列最佳做法改善多模式提示:

  • 提示設計基礎知識

    • 提供具體操作說明:請撰寫清楚明確的操作說明,盡量避免誤解。
    • 在提示中加入幾個範例:使用幾個實際的少量示例,說明您想要達成的目標。
    • 逐步拆解:將複雜的工作拆分為可控的子目標,引導模型完成整個程序。
    • 指定輸出格式:在提示中要求輸出格式,例如 Markdown、JSON、HTML 等。
    • 針對單張圖片提示,請先放入圖片:雖然 Gemini 可處理任何順序的圖片和文字輸入內容,但如果提示包含單張圖片,將圖片 (或影片) 置於文字提示之前,可能會獲得更好的成效。不過,如果提示需要圖片與文字交錯排列才能表達完整意思,請使用最自然的順序。
  • 多模態提示疑難排解

    • 如果模型未從圖片的相關部分繪製資訊:提供提示,說明您希望提示從圖片的哪個部分繪製資訊。
    • 如果模型輸出內容太過一般 (未針對圖片/影片輸入內容進行調整): 在提示開始時,請先要求模型描述圖片或影片,再提供任務指示,或是要求模型參照圖片中的內容。
    • 如要排解問題所在,請按照以下步驟操作:請模型描述圖片,或請模型說明推論過程,以評估模型的初步理解程度。
    • 如果提示產生幻覺內容:請嘗試調低溫度設定,或要求模型提供較短的說明,以免系統推斷出其他詳細資訊。
    • 調整取樣參數:嘗試使用不同的溫度設定和前 K 個選項,調整模型的創意。

提供明確的操作說明

清楚詳細的提示最能獲得成功。如果您有特定輸出內容,建議您在提示中加入該要求,確保您能取得所需的輸出內容。

對於這張機場看板的圖片,如果只要求模型「描述這張圖片」,系統就會產生一般描述。如果您需要模型從圖片中剖析時間和城市,可以直接在提示中加入該要求。

提示 模型回應

描述這張圖片。

圖片顯示機場的航班抵達與起飛時刻資訊看板。

更新提示 改善回應
行程時間表

將圖片中顯示的機場航班時刻表中的時間和城市解析為清單。

  • 10:50 莫斯科時間
  • 11:05 愛丁堡
  • 11:05 倫敦
  • 11:10 布加勒斯特
  • 11:30 基輔
  • 11:35 都柏林
  • 上午 11 點 45 分 (東密德蘭)
  • 12:15 Sofia
  • 12:30 (倫敦時間)
  • 12:30 新堡
  • 12:40 聖彼得堡
  • 12:40 倫敦時間
  • 12:45 曼徹斯特
  • 新增幾個範例

    Gemini 模型可接受多個輸入內容,並將這些內容做為範例,瞭解您想要的輸出內容。新增這些範例有助於模型找出模式,並將指定圖像和回應之間的關係套用至新範例。這也稱為「少量樣本」學習。

    在下方範例中,初始輸出內容以句子形式書寫,並包含國家/地區 (巴西)。假設您想要以其他格式或風格輸出內容,且只需要城市,而非國家/地區。在提示訊息中加入少量樣本,可引導模型以您想要的方式回應。

    提示 模型回應
    行程時間表

    判斷地標所在的城市。

    地標是巴西里約熱內盧的救世基督像。

    更新提示 改善回應

    判斷地標所在的城市。

    羅馬競技場

    city: 羅馬,landmark: 羅馬競技場。

    紫禁城

    city: 北京、landmark: 紫禁城

    forbidden-city

    城市:里約熱內盧,地標:救世基督像

    逐步細分

    對於需要視覺理解和推理能力的複雜工作,建議將工作拆分為更簡單的步驟。或者,您也可以直接在提示中要求模型「逐一思考」,這麼做也能有效解決問題。

    提示 模型回應

    廁所衛生紙何時會用完?

    很快,你就只剩下 3 個卷軸。

    更新提示 改善回應

      1. 首先,請數一數這張圖片中有幾卷衛生紙。
      2. 接著,決定一般人每天會用多少衛生紙巾。
      3. 計算這些衛生紙巾卷的使用期限。

      1. 這張圖片中有 3 卷衛生紙。
      2. 一般人每天會使用約 20 張衛生紙。
      3. 如果每卷衛生棉條含有 200 片,那麼每卷衛生棉條可使用約 10 天。因此,3 卷衛生棉條可使用約一個月。

    數學題或其他類型的文字題,都是讓模型一步步思考的好題型。

    提示 回應

    這個序列的第 4 項為何?

    -135

    模型的回應不正確。改善這項問題的方法之一,就是在回答提示之前,要求模型先剖析問題。

    提示 回應

    請先剖析圖片中的公式。

    接著根據公式回答「這個數列的第 4 項是什麼?」

    按一下即可展開結果

    \( b(n) = b(n-1) * (-3) \)

    \( b(1) = 15 \)

    1. 將 n = 4 替換到公式中:
    2. \( b(4) = b(4-1) * (-3) \)

      \( b(4) = b(3) * (-3) \)

    3. 我們不知道 b(3) 的值,因此將 n = 3 替換為公式:
    4. \( b(3) = b(3-1) * (-3) \)

      \( b(3) = b(2) * (-3) \)

    5. 我們不知道 b(2) 的值,因此將 n = 2 替換為公式:
    6. \( b(2) = b(2-1) * (-3) \)

      \( b(2) = b(1) * (-3) \)

    7. 我們知道 b(1) 的值為 15,因此將其替換到公式中:
    8. \( b(2) = 15 * (-3) \)

      \( b(2) = -45 \)

    9. 我們現在知道 b(2) 的值,因此將其代入 b(3) 的公式:
    10. \( b(3) = b(2) * (-3) \)

      \( b(3) = -45 * (-3) \)

      \( b(3) = 135 \)

    11. 我們現在知道 b(3) 的值,因此將其代入 b(4) 的公式:
    12. \( b(4) = b(3) * (-3) \)

      \( b(4) = 135 * (-3) \)

      \( b(4) = -405 \)

    因此,序列中的第 4 項為 -405。

    這個模型回應是正確的,現在您可以要求模型逐步思考,讓回應更加精簡。

    更新提示 改善回應

    這個序列的第 4 項為何?請按部就班思考。

    第一個項為 15。

    第二項為 b(1) * (-3) = 15 * (-3) = -45。

    第三個項是 b(2) * (-3) = -45 * (-3) = 135。

    第四項為 b(3) * (-3) = 135 * (-3) = -405。

    指定輸出格式

    常見的問題是,模型輸出內容必須採用特定格式 (例如 Markdown、JSON、HTML),尤其是當模型輸出內容需要由下游工作流程攝入時。您可以嘗試在提示中指示模型以該格式產生輸出內容。以下提供兩個範例:

    提示 模型回應

    將圖片中的表格解析為 Markdown 格式

    | 主旨 | 狀態 | 時間 | 開始日期 | 截止日 |

    | ------- | ------ | ---- | --------- | ------ |

    | 數學 | 完成 | 1.5 小時 | 2023 年 11 月 29 日 | 2023 年 12 月 1 日 |

    | 地理位置 | 完成 | 30 分鐘 | 2023 年 12 月 2 日 | 2023 年 12 月 4 日 |

    | 物理 | 進行中 | 2 小時 | 2023 年 12 月 3 日 | 2023 年 12 月 5 日 |

    | 生物學 | 未開始 | 6 小時 | 2016 年 11 月 2 日 | 2023 年 12 月 6 日 |

    提示 模型回應

    請提供下列所有屬性的清單:

    以 JSON 格式提供食材、料理類型、是否為素食

    ```json```

    {

    "ingredients": [

    "rice",

    "shrimp",

    "clams",

    "mussels",

    "peas",

    "tomatoes",

    "onions",

    "garlic",

    "olive oil",

    "paprika",

    "salt",

    "pepper"

    ],

    "type of cuisine": "Spanish",

    "vegetarian": false

    針對單一圖像提示,請先放入圖片

    雖然 Gemini 可以在提示中以任意順序解讀圖片和文字,但在文字提示前放置單一圖片可能會獲得更好的結果。在下列範例中,您會發現每個提示的圖片都會先顯示,然後才顯示文字。

    排解多模態提示問題

    如果沒有獲得實用的回應,您可能需要排解提示問題。以下提供幾種可嘗試的策略。

    如果模型未從圖片的相關部分擷取資訊

    如要取得更具體的回覆,您可以指出要讓提示從圖片的哪些部分擷取資訊,以便提供回覆。

    提示 模型回應

    這些尿布可讓嬰兒使用多久?

    尿布可使用 198 天。

    更新提示 改善回應

    這些尿布可以用多久?

    根據盒子上的體重判斷寶寶的年齡,並使用盒子中的尿布總數。

    將總數除以孩子每天使用的尿布數量。

    盒子內含 198 片尿布。盒子上指出,這些尿布適用於體重 22 到 37 磅的兒童。

    這個體重範圍內的平均兒童年齡大約介於 1 到 2 歲。

    2 歲兒童通常每天使用 6 片尿布,因此尿布可使用約 33 天 (198/6)。

    如果模型輸出結果過於一般化,且未充分針對圖片輸入內容進行調整

    為了協助模型針對圖片調整回應內容,請嘗試在執行推理工作前,先要求模型描述圖片。

    提示 模型回應

    這些圖片有什麼共通之處?

    這四張圖片都是風景攝影的範例。

    更新提示 改善回應

    首先,請詳細說明每張圖片中的內容。這些圖片有什麼共通之處?

    第一張圖片顯示某人正在打包行李箱。第二張圖片顯示購物中心內空無一人的走廊。第三張圖片顯示一卷衛生紙。第四張圖片顯示黑暗暴風的海景。

    這些圖片的共同點是,它們都是邊緣空間的例子。臨界空間是指介於兩個地點或情況之間的地方或情況。這類夢境通常會讓人感到不確定或模糊。

    第一張圖片顯示該名使用者在家中和旅途中的樣貌。第二張圖片顯示兩間商店之間的走道。第三張圖片是衛生紙,可代表浴室。浴室是私人空間和公共空間之間的過渡空間。這是我們準備進入或離開外部世界的場所。

    第四張圖片顯示海面在平靜和暴風之間。

    臨界空間既令人興奮,也令人不安。它們可以是新的開始,也可以是結束的地方。你可以在其中沉思,也可以採取行動。

    您也可以嘗試明確要求模型參照圖片中的物件。

    更新提示 改善回應

    這些圖片有什麼共通之處?請在回覆中提及圖片中的內容。

    所有圖片都與旅遊相關。第一張圖片顯示某人正在打包行李箱,第二張圖片顯示購物中心空無一人的走廊,第三張圖片顯示一疊衛生紙,第四張圖片則顯示黑暗暴風的海面。

    這些圖片都與旅遊相關,因為這些都是旅客在旅遊時需要或使用的物品。第一張圖片顯示某人正在打包行李,這是人們出遊時會做的事。第二張圖片顯示購物中心空蕩的走廊,這是人們經常前往購買旅遊用品的地點。第三張圖片顯示一疊衛生紙,這是人們在旅行時經常會用到的東西。第四張圖片顯示黑暗暴風的海景,這是旅客經常遇到的情況。

    同樣的訣竅也適用於圖片的廣告素材輸出內容。在以下兔子示例中,明確要求模型納入圖片中的各個層面,可以改善輸出結果。

    提示 模型回應

    你可以為這張圖片寫首詩嗎?

    小兔子,棕色又柔軟,
    在田野間跳來跳去。
    你的耳朵好長,尾巴好小,
    你是所有生物中最可愛的。

    你啃食青草,綠油油又香甜,
    看到我時就跳開。
    但我永遠是你的好友,
    小兔子,直到最後一刻。

    更新提示 改善回應

    能否為我寫一首描述這張圖片的詩,並加入地點?

    綠地上的小兔子,
    耳朵好長,好敏銳。
    你看到什麼?
    你在遠方看到什麼?

    是海洋藍嗎?
    在陽光的色調中閃閃發光?
    或者是洶湧澎湃的海浪聲,
    你喜歡這種節奏嗎?

    小兔子,請說實話,
    你為什麼如此專注?
    是鹹鹹的海風,
    還是海鷗的鳴叫聲讓你感到愉悅?

    也許是因為它太廣大,
    這個世界既大又小。
    夢想可以翱翔的地方,
    冒險可以播種的地方。

    小兔子,我想知道你在做什麼夢
    你坐在草地上,看起來很平靜。
    你想探索深海嗎?
    還是想留在陸地上,以便跳躍?

    無論是什麼,小兔子,
    請保持好奇心,讓它熊熊燃燒。
    因為在你的夢想和抱負中,
    有一個世界等著你創造。

    排解提示失敗的部分

    很難判斷提示失敗的原因,是因為模型一開始就沒有瞭解圖片,還是因為模型雖然瞭解圖片,但之後沒有執行正確的推理步驟。如要區分這些原因,請要求模型說明圖片中的內容。

    在下列範例中,如果模型回應的零食與茶搭配起來似乎不合理 (例如爆米花),您可以先排除問題,判斷模型是否正確辨識圖片中含有茶。

    提示 提示疑難排解

    有什麼零食可以在 1 分鐘內完成,並搭配這道料理享用?

    描述這張圖片中的內容。

    另一種策略是要求模型說明推論過程。這有助於您縮小推理過程中出錯的部分 (如果有)。

    提示 提示疑難排解

    有什麼零食可以在 1 分鐘內完成,並搭配這道料理享用?

    請問有什麼零食可以在 1 分鐘內完成,並搭配這道料理食用?請說明原因。

    後續步驟

    • 請嘗試使用 Google AI Studio 編寫自己的多模態提示。
    • 如要瞭解如何使用 Gemini Files API 上傳媒體檔案,並將這些檔案納入提示中,請參閱 Vision音訊文件處理指南。
    • 如需有關提示設計的更多指引 (例如微調取樣參數),請參閱「提示策略」頁面。