文件 API

Gemini 系列人工智能 (AI) 模型专为处理各种类型的输入数据(包括文本、图片和音频)而设计。由于这些模型可以处理多种类型或模式的数据,因此 Gemini 模型被称为多模态模型,或被描述为具有多模态功能

本指南介绍了如何使用 Files API 处理媒体文件。音频文件、图片、视频、文档和其他受支持的文件类型的基本操作相同。

如需了解文件提示指南,请参阅文件提示指南部分。

上传文件

您可以使用 Files API 上传媒体文件。如果请求总大小(包括文件、文本提示、系统说明等)超过 20 MB,请始终使用 Files API。

以下代码会上传文件,然后在调用 generateContent 时使用该文件。

Python

from google import genai

client = genai.Client()

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

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

print(response.text)

JavaScript

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

const ai = new GoogleGenAI({});

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.5-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.5-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" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -D "${tmp_header_file}" \
  -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.5-flash:generateContent" \
    -H "x-goog-api-key: $GEMINI_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 \
-H "x-goog-api-key: $GEMINI_API_KEY" > 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" \
  -H "x-goog-api-key: $GEMINI_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 \
  -H "x-goog-api-key: $GEMINI_API_KEY"

使用情况信息

您可以使用 Files API 上传媒体文件并与其互动。借助 Files API,您最多可为每个项目存储 20 GB 的文件,每个文件的大小上限为 2 GB。文件会存储 48 小时。在此期间,您可以使用 API 获取文件的元数据,但无法下载文件。Files API 在已推出 Gemini API 的所有地区均可免费使用。

文件提示策略

本部分提供了有关如何使用包含 Gemini API 提示的媒体文件的指导和最佳实践。

能够在问题中使用各种类型的数据,让您在使用 Gemini API 处理任务时更加灵活。例如,您可以向模型发送一张美味餐食的照片,并要求它撰写一篇关于该餐食的简短博文。

提示 答案

根据此图片撰写一篇简短且引人入胜的博文。其中应包含照片中菜肴的描述,并谈论我的饮食准备之旅。


Cookie

提前准备餐食不仅能节省时间和金钱,还能帮助您吃得更健康。这道菜就是一个很好的例子,既健康又美味,而且可以提前轻松准备。

这顿餐食包含糙米、烤蔬菜和照烧鸡肉。 糙米是一种健康的复合碳水化合物,可为您提供持久的能量。烤蔬菜是获取每日所需维生素和矿物质的绝佳方式,而日式照烧鸡肉则是一道美味又富含蛋白质的菜肴。

这道菜的制作也非常简单。只需煮糙米饭、烤蔬菜和烹饪照烧鸡肉即可。所有食材都煮熟后,将其分装到餐食准备容器中,并存放在冰箱中。 然后,您就可以抓起一个容器,开始�����的���������!

如果您想要准备一顿健康美味且可以提前轻松准备的餐食,这道菜非常适合。它富含营养和美味,一定会让您感到饱腹和满足。

祝您准备出健康又美味的餐食!

如果您在使用媒体文件的提示中无法获得所需的输出,可以采用一些策略来获得所需的结果。以下部分提供了设计方法和问题排查提示,以帮助您改进使用多模态输入的提示。

您可以按照以下最佳实践来改进多模态提示:

  • 提示设计基础知识

    • 指令应当明确具体:编写清晰且简洁的指令,尽量避免误解。
    • 向提示中添加一些示例:使用切实可行的少样本示例来说明您要实现的目标。
    • 分步细分:将复杂的任务划分为多个易于管理的子目标,引导模型完成整个过程。
    • 指定输出格式:在提示中,要求输出采用所需的格式,如 Markdown、JSON、HTML 等。
    • 对于单个图片的提示,首先放置图片:虽然 Gemini 可以按任意顺序处理图片和文字输入,但对于包含单张图片的提示,如果将图片(或视频)放在文本提示前面,效果可能会更好。 但是,对于需要图片与文本高度交织才具有意义的提示,请使用最自然的顺序。
  • 排查多模态提示问题

    • 如果模型没有从图片的相关部分提取信息:给出提示,说明您希望提示从图片的哪些方面提取信息。
    • 如果模型输出过于笼统(没有针对图片或视频输入进行足够的定制):在提示开头,尝试要求模型描述图片或视频,然后再提供任务指令,或尝试要求模型参考图片中的内容。
    • 排查哪个部分失败:要求模型描述图片,或要求模型说明其推理,以衡量模型的初步理解。
    • 如果您的提示产生幻觉内容:尝试调低���度设置,或要求模型提供较短的说明,以便不太可能推断其他细节。
    • 对采样参数调优:尝试不同的温度设置和 Top-k 选择,以调整模型的创造力。

说明应当明确具体

提示在清晰而详细时最成功。如果您考虑获得特定输出,最好在提示中包含该要求,以确保获得所需输出。

对于此机场面板图片,要求模型仅“描述此图片”可能会生成一般性说明。如果您需要模型从图片中解析时间和城市,则可以直接在提示中添加该请求。

提示 模型回答

描述此图片。

此图片显示了机场到达和出发信息面板。

更新后的提示 改进后的回答
旅行时刻表

将下图中显示的机场面板中的时间和城市解析为列表。

  • 10:50 莫斯科
  • 11:05 爱丁堡
  • 11:05 伦敦
  • 11:10 布加勒斯特
  • 11:30 基辅
  • 11:35 都柏林
  • 11:45 东米德兰兹
  • 12:15 索非亚
  • 12:30 伦敦
  • 12:30 纽卡斯尔
  • 12:40 圣彼得堡
  • 12:40 伦敦
  • 12:45 曼彻斯特
  • 添加一些示例

    Gemini 模型可以接受多个输入,它可以将这些输入用作示例来理解所需的输出。添加这些示例有助于模型识别模式,并将给定图片与回答之间的关系应用于新示例。这也称为少样本学习。

    在以下示例中,初始输出以句子形式编写,并且还包含国家/地区(巴西)。假设您需要不同格式或样式的输出,并且只希望输入城市而不是国家/地区。向提示中添加少样本示例可以引导模型以您所需的方式进行回答。

    提示 模型回答
    旅行时刻表

    确定城市以及地标。

    地标是巴西里约热内卢的基督救世主雕像。

    更新后的提示 改进后的回答

    确定城市以及地标。

    斗兽场

    城市:罗马,地标:斗兽场。

    紫禁城

    城市:北京,地标:紫禁城

    紫禁城

    城市:里约热内卢,地标:基督救世主雕像

    分步细分

    对于复杂的任务(例如需要视觉理解和推理的任务),将任务拆分为更小、更直接的步骤可能会很有帮助。或者,如果您在提示中直接要求模型“分步思考”,也可能会很有效。

    提示 模型回答

    我什么时候会将卫生纸用完?

    您只剩下 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 上传媒体文件并将其添加到问题中,请参阅 VisionAudioDocument processing 指南。
    • 如需有关提示设计的更多指导(例如如何调优采样参数),请参阅提示策略页面。