Gemini 系列人工智慧 (AI) 模型可處理各種類型的輸入資料,包括文字、圖片和音訊。由於這些模型可處理多種資料類型或模式,因此 Gemini 模型稱為多模態模型,或稱為具有多模態功能。
本指南將說明如何使用 Files API 處理媒體檔案。音訊檔案、圖片、影片、文件和其他支援的檔案類型,都適用相同的基本操作。
如需檔案提示指南,請參閱「檔案提示指南」一節。
上傳檔案
您可以使用 Files API 上傳媒體檔案。如果總要求大小 (包括檔案、文字提示、系統指示等) 超過 20 MB,請一律使用 Files API。
下列程式碼會上傳檔案,然後在呼叫 generateContent
時使用該檔案。
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)
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();
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)
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 是否已成功儲存上傳的檔案,並取得其中繼資料。
myfile = client.files.upload(file='path/to/sample.mp3')
file_name = myfile.name
myfile = client.files.get(name=file_name)
print(myfile)
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);
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)
# 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 上傳多個檔案。以下程式碼可取得所有上傳檔案的清單:
print('My files:')
for f in client.files.list():
print(' ', f.name)
const listResponse = await ai.files.list({ config: { pageSize: 10 } });
for await (const file of listResponse) {
console.log(file.name);
}
iter := client.ListFiles(ctx)
for {
ifile, err := iter.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatal(err)
}
fmt.Println(ifile.Name)
}
echo "My files: "
curl "https://generativelanguage.googleapis.com/v1beta/files?key=$GOOGLE_API_KEY"
刪除已上傳的檔案
檔案會在 48 小時後自動刪除。您也可以手動刪除已上傳的檔案:
myfile = client.files.upload(file='path/to/sample.mp3')
client.files.delete(name=myfile.name)
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 });
file, err := client.UploadFileFromPath(ctx, "path/to/sample.mp3", nil)
if err != nil {
log.Fatal(err)
}
client.DeleteFile(ctx, file.Name)
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 處理工作。舉例來說,您可以傳送美味餐點的相片給模型,並要求模型撰寫有關該餐點的短篇網誌。
提示 | 回應 |
根據這張圖片撰寫簡短且引人入勝的網誌文章。應包含對相片中餐點的說明,並談論我準備餐點的過程。 ![]() |
準備餐點是節省時間和金錢的好方法,也可以幫助您吃得更健康。這道餐點是健康美味的絕佳例子,而且可以輕鬆提前準備。 這道餐點包含糙米、烤蔬菜和照燒雞肉。 糙米是健康的複合碳水化合物,可持續提供能量。烤蔬菜是攝取每日維生素和礦物質的絕佳選擇,而照燒雞肉則是美味又富含蛋白質的選擇。 這道料理也非常容易準備。只要煮糙米、烤蔬菜,然後烹煮照燒雞即可。所有食材都煮熟後,請將其分裝到餐點準備容器中,並放入冰箱。這樣一來,你就能在忙碌的早晨拿起容器,出門上班了! 如果你想吃健康又美味的餐點,而且可以提前準備,這道菜色會是絕佳選擇。它富含營養和美味,一定能讓你感到飽足和滿足。 祝你準備出美味健康的餐點! |
如果您無法順利從使用媒體檔案的提示中取得所需的輸出內容,可以採用一些策略來取得所需的結果。以下各節將提供設計方法和疑難排解提示,協助您改善使用多模態輸入的提示。
您可以按照下列最佳做法改善多模式提示:
-
提示設計基礎知識
- 提供具體操作說明:請撰寫清楚明確的操作說明,盡量避免誤解。
- 在提示中加入幾個範例:使用幾個實際的少量示例,說明您想要達成的目標。
- 逐步拆解:將複雜的工作拆分為可控的子目標,引導模型完成整個程序。
- 指定輸出格式:在提示中要求輸出格式,例如 Markdown、JSON、HTML 等。
- 針對單張圖片提示,請先放入圖片:雖然 Gemini 可處理任何順序的圖片和文字輸入內容,但如果提示包含單張圖片,將圖片 (或影片) 置於文字提示之前,可能會獲得更好的成效。不過,如果提示需要圖片與文字交錯排列才能表達完整意思,請使用最自然的順序。
-
多模態提示疑難排解
- 如果模型未從圖片的相關部分繪製資訊:提供提示,說明您希望提示從圖片的哪個部分繪製資訊。
- 如果模型輸出內容太過一般 (未針對圖片/影片輸入內容進行調整): 在提示開始時,請先要求模型描述圖片或影片,再提供任務指示,或是要求模型參照圖片中的內容。
- 如要排解問題所在,請按照以下步驟操作:請模型描述圖片,或請模型說明推論過程,以評估模型的初步理解程度。
- 如果提示產生幻覺內容:請嘗試調低溫度設定,或要求模型提供較短的說明,以免系統推斷出其他詳細資訊。
- 調整取樣參數:嘗試使用不同的溫度設定和前 K 個選項,調整模型的創意。
提供明確的操作說明
清楚詳細的提示最能獲得成功。如果您有特定輸出內容,建議您在提示中加入該要求,確保您能取得所需的輸出內容。
對於這張機場看板的圖片,如果只要求模型「描述這張圖片」,系統就會產生一般描述。如果您需要模型從圖片中剖析時間和城市,可以直接在提示中加入該要求。
提示 | 模型回應 |
---|---|
![]() 描述這張圖片。 |
圖片顯示機場的航班抵達與起飛時刻資訊看板。 |
更新提示 | 改善回應 |
---|---|
![]() 將圖片中顯示的機場航班時刻表中的時間和城市解析為清單。 |
新增幾個範例
Gemini 模型可接受多個輸入內容,並將這些內容做為範例,瞭解您想要的輸出內容。新增這些範例有助於模型找出模式,並將指定圖像和回應之間的關係套用至新範例。這也稱為「少量樣本」學習。
在下方範例中,初始輸出內容以句子形式書寫,並包含國家/地區 (巴西)。假設您想要以其他格式或風格輸出內容,且只需要城市,而非國家/地區。在提示訊息中加入少量樣本,可引導模型以您想要的方式回應。
提示 | 模型回應 |
---|---|
![]() 判斷地標所在的城市。 |
地標是巴西里約熱內盧的救世基督像。 |
更新提示 | 改善回應 |
---|---|
判斷地標所在的城市。 ![]() |
city: 羅馬,landmark: 羅馬競技場。 |
![]() |
city: 北京、landmark: 紫禁城 |
![]() |
城市:里約熱內盧,地標:救世基督像 |
逐步細分
對於需要視覺理解和推理能力的複雜工作,建議將工作拆分為更簡單的步驟。或者,您也可以直接在提示中要求模型「逐一思考」,這麼做也能有效解決問題。
提示 | 模型回應 |
---|---|
![]() 廁所衛生紙何時會用完? |
很快,你就只剩下 3 個卷軸。 |
更新提示 | 改善回應 |
---|---|
![]()
|
|
數學題或其他類型的文字題,都是讓模型一步步思考的好題型。
提示 | 回應 |
---|---|
![]()
這個序列的第 4 項為何? |
-135 |
模型的回應不正確。改善這項問題的方法之一,就是在回答提示之前,要求模型先剖析問題。
提示 | 回應 |
---|---|
![]()
請先剖析圖片中的公式。 接著根據公式回答「這個數列的第 4 項是什麼?」 |
按一下即可展開結果\( b(n) = b(n-1) * (-3) \) \( b(1) = 15 \)
\( b(4) = b(4-1) * (-3) \) \( b(4) = b(3) * (-3) \) \( b(3) = b(3-1) * (-3) \) \( b(3) = b(2) * (-3) \) \( b(2) = b(2-1) * (-3) \) \( b(2) = b(1) * (-3) \) \( b(2) = 15 * (-3) \) \( b(2) = -45 \) \( b(3) = b(2) * (-3) \) \( b(3) = -45 * (-3) \) \( b(3) = 135 \) \( 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 格式提供食材、料理類型、是否為素食 |
|
針對單一圖像提示,請先放入圖片
雖然 Gemini 可以在提示中以任意順序解讀圖片和文字,但在文字提示前放置單一圖片可能會獲得更好的結果。在下列範例中,您會發現每個提示的圖片都會先顯示,然後才顯示文字。
排解多模態提示問題
如果沒有獲得實用的回應,您可能需要排解提示問題。以下提供幾種可嘗試的策略。
如果模型未從圖片的相關部分擷取資訊
如要取得更具體的回覆,您可以指出要讓提示從圖片的哪些部分擷取資訊,以便提供回覆。
提示 | 模型回應 |
---|---|
![]() 這些尿布可讓嬰兒使用多久? |
尿布可使用 198 天。 |
更新提示 | 改善回應 |
---|---|
![]() 這些尿布可以用多久? 根據盒子上的體重判斷寶寶的年齡,並使用盒子中的尿布總數。 將總數除以孩子每天使用的尿布數量。 |
盒子內含 198 片尿布。盒子上指出,這些尿布適用於體重 22 到 37 磅的兒童。 這個體重範圍內的平均兒童年齡大約介於 1 到 2 歲。 2 歲兒童通常每天使用 6 片尿布,因此尿布可使用約 33 天 (198/6)。 |
如果模型輸出結果過於一般化,且未充分針對圖片輸入內容進行調整
為了協助模型針對圖片調整回應內容,請嘗試在執行推理工作前,先要求模型描述圖片。
提示 | 模型回應 |
---|---|
![]() ![]() ![]() ![]() 這些圖片有什麼共通之處? |
這四張圖片都是風景攝影的範例。 |
更新提示 | 改善回應 |
---|---|
![]() ![]() ![]() ![]() 首先,請詳細說明每張圖片中的內容。這些圖片有什麼共通之處? |
第一張圖片顯示某人正在打包行李箱。第二張圖片顯示購物中心內空無一人的走廊。第三張圖片顯示一卷衛生紙。第四張圖片顯示黑暗暴風的海景。 這些圖片的共同點是,它們都是邊緣空間的例子。臨界空間是指介於兩個地點或情況之間的地方或情況。這類夢境通常會讓人感到不確定或模糊。 第一張圖片顯示該名使用者在家中和旅途中的樣貌。第二張圖片顯示兩間商店之間的走道。第三張圖片是衛生紙,可代表浴室。浴室是私人空間和公共空間之間的過渡空間。這是我們準備進入或離開外部世界的場所。 第四張圖片顯示海面在平靜和暴風之間。 臨界空間既令人興奮,也令人不安。它們可以是新的開始,也可以是結束的地方。你可以在其中沉思,也可以採取行動。 |
您也可以嘗試明確要求模型參照圖片中的物件。
更新提示 | 改善回應 |
---|---|
![]() ![]() ![]() ![]() 這些圖片有什麼共通之處?請在回覆中提及圖片中的內容。 |
所有圖片都與旅遊相關。第一張圖片顯示某人正在打包行李箱,第二張圖片顯示購物中心空無一人的走廊,第三張圖片顯示一疊衛生紙,第四張圖片則顯示黑暗暴風的海面。 這些圖片都與旅遊相關,因為這些都是旅客在旅遊時需要或使用的物品。第一張圖片顯示某人正在打包行李,這是人們出遊時會做的事。第二張圖片顯示購物中心空蕩的走廊,這是人們經常前往購買旅遊用品的地點。第三張圖片顯示一疊衛生紙,這是人們在旅行時經常會用到的東西。第四張圖片顯示黑暗暴風的海景,這是旅客經常遇到的情況。 |
同樣的訣竅也適用於圖片的廣告素材輸出內容。在以下兔子示例中,明確要求模型納入圖片中的各個層面,可以改善輸出結果。
提示 | 模型回應 |
---|---|
![]() 你可以為這張圖片寫首詩嗎? |
小兔子,棕色又柔軟, 你啃食青草,綠油油又香甜, |
更新提示 | 改善回應 |
---|---|
![]() 能否為我寫一首描述這張圖片的詩,並加入地點? |
綠地上的小兔子, 是海洋藍嗎? 小兔子,請說實話, 也許是因為它太廣大, 小兔子,我想知道你在做什麼夢 無論是什麼,小兔子, |
排解提示失敗的部分
很難判斷提示失敗的原因,是因為模型一開始就沒有瞭解圖片,還是因為模型雖然瞭解圖片,但之後沒有執行正確的推理步驟。如要區分這些原因,請要求模型說明圖片中的內容。
在下列範例中,如果模型回應的零食與茶搭配起來似乎不合理 (例如爆米花),您可以先排除問題,判斷模型是否正確辨識圖片中含有茶。
提示 | 提示疑難排解 |
---|---|
![]() 有什麼零食可以在 1 分鐘內完成,並搭配這道料理享用? |
![]() 描述這張圖片中的內容。 |
另一種策略是要求模型說明推論過程。這有助於您縮小推理過程中出錯的部分 (如果有)。
提示 | 提示疑難排解 |
---|---|
![]() 有什麼零食可以在 1 分鐘內完成,並搭配這道料理享用? |
![]() 請問有什麼零食可以在 1 分鐘內完成,並搭配這道料理食用?請說明原因。 |
後續步驟
- 請嘗試使用 Google AI Studio 編寫自己的多模態提示。
- 如要瞭解如何使用 Gemini Files API 上傳媒體檔案,並將這些檔案納入提示中,請參閱 Vision、音訊和文件處理指南。
- 如需有關提示設計的更多指引 (例如微調取樣參數),請參閱「提示策略」頁面。